diff --git a/.github/workflows/publish_documentation.yml b/.github/workflows/publish_documentation.yml index 2f0aea97..6087c7d4 100644 --- a/.github/workflows/publish_documentation.yml +++ b/.github/workflows/publish_documentation.yml @@ -6,6 +6,8 @@ on: workflow_dispatch: jobs: build: + env: + JUPYTER_PLATFORM_DIRS: 1 name: Deploy docs runs-on: ubuntu-latest steps: @@ -16,6 +18,7 @@ jobs: python-version: 3.12 - uses: snok/install-poetry@v1 with: + version: 1.8.5 virtualenvs-create: true virtualenvs-in-project: true virtualenvs-path: .venv diff --git a/.gitignore b/.gitignore index 0d1e9610..66233c16 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,7 @@ venv .idea sandbox/ .DS_Store -site/ \ No newline at end of file +site/ +benchmark/bin/env.sh +benchmark/src/results +benchmark/src/results/overlap \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 760ef6cc..16ab0d00 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -132,9 +132,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] name = "apache-avro" @@ -453,13 +453,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.83" +version = "0.1.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +checksum = "1b1244b10dcd56c92219da4e14caa97e312079e185f04ba3eea25061561dc0a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -529,7 +529,7 @@ dependencies = [ "newtype_derive", "num-integer", "num-traits", - "ordered-float 4.5.0", + "ordered-float 4.6.0", "petgraph", "rand", "regex", @@ -659,9 +659,9 @@ checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" [[package]] name = "bytemuck" -version = "1.20.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" [[package]] name = "byteorder" @@ -698,9 +698,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.3" +version = "1.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27f657647bcff5394bf56c7317665bbf790a137a50eaaa5c6bfbb9e27a518f2d" +checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7" dependencies = [ "jobserver", "libc", @@ -721,9 +721,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", @@ -792,9 +792,9 @@ dependencies = [ [[package]] name = "const_panic" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "013b6c2c3a14d678f38cd23994b02da3a1a1b6a5d1eedddfe63a5a5f11b13a81" +checksum = "53857514f72ee4a2b583de67401e3ff63a5472ca4acf289d09a9ea7636dfec17" [[package]] name = "constant_time_eq" @@ -862,18 +862,18 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.13" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" @@ -1425,7 +1425,7 @@ checksum = "d150dea618e920167e5973d70ae6ece4385b7164e0d799fe7c122dd0a5d912ad" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -1447,7 +1447,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -1494,7 +1494,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -1515,9 +1515,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "feature-probe" @@ -1533,9 +1533,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flatbuffers" -version = "24.3.25" +version = "24.12.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8add37afff2d4ffa83bc748a70b4b1370984f6980768554182424ef71447c35f" +checksum = "4f1baf0dbf96932ec9a3038d57900329c015b0bfb7b63d904f3bc27e2b02a096" dependencies = [ "bitflags 1.3.2", "rustc_version 0.4.1", @@ -1622,7 +1622,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -1704,9 +1704,9 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "h2" @@ -1826,9 +1826,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" dependencies = [ "bytes", "futures-channel", @@ -1846,9 +1846,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.3" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", "http", @@ -2019,7 +2019,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -2134,9 +2134,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "lexical-core" -version = "1.0.3" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06d7a061b7feb8a4b233a4d90280d13e0965c4e0181566e9ad61af98e210ca9d" +checksum = "b765c31809609075565a70b4b71402281283aeda7ecaf4818ac14a7b2ade8958" dependencies = [ "lexical-parse-float", "lexical-parse-integer", @@ -2147,9 +2147,9 @@ dependencies = [ [[package]] name = "lexical-parse-float" -version = "1.0.3" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0029bdee2a94a6c4393a86f7e6921c90f234218fa4f2154bc001c92bc51e8bf5" +checksum = "de6f9cb01fb0b08060209a057c048fcbab8717b4c1ecd2eac66ebfe39a65b0f2" dependencies = [ "lexical-parse-integer", "lexical-util", @@ -2158,9 +2158,9 @@ dependencies = [ [[package]] name = "lexical-parse-integer" -version = "1.0.3" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "440a2398a08def518ff962b69e7146246c53bad8090e2b75d95fd5a469338958" +checksum = "72207aae22fc0a121ba7b6d479e42cbfea549af1479c3f3a4f12c70dd66df12e" dependencies = [ "lexical-util", "static_assertions", @@ -2168,18 +2168,18 @@ dependencies = [ [[package]] name = "lexical-util" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3100209587e35b13881068ce5a41241b112e0500b4d847ba16be172829c112ff" +checksum = "5a82e24bf537fd24c177ffbbdc6ebcc8d54732c35b50a3f28cc3f4e4c949a0b3" dependencies = [ "static_assertions", ] [[package]] name = "lexical-write-float" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7176448fc083401942d3cdd767416e35537fc1de055dfb7c615bcd4307ba0c7" +checksum = "c5afc668a27f460fb45a81a757b6bf2f43c2d7e30cb5a2dcd3abf294c78d62bd" dependencies = [ "lexical-util", "lexical-write-integer", @@ -2188,9 +2188,9 @@ dependencies = [ [[package]] name = "lexical-write-integer" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20fdc861893cc05203d57de038ab2e15519ad794bd6e3064fd081e6b42abffe0" +checksum = "629ddff1a914a836fb245616a7888b62903aae58fa771e1d83943035efa0f978" dependencies = [ "lexical-util", "static_assertions", @@ -2198,9 +2198,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.167" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libflate" @@ -2352,9 +2352,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" dependencies = [ "adler2", ] @@ -2405,7 +2405,7 @@ checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -2518,24 +2518,25 @@ dependencies = [ [[package]] name = "object" -version = "0.36.5" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "object_store" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eb4c22c6154a1e759d7099f9ffad7cc5ef8245f9efbab4a41b92623079c82f3" +checksum = "3cfccb68961a56facde1163f9319e0d15743352344e7808a11795fb99698dcaf" dependencies = [ "async-trait", "base64", "bytes", "chrono", "futures", + "httparse", "humantime", "hyper", "itertools", @@ -2579,9 +2580,9 @@ dependencies = [ [[package]] name = "ordered-float" -version = "4.5.0" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c65ee1f9701bf938026630b455d5315f490640234259037edb259798b3bcf85e" +checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" dependencies = [ "num-traits", ] @@ -2734,7 +2735,7 @@ checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "polars_bio" -version = "0.2.12" +version = "0.3.0" dependencies = [ "arrow", "datafusion", @@ -2799,7 +2800,7 @@ dependencies = [ "itertools", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -2869,7 +2870,7 @@ dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -2882,7 +2883,7 @@ dependencies = [ "proc-macro2", "pyo3-build-config", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -2893,9 +2894,9 @@ checksum = "5a651516ddc9168ebd67b24afd085a718be02f8858fe406591b013d101ce2f40" [[package]] name = "quick-xml" -version = "0.36.2" +version = "0.37.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" +checksum = "165859e9e55f79d67b96c5d96f4e88b6f2695a1972849c15a6a3f5c59fc2c003" dependencies = [ "memchr", "serde", @@ -2914,7 +2915,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2", - "thiserror 2.0.5", + "thiserror 2.0.9", "tokio", "tracing", ] @@ -2933,7 +2934,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.5", + "thiserror 2.0.9", "tinyvec", "tracing", "web-time", @@ -2941,9 +2942,9 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.7" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" +checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" dependencies = [ "cfg_aliases", "libc", @@ -2955,9 +2956,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -3010,9 +3011,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ "bitflags 2.6.0", ] @@ -3063,9 +3064,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.9" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ "base64", "bytes", @@ -3097,6 +3098,7 @@ dependencies = [ "tokio", "tokio-rustls", "tokio-util", + "tower", "tower-service", "url", "wasm-bindgen", @@ -3163,27 +3165,27 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.23", + "semver 1.0.24", ] [[package]] name = "rustix" -version = "0.38.41" +version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "rustls" -version = "0.23.19" +version = "0.23.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" +checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" dependencies = [ "once_cell", "ring", @@ -3216,9 +3218,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" dependencies = [ "web-time", ] @@ -3236,9 +3238,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "ryu" @@ -3248,9 +3250,9 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "safe_arch" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3460605018fdc9612bce72735cba0d27efbcd9904780d44c7e3a9948f96148a" +checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" dependencies = [ "bytemuck", ] @@ -3287,9 +3289,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "3.0.1" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1415a607e92bec364ea2cf9264646dcce0f91e6d65281bd6f2819cca3bf39c8" +checksum = "81d3f8c9bfcc3cbb6b0179eb57042d75b1582bdc65c3cb95f3fa999509c03cbc" dependencies = [ "bitflags 2.6.0", "core-foundation", @@ -3300,9 +3302,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.1" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" +checksum = "1863fd3768cd83c56a7f60faa4dc0d403f1b6df0a38c3c25f44b7894e45370d5" dependencies = [ "core-foundation-sys", "libc", @@ -3316,9 +3318,9 @@ checksum = "d4f410fedcf71af0345d7607d246e7ad15faaadd49d240ee3b24e5dc21a820ac" [[package]] name = "semver" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" [[package]] name = "seq-macro" @@ -3329,7 +3331,7 @@ checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4" [[package]] name = "sequila-core" version = "0.1.0" -source = "git+https://github.com/biodatageeks/sequila-native.git?rev=1a2eeb42d26753cd68ce5d981f6471655037abab#1a2eeb42d26753cd68ce5d981f6471655037abab" +source = "git+https://github.com/biodatageeks/sequila-native.git?rev=07a36935177f8ffbfbaa7f63958384108efd7b4f#07a36935177f8ffbfbaa7f63958384108efd7b4f" dependencies = [ "ahash", "async-trait", @@ -3350,29 +3352,29 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.215" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.215" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.134" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" dependencies = [ "itoa", "memchr", @@ -3461,7 +3463,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -3504,7 +3506,7 @@ checksum = "01b2e185515564f15375f593fb966b5718bc624ba77fe49fa4616ad619690554" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -3556,7 +3558,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -3569,7 +3571,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -3591,9 +3593,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.90" +version = "2.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "46f71c0377baf4ef1cc3e3402ded576dccc315800fbc62dfc7fe04b009773b4a" dependencies = [ "proc-macro2", "quote", @@ -3617,7 +3619,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -3628,12 +3630,13 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tempfile" -version = "3.14.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" dependencies = [ "cfg-if", "fastrand", + "getrandom", "once_cell", "rustix", "windows-sys 0.59.0", @@ -3650,11 +3653,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.5" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643caef17e3128658ff44d85923ef2d28af81bb71e0d67bbfe1d76f19a73e053" +checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" dependencies = [ - "thiserror-impl 2.0.5", + "thiserror-impl 2.0.9", ] [[package]] @@ -3665,18 +3668,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] name = "thiserror-impl" -version = "2.0.5" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "995d0bbc9995d1f19d28b7215a9352b0fc3cd3a2d2ec95c2cadc485cdedbcdde" +checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -3711,9 +3714,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -3748,7 +3751,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -3774,6 +3777,27 @@ dependencies = [ "tokio", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + [[package]] name = "tower-service" version = "0.3.3" @@ -3799,7 +3823,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -3871,7 +3895,7 @@ checksum = "f03ca4cb38206e2bef0700092660bb74d696f808514dae47fa1467cbfe26e96e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -4004,7 +4028,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", "wasm-bindgen-shared", ] @@ -4039,7 +4063,7 @@ checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4085,9 +4109,9 @@ dependencies = [ [[package]] name = "wide" -version = "0.7.30" +version = "0.7.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58e6db2670d2be78525979e9a5f9c69d296fd7d670549fe9ebf70f8708cb5019" +checksum = "cc0ca27312d1e9218687a4e804cd4b7410bf54125d54d13e5170efbf09066d24" dependencies = [ "bytemuck", "safe_arch", @@ -4286,7 +4310,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", "synstructure", ] @@ -4308,7 +4332,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] @@ -4328,7 +4352,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", "synstructure", ] @@ -4357,7 +4381,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.95", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index bbfbc7b0..9caa968d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ crate-type= ["cdylib"] datafusion-python = { git = "https://github.com/apache/datafusion-python.git", rev = "5c834934dec89bd96ff70df3b278e9d6fe78f7ec"} pyo3 = { version = "0.22.4", features = ["extension-module", "abi3-py38", "experimental-async"] } pyo3-log = "0.11.0" -sequila-core = { git = "https://github.com/biodatageeks/sequila-native.git", rev = "1a2eeb42d26753cd68ce5d981f6471655037abab" } +sequila-core = { git = "https://github.com/biodatageeks/sequila-native.git", rev = "07a36935177f8ffbfbaa7f63958384108efd7b4f" } datafusion = { version = "43.0.0"} arrow = "53.3.0" tokio = "1.42.0" diff --git a/benchmark/queries/0-1.sql b/benchmark/queries/0-1.sql deleted file mode 100644 index 1eb4146b..00000000 --- a/benchmark/queries/0-1.sql +++ /dev/null @@ -1,18 +0,0 @@ -SET sequila.prefer_interval_join TO true; -SET datafusion.execution.target_partitions=1; -SET sequila.interval_join_algorithm TO coitrees; -SET datafusion.optimizer.repartition_joins TO false; -SET datafusion.execution.coalesce_batches TO false; - -CREATE EXTERNAL TABLE a -STORED AS PARQUET -LOCATION '/Users/mwiewior/research/git/openstack-bdg-runners/ansible/roles/gha_runner/files/databio/chainRn4/*parquet'; - -CREATE EXTERNAL TABLE b -STORED AS PARQUET -LOCATION '/Users/mwiewior/research/git/openstack-bdg-runners/ansible/roles/gha_runner/files/databio/fBrain-DS14718/*parquet'; - -select count(1) from a join b - on a.contig = b.contig - and a.pos_end > b.pos_start - and a.pos_start < b.pos_end; diff --git a/benchmark/queries/0-3.sql b/benchmark/queries/0-3.sql deleted file mode 100644 index 50d5b5c7..00000000 --- a/benchmark/queries/0-3.sql +++ /dev/null @@ -1,18 +0,0 @@ -SET sequila.prefer_interval_join TO true; -SET datafusion.execution.target_partitions=8; -SET sequila.interval_join_algorithm TO coitrees; -SET datafusion.optimizer.repartition_joins TO false; -SET datafusion.execution.coalesce_batches TO false; - -CREATE EXTERNAL TABLE a -STORED AS PARQUET -LOCATION '/Users/mwiewior/research/git/openstack-bdg-runners/ansible/roles/gha_runner/files/databio-8p/chainRn4/*parquet'; - -CREATE EXTERNAL TABLE b -STORED AS PARQUET -LOCATION '/Users/mwiewior/research/git/openstack-bdg-runners/ansible/roles/gha_runner/files/databio-8p/chainOrnAna1/*parquet'; - -select count(1) from a join b - on a.contig = b.contig - and a.pos_end > b.pos_start - and a.pos_start < b.pos_end; diff --git a/benchmark/queries/0-8.sql b/benchmark/queries/0-8.sql deleted file mode 100644 index ae06168d..00000000 --- a/benchmark/queries/0-8.sql +++ /dev/null @@ -1,18 +0,0 @@ -SET sequila.prefer_interval_join TO true; -SET datafusion.execution.target_partitions=1; -SET sequila.interval_join_algorithm TO coitrees; -SET datafusion.optimizer.repartition_joins TO false; -SET datafusion.execution.coalesce_batches TO false; - -CREATE EXTERNAL TABLE a -STORED AS PARQUET -LOCATION '/Users/mwiewior/research/git/openstack-bdg-runners/ansible/roles/gha_runner/files/databio/chainRn4/*parquet'; - -CREATE EXTERNAL TABLE b -STORED AS PARQUET -LOCATION '/Users/mwiewior/research/git/openstack-bdg-runners/ansible/roles/gha_runner/files/databio/ex-rna/*parquet'; - -select count(1) from a join b - on a.contig = b.contig - and a.pos_end > b.pos_start - and a.pos_start < b.pos_end; diff --git a/benchmark/queries/7-8.sql b/benchmark/queries/7-8.sql deleted file mode 100644 index 089c4371..00000000 --- a/benchmark/queries/7-8.sql +++ /dev/null @@ -1,18 +0,0 @@ -SET sequila.prefer_interval_join TO true; -SET datafusion.execution.target_partitions=1; -SET sequila.interval_join_algorithm TO coitrees; -SET datafusion.optimizer.repartition_joins TO false; -SET datafusion.execution.coalesce_batches TO false; - -CREATE EXTERNAL TABLE a -STORED AS PARQUET -LOCATION '/Users/mwiewior/research/git/openstack-bdg-runners/ansible/roles/gha_runner/files/databio/ex-anno/*parquet'; - -CREATE EXTERNAL TABLE b -STORED AS PARQUET -LOCATION '/Users/mwiewior/research/git/openstack-bdg-runners/ansible/roles/gha_runner/files/databio/ex-rna/*parquet'; - -select count(1) from a join b - on a.contig = b.contig - and a.pos_end > b.pos_start - and a.pos_start < b.pos_end; diff --git a/benchmark/queries/complement/table_1.csv b/benchmark/queries/complement/table_1.csv deleted file mode 100644 index d1bbafea..00000000 --- a/benchmark/queries/complement/table_1.csv +++ /dev/null @@ -1,5 +0,0 @@ -chrom,start,end -chr1,1,5 -chr1,3,8 -chr1,8,10 -chr1,12,4 \ No newline at end of file diff --git a/benchmark/queries/complement/table_2.csv b/benchmark/queries/complement/table_2.csv deleted file mode 100644 index 1ef8d90a..00000000 --- a/benchmark/queries/complement/table_2.csv +++ /dev/null @@ -1,3 +0,0 @@ -chrom,size -chr1,100 -chrX,100 \ No newline at end of file diff --git a/benchmark/queries/complement/test.sql b/benchmark/queries/complement/test.sql deleted file mode 100644 index 8cf5e76f..00000000 --- a/benchmark/queries/complement/test.sql +++ /dev/null @@ -1,63 +0,0 @@ -CREATE EXTERNAL TABLE table_1 -STORED AS CSV -LOCATION '/Users/mwiewior/research/git/polars-bio/benchmark/queries/complement/table_1.csv' -OPTIONS ('has_header' 'true'); - -CREATE EXTERNAL TABLE chrom_sizes -STORED AS CSV -LOCATION '/Users/mwiewior/research/git/polars-bio/benchmark/queries/complement/table_2.csv' -OPTIONS ('has_header' 'true'); - - -WITH sorted_intervals AS ( - SELECT chrom, start, end -FROM table_1 -ORDER BY chrom, start - ), - gaps AS ( -SELECT - si1.chrom, - si1.end AS gap_start, - si2.start AS gap_end -FROM sorted_intervals si1 - JOIN sorted_intervals si2 -ON si1.chrom = si2.chrom AND si1.end < si2.start -WHERE NOT EXISTS ( - SELECT 1 - FROM sorted_intervals si3 - WHERE si3.chrom = si1.chrom - AND si3.start < si2.start - AND si3.start > si1.end - ) - ), - boundary_gaps AS ( -SELECT - cs.chrom, - 0 AS start, - MIN(si.start) AS end -FROM chrom_sizes cs - LEFT JOIN sorted_intervals si ON cs.chrom = si.chrom -GROUP BY cs.chrom - -UNION ALL - -SELECT - cs.chrom, - MAX(si.end) AS start, - cs.size AS end -FROM chrom_sizes cs - LEFT JOIN sorted_intervals si ON cs.chrom = si.chrom -GROUP BY cs.chrom, cs.size - ), - all_gaps AS ( -SELECT chrom, gap_start AS start, gap_end AS end -FROM gaps - -UNION ALL - -SELECT chrom, start, end -FROM boundary_gaps - ) -SELECT chrom, start, end, chrom AS view_region -FROM all_gaps -ORDER BY chrom, start; diff --git a/benchmark/queries/nearest/table_1.csv b/benchmark/queries/nearest/table_1.csv deleted file mode 100644 index f46d0775..00000000 --- a/benchmark/queries/nearest/table_1.csv +++ /dev/null @@ -1,2 +0,0 @@ -chrom,start,end -chr1,1,5 diff --git a/benchmark/queries/nearest/table_2.csv b/benchmark/queries/nearest/table_2.csv deleted file mode 100644 index 0c6473ee..00000000 --- a/benchmark/queries/nearest/table_2.csv +++ /dev/null @@ -1,3 +0,0 @@ -chrom,start,end -chr1,4,8 -chr1,10,11 diff --git a/benchmark/queries/nearest/test.sql b/benchmark/queries/nearest/test.sql deleted file mode 100644 index c6703dd4..00000000 --- a/benchmark/queries/nearest/test.sql +++ /dev/null @@ -1,58 +0,0 @@ -SET sequila.prefer_interval_join TO false; - -CREATE EXTERNAL TABLE table_A -STORED AS CSV -LOCATION '/Users/mwiewior/research/git/polars-bio/benchmark/queries/nearest/table_1.csv' -OPTIONS ('has_header' 'true'); - -CREATE EXTERNAL TABLE table_B -STORED AS CSV -LOCATION '/Users/mwiewior/research/git/polars-bio/benchmark/queries/nearest/table_2.csv' -OPTIONS ('has_header' 'true'); - - -explain WITH Distances AS ( - SELECT - A.chrom AS chrom_A, - A.start AS start_A, - A.end AS end_A, - B.chrom AS chrom_B, - B.start AS start_B, - B.end AS end_B, - CASE - WHEN A.end < B.start THEN B.start - A.end - WHEN B.end < A.start THEN A.start - B.end - ELSE 0 -- Overlapping ranges - END AS distance - FROM - table_A A - JOIN - table_B B - ON - A.chrom = B.chrom -), - Nearest AS ( - SELECT - chrom_A, - start_A, - end_A, - chrom_B, - start_B, - end_B, - distance, - ROW_NUMBER() OVER (PARTITION BY chrom_A, start_A, end_A ORDER BY distance ASC) AS rank - FROM - Distances - ) -SELECT - chrom_A, - start_A, - end_A, - chrom_B, - start_B, - end_B, - distance -FROM - Nearest -WHERE - rank = 2; diff --git a/benchmark/results/apple-silicon/0-1.json b/benchmark/results/apple-silicon/0-1.json new file mode 100644 index 00000000..d0870dd8 --- /dev/null +++ b/benchmark/results/apple-silicon/0-1.json @@ -0,0 +1,58 @@ +{ + "inputs": { + "df_1_num": 2350965, + "df_2_num": 198621 + }, + "output_num": 320955, + "results": [ + { + "name": "bioframe", + "min": 0.4824440833326662, + "max": 0.4864661946630804, + "mean": 0.48469012044208487, + "speedup": 0.16860836806000543 + }, + { + "name": "polars_bio", + "min": 0.09075104166792396, + "max": 0.09702943066561905, + "mean": 0.09311920377755693, + "speedup": 0.8776150021403402 + }, + { + "name": "pyranges0", + "min": 0.07799816666617214, + "max": 0.08790026399947237, + "mean": 0.0817228102225474, + "speedup": 1.0 + }, + { + "name": "pyranges1", + "min": 0.23589159733577011, + "max": 0.2378742219977236, + "mean": 0.23700583333427658, + "speedup": 0.344813497089265 + }, + { + "name": "pybedtools0", + "min": 1.4111382639966905, + "max": 1.4246090833330527, + "mean": 1.416416699110414, + "speedup": 0.05769687004811066 + }, + { + "name": "pygenomics", + "min": 1.390716375002133, + "max": 1.402293403002356, + "mean": 1.395175759334557, + "speedup": 0.05857527962034397 + }, + { + "name": "genomicranges", + "min": 4.046394958335441, + "max": 4.0558332916649915, + "mean": 4.050494356556253, + "speedup": 0.020176008908707254 + } + ] +} diff --git a/benchmark/results/apple-silicon/0-7.json b/benchmark/results/apple-silicon/0-7.json new file mode 100644 index 00000000..65f3249b --- /dev/null +++ b/benchmark/results/apple-silicon/0-7.json @@ -0,0 +1,58 @@ +{ + "inputs": { + "df_1_num": 2350965, + "df_2_num": 1194285 + }, + "output_num": 2761621, + "results": [ + { + "name": "bioframe", + "min": 0.2980392776662484, + "max": 0.30927084732684307, + "mean": 0.30290485188662486, + "speedup": 0.29821783673328733 + }, + { + "name": "polars_bio", + "min": 0.08932411100249738, + "max": 0.09219969466600257, + "mean": 0.09033162966564608, + "speedup": 1.0 + }, + { + "name": "pyranges0", + "min": 0.09647758333206487, + "max": 0.10345558333210647, + "mean": 0.10102296299818488, + "speedup": 0.8941692758236471 + }, + { + "name": "pyranges1", + "min": 0.19562062499850677, + "max": 0.19802473599944884, + "mean": 0.19714646755407253, + "speedup": 0.45819552734755586 + }, + { + "name": "pybedtools0", + "min": 1.0045766390006368, + "max": 1.0130972083328136, + "mean": 1.0077013518894091, + "speedup": 0.08964127069620086 + }, + { + "name": "pygenomics", + "min": 4.264574694330804, + "max": 4.275965152997135, + "mean": 4.26905469455394, + "speedup": 0.021159632782611733 + }, + { + "name": "genomicranges", + "min": 2.919674833334284, + "max": 2.9267854306672234, + "mean": 2.9235494306647323, + "speedup": 0.0308979313700563 + } + ] +} \ No newline at end of file diff --git a/benchmark/results/apple-silicon/0-8.json b/benchmark/results/apple-silicon/0-8.json new file mode 100644 index 00000000..705429b5 --- /dev/null +++ b/benchmark/results/apple-silicon/0-8.json @@ -0,0 +1,58 @@ +{ + "inputs": { + "df_1_num": 2350965, + "df_2_num": 9944559 + }, + "output_num": 164196784, + "results": [ + { + "name": "bioframe", + "min": 15.630508430331247, + "max": 16.719792805665445, + "mean": 16.080008865665555, + "speedup": 0.18642745012968612 + }, + { + "name": "polars_bio", + "min": 2.882899638667974, + "max": 3.1351002083344306, + "mean": 2.997755050888776, + "speedup": 1.0 + }, + { + "name": "pyranges0", + "min": 9.276095166666588, + "max": 10.15810941666617, + "mean": 9.761879657443691, + "speedup": 0.30708789250468876 + }, + { + "name": "pyranges1", + "min": 13.076820124998145, + "max": 13.510233986002277, + "mean": 13.329948374999931, + "speedup": 0.22488872173811336 + }, + { + "name": "pybedtools0", + "min": 322.9229150833368, + "max": 335.12307094466814, + "mean": 329.65914210189015, + "speedup": 0.00909349891459172 + }, + { + "name": "pygenomics", + "min": 128.84953573599827, + "max": 132.10968911099675, + "mean": 130.08909561566543, + "speedup": 0.02304386110689345 + }, + { + "name": "genomicranges", + "min": 234.23743527799766, + "max": 239.3151572223384, + "mean": 236.504564745557, + "speedup": 0.012675252395715514 + } + ] +} diff --git a/benchmark/results/apple-silicon/1-2.json b/benchmark/results/apple-silicon/1-2.json new file mode 100644 index 00000000..deb64e38 --- /dev/null +++ b/benchmark/results/apple-silicon/1-2.json @@ -0,0 +1,58 @@ +{ + "inputs": { + "df_1_num": 198621, + "df_2_num": 438694 + }, + "output_num": 54246, + "results": [ + { + "name": "bioframe", + "min": 0.10073762500057153, + "max": 0.10154148600122426, + "mean": 0.10111909722197905, + "speedup": 0.25305574464594827 + }, + { + "name": "polars_bio", + "min": 0.032156180668001376, + "max": 0.0355005000019446, + "mean": 0.03339360188854496, + "speedup": 0.7662775800837371 + }, + { + "name": "pyranges0", + "min": 0.024099944668705575, + "max": 0.02827072200307157, + "mean": 0.025588768445433948, + "speedup": 1.0 + }, + { + "name": "pyranges1", + "min": 0.05377036133237804, + "max": 0.054647471998274945, + "mean": 0.05412140744253217, + "speedup": 0.472803085777193 + }, + { + "name": "pybedtools0", + "min": 0.2819691666663857, + "max": 0.2833851113343068, + "mean": 0.28285702322156997, + "speedup": 0.09046538125160689 + }, + { + "name": "pygenomics", + "min": 1.4249745693329412, + "max": 1.436369222336604, + "mean": 1.430531254667181, + "speedup": 0.0178875983044406 + }, + { + "name": "genomicranges", + "min": 0.9727168609970249, + "max": 0.9790132083338298, + "mean": 0.9757608008868476, + "speedup": 0.0262244275668554 + } + ] +} diff --git a/benchmark/results/apple-silicon/2-7.json b/benchmark/results/apple-silicon/2-7.json new file mode 100644 index 00000000..fc23141b --- /dev/null +++ b/benchmark/results/apple-silicon/2-7.json @@ -0,0 +1,58 @@ +{ + "inputs": { + "df_1_num": 438694, + "df_2_num": 1194285 + }, + "output_num": 273500, + "results": [ + { + "name": "bioframe", + "min": 0.2980392776662484, + "max": 0.30927084732684307, + "mean": 0.30290485188662486, + "speedup": 0.29821783673328733 + }, + { + "name": "polars_bio", + "min": 0.08932411100249738, + "max": 0.09219969466600257, + "mean": 0.09033162966564608, + "speedup": 1.0 + }, + { + "name": "pyranges0", + "min": 0.09647758333206487, + "max": 0.10345558333210647, + "mean": 0.10102296299818488, + "speedup": 0.8941692758236471 + }, + { + "name": "pyranges1", + "min": 0.19562062499850677, + "max": 0.19802473599944884, + "mean": 0.19714646755407253, + "speedup": 0.45819552734755586 + }, + { + "name": "pybedtools0", + "min": 1.0045766390006368, + "max": 1.0130972083328136, + "mean": 1.0077013518894091, + "speedup": 0.08964127069620086 + }, + { + "name": "pygenomics", + "min": 4.264574694330804, + "max": 4.275965152997135, + "mean": 4.26905469455394, + "speedup": 0.021159632782611733 + }, + { + "name": "genomicranges", + "min": 2.919674833334284, + "max": 2.9267854306672234, + "mean": 2.9235494306647323, + "speedup": 0.0308979313700563 + } + ] +} diff --git a/benchmark/results/apple-silicon/3-7.json b/benchmark/results/apple-silicon/3-7.json new file mode 100644 index 00000000..ca800f9e --- /dev/null +++ b/benchmark/results/apple-silicon/3-7.json @@ -0,0 +1,58 @@ +{ + "inputs": { + "df_1_num": 1956864, + "df_2_num": 1194285 + }, + "output_num": 4408383, + "results": [ + { + "name": "bioframe", + "min": 0.9651126806663038, + "max": 0.9735246386650639, + "mean": 0.9680251064419281, + "speedup": 0.21091899669168662 + }, + { + "name": "polars_bio", + "min": 0.19807397232701382, + "max": 0.21415665267462222, + "mean": 0.20417488422309463, + "speedup": 1.0 + }, + { + "name": "pyranges0", + "min": 0.299306430669579, + "max": 0.3361351666681003, + "mean": 0.3225051574441345, + "speedup": 0.6330902917683185 + }, + { + "name": "pyranges1", + "min": 1.0402721390031122, + "max": 1.0440249723324087, + "mean": 1.0427527454448864, + "speedup": 0.1958037369021591 + }, + { + "name": "pybedtools0", + "min": 8.970137541667404, + "max": 9.048951763669416, + "mean": 9.003954847223618, + "speedup": 0.02267613373095182 + }, + { + "name": "pygenomics", + "min": 8.626979291671887, + "max": 8.637451514000228, + "mean": 8.632298328781163, + "speedup": 0.023652436054295067 + }, + { + "name": "genomicranges", + "min": 10.57524026366688, + "max": 10.5942114443363, + "mean": 10.584906157222576, + "speedup": 0.019289248406210626 + } + ] +} diff --git a/benchmark/results/apple-silicon/4-8.json b/benchmark/results/apple-silicon/4-8.json new file mode 100644 index 00000000..49e1793c --- /dev/null +++ b/benchmark/results/apple-silicon/4-8.json @@ -0,0 +1,58 @@ +{ + "inputs": { + "df_1_num": 7684066, + "df_2_num": 9944559 + }, + "output_num": 227832153, + "results": [ + { + "name": "bioframe", + "min": 22.91120584734017, + "max": 23.118099846993573, + "mean": 23.030571874890786, + "speedup": 0.15997506012713292 + }, + { + "name": "polars_bio", + "min": 3.5413247360071787, + "max": 3.9377595280044866, + "mean": 3.68431712044791, + "speedup": 1.0 + }, + { + "name": "pyranges0", + "min": 13.035069347339837, + "max": 13.510202666666979, + "mean": 13.225004953778503, + "speedup": 0.27858720154167255 + }, + { + "name": "pyranges1", + "min": 20.924920874997042, + "max": 21.65729676366512, + "mean": 21.398281009111088, + "speedup": 0.17217818192401432 + }, + { + "name": "pybedtools0", + "min": 505.89715663900523, + "max": 521.2392763610018, + "mean": 511.3106857593359, + "speedup": 0.007205632941107839 + }, + { + "name": "pygenomics", + "min": 159.8838469166658, + "max": 160.94232931933948, + "mean": 160.30697036100253, + "speedup": 0.022982887844184376 + }, + { + "name": "genomicranges", + "min": 322.217280152671, + "max": 322.49039133332553, + "mean": 322.3716621758876, + "speedup": 0.011428787181789347 + } + ] +} diff --git a/benchmark/results/apple-silicon/7-8.json b/benchmark/results/apple-silicon/7-8.json new file mode 100644 index 00000000..3a868797 --- /dev/null +++ b/benchmark/results/apple-silicon/7-8.json @@ -0,0 +1,107 @@ +{ + "inputs": { + "df_1_num": 1194285, + "df_2_num": 9944559 + }, + "output_num": 307184634, + "results": [ + { + "name": "bioframe", + "min": 22.91120584734017, + "max": 23.118099846993573, + "mean": 23.030571874890786, + "speedup": 0.15150635688648495 + }, + { + "name": "polars_bio", + "min": 3.5413247360071787, + "max": 3.9377595280044866, + "mean": 3.68431712044791, + "speedup": 0.9470623531323078 + }, + { + "name": "pyranges0", + "min": 13.035069347339837, + "max": 13.510202666666979, + "mean": 13.225004953778503, + "speedup": 0.2638394506446009 + }, + { + "name": "pyranges1", + "min": 20.924920874997042, + "max": 21.65729676366512, + "mean": 21.398281009111088, + "speedup": 0.1630634741309996 + }, + { + "name": "pybedtools0", + "min": 505.89715663900523, + "max": 521.2392763610018, + "mean": 511.3106857593359, + "speedup": 0.006824183689013262 + }, + { + "name": "pygenomics", + "min": 159.8838469166658, + "max": 160.94232931933948, + "mean": 160.30697036100253, + "speedup": 0.021766227843489167 + }, + { + "name": "genomicranges", + "min": 322.217280152671, + "max": 322.49039133332553, + "mean": 322.3716621758876, + "speedup": 0.010823774081833775 + }, + { + "name": "bioframe", + "min": 29.128663666672463, + "max": 29.9931820416629, + "mean": 29.518215175889463, + "speedup": 0.11820762268265783 + }, + { + "name": "polars_bio", + "min": 3.26043755565964, + "max": 3.8972603473327276, + "mean": 3.489278041777046, + "speedup": 1.0 + }, + { + "name": "pyranges0", + "min": 16.615282875000656, + "max": 16.983202430671856, + "mean": 16.753369328779325, + "speedup": 0.20827321199104012 + }, + { + "name": "pyranges1", + "min": 44.154733083337, + "max": 44.4963572776663, + "mean": 44.37964724533311, + "speedup": 0.07862338387883361 + }, + { + "name": "pybedtools0", + "min": 555.4805318053308, + "max": 559.9474212220035, + "mean": 556.9867719350021, + "speedup": 0.006264561777033062 + }, + { + "name": "pygenomics", + "min": 156.7244200556694, + "max": 157.32151397200263, + "mean": 156.9354242082239, + "speedup": 0.022233845923450832 + }, + { + "name": "genomicranges", + "min": 416.0955732223326, + "max": 417.2842364446648, + "mean": 416.6999997594459, + "speedup": 0.008373597417305853 + } + ] +} diff --git a/benchmark/run_bench.ipynb b/benchmark/run_bench.ipynb deleted file mode 100644 index ea1e40b6..00000000 --- a/benchmark/run_bench.ipynb +++ /dev/null @@ -1,1532 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "eb072f632cedbed3", - "metadata": {}, - "source": "## Install dependencies" - }, - { - "cell_type": "code", - "execution_count": null, - "id": "initial_id", - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "!pip install --force-reinstall bioframe==0.7.2 pyarrow fastparquet pyranges==0.1.2 pybedtools==0.10.0 git+https://gitlab.com/gtamazian/pygenomics.git" - ] - }, - { - "cell_type": "markdown", - "id": "11ecf3f76791210", - "metadata": {}, - "source": "## Setup the environment\n" - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "bc154f4724028a04", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T06:43:35.806399Z", - "start_time": "2024-12-16T06:43:35.801676Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "env: BENCH_DATA_ROOT=/Users/mwiewior/research/git/openstack-bdg-runners/ansible/roles/gha_runner/files/databio\n", - "env: SEQUILA_CLI=/Users/mwiewior/CLionProjects/sequila-native/target/release/sequila-cli\n" - ] - } - ], - "source": [ - "%env BENCH_DATA_ROOT=/Users/mwiewior/research/git/openstack-bdg-runners/ansible/roles/gha_runner/files/databio\n", - "%env SEQUILA_CLI=/Users/mwiewior/CLionProjects/sequila-native/target/release/sequila-cli" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "ae490515180f0af4", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T06:43:37.130136Z", - "start_time": "2024-12-16T06:43:37.128323Z" - } - }, - "outputs": [], - "source": [ - "import os\n", - "\n", - "BENCH_DATA_ROOT = os.getenv(\"BENCH_DATA_ROOT\", \"/data/bench_data/databio/\")" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "4ade8155f7bea44b", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T06:43:38.724196Z", - "start_time": "2024-12-16T06:43:38.482490Z" - } - }, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "21bb288ddcb3bc12", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T06:52:36.306325Z", - "start_time": "2024-12-16T06:52:36.304523Z" - } - }, - "outputs": [], - "source": [ - "# 0-\n", - "df_path_0 = f\"{BENCH_DATA_ROOT}/chainRn4/*.parquet\"\n", - "df_path_1 = f\"{BENCH_DATA_ROOT}/fBrain-DS14718/*.parquet\"" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "9d4b74fee7c23e1f", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T06:52:37.511959Z", - "start_time": "2024-12-16T06:52:37.510079Z" - } - }, - "outputs": [], - "source": [ - "# 0-3\n", - "df_path_0 = f\"{BENCH_DATA_ROOT}/chainRn4/*.parquet\"\n", - "df_path_3 = f\"{BENCH_DATA_ROOT}/chainOrnAna1/*.parquet\"" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "696876ae1fc468b9", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T06:52:38.857019Z", - "start_time": "2024-12-16T06:52:38.855346Z" - } - }, - "outputs": [], - "source": [ - "# 0-8\n", - "df_path_0 = f\"{BENCH_DATA_ROOT}/chainRn4/*.parquet\"\n", - "df_path_8 = f\"{BENCH_DATA_ROOT}/ex-rna/*.parquet\"" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "fdd8e48c1393bc2b", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T06:52:41.350810Z", - "start_time": "2024-12-16T06:52:41.348934Z" - } - }, - "outputs": [], - "source": [ - "# 7-8\n", - "df_path_7 = f\"{BENCH_DATA_ROOT}/ex-anno/*.parquet\"\n", - "df_path_8 = f\"{BENCH_DATA_ROOT}/ex-rna/*.parquet\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "948c4a842a06030a", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "3621a226d6b36e61", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T06:52:58.499429Z", - "start_time": "2024-12-16T06:52:58.246305Z" - } - }, - "outputs": [], - "source": [ - "df_0 = pd.read_parquet(df_path_0.replace(\"*.parquet\", \"\"), engine=\"pyarrow\")\n", - "df_1 = pd.read_parquet(df_path_1.replace(\"*.parquet\", \"\"), engine=\"pyarrow\")\n", - "df_3 = pd.read_parquet(df_path_3.replace(\"*.parquet\", \"\"), engine=\"pyarrow\")\n", - "df_7 = pd.read_parquet(df_path_7.replace(\"*.parquet\", \"\"), engine=\"pyarrow\")\n", - "df_8 = pd.read_parquet(df_path_8.replace(\"*.parquet\", \"\"), engine=\"pyarrow\")" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "90831b206d78970a", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T06:53:03.084092Z", - "start_time": "2024-12-16T06:53:02.506476Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "contig 320955\n", - "pos_start 320955\n", - "pos_end 320955\n", - "contig_ 320955\n", - "pos_start_ 320955\n", - "pos_end_ 320955\n", - "dtype: int64" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import bioframe as bf\n", - "\n", - "bf.overlap(\n", - " df_0,\n", - " df_1,\n", - " cols1=(\"contig\", \"pos_start\", \"pos_end\"),\n", - " cols2=(\"contig\", \"pos_start\", \"pos_end\"),\n", - " how=\"inner\",\n", - ").count()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "7a7e25a918672b12", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-11T23:03:38.690900Z", - "start_time": "2024-12-11T23:03:38.455518Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0 row(s) fetched. \n", - "Elapsed 0.018 seconds.\n", - "\n", - "0 row(s) fetched. \n", - "Elapsed 0.000 seconds.\n", - "\n", - "0 row(s) fetched. \n", - "Elapsed 0.000 seconds.\n", - "\n", - "0 row(s) fetched. \n", - "Elapsed 0.000 seconds.\n", - "\n", - "0 row(s) fetched. \n", - "Elapsed 0.000 seconds.\n", - "\n", - "0 row(s) fetched. \n", - "Elapsed 0.009 seconds.\n", - "\n", - "0 row(s) fetched. \n", - "Elapsed 0.000 seconds.\n", - "\n", - "+-----------------+\n", - "| count(Int64(1)) |\n", - "+-----------------+\n", - "| 320955 |\n", - "+-----------------+\n", - "1 row(s) fetched. \n", - "Elapsed 0.138 seconds.\n", - "\n" - ] - } - ], - "source": [ - "%%bash\n", - "$SEQUILA_CLI --file queries/0-1.sql" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fcb27a787b8b7c97", - "metadata": {}, - "outputs": [], - "source": [ - "bf.overlap(\n", - " df_0,\n", - " df_3,\n", - " cols1=(\"contig\", \"pos_start\", \"pos_end\"),\n", - " cols2=(\"contig\", \"pos_start\", \"pos_end\"),\n", - " how=\"inner\",\n", - ").count()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "186b1e6fca447dc7", - "metadata": {}, - "outputs": [], - "source": [ - "%%bash\n", - "$SEQUILA_CLI --file queries/0-3.sql" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "74d31db9ac48f44f", - "metadata": {}, - "outputs": [], - "source": [ - "bf.overlap(\n", - " df_0,\n", - " df_8,\n", - " cols1=(\"contig\", \"pos_start\", \"pos_end\"),\n", - " cols2=(\"contig\", \"pos_start\", \"pos_end\"),\n", - " how=\"inner\",\n", - ").count()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bd5a331edde24cb1", - "metadata": {}, - "outputs": [], - "source": [ - "%%bash\n", - "$SEQUILA_CLI --file queries/0-8.sql" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d35eb67e7a3a3822", - "metadata": {}, - "outputs": [], - "source": [ - "bf.overlap(\n", - " df_7,\n", - " df_8,\n", - " cols1=(\"contig\", \"pos_start\", \"pos_end\"),\n", - " cols2=(\"contig\", \"pos_start\", \"pos_end\"),\n", - " how=\"inner\",\n", - ").count()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d480fbb838b5a255", - "metadata": {}, - "outputs": [], - "source": [ - "%%bash\n", - "$SEQUILA_CLI --file queries/7-8.sql" - ] - }, - { - "cell_type": "markdown", - "id": "958f97c5c7016f52", - "metadata": {}, - "source": "### pyranges" - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "ab270537110baba2", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T06:44:07.792613Z", - "start_time": "2024-12-16T06:44:07.699735Z" - } - }, - "outputs": [], - "source": [ - "import pyranges as pr\n", - "\n", - "\n", - "def df2pr(df):\n", - " return pr.PyRanges(\n", - " chromosomes=df.contig,\n", - " starts=df.pos_start,\n", - " ends=df.pos_end,\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "920fc6c0e98b23d4", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T06:44:11.731196Z", - "start_time": "2024-12-16T06:44:10.496332Z" - } - }, - "outputs": [], - "source": [ - "df_0_pr = df2pr(df_0)\n", - "df_1_pr = df2pr(df_1)\n", - "df_3_pr = df2pr(df_3)\n", - "df_7_pr = df2pr(df_7)\n", - "df_8_pr = df2pr(df_8)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d5514b11e4315a18", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f57a68d0ca3e6894", - "metadata": {}, - "outputs": [], - "source": [ - "len(df_0_pr.join(df_1_pr))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "61d44780f5eed493", - "metadata": {}, - "outputs": [], - "source": [ - "len(df_0_pr.join(df_3_pr))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3bad2681af94f295", - "metadata": {}, - "outputs": [], - "source": [ - "len(df_0_pr.join(df_8_pr))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "673b2468c4418264", - "metadata": {}, - "outputs": [], - "source": [ - "len(df_7_pr.join(df_8_pr))" - ] - }, - { - "cell_type": "markdown", - "id": "1eb620562954f9c3", - "metadata": {}, - "source": "### pybedtools" - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8838e8e4ff90fc0f", - "metadata": {}, - "outputs": [], - "source": [ - "import pybedtools" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "998842945f3e529a", - "metadata": {}, - "outputs": [], - "source": [ - "df_0_bed = pybedtools.BedTool.from_dataframe(df_0)\n", - "df_1_bed = pybedtools.BedTool.from_dataframe(df_1)\n", - "df_3_bed = pybedtools.BedTool.from_dataframe(df_3)\n", - "df_7_bed = pybedtools.BedTool.from_dataframe(df_7)\n", - "df_8_bed = pybedtools.BedTool.from_dataframe(df_8)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "78ca9b3a2e476162", - "metadata": {}, - "outputs": [], - "source": [ - "df_0_bed.intersect(df_1_bed).count()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "45f3fa54c1ac185d", - "metadata": {}, - "outputs": [], - "source": [ - "df_0_bed.intersect(df_3_bed).count()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e04aee9aa177d52c", - "metadata": {}, - "outputs": [], - "source": [ - "df_0_bed.intersect(df_8_bed).count()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "af842070d00c48db", - "metadata": {}, - "outputs": [], - "source": [ - "df_7_bed.intersect(df_8_bed).count()" - ] - }, - { - "cell_type": "markdown", - "id": "7808a7e53de88910", - "metadata": {}, - "source": "### pygenomics" - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3438785aa2066da2", - "metadata": {}, - "outputs": [], - "source": [ - "from pygenomics.interval import GenomicBase\n", - "import itertools" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "23807573c7e55fc1", - "metadata": {}, - "outputs": [], - "source": [ - "df_0_pg = GenomicBase([(r.contig, r.pos_start, r.pos_end) for r in df_0.itertuples()])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d7fe544b1190fbd", - "metadata": {}, - "outputs": [], - "source": [ - "df_1_pg = GenomicBase([(r.contig, r.pos_start, r.pos_end) for r in df_1.itertuples()])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3401359170ce0752", - "metadata": {}, - "outputs": [], - "source": [ - "df_7_pg = GenomicBase([(r.contig, r.pos_start, r.pos_end) for r in df_7.itertuples()])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "787ca4a4c8162110", - "metadata": {}, - "outputs": [], - "source": [ - "df_1_a = df_1.values.tolist()\n", - "df_3_a = df_3.values.tolist()\n", - "df_8_a = df_8.values.tolist()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7dc826a7e22d234c", - "metadata": {}, - "outputs": [], - "source": [ - "df_1_a[1]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "22d742fe4f7a5581", - "metadata": {}, - "outputs": [], - "source": [ - "len(\n", - " list(\n", - " itertools.chain.from_iterable(\n", - " [df_0_pg.find_all((r[0], r[1], r[2])) for r in df_1_a]\n", - " )\n", - " )\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6b776729965815f2", - "metadata": {}, - "outputs": [], - "source": [ - "# slower than array\n", - "# len(list(itertools.chain.from_iterable([df_0_pg.find_all((r.contig, r.pos_start, r.pos_end)) for r in df_3.itertuples()])))\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2c1e2dd48f2406e1", - "metadata": {}, - "outputs": [], - "source": [ - "len(\n", - " list(\n", - " itertools.chain.from_iterable(\n", - " [df_0_pg.find_all((r[0], r[1], r[2])) for r in df_3_a]\n", - " )\n", - " )\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5f1194dc906f8944", - "metadata": {}, - "outputs": [], - "source": [ - "len(\n", - " list(\n", - " itertools.chain.from_iterable(\n", - " [df_0_pg.find_all((r[0], r[1], r[2])) for r in df_8_a]\n", - " )\n", - " )\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "79a036041cdbc3b3", - "metadata": {}, - "outputs": [], - "source": [ - "len(\n", - " list(\n", - " itertools.chain.from_iterable(\n", - " [\n", - " df_7_pg.find_all((r.contig, r.pos_start, r.pos_end))\n", - " for r in df_8.itertuples()\n", - " ]\n", - " )\n", - " )\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "37203b78de5f8e3b", - "metadata": {}, - "outputs": [], - "source": [ - "len(\n", - " list(\n", - " itertools.chain.from_iterable(\n", - " [df_7_pg.find_all((r[0], r[1], r[2])) for r in df_8_a]\n", - " )\n", - " )\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9d637ac58bcbc60e", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "id": "2d7c7ab26897912", - "metadata": {}, - "source": "" - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "f77062ce640cc526", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-15T13:21:32.204321Z", - "start_time": "2024-12-15T13:21:32.197916Z" - } - }, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "\n", - "\n", - "def plot_metrics(metrics, labels, title):\n", - " x = np.arange(len(labels)) # the label locations\n", - " width = 0.10 # the width of the bars\n", - " fig, ax = plt.subplots()\n", - " k = 0\n", - " for m in metrics:\n", - " ax.bar(\n", - " x + width * k,\n", - " [\n", - " metrics[m][\"0-1\"],\n", - " metrics[m][\"0-3\"],\n", - " metrics[m][\"0-8\"],\n", - " metrics[m][\"7-8\"],\n", - " ],\n", - " width,\n", - " label=m,\n", - " )\n", - " k += 1\n", - " ax.set_xticks(x)\n", - " ax.set_xticklabels(labels)\n", - " ax.set_ylabel(\"Time [s]\")\n", - " ax.set_title(title)\n", - " ax.legend(loc=\"upper center\", bbox_to_anchor=(0.5, -0.05), shadow=True, ncol=4)\n", - " ax.grid(True)\n", - " fig.set_size_inches(10, 5)\n", - " plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "75aba28753e4572c", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-15T13:21:33.478961Z", - "start_time": "2024-12-15T13:21:33.400773Z" - } - }, - "outputs": [ - { - "data": { - "image/png": "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Dipbtqz69++vl19+OVu/D3Xnwx7s7e3l7++v7t27a/r06XJycspZ8FlYuXKlnn766bu2OXfunMqVK2eV7cF6uLIF5KKiRYuqRIkSuR0GcN9s9YPojo6O8vX1LVRPrMqJCxcuKDk5WR06dJCfn59cXV1zO6R8o23btoqJiVFMTIx27typIkWKqGPHjpJuf1D29fXN0Q+wnj17Vn5+fmrcuHGW69rqfQLrSc+LM2fOaMyYMYqIiNCsWbOyvf6KFSsUExOjc+fO6e2339bq1av12muvWS2+Xr16mfM2JiZGISEhGjhwoMW8gIAAq20P1kOxhXznk08+UY0aNeTi4qISJUqodevWSkhIkCS99957qlq1qpydnfXQQw/p7bfftlj38OHDql27tpydnVWvXj1t3LjxnsM+0ofvbNu2TVWrVlXRokXNJ+V033zzjdq0aaOSJUvK09NTzZs313fffWdenv5N0+OPPy6TyWSevnMY4fbt2+Xs7Jzh2/MXXnhBjz76f9/gfvXVV2ratKlcXFwUEBCgESNGmPcfhUuLFi00bNgwDRs2TJ6enipZsqQmTpxoHqJx7do19e/fX8WLF5erq6vatWunM2fOZNnf2bNn1blzZ/n4+Kho0aKqX7++duzYYdGmXLlymjZtmvr37y8PDw8999xzunXrloYNGyY/Pz85OzsrMDBQ06dPv2f8P/74oxo3bixnZ2c9/PDD2rt3r3lZZsMIP/30U1WvXl1OTk4qV66c5syZk61jNGLECL344ovy8vKSr6+vIiIiLNrMnTtXNWrUkJubmwICAjRkyBDz/QR79uzR008/rRs3bshkMslkMmVY/04mk0lLlixRu3bt5OLiogoVKuiTTz65Z5z/tHLlSpUtW1aurq56/PHHdeXKFYtlNWrcvupaoUIFmUwmnT9/PsfbKKycnJzk6+srX19f1apVSy+99JJ+/fVX/fHHH5kOI9y7d68aNGggJycn+fn56aWXXlJKSoqk21dEhg8frgsXLlic29PfmyNHjlTJkiUVFhYm6e65Jv3f/zebN29WUFCQXF1d1b17dyUmJmrVqlUqV66cihcvrhEjRig1NdW8XlJSksaOHavSpUvLzc1NDRs21J49e2x+LAuS9LwIDAzU4MGD1bp1a3300Ufy8PDI8B7etGmT3NzcdPPmTfO8YsWKydfXVwEBAerYsaM6d+5s8TlAkj777DPVqVNHzs7OqlChgqZMmWLOJUk6c+aMmjVrJmdnZ1WrVk2RkZHmZS4uLua89fX1laOjo1xdXc3Tt27dUteuXVW0aFF5eHioZ8+eunTpksX2lyxZoooVK8rR0VFBQUFavXp1lsfjfs/ryIhiC/lKTEyM+vTpo2eeeUanTp3Snj171LVrVxmGoTVr1mjSpEl6/fXXderUKb3xxhuaOHGieWhAfHy8OnbsqGrVqunIkSOKiIjQ2LFjs7XdxMREzZ49W6tXr9a+fft04cIFi3Vv3ryp8PBwffXVVzp48KAqV66s9u3bm0/E33zzjaT/++YrffpOrVq1UrFixfTpp5+a56Wmpmr9+vXq27evpNsfhtu2batu3brp2LFjWr9+vb766isNGzbs/g4o8r1Vq1apSJEiOnz4sObPn6+5c+fqvffek3T7g+C3336rzz//XFFRUTIMQ+3bt8/yKVDx8fFq3769du7cqaNHj6pt27bq1KmTLly4YNFu9uzZqlmzpo4ePaqJEydqwYIF+vzzz/XRRx/p9OnTWrNmTbaGsowbN05jxozR0aNHFRISok6dOlkUFXc6cuSIevbsqd69e+v48eOKiIjQxIkTtXLlymwdIzc3Nx06dEgzZ87U1KlTLT7E2NnZacGCBTpx4oRWrVqlXbt26cUXX5R0ezjjW2+9JQ8PD/O3x/c6b0ycOFHdunXT999/r759+6p37946derUPeNMd+jQIQ0YMEDDhg1TdHS0WrZsafENea9evcxF8OHDh/lG+1+Ij4/Xhx9+qEqVKmU6yuD3339X+/btVb9+fX3//fdasmSJli9fbn495s+fr6lTp6pMmTIZzu2rVq2So6OjDhw4oHfeeUfS3XMtXWJiohYsWKB169Zp69at2rNnjx5//HFt2bJFW7Zs0erVq7V06VKLAmDYsGGKiorSunXrdOzYMfXo0UNt27a965cruDsXFxfZ2dmpd+/eWrFihcWyFStWqHv37nJ3d8903Z9++km7du1Sw4YNzfP279+v/v3764UXXtDJkye1dOlSrVy5Uq+//rqk2z/+27VrVzk6OurQoUN65513NH78+GzFmpaWps6dO+vq1avau3evIiMj9b///U+9evUyt9m4caNeeOEFjRkzRj/88IOef/55Pf3009q9e3emfd7veR0Zcc8W8pWYmBilpKSoa9eu5l8hT/+Gd/LkyZozZ466du0qSSpfvrz5hBYeHq61a9cqLS1Ny5cvl7Ozs6pXr67ffvtNgwcPvud2k5OT9c4776hixYqSbv/HNnXqVPPyO688SbdvXC9WrJj27t2rjh07qlSpUpL+75uvzNjb26t3795au3atBgwYIEnauXOnrl+/rm7dukmSpk+frr59+2rkyJGSpMqVK2vBggVq3ry5lixZImdn52wdRxQcAQEBmjdvnkwmk4KCgnT8+HHNmzdPLVq00Oeff64DBw6ocePGkqQ1a9YoICBAmzZtUo8ePTL0VbNmTdWsWdM8PW3aNG3cuFGff/65RUH/6KOPasyYMebpCxcuqHLlymrSpIlMJpP5vXkvw4YNM+f2kiVLtHXrVi1fvjzDh0/p9hWBVq1aaeLEiZKkKlWq6OTJk5o1a5aeeuqpu24nODhYkydPlnT7PbNo0SLt3LlTbdq0kSTz+0m6feXutdde06BBg/T222/L0dFRnp6eMplM2f4B+B49eujZZ5+VdPsYRkZGauHChRmutGdl/vz5atu2rfk4VKlSRV9//bW2bt0qSear+pJUqlQpfpg+hzZv3mz+zZ+EhAT5+flp8+bNmf4Uyttvv62AgAAtWrRIJpNJDz30kC5evKjx48dr0qRJ8vT0lLu7u3n44Z0qV66smTNnWsy7W66lS05ONl+BkKTu3btr9erVunTpkooWLapq1aqpZcuW2r17t3r16qULFy5oxYoVunDhgvz9/SXdvh9469atWrFihd544w2rHLfCwjAM7dy5U9u2bdPw4cPVo0cP8z2kfn5+unz5srZs2ZLhqn+fPn1kb2+vlJQUJSUlqWPHjpowYYJ5+ZQpU/TSSy8pPDxc0u2r0tOmTdOLL76oyZMna8eOHfrxxx+1bds28+v4xhtvqF27dveMeefOnTp+/LjOnTtn/uLlgw8+UPXq1fXNN9+ofv36mj17tp566ikNGTJEkjR69GgdPHhQs2fPVsuWLTP0eb/ndWTElS3kKzVr1lSrVq1Uo0YN9ejRQ++++66uXbumhIQEnT17VgMGDFDRokXNf6+99prOnj0rSTp16pSCg4MtCpKQkBCL/qtXr25e984TnKurq/k/PknmE266S5cuaeDAgapcubI8PT3l4eGh+Pj4DFcE7qVv377as2ePLl68KOn2h+MOHTqYn0L2/fffa+XKlRb7GBYWprS0NJ07dy5H20LB0KhRI4v7mkJCQnTmzBmdPHlSRYoUsfhmtUSJEgoKCsryKkt8fLzGjh2rqlWrqlixYipatKhOnTqVIY/r1atnMf3UU08pOjpaQUFBGjFihLZv325eNmjQIIt8vdOd778iRYqoXr16WcZ26tQpPfLIIxbzHnnkEZ05c0apqanav3+/xXbWrFljbhccHGyx3j/fvzt27FCrVq1UunRpubu7q1+/frpy5YoSExMzjUW6/SHozu3deYz+eV4JCQnJcr8yO+ecOnXK4nXLrE/cv5YtWyo6OlrR0dE6fPiwwsLC1K5dO/3yyy8Z2p46dUohISEW77FHHnlE8fHx+u233+66nbp162aYl51c++f/Nz4+PipXrpzF+8fHx8ecw8ePH1dqaqqqVKlikZN79+41//+He0svwp2dndWuXTv16tVLERERatCggapXr24eJfPhhx8qMDBQzZo1s1h/3rx5io6O1vfff6/Nmzfrp59+Ur9+/czLv//+e02dOtXiNUq/5yoxMVGnTp1SQECAudCSsv++T1/3zivc1apVU7FixcznnqzOoVmdm+52XkfOcGUL+Yq9vb0iIyP19ddfa/v27Vq4cKFeeeUV/fe//5Ukvfvuuxk+pNjb22e7/y1btpiHWLm4uJjnOzg4WLQzmUwWjy4NDw/XlStXNH/+fAUGBsrJyUkhISE5vim6fv36qlixotatW6fBgwdr48aNFsOk4uPj9fzzz2vEiBEZ1i1btmyOtgX809ixYxUZGanZs2erUqVKcnFxUffu3TPksZubm8V0nTp1dO7cOX355ZfasWOHevbsqdatW+uTTz7R1KlTsz1c99+oV6+exX02Pj4+5n9n9v5NS0uTdPtR3x07dtTgwYP1+uuvy8vLS1999ZUGDBigW7duZfngiUGDBqlnz57m6Ts/IOVEVucc2I6bm5sqVapknn7vvffk6empd99913xF0lrbuVN2cy2zfL1bDsfHx8ve3l5HjhzJ8P/dP7/gQNZatmypJUuWyNHRUf7+/hYPOnn22We1ePFivfTSS1qxYoWefvrpDA/v8fX1NedVUFCQbt68qT59+ui1115TpUqVFB8frylTpphH39wpL45Kudt5HTlDsYV8x2Qy6ZFHHtEjjzyiSZMmKTAwUAcOHJC/v7/+97//me9v+qeqVatq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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# pygenomic uses ge/lte for comparison - results differ\n", - "\n", - "metrics = {\n", - " \"seq-native\": {\"0-1\": 0.144, \"0-3\": 9.425, \"0-8\": 3.374, \"7-8\": 4.756},\n", - " \"polars-bio-nat-pl-lf\": {\"0-1\": 0.164, \"0-3\": 9.248, \"0-8\": 3.470, \"7-8\": 5.090},\n", - " \"polars-bio-nat-pl-df\": {\"0-1\": 0.145, \"0-3\": 24.668, \"0-8\": 4.210, \"7-8\": 6.698},\n", - " \"polars-bio-nat-pd-df\": {\"0-1\": 0.150, \"0-3\": 41.995, \"0-8\": 6.392, \"7-8\": 10.639},\n", - " \"Bioframe\": {\"0-1\": 0.559, \"0-3\": 196.0, \"0-8\": 21.128, \"7-8\": 41.103},\n", - " \"PyRanges\": {\"0-1\": 0.135, \"0-3\": 92.0, \"0-8\": 10.629, \"7-8\": 19.461},\n", - " \"PyBedTools\": {\"0-1\": 1.512, \"0-3\": 2029.0, \"0-8\": 350.0, \"7-8\": 611.0},\n", - " \"PyGenomics\": {\"0-1\": 1.579, \"0-3\": 487.0, \"0-8\": 153.0, \"7-8\": 193},\n", - "}\n", - "plot_metrics(\n", - " metrics, [\"0-1\", \"0-3\", \"0-8\", \"7-8\"], \"Overlap operation performance comparison\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "657a85d9bf76f15c", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-15T13:21:43.351332Z", - "start_time": "2024-12-15T13:21:43.285502Z" - } - }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2EAAAHeCAYAAAASDwO2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/GU6VOAAAACXBIWXMAAA9hAAAPYQGoP6dpAABV+ElEQVR4nO3deZyN9f//8eeZ7cwwZhjbWMaMfWuiCCP7koSIUCpDWhRJQ33SJzFaRLbKWh8hJSK0WyKSkETqY82HlGVkGctgZjjv3x/95nwds8+cuc7MeNxvN7ebc53rvK/XdZ3rdc48z3Wd69iMMUYAAAAAAEt4eboAAAAAALiREMIAAAAAwEKEMAAAAACwECEMAAAAACxECAMAAAAACxHCAAAAAMBChDAAAAAAsBAhDAAAAAAsRAgDAAAAAAsRwgA3mjt3rmw2mw4dOuTpUgqN0aNHy2azeboMS2zdulVNmzZV0aJFZbPZtGPHDk+XhAJo3bp1stlsWrdunadLSeXQoUOy2WyaMGGCp0sBAI8ihKFA+u9//6sHH3xQFSpUkN1uV/ny5fXAAw/ov//9r6dLQw5cvHhRo0ePzpd/NFolOTlZPXv21OnTpzV58mTNnz9f4eHhni4LyPd27dql0aNHF+oPvyIiImSz2WSz2eTl5aXixYsrMjJSjz32mLZs2ZKrsV977TUtX748x49PCf1p/bvvvvtyVRtQmPl4ugAgu5YuXar7779fISEhGjBggCpXrqxDhw5p9uzZWrJkiRYuXKh77rnH02UiGy5evKjY2FhJUqtWrVzue/HFF/X88897oCprHThwQH/88YfeffddPfLII54uBwVYixYtdOnSJfn5+Xm6FEvs2rVLsbGxatWqlSIiIjxdTp6pX7++hg0bJkk6f/68du/ercWLF+vdd9/VM888o0mTJuVo3Ndee0333nuvunXrlqv6hgwZottuu81lWmF+PoDcIoShQDlw4IAeeughValSRd99951Kly7tvO/pp59W8+bN9dBDD2nnzp2qUqWKZXUlJCSoaNGili0vv7ty5YocDodb/gj08fGRj0/hfalK2XdOnDghSSpevLjbx8aN4fLly/Lz85OXl5f8/f09XQ7crEKFCnrwwQddpo0bN059+vTR5MmTVb16dT3xxBMeqk5q3ry57r333izN6873CKCg4nREFChvvPGGLl68qHfeecclgElSqVKlNGvWLCUkJGj8+PGSpCVLlshms2n9+vWpxpo1a5ZsNpt+++0357Q9e/bo3nvvVUhIiPz9/dWwYUN99tlnLo9L+d7X+vXr9eSTT6pMmTKqWLFiujV/+umn6tSpk8qXLy+73a6qVavq5Zdf1tWrV13ma9WqlW666SZt27ZNTZs2VUBAgCpXrqyZM2dmadtcuXJFL7/8sqpWrSq73a6IiAi98MILSkxMdJkvIiJCnTt31qpVq1S/fn35+/urTp06Wrp0aaox4+PjNXToUIWFhclut6tatWoaN26cHA6Hc55rv+MxZcoU5/J37dqlpKQkvfTSS2rQoIGCg4NVtGhRNW/eXN9++63L41Oey9jYWOdpLKNHj5aU9nfCsruu33//vRo1aiR/f39VqVJF77//fqbb89r1mjx5ssLDwxUQEKCWLVu67DMpcrPv9OvXTy1btpQk9ezZUzabzeWI4Nq1a9W8eXMVLVpUxYsXV9euXbV7926XsVO2065du9SnTx+VKFFCzZo1c9kO69atU8OGDRUQEKDIyEjn6Z9Lly5VZGSk/P391aBBA23fvt1l7J07d6pfv36qUqWK/P39FRoaqocfflinTp1Ks4bff/9d/fr1U/HixRUcHKz+/fvr4sWLqbbZBx98oEaNGqlIkSIqUaKEWrRooVWrVrnM8/XXXzvXvVixYurUqVOWTzuOj4/XM888o4iICNntdlWsWFF9+/bVyZMnnfOcOHFCAwYMUNmyZeXv76969epp3rx5LuNcuy9MmzZNVapUUZEiRXTHHXfozz//lDFGL7/8sipWrKiAgAB17dpVp0+fdhkjq313+vRpDR8+XJGRkQoMDFRQUJA6duyoX375xWW+lFPAFi5cqBdffFEVKlRQkSJFdO7cuTS/E7Z//3716NFDoaGh8vf3V8WKFXXffffp7Nmzznms6KtruaOv5s6dq549e0qSWrdu7Xz9WLdunWJiYlSyZEkZY5zzP/XUU7LZbHrrrbec0+Li4mSz2TRjxgzntMTERI0aNUrVqlWT3W5XWFiYnnvuuVTbQvpnP27QoIECAgIUEhKi++67T3/++afLPCmv77t27VLr1q1VpEgRVahQwflelVMBAQGaP3++QkJC9Oqrr7qs64QJE9S0aVOVLFlSAQEBatCggZYsWeLyeJvNpoSEBM2bN8+57fr16ydJ+uOPP/Tkk0+qZs2aCggIUMmSJdWzZ89sn/aZ2/eI68fIaQ9KWXs9OX78uPr376+KFSvKbrerXLly6tq1a6E+3RUeYoACpHz58iYiIiLDeSIiIkzFihWNMcZcvHjRBAYGmieffDLVfK1btzZ169Z13v7tt99McHCwqVOnjhk3bpyZOnWqadGihbHZbGbp0qXO+ebMmWMkmTp16piWLVuat99+27z++usu9x08eNA5f7du3UyvXr3MG2+8YWbMmGF69uxpJJnhw4e71NOyZUtTvnx5U6ZMGTN48GDz1ltvmWbNmhlJZvbs2Zlum+joaCPJ3HvvvWbatGmmb9++RpLp1q2by3zh4eGmRo0apnjx4ub55583kyZNMpGRkcbLy8usWrXKOV9CQoK5+eabTcmSJc0LL7xgZs6cafr27WtsNpt5+umnnfMdPHjQuT2qVKliXn/9dTN58mTzxx9/mL///tuUK1fOxMTEmBkzZpjx48ebmjVrGl9fX7N9+3ZjjDEXLlwwM2bMMJLMPffcY+bPn2/mz59vfvnlF2OMMaNGjTLXv1RlZ11r1qxpypYta1544QUzdepUc+uttxqbzWZ+++23DLdnynpFRkaaiIgIM27cOBMbG2tCQkJM6dKlzfHjx53z5nbf+eGHH8wLL7xgJJkhQ4aY+fPnO5+L1atXGx8fH1OjRg0zfvx4Exsba0qVKmVKlCjhsp+lbKc6deqYrl27munTp5tp06a5bIdy5cqZ0aNHm8mTJ5sKFSqYwMBA88EHH5hKlSqZ119/3bz++usmODjYVKtWzVy9etU59oQJE0zz5s3NmDFjzDvvvGOefvppExAQYBo1amQcDkeqGm655RbTvXt3M336dPPII48YSea5555z2b6jR482kkzTpk3NG2+8Yd58803Tp08f869//cs5z/vvv29sNpu58847zdtvv23GjRtnIiIiTPHixV3WPS3nz583N910k/H29jaPPvqomTFjhnn55ZfNbbfd5tz3Ll68aGrXrm18fX3NM888Y9566y3TvHlzI8lMmTIl1b5Qv359U6dOHTNp0iTz4osvGj8/P9OkSRPzwgsvmKZNm5q33nrLDBkyxNhsNtO/f3+XerLad1u3bjVVq1Y1zz//vJk1a5YZM2aMqVChggkODjZHjhxxzvftt986n+/69eubSZMmmbFjx5qEhATn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hCTJ29tboaGhstlsCg4OztH+OmrUKGdvzps3TxUrVtSyZcvUq1evbI8VHBysYsWKOetC+uif3PXPvn379PXXX+vHH3/UbbfdJkmaPXu2atfO+LtL9FThRU/dmD315ptv6s4773Ruqxo1auiHH37QihUrMhxzypQpGjFihLp37y5JmjlzplauXOm8Py96jyNhudSkSRPZbDbn7aioKO3fv1+7du2Sj4+PGjdu7LyvZMmSqlmzZrpHZS5cuKDhw4erdu3aKl68uAIDA7V79+5Un7Q0bNjQ5Xa/fv20Y8cO1axZU0OGDNGqVauc9w0cOFCBgYHOf9eKiopy/t/Hx0cNGzZMt7bdu3fr9ttvd5l2++23a//+/bp69ao2bNjgspxrD1nffPPNLo8rV66cyycp33zzjdq2basKFSqoWLFieuihh3Tq1KkML+v52muvuSzv2m107Xql3E5vverWresco2PHjukuD5mjFzLvhfS20dWrV1MtJ616d+/e7TwFI63a05LWOB07dnTerlu3brrbIiQkJN3n6fDhwy7jvvbaaxnWgYzRP7nrn927d8vHx0cNGjRw3l+rVi2XK6LRUzcWeurG7Kndu3e7PLfXz59Wn509e1bHjh1zeVzKds9LHAnLR4YPH67Vq1drwoQJqlatmgICAnTvvfcqKSnJZb6iRYu63L711lt18OBBff311/rmm2/Uq1cvtWvXTkuWLNGYMWMyPX3PHRo2bOhyqc6yZcs6/+/r6+syr81mk8PhkPTPucGdO3fWE088oVdffVUhISH6/vvvNWDAACUlJalIkSJpLm/gwIEunyKWL18+R3V/9dVXzkPYAQEBORoD7ldYeyE73FVvWuP85z//0aVLlySl7s+sKl++vMt6hoSE5LhGuBf9kzZ6CjlFT6Utv/dUWvJTnxHCcmnLli0utzdv3qzq1aurTp06unLlirZs2eI83H3q1Cnt3btXderUSXOsjRs3ql+/frrnnnsk/fPJS1YvAhEUFKTevXurd+/euvfee3XnnXfq9OnTKlOmjMqUKZPmYzZv3qwWLVpIkq5cuaJt27a5HFa/Vu3atbVx48ZU9daoUUPe3t4KCAhQtWrVslTrtbZt2yaHw6GJEyc6f2X8448/dpnHz88v1ZGCkJCQdBtn8+bN6tu3r8vtW265Jc15s3pqADJHL2TeC+ltI29v71TzplVv7dq1NX/+fF2+fNn5KePmzZvTXFZG41SoUCHd+Tdv3qxKlSpJ+ufL6/v27Uvz9BMfH58c9TzSRv/krn9q1arlXHbKqVN79+51uXgBPXVjoaduzJ6qXbt2muuVIr0+K1eunLZs2ZJqu996660Z1p4bnI6YS4cPH1ZMTIz27t2rjz76SG+//baefvppVa9eXV27dtWjjz6q77//Xr/88osefPBBVahQQV27dk1zrOrVq2vp0qXasWOHfvnlF/Xp08d5xCgjkyZN0kcffaQ9e/Zo3759Wrx4sUJDQzP9Ybpp06Zp2bJl2rNnjwYNGqQzZ87o4YcfTnPeYcOGac2aNXr55Ze1b98+zZs3T1OnTs31JyDVqlVTcnKy3n77bf3vf//T/PnzNXPmTJd5IiIidOHCBa1Zs0YnT57M8DRFSVq8eLHee+897du3T6NGjdKPP/6Y7osX3IdeyLwX0ttGWdWnTx/ZbDY9+uij2rVrl7766itNmDAhy4/PijFjxmjNmjX67bff1K9fP5UqVSrPf0gT9E9u+6dmzZq688479fjjj2vLli3atm2bHnnkkUzPcKCnCi966sbsqSFDhmjFihWaMGGC9u/fr6lTp2b6fTBJevrpp/X6669r+fLl2rNnj5588sm8/31akw8kJCSYn376ySQkJHi6lGxp2bKlefLJJ83AgQNNUFCQKVGihHnhhReMw+Ewxhhz+vRp89BDD5ng4GATEBBgOnToYPbt2+d8/Jw5c0xwcLDz9sGDB03r1q1NQECACQsLM1OnTjUtW7Y0Tz/9tHOe8PBwM3nyZJc63nnnHVO/fn1TtGhRExQUZNq2bWt+/vnndOs+ePCgkWQWLFhgGjVqZPz8/EydOnXM2rVrnfN8++23RpI5c+aMc9qSJUtMnTp1jK+vr6lUqZJ54403srSNrq3fGGO6du1qoqOjnbcnTZpkypUr59xG77//fqplDxw40JQsWdJIMqNGjUp3eZLMtGnTTPv27Y3dbjcRERFm0aJFqdZ9+/bt6Y5x/fOyfft2I8kcPHgw0/W9UdELWeuFjLZReut0vU2bNpl69eoZPz8/U79+ffPJJ5+k2qeDg4PNnDlzMq3pWinr+fnnn5u6desaPz8/06hRI/PLL78457n+eUpLdHS06dq1q/P25MmTTXh4eLZqudHQP+7pn2PHjplOnToZu91uKlWqZN5//3166gZFT924PWWMMbNnzzYVK1Y0AQEBpkuXLmbChAmZ9llycrJ5+umnTVBQkClevLiJiYkxffv2zXbvpWSaJUuWmLFjx5qdO3emO6/NmGz+SE0euHjxonbv3q3atWun+x2g/KhVq1aqX7++pkyZ4ulS8P/ZbDYtW7aMTxktRi9kLr9vo3Xr1ql169Y6c+ZMpp/Swr3y+76RHxTEbURPeU5B3F+sVhC3UUHoqZRMc+jQIe3fv1+dOnVy/t7s9TgdEQAAAAAsRAgDAAAAAAtxOiIAAAAA5BKnIwIAAABAPpWvQlhWLvcJAAAAAPlNdrJMvghhfn5+kv758TsAAAAAKGhSskxycnKm8/rkdTFZ4ePjo1KlSunIkSOSpMDAQHl55Yt8CAAAAADpcjgcunDhgo4cOaL4+PgsHRHLFyFMkipVqqSrV686gxgAAAAAFBTx8fGKi4uTMUbGGPn6+qY7b74JYTabTZUrV9bOnTv1559/qnTp0hkWDgAAAAD5QXJyshwOhxwOh44ePaoSJUqoVKlS6c6fLy5Rf62EhAStWLFCv//+u/JZaQAAAACQLmOMSpQooY4dOyo8PDzd+fJdCJOkS5cu6fjx47p06RJBDAAAAECB4Ofnp5CQEJUsWTLD+fJlCAMAAACAwopLEAIAAACAhQhhAAAAAGAhQhgAAAAAWIgQBgAAAAAWIoQBAAAAgIX+H6r/mOkC97ucAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "metrics = {\n", - " \"polars-bio-nat-pl-lf\": {\"0-1\": 0.164, \"0-3\": 9.248, \"0-8\": 3.470, \"7-8\": 5.090},\n", - " \"polars-bio-pl-df--pl-lf\": {\n", - " \"0-1\": 0.147,\n", - " \"0-3\": 44.942,\n", - " \"0-8\": 6.096,\n", - " \"7-8\": 9.522,\n", - " },\n", - " \"polars-bio-pd-df--pl-lf\": {\n", - " \"0-1\": 0.177,\n", - " \"0-3\": 43.369,\n", - " \"0-8\": 6.241,\n", - " \"7-8\": 9.688,\n", - " },\n", - " \"polars-bio-pd-df--pd-df\": {\n", - " \"0-1\": 0.175,\n", - " \"0-3\": 51.226,\n", - " \"0-8\": 7.435,\n", - " \"7-8\": 11.756,\n", - " },\n", - "}\n", - "plot_metrics(\n", - " metrics,\n", - " [\"0-1\", \"0-3\", \"0-8\", \"7-8\"],\n", - " \"Overlap operation performance comparison between DataFrames\",\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "caccc329ea316f05", - "metadata": {}, - "source": "## Nearest" - }, - { - "cell_type": "code", - "execution_count": 43, - "id": "7307580054aa7d4e", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T06:54:58.562728Z", - "start_time": "2024-12-16T06:54:58.560945Z" - } - }, - "outputs": [], - "source": [ - "from polars_bio import FilterOp\n", - "import polars_bio as pb\n", - "\n", - "pb.ctx.set_option(\"datafusion.execution.target_partitions\", \"1\")\n", - "pb.ctx.set_option(\"datafusion.optimizer.repartition_joins\", \"false\")" - ] - }, - { - "cell_type": "markdown", - "id": "d808c04c9f99c6b6", - "metadata": {}, - "source": "### 0-1" - }, - { - "cell_type": "code", - "execution_count": 71, - "id": "821e3151e6a6e1f", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T07:10:27.983325Z", - "start_time": "2024-12-16T07:10:27.258575Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2350965" - ] - }, - "execution_count": 71, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(df_0_pr.nearest(df_1_pr))" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "id": "44f3329dc936f096", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T07:10:29.672109Z", - "start_time": "2024-12-16T07:10:29.438203Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:polars_bio:Running nearest: algorithm CoitreesNearest with 1 threads\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "shape: (1, 7)
contig_1pos_start_1pos_end_1contig_2pos_start_2pos_end_2distance
u32u32u32u32u32u32u32
2350965235096523509652350965235096523509652350965
" - ], - "text/plain": [ - "shape: (1, 7)\n", - "ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”\n", - "│ contig_1 ┆ pos_start_1 ┆ pos_end_1 ┆ contig_2 ┆ pos_start_2 ┆ pos_end_2 ┆ distance │\n", - "│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │\n", - "│ u32 ┆ u32 ┆ u32 ┆ u32 ┆ u32 ┆ u32 ┆ u32 │\n", - "ā•žā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•”\n", - "│ 2350965 ┆ 2350965 ┆ 2350965 ┆ 2350965 ┆ 2350965 ┆ 2350965 ┆ 2350965 │\n", - "ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜" - ] - }, - "execution_count": 72, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pb.nearest(df_path_0, df_path_1, overlap_filter=FilterOp.Strict).collect().count()" - ] - }, - { - "cell_type": "code", - "execution_count": 83, - "id": "48a0121f4a018d32", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T07:30:54.883707Z", - "start_time": "2024-12-16T07:30:54.556121Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:polars_bio:Running nearest: algorithm CoitreesNearest with 1 threads\n" - ] - }, - { - "data": { - "text/plain": [ - "2350965" - ] - }, - "execution_count": 83, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(\n", - " pb.nearest(\n", - " df_0, df_1, overlap_filter=FilterOp.Strict, output_type=\"pandas.DataFrame\"\n", - " )\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "id": "851b2aac4c2007c1", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T07:22:37.785612Z", - "start_time": "2024-12-16T07:22:36.286072Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2350965" - ] - }, - "execution_count": 76, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(\n", - " bf.closest(\n", - " df_0,\n", - " df_1,\n", - " suffixes=(\"_1\", \"_2\"),\n", - " cols1=(\"contig\", \"pos_start\", \"pos_end\"),\n", - " cols2=(\"contig\", \"pos_start\", \"pos_end\"),\n", - " )\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "id": "1635e076c58e372f", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T06:55:36.059294Z", - "start_time": "2024-12-16T06:55:36.057562Z" - } - }, - "outputs": [], - "source": [ - "### 0-3" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "id": "742a4f3e4e829068", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T07:09:51.687014Z", - "start_time": "2024-12-16T07:09:50.966193Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2350965" - ] - }, - "execution_count": 65, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(df_0_pr.nearest(df_3_pr))" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "id": "3c1d8f23eea97c63", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T07:22:46.856131Z", - "start_time": "2024-12-16T07:22:44.911028Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:polars_bio:Running nearest: algorithm CoitreesNearest with 1 threads\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "shape: (1, 7)
contig_1pos_start_1pos_end_1contig_2pos_start_2pos_end_2distance
u32u32u32u32u32u32u32
2350965235096523509652350965235096523509652350965
" - ], - "text/plain": [ - "shape: (1, 7)\n", - "ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”\n", - "│ contig_1 ┆ pos_start_1 ┆ pos_end_1 ┆ contig_2 ┆ pos_start_2 ┆ pos_end_2 ┆ distance │\n", - "│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │\n", - "│ u32 ┆ u32 ┆ u32 ┆ u32 ┆ u32 ┆ u32 ┆ u32 │\n", - "ā•žā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•”\n", - "│ 2350965 ┆ 2350965 ┆ 2350965 ┆ 2350965 ┆ 2350965 ┆ 2350965 ┆ 2350965 │\n", - "ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜" - ] - }, - "execution_count": 77, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pb.nearest(df_path_0, df_path_3, overlap_filter=FilterOp.Strict).collect().count()" - ] - }, - { - "cell_type": "code", - "execution_count": 82, - "id": "9511200a4747c7ac", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T07:30:35.059914Z", - "start_time": "2024-12-16T07:30:33.120323Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:polars_bio:Running nearest: algorithm CoitreesNearest with 1 threads\n" - ] - }, - { - "data": { - "text/plain": [ - "2350965" - ] - }, - "execution_count": 82, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(\n", - " pb.nearest(\n", - " df_0, df_3, overlap_filter=FilterOp.Strict, output_type=\"pandas.DataFrame\"\n", - " )\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 78, - "id": "45b5c52d86addda1", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T07:24:33.106378Z", - "start_time": "2024-12-16T07:22:49.056273Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2350965" - ] - }, - "execution_count": 78, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(\n", - " bf.closest(\n", - " df_0,\n", - " df_3,\n", - " suffixes=(\"_1\", \"_2\"),\n", - " cols1=(\"contig\", \"pos_start\", \"pos_end\"),\n", - " cols2=(\"contig\", \"pos_start\", \"pos_end\"),\n", - " )\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "d24b8def21308bb0", - "metadata": {}, - "source": "### 0-8" - }, - { - "cell_type": "code", - "execution_count": 67, - "id": "c656968bfe2fb445", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T07:10:03.959021Z", - "start_time": "2024-12-16T07:10:00.992170Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2350965" - ] - }, - "execution_count": 67, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(df_0_pr.nearest(df_8_pr))" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "id": "9b0a3f17d49d1a8b", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T07:10:06.694111Z", - "start_time": "2024-12-16T07:10:05.578835Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:polars_bio:Running nearest: algorithm CoitreesNearest with 1 threads\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "shape: (1, 7)
contig_1pos_start_1pos_end_1contig_2pos_start_2pos_end_2distance
u32u32u32u32u32u32u32
2350965235096523509652350965235096523509652350965
" - ], - "text/plain": [ - "shape: (1, 7)\n", - "ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”\n", - "│ contig_1 ┆ pos_start_1 ┆ pos_end_1 ┆ contig_2 ┆ pos_start_2 ┆ pos_end_2 ┆ distance │\n", - "│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │\n", - "│ u32 ┆ u32 ┆ u32 ┆ u32 ┆ u32 ┆ u32 ┆ u32 │\n", - "ā•žā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•”\n", - "│ 2350965 ┆ 2350965 ┆ 2350965 ┆ 2350965 ┆ 2350965 ┆ 2350965 ┆ 2350965 │\n", - "ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜" - ] - }, - "execution_count": 68, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pb.nearest(df_path_0, df_path_8, overlap_filter=FilterOp.Strict).collect().count()" - ] - }, - { - "cell_type": "code", - "execution_count": 81, - "id": "e8d72e412223bcfd", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T07:30:15.829254Z", - "start_time": "2024-12-16T07:30:14.600179Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:polars_bio:Running nearest: algorithm CoitreesNearest with 1 threads\n" - ] - }, - { - "data": { - "text/plain": [ - "2350965" - ] - }, - "execution_count": 81, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(\n", - " pb.nearest(\n", - " df_0, df_8, overlap_filter=FilterOp.Strict, output_type=\"pandas.DataFrame\"\n", - " )\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "id": "778737f01bb55519", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T07:22:25.865473Z", - "start_time": "2024-12-16T07:21:51.411229Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2350965" - ] - }, - "execution_count": 75, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(\n", - " bf.closest(\n", - " df_0,\n", - " df_8,\n", - " suffixes=(\"_1\", \"_2\"),\n", - " cols1=(\"contig\", \"pos_start\", \"pos_end\"),\n", - " cols2=(\"contig\", \"pos_start\", \"pos_end\"),\n", - " )\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "88d308f61a234402", - "metadata": {}, - "source": "### 7-8" - }, - { - "cell_type": "code", - "execution_count": 69, - "id": "778bed8b6ecbeac2", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T07:10:12.566070Z", - "start_time": "2024-12-16T07:10:09.679856Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1194262" - ] - }, - "execution_count": 69, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(df_7_pr.nearest(df_8_pr))" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "id": "4c63620db4a80cb2", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T07:10:15.674024Z", - "start_time": "2024-12-16T07:10:14.648745Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:polars_bio:Running nearest: algorithm CoitreesNearest with 1 threads\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "shape: (1, 7)
contig_1pos_start_1pos_end_1contig_2pos_start_2pos_end_2distance
u32u32u32u32u32u32u32
1194285119428511942851194262119426211942621194285
" - ], - "text/plain": [ - "shape: (1, 7)\n", - "ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”\n", - "│ contig_1 ┆ pos_start_1 ┆ pos_end_1 ┆ contig_2 ┆ pos_start_2 ┆ pos_end_2 ┆ distance │\n", - "│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │\n", - "│ u32 ┆ u32 ┆ u32 ┆ u32 ┆ u32 ┆ u32 ┆ u32 │\n", - "ā•žā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•Ŗā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•”\n", - "│ 1194285 ┆ 1194285 ┆ 1194285 ┆ 1194262 ┆ 1194262 ┆ 1194262 ┆ 1194285 │\n", - "ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜" - ] - }, - "execution_count": 70, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pb.nearest(df_path_7, df_path_8, overlap_filter=FilterOp.Strict).collect().count()" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "id": "f34aac1ff1ec9ac4", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T07:29:35.817730Z", - "start_time": "2024-12-16T07:29:34.625710Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:polars_bio:Running nearest: algorithm CoitreesNearest with 1 threads\n" - ] - }, - { - "data": { - "text/plain": [ - "1194285" - ] - }, - "execution_count": 80, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(\n", - " pb.nearest(\n", - " df_7, df_8, overlap_filter=FilterOp.Strict, output_type=\"pandas.DataFrame\"\n", - " )\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "id": "d232e39d53502d3f", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T07:21:43.770509Z", - "start_time": "2024-12-16T07:20:35.225095Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1194285" - ] - }, - "execution_count": 74, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(\n", - " bf.closest(\n", - " df_7,\n", - " df_8,\n", - " suffixes=(\"_1\", \"_2\"),\n", - " cols1=(\"contig\", \"pos_start\", \"pos_end\"),\n", - " cols2=(\"contig\", \"pos_start\", \"pos_end\"),\n", - " )\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 84, - "id": "d712e9a31b24a645", - "metadata": { - "ExecuteTime": { - "end_time": "2024-12-16T07:33:16.548733Z", - "start_time": "2024-12-16T07:33:16.483366Z" - } - }, - "outputs": [ - { - "data": { - "image/png": "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71f7ypXP0eWV/9Pc6Wc3vw7c3d1VvHhxdenSRW+++aby5r3zx+Cb72bn5+enhx56SG+//bZatWplrnDclzgiBdwj9+oHjPPly6eQkBBuVSrp6NGjSk1NVfPmzRUaGipvb29nl4QMMBbgLE899ZROnDihEydOaM2aNcqbN69atGghScqTJ49CQkKy9GE6zaFDhxQaGqo6depk+lx+vN71pL0ODh48qNdee00jR47UBx98kOXnx8bG6sSJE9q2bZvq1q2r9u3ba/duc8Ee9yeCFO5LTzzxhPr27au+ffsqICBAhQoV0vDhw5V2t//z58+rS5cuKlCggLy9vdW0aVMdPHgw0/4OHTqkVq1aKTg4WL6+vqpRo4ZWr15t1yY8PFzvvvuuunTpIn9/f/Xs2VNXr15V3759FRoaKk9PT5UoUUJjx469Y/1//vmn6tSpI09PTz388MP68ccfbfMyOp1p0aJFqlixojw8PBQeHq6PPvooS9uof//+GjJkiAIDAxUSEqKRI0fatZkwYYIqVaokHx8fhYWFqXfv3kpMTLTV0a1bN128eFEWi0UWiyXd829msVg0bdo0NW3aVF5eXipZsqQWLlx4xzozM3v2bFWqdOMb8ZIlS8pisejw4cPZ7u9+xVjI2li43TaSpC+//FLVq1eXn5+fQkJC9Nxzz9nd4SqtljVr1qh69ery9vZWnTp1tH//frtljRs3TsHBwfLz81P37t115coVu/lbt25Vo0aNVKhQIQUEBKh+/fr67bffbPMNw9DIkSNVvHhxeXh4qEiRIurfv/8d1/FB5eHhoZCQEIWEhKhq1aoaOnSojh07pn/++SfDU/t+/PFH1axZUx4eHgoNDdXQoUN17do1STeObPTr109Hjx6VxWJReHi4pP97/QwcOFCFChVSkyZNJN1+/yn932mzy5Yt00MPPSRvb2+1b99eycnJmjNnjsLDw1WgQAH1799f169ftz0vJSVFgwcPVtGiReXj46NatWpp/fr193xb5mZpr4MSJUrolVdeUVRUlObPny9/f/9070NLliyRj4+PLl26ZJuWP39+hYSEqGzZsnr33Xd17do1rVu3zjZ/xYoVqlevnvLnz6+CBQuqRYsWOnTokG1+2mvtu+++U4MGDeTt7a0qVapo48aNdsueNWuWwsLC5O3trTZt2mjChAnpTq3+97//rUcffVSenp4qWbKkYmJibK9R9g85jyCF+9acOXOUN29ebdmyRR9//LEmTJigzz77TNKNN8Rt27Zp6dKl2rhxowzDULNmzZSampphX4mJiWrWrJnWrFmjHTt26KmnnlLLli119OhRu3YffvihqlSpoh07dmj48OGaPHmyli5dqvnz52v//v2aO3eu7c33dl5//XW99tpr2rFjhyIjI9WyZUudPXs2w7bbt29Xx44d1alTJ+3evVsjR47U8OHDNXv27CxtIx8fH23evFnjx4/XqFGjFBcXZ5vv5uamyZMna8+ePZozZ47Wrl2rIUOGSLpxWtWkSZPk7+9v+8Z38ODBt13e8OHD1a5dO+3atUudO3dWp06dsn2XoGeeecb2AX7Lli06ceKEwsLCstXX/Y6xMPuutpEkpaam6t1339WuXbu0ZMkSHT58WF27dk3Xz1tvvaWPPvpI27ZtU968efXiiy/a5s2fP18jR47Ue++9p23btik0NFSffvqp3fMvXbqk6Oho/fLLL9q0aZPKlCmjZs2a2T7ULVq0SBMnTtSMGTN08OBBLVmyxPaFAm4vMTFRX331lUqXLq2CBQumm//333+rWbNmqlGjhnbt2qVp06bp888/1+jRoyVJH3/8sUaNGqVixYrpxIkT2rp1q+25c+bMUb58+bRhwwZNnz5d0u33n2mSk5M1efJkffPNN1qxYoXWr1+vNm3aaPny5Vq+fLm+/PJLzZgxw+7Dft++fbVx40Z98803+v3339WhQwc99dRTt/0CBPa8vLzk5uamTp06KTY21m5ebGys2rdvLz8/v3TPu3btmj7//HNJN46Ip0lKStKgQYO0bds2rVmzRm5ubmrTpk26a47eeustDR48WDt37lTZsmX17LPP2kLQhg0b1KtXLw0YMEA7d+5Uo0aNNGbMGLvn//zzz+rSpYsGDBigvXv3asaMGZo9e7atHfuHnMcP8iJTycnJ2rdvn8qXL5/ulClXv0bqiSee0OnTp7Vnzx7baT9Dhw7V0qVL9e9//1tly5bVhg0bVKdOHUnS2bNnFRYWpjlz5qhDhw5Zuvbn4YcfVq9evdS3b19JN76Ff+SRR7R48WJbm/79+2vPnj1avXp1lk4/Onz4sCIiIjRu3Di98cYbkm7suCMiItSvXz8NGTJE69evV4MGDXT+/Hnlz59fnTt31j///KNVq1bZ+hkyZIj+85//aM+ePbfdRtevX9fPP/9sm1azZk09+eSTGjduXIbPWbhwoXr16qUzZ85IMneNlMViUa9evTRt2jTbtNq1a+vRRx/Vp59+alv3HTt2ZHrx/a3L27lzpx555BHFx8dn6UO5w+WCa6QYC1kbC5lto71792b4nG3btqlGjRq6dOmSfH19bbWsXr1aDRs2lCQtX75czZs31+XLl+Xp6ak6derokUce0dSpU2391K5dW1euXMn0pgVWq1X58+fXvHnz1KJFC02YMEEzZszQH3/8IXd39ztux3spN1wj9dVXX8nT01PSjQ+7oaGhWrZsmR599NF0+5y33npLixYt0r59+2yvg08//VRvvPGGLl68aLuhzaRJk+yOfj/xxBNKSEiwO3KYkYz2n926ddNff/2lUqVKSZJ69eqlL7/8UqdOnbL9huNTTz2l8PBwTZ8+XUePHlXJkiV19OhRFSlSxNZ3VFSUatasqffee8/UNnKE3HCN1IULF7RkyRIZhqE1a9aoRYsW6tevnzp06KA6dero2LFjCg0N1enTp1W0aFGtXr1a9evXl3TjvcvT01N58uTR5cuXZbVaFR4eru3btyswMDDDZZ45c0aFCxfW7t279fDDD9tea5999pm6d+8uSdq7d68qVqyoffv2qVy5curUqZMSExO1bNkyWz/PP/+8li1bZtv/RkVFqWHDhho2bJitzVdffaUhQ4bo+PHjpvcPaZ/zDh8+rPj4eJUuXVqtW7c2tX0fdByRwn2rdu3adh/YIiMjdfDgQe3du1d58+ZVrVq1bPMKFiyohx56KNOjI4mJiRo8eLDKly+v/Pnzy9fXV/v27Uv3LXz16tXtHnft2lU7d+7UQw89pP79+9t9wOvVq5d8fX1t/24WGRlp+3/evHlVvXr1TGvbt2+f6tatazetbt26OnjwoC0o3bycuXPn2tpVrlzZ7nlpbyRp0j4UFi1aVH5+fnrhhRd09uxZJScnZ1iLJL333nt2y7t5G928XmmPM1uvihUr2vpo2rRppsvDnTEW7jwWMttGaadUbd++XS1btlTx4sXl5+dn+5B163rfPKZCQ0MlyTam9u3bZ7etb10/STp16pR69OihMmXKKCAgQP7+/kpMTLQtp0OHDrp8+bJKliypHj16aPHixbZvtJFegwYNtHPnTu3cuVNbtmxRkyZN1LRpUx05ciRd2337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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "metrics = {\n", - " \"polars-bio-nat-pl-lf\": {\"0-1\": 0.233, \"0-3\": 1.945, \"0-8\": 1.115, \"7-8\": 1.025},\n", - " \"polars-bio-pandas\": {\"0-1\": 0.327, \"0-3\": 1.939, \"0-8\": 1.229, \"7-8\": 1.192},\n", - " \"Bioframe\": {\"0-1\": 1.499, \"0-3\": 104.0, \"0-8\": 34.454, \"7-8\": 68.00},\n", - " \"PyRanges\": {\"0-1\": 0.724, \"0-3\": 0.720, \"0-8\": 2.966, \"7-8\": 2.866},\n", - "}\n", - "plot_metrics(\n", - " metrics, [\"0-1\", \"0-3\", \"0-8\", \"7-8\"], \"Nearest operation performance comparison\"\n", - ")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/benchmark/src/bench_nearest.py b/benchmark/src/bench_nearest.py new file mode 100755 index 00000000..f63a7410 --- /dev/null +++ b/benchmark/src/bench_nearest.py @@ -0,0 +1,265 @@ +import json +import os +import timeit + +import bioframe as bf +import numpy as np +import pandas as pd +import pybedtools +import pyranges as pr +import pyranges1 as pr1 +from genomicranges import GenomicRanges +from pygenomics.interval import GenomicBase +from rich import print +from rich.box import MARKDOWN +from rich.table import Table + +import polars_bio as pb + +BENCH_DATA_ROOT = os.getenv("BENCH_DATA_ROOT") + +if BENCH_DATA_ROOT is None: + raise ValueError("BENCH_DATA_ROOT is not set") + + +pb.ctx.set_option("datafusion.optimizer.repartition_joins", "false") +pb.ctx.set_option("datafusion.execution.target_partitions", "1") + +columns = ("contig", "pos_start", "pos_end") + + +num_repeats = 3 +num_executions = 3 + + +test_cases = [ + { + "df_path_1": f"{BENCH_DATA_ROOT}/fBrain-DS14718/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/exons/*.parquet", + "name": "1-2", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/exons/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "name": "2-7", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/fBrain-DS14718/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "name": "1-0", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "name": "7-0", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainOrnAna1/*.parquet", + "name": "7-3", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-rna/*.parquet", + "name": "0-8", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/chainVicPac2/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-rna/*.parquet", + "name": "4-8", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-rna/*.parquet", + "name": "7-8", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/chainOrnAna1/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "name": "3-0", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainVicPac2/*.parquet", + "name": "0-4", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainXenTro3Link/*.parquet", + "name": "0-5", + }, +] + + +# pyranges0 +def df2pr0(df): + return pr.PyRanges( + chromosomes=df.contig, + starts=df.pos_start, + ends=df.pos_end, + ) + + +### pyranges1 +def df2pr1(df): + return pr1.PyRanges( + { + "Chromosome": df.contig, + "Start": df.pos_start, + "End": df.pos_end, + } + ) + + +def bioframe(df_1, df_2): + len(bf.closest(df_1, df_2, cols1=columns, cols2=columns)) + + +def polars_bio(df_path_1, df_path_2): + pb.nearest(df_path_1, df_path_2, col1=columns, col2=columns).collect().count() + + +def pyranges0(df_1_pr0, df_2_pr0): + len(df_1_pr0.nearest(df_2_pr0)) + + +def pyranges1(df_1_pr1, df_2_pr1): + len(df_1_pr1.nearest(df_2_pr1)) + + +def pybedtools0(df_1_bed, df_2_bed): + len(df_1_bed.closest(df_2_bed, s=False, t="first")) + + +def genomicranges(df_1, df_2): + len(df_1.nearest(df_2, ignore_strand=True, select="arbitrary")) + + +functions = [ + bioframe, + polars_bio, + pyranges0, + pyranges1, + pybedtools0, + genomicranges, +] + + +# mkdir +# mkdir results directory if it does not exist + +os.makedirs("results", exist_ok=True) + +for t in test_cases: + results = [] + df_1 = pd.read_parquet(t["df_path_1"].replace("*.parquet", ""), engine="pyarrow") + df_2 = pd.read_parquet(t["df_path_2"].replace("*.parquet", ""), engine="pyarrow") + df_1_pr0 = df2pr0(df_1) + df_2_pr0 = df2pr0(df_2) + df_1_pr1 = df2pr1(df_1) + df_2_pr1 = df2pr1(df_2) + df_0_bed = pybedtools.BedTool.from_dataframe(df_1).sort() + df_1_bed = pybedtools.BedTool.from_dataframe(df_2).sort() + df_1_pg = GenomicBase( + [(r.contig, r.pos_start, r.pos_end) for r in df_1.itertuples()] + ) + df_2_array = df_2.values.tolist() + + df_0_gr = GenomicRanges.from_pandas( + df_1.rename( + columns={"contig": "seqnames", "pos_start": "starts", "pos_end": "ends"} + ) + ) + df_1_gr = GenomicRanges.from_pandas( + df_2.rename( + columns={"contig": "seqnames", "pos_start": "starts", "pos_end": "ends"} + ) + ) + + for func in functions: + times = None + print(f"Running {func.__name__}...") + if func == bioframe: + times = timeit.repeat( + lambda: func(df_1, df_2), repeat=num_repeats, number=num_executions + ) + elif func == polars_bio: + times = timeit.repeat( + lambda: func(t["df_path_1"], t["df_path_2"]), + repeat=num_repeats, + number=num_executions, + ) + elif func == pyranges0: + times = timeit.repeat( + lambda: func(df_1_pr0, df_2_pr0), + repeat=num_repeats, + number=num_executions, + ) + elif func == pyranges1: + times = timeit.repeat( + lambda: func(df_1_pr1, df_2_pr1), + repeat=num_repeats, + number=num_executions, + ) + elif func == pybedtools0: + times = timeit.repeat( + lambda: func(df_0_bed, df_1_bed), + repeat=num_repeats, + number=num_executions, + ) + elif func == genomicranges: + times = timeit.repeat( + lambda: func(df_0_gr, df_1_gr), + repeat=num_repeats, + number=num_executions, + ) + + per_run_times = [ + time / num_executions for time in times + ] # Convert to per-run times + results.append( + { + "name": func.__name__, + "min": min(per_run_times), + "max": max(per_run_times), + "mean": np.mean(per_run_times), + } + ) + + fastest_mean = min(result["mean"] for result in results) + for result in results: + result["speedup"] = fastest_mean / result["mean"] + + # Create Rich table + table = Table(title="Benchmark Results", box=MARKDOWN) + table.add_column("Library", justify="left", style="cyan", no_wrap=True) + table.add_column("Min (s)", justify="right", style="green") + table.add_column("Max (s)", justify="right", style="green") + table.add_column("Mean (s)", justify="right", style="green") + table.add_column("Speedup", justify="right", style="magenta") + + # Add rows to the table + for result in results: + table.add_row( + result["name"], + f"{result['min']:.6f}", + f"{result['max']:.6f}", + f"{result['mean']:.6f}", + f"{result['speedup']:.2f}x", + ) + + # Display the table + benchmark_results = { + "inputs": { + "df_1_num": len(df_1), + "df_2_num": len(df_2), + }, + # "output_num": + # pb.overlap(df_1, df_2, col1=columns, col2=columns).collect() + # , + "results": results, + } + print(t["name"]) + print(json.dumps(benchmark_results, indent=4)) + json.dump(benchmark_results, open(f"results/{t['name']}.json", "w")) + print(table) diff --git a/benchmark/src/bench_nearest_parallel.py b/benchmark/src/bench_nearest_parallel.py new file mode 100755 index 00000000..1d7e25b6 --- /dev/null +++ b/benchmark/src/bench_nearest_parallel.py @@ -0,0 +1,239 @@ +import json +import os +import timeit + +import bioframe as bf +import numpy as np +import pandas as pd +import pyranges as pr +import pyranges1 as pr1 +from rich import print +from rich.box import MARKDOWN +from rich.table import Table + +import polars_bio as pb + +BENCH_DATA_ROOT = os.getenv("BENCH_DATA_ROOT") + +if BENCH_DATA_ROOT is None: + raise ValueError("BENCH_DATA_ROOT is not set") + +pb.ctx.set_option("datafusion.optimizer.repartition_joins", "false") +pb.ctx.set_option("datafusion.optimizer.repartition_file_scans", "false") +pb.ctx.set_option("datafusion.execution.coalesce_batches", "false") + +columns = ("contig", "pos_start", "pos_end") + +test_threads = [1, 2, 4, 8] + +num_repeats = 3 +num_executions = 2 + +test_cases = [ + { + "df_path_1": f"{BENCH_DATA_ROOT}/fBrain-DS14718/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/exons/*.parquet", + "name": "1-2", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/exons/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "name": "2-7", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/fBrain-DS14718/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "name": "1-0", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "name": "7-0", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainOrnAna1/*.parquet", + "name": "7-3", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-rna/*.parquet", + "name": "0-8", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/chainVicPac2/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-rna/*.parquet", + "name": "4-8", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-rna/*.parquet", + "name": "7-8", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/chainOrnAna1/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "name": "3-0", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainVicPac2/*.parquet", + "name": "0-4", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainXenTro3Link/*.parquet", + "name": "0-5", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/exons/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainXenTro3Link/*.parquet", + "name": "2-5", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/exons/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainMonDom5Link/*.parquet", + "name": "2-6", + }, +] + + +# pyranges0 +def df2pr0(df): + return pr.PyRanges( + chromosomes=df.contig, + starts=df.pos_start, + ends=df.pos_end, + ) + + +### pyranges1 +def df2pr1(df): + return pr1.PyRanges( + { + "Chromosome": df.contig, + "Start": df.pos_start, + "End": df.pos_end, + } + ) + + +def bioframe(df_1, df_2): + len(bf.closest(df_1, df_2, cols1=columns, cols2=columns)) + + +def polars_bio(df_path_1, df_path_2): + len(pb.nearest(df_path_1, df_path_2, col1=columns, col2=columns).collect()) + + +def pyranges0(df_1_pr0, df_2_pr0): + len(df_1_pr0.nearest(df_2_pr0)) + + +def pyranges1(df_1_pr1, df_2_pr1): + len(df_1_pr1.nearest(df_2_pr1)) + + +def pybedtools0(df_1_bed, df_2_bed): + len(df_1_bed.closest(df_2_bed, s=False, t="first")) + + +def genomicranges(df_1, df_2): + len(df_1.nearest(df_2, ignore_strand=True, select="arbitrary")) + + +functions = [ + pyranges0, + pyranges1, + polars_bio, +] + + +# mkdir +# mkdir results directory if it does not exist + +os.makedirs("results", exist_ok=True) + +for t in test_cases: + results = [] + df_1 = pd.read_parquet(t["df_path_1"].replace("*.parquet", ""), engine="pyarrow") + df_2 = pd.read_parquet(t["df_path_2"].replace("*.parquet", ""), engine="pyarrow") + df_1_pr0 = df2pr0(df_1) + df_2_pr0 = df2pr0(df_2) + df_1_pr1 = df2pr1(df_1) + df_2_pr1 = df2pr1(df_2) + for p in test_threads: + pb.ctx.set_option("datafusion.execution.target_partitions", str(p)) + for func in functions: + times = None + print(f"Running {func.__name__}...") + if func == polars_bio: + times = timeit.repeat( + lambda: func(t["df_path_1"], t["df_path_2"]), + repeat=num_repeats, + number=num_executions, + ) + elif func == pyranges0 and p == 1: + times = timeit.repeat( + lambda: func(df_1_pr0, df_2_pr0), + repeat=num_repeats, + number=num_executions, + ) + elif func == pyranges1 and p == 1: + times = timeit.repeat( + lambda: func(df_1_pr1, df_2_pr1), + repeat=num_repeats, + number=num_executions, + ) + else: + continue + per_run_times = [ + time / num_executions for time in times + ] # Convert to per-run times + results.append( + { + "name": f"{func.__name__}-{p}", + "min": min(per_run_times), + "max": max(per_run_times), + "mean": np.mean(per_run_times), + } + ) + + # fastest_mean = min(result["mean"] for result in results) + fastest_mean = results[0]["mean"] + for result in results: + result["speedup"] = fastest_mean / result["mean"] + + # Create Rich table + table = Table(title="Benchmark Results", box=MARKDOWN) + table.add_column("Library", justify="left", style="cyan", no_wrap=True) + table.add_column("Min (s)", justify="right", style="green") + table.add_column("Max (s)", justify="right", style="green") + table.add_column("Mean (s)", justify="right", style="green") + table.add_column("Speedup", justify="right", style="magenta") + + # Add rows to the table + for result in results: + table.add_row( + result["name"], + f"{result['min']:.6f}", + f"{result['max']:.6f}", + f"{result['mean']:.6f}", + f"{result['speedup']:.2f}x", + ) + + # Display the table + benchmark_results = { + "inputs": { + "df_1_num": len(df_1), + "df_2_num": len(df_2), + }, + # "output_num": + # pb.overlap(df_1, df_2, col1=columns, col2=columns).collect().count() + # , + "results": results, + } + print(t["name"]) + print(json.dumps(benchmark_results, indent=4)) + json.dump(benchmark_results, open(f"results/{t['name']}.json", "w")) + print(table) diff --git a/benchmark/src/bench_overlap.py b/benchmark/src/bench_overlap.py new file mode 100755 index 00000000..009d1583 --- /dev/null +++ b/benchmark/src/bench_overlap.py @@ -0,0 +1,282 @@ +import itertools +import json +import os +import timeit + +import bioframe as bf +import numpy as np +import pandas as pd +import pybedtools +import pyranges as pr +import pyranges1 as pr1 +from genomicranges import GenomicRanges +from pygenomics.interval import GenomicBase +from rich import print +from rich.box import MARKDOWN +from rich.table import Table + +import polars_bio as pb + +BENCH_DATA_ROOT = os.getenv("BENCH_DATA_ROOT") + +if BENCH_DATA_ROOT is None: + raise ValueError("BENCH_DATA_ROOT is not set") + + +pb.ctx.set_option("datafusion.optimizer.repartition_joins", "false") + +columns = ("contig", "pos_start", "pos_end") + + +num_repeats = 3 +num_executions = 3 + + +test_cases = [ + { + "df_path_1": f"{BENCH_DATA_ROOT}/fBrain-DS14718/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/exons/*.parquet", + "name": "1-2", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/exons/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "name": "2-7", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/fBrain-DS14718/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "name": "1-0", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "name": "7-0", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainOrnAna1/*.parquet", + "name": "7-3", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-rna/*.parquet", + "name": "0-8", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/chainVicPac2/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-rna/*.parquet", + "name": "4-8", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-rna/*.parquet", + "name": "7-8", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/chainOrnAna1/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "name": "3-0", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainVicPac2/*.parquet", + "name": "0-4", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainXenTro3Link/*.parquet", + "name": "0-5", + }, +] + + +# pyranges0 +def df2pr0(df): + return pr.PyRanges( + chromosomes=df.contig, + starts=df.pos_start, + ends=df.pos_end, + ) + + +### pyranges1 +def df2pr1(df): + return pr1.PyRanges( + { + "Chromosome": df.contig, + "Start": df.pos_start, + "End": df.pos_end, + } + ) + + +def bioframe(df_1, df_2): + len(bf.overlap(df_1, df_2, cols1=columns, cols2=columns, how="inner")) + + +def polars_bio(df_path_1, df_path_2): + pb.overlap(df_path_1, df_path_2, col1=columns, col2=columns).collect().count() + + +def pyranges0(df_1_pr0, df_2_pr0): + len(df_1_pr0.join(df_2_pr0)) + + +def pyranges1(df_1_pr1, df_2_pr1): + len(df_1_pr1.join_ranges(df_2_pr1)) + + +def pybedtools0(df_1_bed, df_2_bed): + len(df_1_bed.intersect(df_2_bed, wa=True, wb=True)) + + +def pygenomics(df_1_pg, df_2_array): + len( + list( + itertools.chain.from_iterable( + [df_1_pg.find_all((r[0], r[1], r[2])) for r in df_2_array] + ) + ) + ) + + +def genomicranges(df_1, df_2): + len(df_1.find_overlaps(df_2, ignore_strand=True, query_type="any")) + + +functions = [ + bioframe, + polars_bio, + pyranges0, + pyranges1, + pybedtools0, + pygenomics, + genomicranges, +] + + +# mkdir +# mkdir results directory if it does not exist + +os.makedirs("results", exist_ok=True) + +for t in test_cases: + results = [] + df_1 = pd.read_parquet(t["df_path_1"].replace("*.parquet", ""), engine="pyarrow") + df_2 = pd.read_parquet(t["df_path_2"].replace("*.parquet", ""), engine="pyarrow") + df_1_pr0 = df2pr0(df_1) + df_2_pr0 = df2pr0(df_2) + df_1_pr1 = df2pr1(df_1) + df_2_pr1 = df2pr1(df_2) + df_0_bed = pybedtools.BedTool.from_dataframe(df_1) + df_1_bed = pybedtools.BedTool.from_dataframe(df_2) + df_1_pg = GenomicBase( + [(r.contig, r.pos_start, r.pos_end) for r in df_1.itertuples()] + ) + df_2_array = df_2.values.tolist() + + df_0_gr = GenomicRanges.from_pandas( + df_1.rename( + columns={"contig": "seqnames", "pos_start": "starts", "pos_end": "ends"} + ) + ) + df_1_gr = GenomicRanges.from_pandas( + df_2.rename( + columns={"contig": "seqnames", "pos_start": "starts", "pos_end": "ends"} + ) + ) + + for func in functions: + times = None + print(f"Running {func.__name__}...") + if func == bioframe: + times = timeit.repeat( + lambda: func(df_1, df_2), repeat=num_repeats, number=num_executions + ) + elif func == polars_bio: + times = timeit.repeat( + lambda: func(t["df_path_1"], t["df_path_2"]), + repeat=num_repeats, + number=num_executions, + ) + elif func == pyranges0: + times = timeit.repeat( + lambda: func(df_1_pr0, df_2_pr0), + repeat=num_repeats, + number=num_executions, + ) + elif func == pyranges1: + times = timeit.repeat( + lambda: func(df_1_pr1, df_2_pr1), + repeat=num_repeats, + number=num_executions, + ) + elif func == pybedtools0: + times = timeit.repeat( + lambda: func(df_0_bed, df_1_bed), + repeat=num_repeats, + number=num_executions, + ) + elif func == pygenomics: + times = timeit.repeat( + lambda: func(df_1_pg, df_2_array), + repeat=num_repeats, + number=num_executions, + ) + elif func == genomicranges: + times = timeit.repeat( + lambda: func(df_0_gr, df_1_gr), + repeat=num_repeats, + number=num_executions, + ) + + per_run_times = [ + time / num_executions for time in times + ] # Convert to per-run times + results.append( + { + "name": func.__name__, + "min": min(per_run_times), + "max": max(per_run_times), + "mean": np.mean(per_run_times), + } + ) + + fastest_mean = min(result["mean"] for result in results) + for result in results: + result["speedup"] = fastest_mean / result["mean"] + + # Create Rich table + table = Table(title="Benchmark Results", box=MARKDOWN) + table.add_column("Library", justify="left", style="cyan", no_wrap=True) + table.add_column("Min (s)", justify="right", style="green") + table.add_column("Max (s)", justify="right", style="green") + table.add_column("Mean (s)", justify="right", style="green") + table.add_column("Speedup", justify="right", style="magenta") + + # Add rows to the table + for result in results: + table.add_row( + result["name"], + f"{result['min']:.6f}", + f"{result['max']:.6f}", + f"{result['mean']:.6f}", + f"{result['speedup']:.2f}x", + ) + + # Display the table + benchmark_results = { + "inputs": { + "df_1_num": len(df_1), + "df_2_num": len(df_2), + }, + # "output_num": pb.overlap(df_1, df_2, col1=columns, col2=columns) + # .collect() + # .count(), + "results": results, + } + print(t["name"]) + print(json.dumps(benchmark_results, indent=4)) + json.dump(benchmark_results, open(f"results/{t['name']}.json", "w")) + print(table) diff --git a/benchmark/src/bench_overlap_dataframes.py b/benchmark/src/bench_overlap_dataframes.py new file mode 100644 index 00000000..5b2296b4 --- /dev/null +++ b/benchmark/src/bench_overlap_dataframes.py @@ -0,0 +1,226 @@ +import json +import os +import timeit + +import numpy as np +import pandas as pd +import polars as pl +import pyranges as pr +from rich import print +from rich.box import MARKDOWN +from rich.table import Table + +import polars_bio as pb + +BENCH_DATA_ROOT = os.getenv("BENCH_DATA_ROOT") + +if BENCH_DATA_ROOT is None: + raise ValueError("BENCH_DATA_ROOT is not set") + + +pb.ctx.set_option("datafusion.optimizer.repartition_joins", "false") +pb.ctx.set_option("datafusion.execution.target_partitions", "1") + +columns = ("contig", "pos_start", "pos_end") + + +num_repeats = 3 +num_executions = 3 + + +test_cases = [ + { + "df_path_1": f"{BENCH_DATA_ROOT}/fBrain-DS14718/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/exons/*.parquet", + "name": "1-2", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/exons/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "name": "2-7", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/fBrain-DS14718/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "name": "1-0", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "name": "7-0", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainOrnAna1/*.parquet", + "name": "7-3", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-rna/*.parquet", + "name": "0-8", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/chainVicPac2/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-rna/*.parquet", + "name": "4-8", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-rna/*.parquet", + "name": "7-8", + }, + # { + # "df_path_1": f"{BENCH_DATA_ROOT}/chainOrnAna1/*.parquet", + # "df_path_2": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + # "name": "3-0", + # }, + # { + # "df_path_1": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + # "df_path_2": f"{BENCH_DATA_ROOT}/chainVicPac2/*.parquet", + # "name": "0-4", + # }, + # { + # "df_path_1": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + # "df_path_2": f"{BENCH_DATA_ROOT}/chainXenTro3Link/*.parquet", + # "name": "0-5", + # }, +] + + +# pyranges0 +def df2pr0(df): + return pr.PyRanges( + chromosomes=df.contig, + starts=df.pos_start, + ends=df.pos_end, + ) + + +def polars_bio(df_path_1, df_path_2): + pb.overlap(df_path_1, df_path_2, col1=columns, col2=columns).collect().count() + + +def polars_bio_pandas_lf(df1, df2): + pb.overlap(df1, df2, col1=columns, col2=columns).collect().count() + + +def polars_bio_pandas_pd(df1, df2): + len( + pb.overlap(df1, df2, col1=columns, col2=columns, output_type="pandas.DataFrame") + ) + + +def polars_bio_polars_eager(df1, df2): + pb.overlap(df1, df2, col1=columns, col2=columns).collect().count() + + +def polars_bio_polars_lazy(df1, df2): + pb.overlap(df1, df2, col1=columns, col2=columns).collect().count() + + +functions = [ + polars_bio, + polars_bio_pandas_lf, + polars_bio_pandas_pd, + polars_bio_polars_eager, + polars_bio_polars_lazy, +] + + +# mkdir +# mkdir results directory if it does not exist + +os.makedirs("results", exist_ok=True) + +for t in test_cases: + results = [] + df_1 = pd.read_parquet(t["df_path_1"].replace("*.parquet", ""), engine="pyarrow") + df_2 = pd.read_parquet(t["df_path_2"].replace("*.parquet", ""), engine="pyarrow") + df_pl_1 = pl.from_pandas(df_1) + df_pl_2 = pl.from_pandas(df_2) + df_pl_lazy_1 = df_pl_1.lazy() + df_pl_lazy_2 = df_pl_2.lazy() + + for func in functions: + times = None + print(f"Running {func.__name__}...") + if func == polars_bio: + times = timeit.repeat( + lambda: func(t["df_path_1"], t["df_path_2"]), + repeat=num_repeats, + number=num_executions, + ) + elif func == polars_bio_pandas_lf: + times = timeit.repeat( + lambda: func(df_1, df_2), + repeat=num_repeats, + number=num_executions, + ) + elif func == polars_bio_pandas_pd: + times = timeit.repeat( + lambda: func(df_1, df_2), + repeat=num_repeats, + number=num_executions, + ) + elif func == polars_bio_polars_eager: + times = timeit.repeat( + lambda: func(df_pl_1, df_pl_2), + repeat=num_repeats, + number=num_executions, + ) + elif func == polars_bio_polars_lazy: + times = timeit.repeat( + lambda: func(df_pl_lazy_1, df_pl_lazy_2), + repeat=num_repeats, + number=num_executions, + ) + + per_run_times = [ + time / num_executions for time in times + ] # Convert to per-run times + results.append( + { + "name": func.__name__, + "min": min(per_run_times), + "max": max(per_run_times), + "mean": np.mean(per_run_times), + } + ) + + fastest_mean = min(result["mean"] for result in results) + for result in results: + result["speedup"] = fastest_mean / result["mean"] + + # Create Rich table + table = Table(title="Benchmark Results", box=MARKDOWN) + table.add_column("Library", justify="left", style="cyan", no_wrap=True) + table.add_column("Min (s)", justify="right", style="green") + table.add_column("Max (s)", justify="right", style="green") + table.add_column("Mean (s)", justify="right", style="green") + table.add_column("Speedup", justify="right", style="magenta") + + # Add rows to the table + for result in results: + table.add_row( + result["name"], + f"{result['min']:.6f}", + f"{result['max']:.6f}", + f"{result['mean']:.6f}", + f"{result['speedup']:.2f}x", + ) + + # Display the table + benchmark_results = { + "inputs": { + "df_1_num": len(df_1), + "df_2_num": len(df_2), + }, + # "output_num": + # pb.overlap(df_1, df_2, col1=columns, col2=columns).collect() + # , + "results": results, + } + print(t["name"]) + print(json.dumps(benchmark_results, indent=4)) + json.dump(benchmark_results, open(f"results/{t['name']}.json", "w")) + print(table) diff --git a/benchmark/src/bench_overlap_dataframes_parallel.py b/benchmark/src/bench_overlap_dataframes_parallel.py new file mode 100644 index 00000000..9df63521 --- /dev/null +++ b/benchmark/src/bench_overlap_dataframes_parallel.py @@ -0,0 +1,229 @@ +import json +import os +import timeit + +import numpy as np +import pandas as pd +import polars as pl +import pyranges as pr +from rich import print +from rich.box import MARKDOWN +from rich.table import Table + +import polars_bio as pb + +BENCH_DATA_ROOT = os.getenv("BENCH_DATA_ROOT") + +if BENCH_DATA_ROOT is None: + raise ValueError("BENCH_DATA_ROOT is not set") + + +pb.ctx.set_option("datafusion.optimizer.repartition_joins", "true") +pb.ctx.set_option("datafusion.optimizer.repartition_file_scans", "true") +pb.ctx.set_option("datafusion.execution.coalesce_batches", "false") + +columns = ("contig", "pos_start", "pos_end") + +test_threads = [1, 2, 4, 8] + +num_repeats = 3 +num_executions = 2 + + +test_cases = [ + { + "df_path_1": f"{BENCH_DATA_ROOT}/fBrain-DS14718/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/exons/*.parquet", + "name": "1-2", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/exons/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "name": "2-7", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/fBrain-DS14718/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "name": "1-0", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "name": "7-0", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainOrnAna1/*.parquet", + "name": "7-3", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-rna/*.parquet", + "name": "0-8", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/chainVicPac2/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-rna/*.parquet", + "name": "4-8", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-rna/*.parquet", + "name": "7-8", + }, + # { + # "df_path_1": f"{BENCH_DATA_ROOT}/chainOrnAna1/*.parquet", + # "df_path_2": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + # "name": "3-0", + # }, + # { + # "df_path_1": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + # "df_path_2": f"{BENCH_DATA_ROOT}/chainVicPac2/*.parquet", + # "name": "0-4", + # }, + # { + # "df_path_1": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + # "df_path_2": f"{BENCH_DATA_ROOT}/chainXenTro3Link/*.parquet", + # "name": "0-5", + # }, +] + + +# pyranges0 +def df2pr0(df): + return pr.PyRanges( + chromosomes=df.contig, + starts=df.pos_start, + ends=df.pos_end, + ) + + +def polars_bio(df_path_1, df_path_2): + pb.overlap(df_path_1, df_path_2, col1=columns, col2=columns).collect().count() + + +def polars_bio_pandas_lf(df1, df2): + pb.overlap(df1, df2, col1=columns, col2=columns).collect().count() + + +def polars_bio_pandas_pd(df1, df2): + len( + pb.overlap(df1, df2, col1=columns, col2=columns, output_type="pandas.DataFrame") + ) + + +def polars_bio_polars_eager(df1, df2): + pb.overlap(df1, df2, col1=columns, col2=columns).collect().count() + + +def polars_bio_polars_lazy(df1, df2): + pb.overlap(df1, df2, col1=columns, col2=columns).collect().count() + + +functions = [ + polars_bio, + polars_bio_pandas_lf, + polars_bio_pandas_pd, + polars_bio_polars_eager, + polars_bio_polars_lazy, +] + + +# mkdir +# mkdir results directory if it does not exist + +os.makedirs("results", exist_ok=True) + +for t in test_cases: + results = [] + df_1 = pd.read_parquet(t["df_path_1"].replace("*.parquet", ""), engine="pyarrow") + df_2 = pd.read_parquet(t["df_path_2"].replace("*.parquet", ""), engine="pyarrow") + df_pl_1 = pl.from_pandas(df_1) + df_pl_2 = pl.from_pandas(df_2) + df_pl_lazy_1 = df_pl_1.lazy() + df_pl_lazy_2 = df_pl_2.lazy() + for p in test_threads: + pb.ctx.set_option("datafusion.execution.target_partitions", str(p)) + for func in functions: + times = None + print(f"Running {func.__name__}...") + if func == polars_bio: + times = timeit.repeat( + lambda: func(t["df_path_1"], t["df_path_2"]), + repeat=num_repeats, + number=num_executions, + ) + elif func == polars_bio_pandas_lf: + times = timeit.repeat( + lambda: func(df_1, df_2), + repeat=num_repeats, + number=num_executions, + ) + elif func == polars_bio_pandas_pd: + times = timeit.repeat( + lambda: func(df_1, df_2), + repeat=num_repeats, + number=num_executions, + ) + elif func == polars_bio_polars_eager: + times = timeit.repeat( + lambda: func(df_pl_1, df_pl_2), + repeat=num_repeats, + number=num_executions, + ) + elif func == polars_bio_polars_lazy: + times = timeit.repeat( + lambda: func(df_pl_lazy_1, df_pl_lazy_2), + repeat=num_repeats, + number=num_executions, + ) + + per_run_times = [ + time / num_executions for time in times + ] # Convert to per-run times + results.append( + { + "name": f"{func.__name__}-{p}", + "min": min(per_run_times), + "max": max(per_run_times), + "mean": np.mean(per_run_times), + } + ) + + fastest_mean = results[0]["mean"] + for result in results: + result["speedup"] = fastest_mean / result["mean"] + + # Create Rich table + table = Table(title="Benchmark Results", box=MARKDOWN) + table.add_column("Library", justify="left", style="cyan", no_wrap=True) + table.add_column("Min (s)", justify="right", style="green") + table.add_column("Max (s)", justify="right", style="green") + table.add_column("Mean (s)", justify="right", style="green") + table.add_column("Speedup", justify="right", style="magenta") + + # Add rows to the table + for result in results: + table.add_row( + result["name"], + f"{result['min']:.6f}", + f"{result['max']:.6f}", + f"{result['mean']:.6f}", + f"{result['speedup']:.2f}x", + ) + + # Display the table + benchmark_results = { + "inputs": { + "df_1_num": len(df_1), + "df_2_num": len(df_2), + }, + # "output_num": + # pb.overlap(df_1, df_2, col1=columns, col2=columns).collect() + # , + "results": results, + } + print(t["name"]) + print(json.dumps(benchmark_results, indent=4)) + json.dump(benchmark_results, open(f"results/{t['name']}.json", "w")) + print(table) diff --git a/benchmark/src/bench_overlap_parallel.py b/benchmark/src/bench_overlap_parallel.py new file mode 100755 index 00000000..d6a82147 --- /dev/null +++ b/benchmark/src/bench_overlap_parallel.py @@ -0,0 +1,236 @@ +import json +import os +import timeit + +import numpy as np +import pandas as pd +import pyranges as pr +import pyranges1 as pr1 +from rich import print +from rich.box import MARKDOWN +from rich.table import Table + +import polars_bio as pb + +BENCH_DATA_ROOT = os.getenv("BENCH_DATA_ROOT") + +if BENCH_DATA_ROOT is None: + raise ValueError("BENCH_DATA_ROOT is not set") + +pb.ctx.set_option("datafusion.optimizer.repartition_joins", "true") +pb.ctx.set_option("datafusion.optimizer.repartition_file_scans", "true") +pb.ctx.set_option("datafusion.execution.coalesce_batches", "false") +pb.ctx.set_option("datafusion.execution.parquet.schema_force_view_types", "false") +columns = ("contig", "pos_start", "pos_end") + +test_threads = [8] + +num_repeats = 1 +num_executions = 1 + +test_cases = [ + { + "df_path_1": f"{BENCH_DATA_ROOT}/fBrain-DS14718/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/exons/*.parquet", + "name": "1-2", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/exons/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "name": "2-7", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/fBrain-DS14718/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "name": "1-0", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "name": "7-0", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/chainOrnAna1/*.parquet", + "name": "7-3", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-rna/*.parquet", + "name": "0-8", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/chainVicPac2/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-rna/*.parquet", + "name": "4-8", + }, + { + "df_path_1": f"{BENCH_DATA_ROOT}/ex-anno/*.parquet", + "df_path_2": f"{BENCH_DATA_ROOT}/ex-rna/*.parquet", + "name": "7-8", + }, + # { + # "df_path_1": f"{BENCH_DATA_ROOT}/chainOrnAna1/*.parquet", + # "df_path_2": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + # "name": "3-0", + # }, + # { + # "df_path_1": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + # "df_path_2": f"{BENCH_DATA_ROOT}/chainVicPac2/*.parquet", + # "name": "0-4", + # }, + # { + # "df_path_1": f"{BENCH_DATA_ROOT}/chainRn4/*.parquet", + # "df_path_2": f"{BENCH_DATA_ROOT}/chainXenTro3Link/*.parquet", + # "name": "0-5", + # }, + # { + # "df_path_1": f"{BENCH_DATA_ROOT}/chainOrnAna1/*.parquet", + # "df_path_2": f"{BENCH_DATA_ROOT}/chainXenTro3Link/*.parquet", + # "name": "3-5", + # }, +] + + +# pyranges0 +def df2pr0(df): + return pr.PyRanges( + chromosomes=df.contig, + starts=df.pos_start, + ends=df.pos_end, + ) + + +### pyranges1 +def df2pr1(df): + return pr1.PyRanges( + { + "Chromosome": df.contig, + "Start": df.pos_start, + "End": df.pos_end, + } + ) + + +def polars_bio(df_path_1, df_path_2): + # lf = pl.LazyFrame( + # { + # "a": ["a", "b", "a", "b", "b", "c"], + # "b": [1, 2, 3, 4, 5, 6], + # "c": [6, 5, 4, 3, 2, 1], + # } + # ) + # print(lf.group_by("a", maintain_order=True).agg(pl.all().sum()).sort( + # "a" + # ).explain(streaming=True, format="tree")) + # print(pb.overlap(df_path_1, df_path_2, col1=columns, col2=columns).explain(streaming=True, format="tree")) + len( + pb.overlap(df_path_1, df_path_2, col1=columns, col2=columns).collect( + streaming=True + ) + ) + + +def pyranges0(df_1_pr0, df_2_pr0): + len(df_1_pr0.join(df_2_pr0)) + + +def pyranges1(df_1_pr1, df_2_pr1): + len(df_1_pr1.join_ranges(df_2_pr1)) + + +functions = [ + pyranges0, + pyranges1, + polars_bio, +] + + +# mkdir +# mkdir results directory if it does not exist + +os.makedirs("results", exist_ok=True) + +for t in test_cases: + results = [] + df_1 = pd.read_parquet(t["df_path_1"].replace("*.parquet", ""), engine="pyarrow") + df_2 = pd.read_parquet(t["df_path_2"].replace("*.parquet", ""), engine="pyarrow") + df_1_pr0 = df2pr0(df_1) + df_2_pr0 = df2pr0(df_2) + df_1_pr1 = df2pr1(df_1) + df_2_pr1 = df2pr1(df_2) + for p in test_threads: + pb.ctx.set_option("datafusion.execution.target_partitions", str(p)) + for func in functions: + times = None + print(f"Running {func.__name__}...") + if func == polars_bio: + times = timeit.repeat( + lambda: func(t["df_path_1"], t["df_path_2"]), + repeat=num_repeats, + number=num_executions, + ) + elif func == pyranges0 and p == 1: + times = timeit.repeat( + lambda: func(df_1_pr0, df_2_pr0), + repeat=num_repeats, + number=num_executions, + ) + elif func == pyranges1 and p == 1: + times = timeit.repeat( + lambda: func(df_1_pr1, df_2_pr1), + repeat=num_repeats, + number=num_executions, + ) + else: + continue + per_run_times = [ + time / num_executions for time in times + ] # Convert to per-run times + results.append( + { + "name": f"{func.__name__}-{p}", + "min": min(per_run_times), + "max": max(per_run_times), + "mean": np.mean(per_run_times), + } + ) + + # fastest_mean = min(result["mean"] for result in results) + fastest_mean = results[0]["mean"] + for result in results: + result["speedup"] = fastest_mean / result["mean"] + + # Create Rich table + table = Table(title="Benchmark Results", box=MARKDOWN) + table.add_column("Library", justify="left", style="cyan", no_wrap=True) + table.add_column("Min (s)", justify="right", style="green") + table.add_column("Max (s)", justify="right", style="green") + table.add_column("Mean (s)", justify="right", style="green") + table.add_column("Speedup", justify="right", style="magenta") + + # Add rows to the table + for result in results: + table.add_row( + result["name"], + f"{result['min']:.6f}", + f"{result['max']:.6f}", + f"{result['mean']:.6f}", + f"{result['speedup']:.2f}x", + ) + + # Display the table + benchmark_results = { + "inputs": { + "df_1_num": len(df_1), + "df_2_num": len(df_2), + }, + # "output_num": + # pb.overlap(df_1, df_2, col1=columns, col2=columns).collect().count() + # , + "results": results, + } + print(t["name"]) + # print(json.dumps(benchmark_results, indent=4)) + json.dump(benchmark_results, open(f"results/{t['name']}.json", "w")) + print(table) diff --git a/benchmark/src/results/overlap/1-0.json b/benchmark/src/results/overlap/1-0.json new file mode 100644 index 00000000..af6c2552 --- /dev/null +++ b/benchmark/src/results/overlap/1-0.json @@ -0,0 +1 @@ +{"inputs": {"df_1_num": 198621, "df_2_num": 2350965}, "output_num": 320955, "results": [{"name": "pyranges0-1", "min": 0.254230264001914, "max": 0.26455270833685063, "mean": 0.25789941200249206, "speedup": 1.0}, {"name": "polars_bio-1", "min": 0.13141876399943916, "max": 0.1342167916688292, "mean": 0.13238331944578222, "speedup": 1.948126192047293}, {"name": "polars_bio-2", "min": 0.09480504166761723, "max": 0.09585004166001454, "mean": 0.0952059768864678, "speedup": 2.708857368377561}, {"name": "polars_bio-4", "min": 0.08114294433228982, "max": 0.0841700276650954, "mean": 0.0828951342199515, "speedup": 3.111152595738483}, {"name": "polars_bio-8", "min": 0.06601511100113082, "max": 0.07114970833451177, "mean": 0.0680819351109676, "speedup": 3.788074054918365}]} \ No newline at end of file diff --git a/benchmark/src/results/overlap/1-2.json b/benchmark/src/results/overlap/1-2.json new file mode 100644 index 00000000..893b4360 --- /dev/null +++ b/benchmark/src/results/overlap/1-2.json @@ -0,0 +1 @@ +{"inputs": {"df_1_num": 198621, "df_2_num": 438694}, "output_num": 54246, "results": [{"name": "pyranges0-1", "min": 0.032831583986990154, "max": 0.032831583986990154, "mean": 0.032831583986990154, "speedup": 1.1529116907501256}, {"name": "polars_bio-1", "min": 0.03785191700444557, "max": 0.03785191700444557, "mean": 0.03785191700444557, "speedup": 1.0}, {"name": "polars_bio-2", "min": 0.02484187501249835, "max": 0.02484187501249835, "mean": 0.02484187501249835, "speedup": 1.523714171551127}, {"name": "polars_bio-4", "min": 0.016445625020423904, "max": 0.016445625020423904, "mean": 0.016445625020423904, "speedup": 2.301640524907815}, {"name": "polars_bio-8", "min": 0.01268029201310128, "max": 0.01268029201310128, "mean": 0.01268029201310128, "speedup": 2.9850982110930064}]} \ No newline at end of file diff --git a/benchmark/src/results/overlap/2-7.json b/benchmark/src/results/overlap/2-7.json new file mode 100644 index 00000000..4d089daa --- /dev/null +++ b/benchmark/src/results/overlap/2-7.json @@ -0,0 +1 @@ +{"inputs": {"df_1_num": 438694, "df_2_num": 1194285}, "output_num": 273500, "results": [{"name": "bioframe", "min": 0.2993143889956021, "max": 0.30426263899425976, "mean": 0.3012149584408487, "speedup": 0.2997951766306785}, {"name": "polars_bio", "min": 0.08901551400776953, "max": 0.0912378056673333, "mean": 0.09030279166957673, "speedup": 1.0}, {"name": "pyranges0", "min": 0.10240074999940892, "max": 0.10710211100134377, "mean": 0.10427152777750355, "speedup": 0.8660349914721346}, {"name": "pyranges1", "min": 0.19792461100344858, "max": 0.2004592779946203, "mean": 0.1990527963336919, "speedup": 0.4536625123225761}, {"name": "pybedtools0", "min": 1.0202673056628555, "max": 1.0225228890000533, "mean": 1.021485282441265, "speedup": 0.08840341923846476}, {"name": "pygenomics", "min": 4.2786070556612685, "max": 4.289572486003938, "mean": 4.283311361110665, "speedup": 0.021082471960703123}, {"name": "genomicranges", "min": 2.899962486330575, "max": 2.947669222330054, "mean": 2.9298967315537285, "speedup": 0.03082115171400223}]} \ No newline at end of file diff --git a/benchmark/src/results/overlap/7-0.json b/benchmark/src/results/overlap/7-0.json new file mode 100644 index 00000000..7ee756b4 --- /dev/null +++ b/benchmark/src/results/overlap/7-0.json @@ -0,0 +1 @@ +{"inputs": {"df_1_num": 1194285, "df_2_num": 2350965}, "output_num": 2761621, "results": [{"name": "polars_bio-1", "min": 0.20322780533266874, "max": 0.22035698633408174, "mean": 0.2096674722237771, "speedup": 1.0}, {"name": "pyranges0-1", "min": 0.3736755136730305, "max": 0.39214961099787615, "mean": 0.3831038471123773, "speedup": 0.5472862614252854}, {"name": "polars_bio-2", "min": 0.12236977766345565, "max": 0.14651919432799332, "mean": 0.13504305088685617, "speedup": 1.552597270624787}, {"name": "polars_bio-4", "min": 0.08410388866711098, "max": 0.08481430566947286, "mean": 0.08448079155964984, "speedup": 2.4818360286756542}, {"name": "polars_bio-8", "min": 0.0637157083353183, "max": 0.06470926399924792, "mean": 0.06436381955669883, "speedup": 3.2575362007389668}]} \ No newline at end of file diff --git a/benchmark/src/results/overlap/7-3.json b/benchmark/src/results/overlap/7-3.json new file mode 100644 index 00000000..f09ab58f --- /dev/null +++ b/benchmark/src/results/overlap/7-3.json @@ -0,0 +1 @@ +{"inputs": {"df_1_num": 1194285, "df_2_num": 1956864}, "output_num": 4408383, "results": [{"name": "pyranges0-1", "min": 0.6125135000038426, "max": 0.6125135000038426, "mean": 0.6125135000038426, "speedup": 0.5540596247948253}, {"name": "polars_bio-1", "min": 0.33936899999389425, "max": 0.33936899999389425, "mean": 0.33936899999389425, "speedup": 1.0}, {"name": "polars_bio-2", "min": 0.19287191701005213, "max": 0.19287191701005213, "mean": 0.19287191701005213, "speedup": 1.7595563172434634}, {"name": "polars_bio-4", "min": 0.15540250000776723, "max": 0.15540250000776723, "mean": 0.15540250000776723, "speedup": 2.1838065666699835}, {"name": "polars_bio-8", "min": 0.11462370801018551, "max": 0.11462370801018551, "mean": 0.11462370801018551, "speedup": 2.96072257550539}, {"name": "polars_bio-16", "min": 0.11476470899651758, "max": 0.11476470899651758, "mean": 0.11476470899651758, "speedup": 2.957085004277683}]} \ No newline at end of file diff --git a/benchmark/src/somefile.parquet b/benchmark/src/somefile.parquet new file mode 100644 index 00000000..e69de29b diff --git a/docs/features.md b/docs/features.md index 1361c2c9..7a792348 100644 --- a/docs/features.md +++ b/docs/features.md @@ -1,23 +1,38 @@ ## Genomic ranges operations -| Features | Bioframe | polars-bio | PyRanges | Pybedtools | PyGenomics | GenomicRanges | -|--------------|--------------------|---------------------|--------------------|--------------------|--------------------|--------------------| -| overlap | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| nearest | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | -| cluster | :white_check_mark: | | | | | | -| merge | :white_check_mark: | | | | | | -| complement | :white_check_mark: | | | | | | -| select/slice | :white_check_mark: | | | | | | -| | | | | | | | -| coverage | :white_check_mark: | | | | | | -| expand | :white_check_mark: | | | | | | -| sort | :white_check_mark: | | | | | | +| Features | Bioframe | polars-bio | PyRanges | Pybedtools | PyGenomics | GenomicRanges | +|--------------|--------------------|--------------------|--------------------|---------------------|--------------------|--------------------| +| overlap | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| nearest | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | :white_check_mark: | +| cluster | :white_check_mark: | | :white_check_mark: | :white_check_mark: | | | +| merge | :white_check_mark: | | :white_check_mark: | :white_check_mark: | | :white_check_mark: | +| complement | :white_check_mark: | :construction: | | :white_check_mark: | :white_check_mark: | | +| coverage | :white_check_mark: | | :white_check_mark: | :white_check_mark: | | :white_check_mark: | +| expand | :white_check_mark: | :construction: | :white_check_mark: | :white_check_mark: | | :white_check_mark: | +| sort | :white_check_mark: | :construction: | :white_check_mark: | :white_check_mark: | | :white_check_mark: | +## API comparison between libraries +There is no standard API for genomic ranges operations in Python. +This table compares the API of the libraries. The table is not exhaustive and only shows the most common operations used in benchmarking. + +|operation| Bioframe | polars-bio | PyRanges0 | PyRanges1 | Pybedtools | GenomicRanges | +|---------|------------------------------------------------------------------------------------------------|------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------| +|overlap | [overlap](https://bioframe.readthedocs.io/en/latest/api-intervalops.html#bioframe.ops.overlap) | [overlap](https://biodatageeks.org/polars-bio/api/#polars_bio.overlap) | [join](https://pyranges.readthedocs.io/en/latest/autoapi/pyranges/index.html#pyranges.PyRanges.join)1 | [join_ranges](https://pyranges1.readthedocs.io/en/latest/pyranges_objects.html#pyranges.PyRanges.join_ranges) | [intersect](https://bedtools.readthedocs.io/en/latest/content/tools/intersect.html?highlight=intersect#usage-and-option-summary)2 | [find_overlaps](https://biocpy.github.io/GenomicRanges/api/genomicranges.html#genomicranges.GenomicRanges.GenomicRanges.find_overlaps)3 | +|nearest | [closest](https://bioframe.readthedocs.io/en/latest/api-intervalops.html#bioframe.ops.closest) | [nearest](https://biodatageeks.org/polars-bio/api/#polars_bio.nearest) | [nearest](https://pyranges.readthedocs.io/en/latest/autoapi/pyranges/index.html#pyranges.PyRanges.nearest) | [nearest](https://pyranges1.readthedocs.io/en/latest/pyranges_objects.html#pyranges.PyRanges.nearest) | [closest](https://daler.github.io/pybedtools/autodocs/pybedtools.bedtool.BedTool.closest.html#pybedtools.bedtool.BedTool.closest)4 | [nearest](https://biocpy.github.io/GenomicRanges/api/genomicranges.html#genomicranges.GenomicRanges.GenomicRanges.nearest)5 | + +!!! note + 1. There is an [overlap](https://pyranges.readthedocs.io/en/latest/autoapi/pyranges/index.html#pyranges.PyRanges.overlap) method in PyRanges, but its output is only limited to indices of intervals from the other Dataframe that overlap. + In Bioframe's [benchmark](https://bioframe.readthedocs.io/en/latest/guide-performance.html#vs-pyranges-and-optionally-pybedtools) also **join** method instead of overlap was used. + 2. **wa** and **wb** options used to obtain a comparable output. + 3. Output contains only a list with the same length as query, containing hits to overlapping indices. Data transformation is required to obtain the same output as in other libraries. + Since the performance was far worse than in more efficient libraries anyway, additional data transformation was not included in the benchmark. + 4. **s=first** was used to obtain a comparable output. + 5. **select="arbitrary"** was used to obtain a comparable output. ## Input/Output -| I/O | Bioframe | polars-bio | PyRanges | Pybedtools | PyGenomics | GenomicRanges | -|------------------|--------------------|------------------------|--------------------|------------|------------|---------------| -| Pandas DataFrame | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | | -| Polars DataFrame | | :white_check_mark: | | | | | -| Polars LazyFrame | | :white_check_mark: | | | | | -| Native readers | | :white_check_mark: | | | | | +| I/O | Bioframe | polars-bio | PyRanges | Pybedtools | PyGenomics | GenomicRanges | +|------------------|--------------------|------------------------|--------------------|------------|------------|------------------------| +| Pandas DataFrame | :white_check_mark: | :white_check_mark: | :white_check_mark: | | | :white_check_mark: | +| Polars DataFrame | | :white_check_mark: | | | | :white_check_mark: | +| Polars LazyFrame | | :white_check_mark: | | | | | +| Native readers | | :white_check_mark: | | | | | diff --git a/docs/performance.md b/docs/performance.md index f16473a0..f3793c67 100644 --- a/docs/performance.md +++ b/docs/performance.md @@ -1,40 +1,1256 @@ -## Benchmarking -polars-bio significantly outperforms other libraries in terms of speed and memory usage. -It was benchmarked against following libraries: +# Results summary šŸ“ˆ -- [Bioframe](https://github.com/open2c/bioframe)-0.7.2 -- [PyRanges](https://github.com/pyranges/pyranges)-0.0.132 -- [pybedtools](https://github.com/daler/pybedtools)-0.10.0 -- [PyGenomics](https://gitlab.com/gtamazian/pygenomics)-0.1.1 -- [GenomicRanges](https://github.com/BiocPy/GenomicRanges)-0.4.34 !!! todo - 1. Add more details about the benchmarking process. - 2. GenomicRanges + - Add summary of the results -### Test datasets +## Benchmarks 🧪 +### Detailed results shortcuts šŸ‘Øā€šŸ”¬ +- [Binary operations](#binary-operations) +- [Parallel execution and scalability](#parallel-execution-and-scalability) +- [DataFrame formats performance](#dataframes-comparison) + +### Test datasets šŸ—ƒļø [AIList](https://github.com/databio/AIList) dataset was used for benchmarking. -|Dataset# |Name(.bed) |size(x1000) |non-flatness | -|:---------|:-----------------|:-----------|:------------| -|0 |chainRn4 |2,351 |6 | -|1 |fBrain |199 |1 | -|2 |exons |439 |2 | -|3 |chainOrnAna1 |1,957 |6 | -|4 |chainVicPac2 |7,684 |8 | -|5 |chainXenTro3Link |50,981 |7 | -|6 |chainMonDom5Link |128,187 |7 | -|7 |ex-anno |1,194 |2 | -|8 |ex-rna |9,945 |7 | +|Dataset# | Name | Size(x1000) | Non-flatness | +|:---------|:----------------|:------------|:-------------| +|0 | chainRn4 | 2,351 | 6 | +|1 | fBrain | 199 | 1 | +|2 | exons | 439 | 2 | +|3 | chainOrnAna1 | 1,957 | 6 | +|4 | chainVicPac2 | 7,684 | 8 | +|5 | chainXenTro3Link| 50,981 | 7 | +|6 | chainMonDom5Link| 128,187 | 7 | +|7 | ex-anno | 1,194 | 2 | +|8 | ex-rna | 9,945 | 7 | !!! note Test dataset in *Parquet* format can be downloaded from: * for [single-threaded](https://drive.google.com/file/d/1lctmude31mSAh9fWjI60K1bDrbeDPGfm/view?usp=sharing) tests * for [parallel](https://drive.google.com/file/d/1Sj7nTB5gCUq9nbeQOg4zzS4tKO37M5Nd/view?usp=sharing) tests (8 partitions per dataset) -## Results + +### Test libraries šŸ“š + +- [Bioframe](https://github.com/open2c/bioframe)-0.7.2 +- [PyRanges0](https://github.com/pyranges/pyranges)-0.0.132 +- [PyRanges1](https://github.com/pyranges/pyranges_1.x)-[e634a11](https://github.com/mwiewior/pyranges1/commit/e634a110e7c00d7c5458d69d5e39bec41d23a2fe) +- [pybedtools](https://github.com/daler/pybedtools)-0.10.0 +- [PyGenomics](https://gitlab.com/gtamazian/pygenomics)-0.1.1 +- [GenomicRanges](https://github.com/BiocPy/GenomicRanges)-0.5.0 + +!!! note + Some tests were not conducted for all libraries in case of poor performance of specific tools, e.g. `pybedtools`, `PyGenomics` and `GenomicRanges` for the largest outputs. + +### Output compatibility šŸ–„ļø +See [API comparison](../features/#api-comparison-between-libraries) for more details on parameters used in the benchmark. +## Binary operations + + + +### Overlap operation +Test cases were categorized based on the size šŸ‘• of the input datasets and the expected output size into the following groups: + +- **S-size**: output < 1,000,000 +- **M-size**: 1,000,000 < output < 100,000,000 +- **L-size**: 100,000,000 < output < 1,000,000,000 +- **XL-size**: output > 1,000,000,000 + +!!! note + Naming convention for the test cases is as follows `test-case-size (dataset-1-id, dataset-2-id)`, e.g.: `S-size (1-2)`, where `1` and `2` are the indices of the datasets used in the test case. + +### Apple Silicon (macOS) šŸŽ +Here is the configuration of the Apple Silicon machine used for benchmarking: + +- cpu architecture: `arm64` +- cpu name: `Apple M3 Max` +- cpu cores: `16` +- memory: `64 GB` +- kernel: `Darwin Kernel Version 24.2.0: Fri Dec 6 19:02:12 PST 2024; root:xnu-11215.61.5~2/RELEASE_ARM64_T6031` +- system: `Darwin` +- os-release: `macOS-15.2-arm64-arm-64bit` +- python: `3.12.4` +- polars-bio: `0.3.0` + +#### S-size +##### S-size (1-2) + +Output size: 54,246 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|---------------|----------|----------|----------|-----------| +| bioframe | 0.100738 | 0.101541 | 0.101119 | 0.25x | +| polars_bio | 0.032156 | 0.035501 | 0.033394 | **0.77x** | +| pyranges0 | 0.024100 | 0.028271 | 0.025589 | **1.00x** | +| pyranges1 | 0.053770 | 0.054647 | 0.054121 | 0.47x | +| pybedtools0 | 0.281969 | 0.283385 | 0.282857 | 0.09x | +| pygenomics | 1.424975 | 1.436369 | 1.430531 | 0.02x | +| genomicranges | 0.972717 | 0.979013 | 0.975761 | 0.03x | + +##### S-size (2-7) + +Output size: 273,500 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|---------------|----------|----------|----------|-----------| +| bioframe | 0.298039 | 0.309271 | 0.302905 | 0.30x | +| polars_bio | 0.089324 | 0.092200 | 0.090332 | **1.00x** | +| pyranges0 | 0.096478 | 0.103456 | 0.101023 | **0.89x** | +| pyranges1 | 0.195621 | 0.198025 | 0.197146 | 0.46x | +| pybedtools0 | 1.004577 | 1.013097 | 1.007701 | 0.09x | +| pygenomics | 4.264575 | 4.275965 | 4.269055 | 0.02x | +| genomicranges | 2.919675 | 2.926785 | 2.923549 | 0.03x | + + +##### S-size (1-0) + +Output size: 320,955 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|---------------|----------|----------|----------|-----------| +| bioframe | 0.521093 | 0.549674 | 0.534084 | 0.28x | +| polars_bio | 0.135411 | 0.168570 | 0.147222 | **1.00x** | +| pyranges0 | 0.271539 | 0.282081 | 0.276298 | **0.53x** | +| pyranges1 | 0.418972 | 0.426373 | 0.422060 | 0.35x | +| pybedtools0 | 1.258828 | 1.269215 | 1.264674 | 0.12x | +| pygenomics | 7.877381 | 7.908531 | 7.894108 | 0.02x | +| genomicranges | 4.222082 | 4.266592 | 4.244865 | 0.03x | + + +#### M-size + +##### M-size (7-0) + +Output size: 2,761,621 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|---------------|----------|----------|----------|-----------| +| bioframe | 0.935141 | 0.990710 | 0.970345 | 0.22x | +| polars_bio | 0.213880 | 0.220151 | 0.216288 | **1.00x** | +| pyranges0 | 0.408637 | 0.434262 | 0.422380 | **0.51x** | +| pyranges1 | 0.632015 | 0.642214 | 0.635670 | 0.34x | +| pybedtools0 | 6.415976 | 6.467304 | 6.444268 | 0.03x | +| pygenomics | 9.588232 | 9.705035 | 9.653368 | 0.02x | +| genomicranges | 9.017886 | 9.058916 | 9.033964 | 0.02x | + + + +##### M-size (7-3) + +Output size: 4,408,383 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|---------------|------------|------------|------------|-----------| +| bioframe | 0.954765 | 0.969307 | 0.959704 | 0.21x | +| polars_bio | 0.198607 | 0.208906 | 0.203033 | **1.00x** | +| pyranges0 | 0.425277 | 0.430527 | 0.428594 | **0.47x** | +| pyranges1 | 0.696934 | 0.710050 | 0.702206 | 0.29x | +| pybedtools0 | 9.403818 | 9.491574 | 9.453402 | 0.02x | +| pygenomics | 8.638968 | 8.662197 | 8.647764 | 0.02x | +| genomicranges | 10.514233 | 10.556004 | 10.540377 | 0.02x | + +#### L-size + +##### L-size (0-8) + +Output size: 164,196,784 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|---------------|------------|------------|------------|-----------| +| bioframe | 15.630508 | 16.719793 | 16.080009 | 0.19x | +| polars_bio | 2.882900 | 3.135100 | 2.997755 | **1.00x** | +| pyranges0 | 9.276095 | 10.158109 | 9.761880 | **0.31x** | +| pyranges1 | 13.076820 | 13.510234 | 13.329948 | 0.22x | +| pybedtools0 | 322.922915 | 335.123071 | 329.659142 | 0.01x | +| pygenomics | 128.849536 | 132.109689 | 130.089096 | 0.02x | +| genomicranges | 234.237435 | 239.315157 | 236.504565 | 0.01x | + + +##### L-size (4-8) + +Output size: 227,832,153 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|---------------|------------|------------|------------|-----------| +| bioframe | 22.911206 | 23.118100 | 23.030572 | 0.16x | +| polars_bio | 3.541325 | 3.937760 | 3.684317 | **1.00x** | +| pyranges0 | 13.035069 | 13.510203 | 13.225005 | **0.28x** | +| pyranges1 | 20.924921 | 21.657297 | 21.398281 | 0.17x | +| pybedtools0 | 505.897157 | 521.239276 | 511.310686 | 0.01x | +| pygenomics | 159.883847 | 160.942329 | 160.306970 | 0.02x | +| genomicranges | 322.217280 | 322.490391 | 322.371662 | 0.01x | + + +##### L-size (7-8) + +Output size: 307,184,634 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|---------------|-------------|------------|-------------|-----------| +| bioframe | 29.128664 | 29.993182 | 29.518215 | 0.12x | +| polars_bio | 3.260438 | 3.897260 | 3.489278 | **1.00x** | +| pyranges0 | 16.615283 | 16.983202 | 16.753369 | **0.21x** | +| pyranges1 | 30.504657 | 30.912445 | 30.752887 | 0.11x | +| pybedtools0 | 555.480532 | 559.947421 | 556.986772 | 0.01x | +| pygenomics | 156.724420 | 157.321514 | 156.935424 | 0.02x | +| genomicranges | 416.095573 | 417.284236 | 416.700000 | 0.01x | + + +#### XL-size + +##### XL-size (3-0) + +Output size: 1,086,692,495 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|------------|------------|------------|------------|-----------| +| bioframe | 124.244987 | 126.569689 | 125.435831 | 0.12x | +| polars_bio | 12.650240 | 15.858913 | 14.776997 | **1.00x** | +| pyranges0 | 85.652054 | 94.383934 | 88.712706 | **0.17x** | +| pyranges1 | 92.802026 | 94.400313 | 93.447716 | 0.16x | + + +### AMD Genoa (Linux) 🐧 + +[c3d-highmem-8](https://gcloud-compute.com/c3d-highmem-8.html) machine was used for benchmarking. + +- cpu architecture: `x86_64` +- cpu name: `AMD EPYC 9B14` +- cpu cores: `4` +- memory: `63 GB` +- kernel: `#22~22.04.1-Ubuntu SMP Mon Dec 9 20:42:57 UTC 2024` +- system: `Linux` +- os-release: `Linux-6.8.0-1020-gcp-x86_64-with-glibc2.35` +- python: `3.12.8` +- polars-bio: `0.3.0` + +#### S-size +##### S-size (1-2) + +Output size: 54,246 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|---------------|----------|----------|----------|-----------| +| bioframe | 0.094509 | 0.095311 | 0.094797 | 0.61x | +| polars_bio | 0.058527 | 0.066444 | 0.061503 | **0.95x** | +| pyranges0 | 0.057583 | 0.059461 | 0.058245 | **1.00x** | +| pyranges1 | 0.098868 | 0.107992 | 0.101964 | 0.57x | +| pybedtools0 | 0.382701 | 0.384930 | 0.383619 | 0.15x | +| pygenomics | 2.335400 | 2.340616 | 2.338876 | 0.02x | +| genomicranges | 1.648289 | 1.663941 | 1.657652 | 0.04x | + + +##### S-size (2-7) + +Output size: 273,500 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|---------------|----------|----------|----------|-----------| +| bioframe | 0.273727 | 0.275239 | 0.274383 | 0.60x | +| polars_bio | 0.161882 | 0.164253 | 0.163334 | **1.00x** | +| pyranges0 | 0.169721 | 0.171931 | 0.170678 | **0.96x** | +| pyranges1 | 0.304432 | 0.323747 | 0.311284 | 0.52x | +| pybedtools0 | 1.477541 | 1.478301 | 1.477841 | 0.11x | +| pygenomics | 6.929725 | 6.932875 | 6.931662 | 0.02x | +| genomicranges | 5.096514 | 5.105638 | 5.100280 | 0.03x | + +##### S-size (1-0) + +Output size: 320,955 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|---------------|-----------|-----------|-----------|-----------| +| bioframe | 0.457869 | 0.460473 | 0.459397 | 0.55x | +| polars_bio | 0.251083 | 0.252582 | 0.251673 | **1.00x** | +| pyranges0 | 0.365083 | 0.376212 | 0.369148 | **0.68x** | +| pyranges1 | 0.593858 | 0.605304 | 0.600537 | 0.42x | +| pybedtools0 | 1.834958 | 1.858740 | 1.844379 | 0.14x | +| pygenomics | 12.730241 | 12.771149 | 12.756920 | 0.02x | +| genomicranges | 7.090998 | 7.121029 | 7.107298 | 0.04x | + + +#### M-size +##### M-size (7-0) + +Output size: 2,761,621 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|---------------|-----------|-----------|-----------|-----------| +| bioframe | 0.873343 | 0.875288 | 0.874457 | 0.50x | +| polars_bio | 0.420260 | 0.450565 | 0.433827 | **1.00x** | +| pyranges0 | 0.559251 | 0.564516 | 0.561273 | **0.77x** | +| pyranges1 | 1.876350 | 1.888463 | 1.880867 | 0.23x | +| pybedtools0 | 10.379844 | 10.430488 | 10.404292 | 0.04x | +| pygenomics | 15.553783 | 15.567857 | 15.562953 | 0.03x | +| genomicranges | 15.517461 | 15.548186 | 15.535206 | 0.03x | + + + +##### M-size (7-3) + +Output size: 4,408,383 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|---------------|-----------|-----------|-----------|-----------| +| bioframe | 1.022998 | 1.028002 | 1.024980 | 0.40x | +| polars_bio | 0.397203 | 0.426743 | 0.412704 | **1.00x** | +| pyranges0 | 0.590809 | 0.602570 | 0.594928 | **0.69x** | +| pyranges1 | 2.027123 | 2.074861 | 2.045372 | 0.20x | +| pybedtools0 | 15.957823 | 16.006681 | 15.988963 | 0.03x | +| pygenomics | 13.983596 | 13.994300 | 13.990662 | 0.03x | +| genomicranges | 18.602139 | 18.625446 | 18.615777 | 0.02x | + +#### L-size +##### L-size (0-8) + +Output size: 164,196,784 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|---------------|------------|------------|------------|-----------| +| bioframe | 21.459718 | 21.516023 | 21.480410 | 0.29x | +| polars_bio | 5.713430 | 6.952107 | 6.129996 | **1.00x** | +| pyranges0 | 15.898455 | 16.227408 | 16.011707 | **0.38x** | +| pyranges1 | 21.721230 | 22.272518 | 21.917855 | 0.28x | +| pybedtools0 | 575.612739 | 578.021023 | 577.165597 | 0.01x | +| pygenomics | 244.510614 | 245.508453 | 245.063967 | 0.03x | +| genomicranges | 440.650408 | 440.737924 | 440.706206 | 0.01x | + + +##### L-size (4-8) + +Output size: 227,832,153 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|------------|-----------|-----------|-----------|-----------| +| bioframe | 29.460466 | 29.864740 | 29.633731 | 0.34x | +| polars_bio | 9.731893 | 10.180046 | 9.968996 | **1.00x** | +| pyranges0 | 21.637592 | 22.724399 | 22.011753 | **0.45x** | +| pyranges1 | 37.035666 | 37.531010 | 37.218867 | 0.27x | + +##### L-size (7-8) + +Output size: 307,184,634 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|------------|-----------|-----------|-----------|-----------| +| bioframe | 38.547761 | 38.593432 | 38.573512 | 0.18x | +| polars_bio | 6.356472 | 8.204682 | 6.980182 | **1.00x** | +| pyranges0 | 28.664496 | 28.878972 | 28.751498 | **0.24x** | +| pyranges1 | 80.373241 | 80.871479 | 80.546908 | 0.09x | + + +### Intel Emerald Rapids (Linux) 🐧 + +[c4-highmem-8](https://gcloud-compute.com/c4-highmem-8.html) machine was used for benchmarking. + +- cpu architecture: `x86_64` +- cpu name: `INTEL(R) XEON(R) PLATINUM 8581C CPU @ 2.30GHz` +- cpu cores: `4` +- memory: `61 GB` +- kernel: `#27~22.04.1-Ubuntu SMP Tue Jul 16 23:03:39 UTC 2024` +- system: `Linux` +- os-release: `Linux-6.5.0-1025-gcp-x86_64-with-glibc2.35` +- python: `3.12.8` +- polars-bio: `0.3.0` + +#### S-size +##### S-size (1-2) + +Output size: 54,246 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|---------------|----------|----------|----------|-----------| +| bioframe | 0.080274 | 0.083350 | 0.082125 | 0.67x | +| polars_bio | 0.051923 | 0.060853 | 0.055115 | **1.00x** | +| pyranges0 | 0.057737 | 0.063692 | 0.060233 | **0.92x** | +| pyranges1 | 0.092273 | 0.104232 | 0.096598 | 0.57x | +| pybedtools0 | 0.342928 | 0.350446 | 0.345739 | 0.16x | +| pygenomics | 1.933479 | 1.980263 | 1.958915 | 0.03x | +| genomicranges | 1.317808 | 1.365975 | 1.345268 | 0.04x | + +##### S-size (2-7) + +Output size: 273,500 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|---------------|----------|----------|----------|-----------| +| bioframe | 0.242910 | 0.250233 | 0.246872 | 0.59x | +| polars_bio | 0.142933 | 0.151324 | 0.146654 | **1.00x** | +| pyranges0 | 0.181919 | 0.184524 | 0.183063 | **0.80x** | +| pyranges1 | 0.303359 | 0.305036 | 0.304166 | 0.48x | +| pybedtools0 | 1.303765 | 1.318575 | 1.310322 | 0.11x | +| pygenomics | 5.744573 | 5.917737 | 5.816145 | 0.03x | +| genomicranges | 4.202981 | 4.298941 | 4.243175 | 0.03x | + + +##### S-size (1-0) + +Output: 320,955 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|---------------|-----------|-----------|-----------|-----------| +| bioframe | 0.421461 | 0.449266 | 0.434152 | 0.53x | +| polars_bio | 0.228252 | 0.233000 | 0.230004 | **1.00x** | +| pyranges0 | 0.383663 | 0.401601 | 0.391000 | **0.59x** | +| pyranges1 | 0.563753 | 0.575554 | 0.570290 | 0.40x | +| pybedtools0 | 1.617740 | 1.643310 | 1.631340 | 0.14x | +| pygenomics | 10.491757 | 10.753130 | 10.636810 | 0.02x | +| genomicranges | 5.806456 | 5.880285 | 5.851234 | 0.04x | + +#### M-size +##### M-size (7-0) + +Output: 2,761,621 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|---------------|-----------|-----------|-----------|-----------| +| bioframe | 0.900843 | 0.928098 | 0.917930 | 0.43x | +| polars_bio | 0.380828 | 0.408791 | 0.390157 | **1.00x** | +| pyranges0 | 0.580401 | 0.607483 | 0.595004 | **0.66x** | +| pyranges1 | 1.697365 | 1.705109 | 1.699965 | 0.23x | +| pybedtools0 | 9.120270 | 9.384526 | 9.211789 | 0.04x | +| pygenomics | 13.123205 | 13.179993 | 13.160740 | 0.03x | +| genomicranges | 13.230635 | 13.690668 | 13.472020 | 0.03x | + + +##### M-size (7-3) + +Output: 4,408,383 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|---------------|-----------|-----------|-----------|-----------| +| bioframe | 1.137155 | 1.142985 | 1.140749 | 0.35x | +| polars_bio | 0.382198 | 0.411443 | 0.396179 | **1.00x** | +| pyranges0 | 0.650236 | 0.675971 | 0.659619 | **0.60x** | +| pyranges1 | 1.818395 | 1.841851 | 1.826528 | 0.22x | +| pybedtools0 | 14.588216 | 14.666769 | 14.621019 | 0.03x | +| pygenomics | 11.975859 | 12.196851 | 12.121281 | 0.03x | +| genomicranges | 15.640415 | 15.839974 | 15.736289 | 0.03x | + +#### L-size +##### L-size (0-8) + +Output: 164,196,784 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|------------|-----------|-----------|-----------|-----------| +| bioframe | 28.818453 | 28.956365 | 28.884398 | 0.21x | +| polars_bio | 5.904987 | 6.562457 | 6.145784 | **1.00x** | +| pyranges0 | 22.664353 | 22.997717 | 22.806512 | **0.27x** | +| pyranges1 | 24.446387 | 24.804753 | 24.613135 | 0.25x | + + +##### L-size (4-8) + +Output: 227,832,153 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|------------|-----------|-----------|-----------|-----------| +| bioframe | 39.868340 | 40.109302 | 39.951601 | 0.25x | +| polars_bio | 9.736690 | 10.277895 | 10.021107 | **1.00x** | +| pyranges0 | 31.146222 | 31.290984 | 31.208499 | **0.32x** | +| pyranges1 | 39.407547 | 40.279563 | 39.843926 | 0.25x | + + +##### L-size (7-8) + +Output: 307,184,634 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|------------|-----------|-----------|-----------|-----------| +| bioframe | 51.923368 | 52.840132 | 52.354141 | 0.14x | +| polars_bio | 6.604371 | 7.975253 | 7.151908 | **1.00x** | +| pyranges0 | 41.702499 | 42.557826 | 42.027393 | **0.17x** | +| pyranges1 | 63.524302 | 63.774618 | 63.679367 | 0.11x | + + +### Sorted input + +!!! todo + - Add sorted input benchmarks + +## Nearest (closest) operation + +### Apple Silicon (macOS) šŸŽ + +#### S-size +##### S-size (1-2) + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------|----------|----------|----------|-----------| +| bioframe | 0.282320 | 0.288275 | 0.285267 | 0.31x | +| polars_bio | 0.085046 | 0.091221 | 0.087545 | **1.00x** | +| pyranges0 | 0.131831 | 0.134894 | 0.132961 | **0.66x** | +| pyranges1 | 0.174185 | 0.176994 | 0.175650 | 0.50x | +| pybedtools0 | 0.639068 | 0.648982 | 0.644444 | 0.14x | + +##### S-size (2-7) + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------|----------|----------|----------|-----------| +| bioframe | 0.819279 | 0.829933 | 0.826124 | 0.27x | +| polars_bio | 0.219446 | 0.222345 | 0.220642 | **1.00x** | +| pyranges0 | 0.336059 | 0.346129 | 0.339557 | **0.65x** | +| pyranges1 | 0.415821 | 0.425321 | 0.420848 | 0.52x | +| pybedtools0 | 1.477262 | 1.490676 | 1.483696 | 0.15x | + +##### S-size (1-0) + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------|----------|----------|----------|-----------| +| bioframe | 1.130541 | 1.140416 | 1.134000 | 0.18x | +| polars_bio | 0.196717 | 0.208593 | 0.204053 | **1.00x** | +| pyranges0 | 0.705755 | 0.734622 | 0.720525 | **0.28x** | +| pyranges1 | 0.764694 | 0.848379 | 0.803320 | 0.25x | +| pybedtools0 | 1.054003 | 1.106122 | 1.075032 | 0.19x | + +#### M-size +##### M-size (7-0) + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------|----------|----------|----------|-----------| +| bioframe | 2.477785 | 2.568602 | 2.509461 | 0.17x | +| polars_bio | 0.428317 | 0.444993 | 0.435540 | **1.00x** | +| pyranges0 | 0.776533 | 0.816372 | 0.795476 | **0.55x** | +| pyranges1 | 0.944443 | 0.956939 | 0.952353 | 0.46x | +| pybedtools0 | 3.891626 | 3.920097 | 3.907743 | 0.11x | + + +##### M-size (7-3) + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------|----------|----------|----------|-----------| +| bioframe | 2.753566 | 2.862580 | 2.797397 | 0.17x | +| polars_bio | 0.456776 | 0.473078 | 0.465653 | **1.00x** | +| pyranges0 | 0.763046 | 0.791106 | 0.773746 | **0.60x** | +| pyranges1 | 0.915549 | 0.943690 | 0.931994 | 0.50x | +| pybedtools0 | 3.781775 | 3.803629 | 3.794066 | 0.12x | + +#### L-size +##### L-size (0-8) + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------|-----------|-----------|-----------|-----------| +| bioframe | 48.211329 | 50.000878 | 49.136208 | 0.03x | +| polars_bio | 1.493048 | 1.620652 | 1.552847 | **1.00x** | +| pyranges0 | 3.082013 | 3.146659 | 3.116663 | **0.50x** | +| pyranges1 | 3.662140 | 3.706852 | 3.684952 | 0.42x | +| pybedtools0 | 10.561658 | 10.661184 | 10.603403 | 0.15x | + + +##### L-size (4-8) + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------|-----------|-----------|-----------|-----------| +| polars_bio | 1.778845 | 1.806916 | 1.793131 | **1.00x** | +| pyranges0 | 4.083200 | 4.223863 | 4.162773 | **0.43x** | +| pyranges1 | 5.263221 | 5.281766 | 5.274634 | 0.34x | +| pybedtools0 | 25.670818 | 25.789135 | 25.725079 | 0.07x | + + + +##### L-size (7-8) + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------|----------|----------|----------|-----------| +| polars_bio | 1.002583 | 1.018811 | 1.009884 | **1.00x** | +| pyranges0 | 2.700747 | 2.722101 | 2.712181 | **0.37x** | +| pyranges1 | 2.988758 | 3.026965 | 3.008430 | 0.34x | +| pybedtools0 | 9.403173 | 9.474385 | 9.441718 | 0.11x | + + +##### L-size (3-0) + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------|-----------|-----------|-----------|-----------| +| polars_bio | 0.917404 | 0.924649 | 0.921255 | **0.73x** | +| pyranges0 | 0.648998 | 0.701870 | 0.669507 | **1.00x** | +| pyranges1 | 0.945559 | 0.962450 | 0.956495 | 0.70x | +| pybedtools0 | 18.643435 | 18.860937 | 18.717684 | 0.04x | + + +### Intel Emerald Rapids (Linux) 🐧 + +#### S-size +##### S-size (1-2) + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------|----------|----------|----------|-----------| +| bioframe | 0.166667 | 0.170252 | 0.167967 | **0.64x** | +| polars_bio | 0.059757 | 0.200437 | 0.106731 | **1.00x** | +| pyranges0 | 0.179466 | 0.193530 | 0.187714 | 0.57x | +| pyranges1 | 0.242658 | 0.249828 | 0.245899 | 0.43x | +| pybedtools0 | 0.917019 | 0.931643 | 0.926433 | 0.12x | + + +##### S-size (2-7) + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------|----------|----------|----------|-----------| +| bioframe | 0.422708 | 0.429339 | 0.426257 | 0.48x | +| polars_bio | 0.198758 | 0.213887 | 0.205798 | **1.00x** | +| pyranges0 | 0.416234 | 0.421807 | 0.418619 | **0.49x** | +| pyranges1 | 0.531085 | 0.541683 | 0.536459 | 0.38x | +| pybedtools0 | 2.085108 | 2.086168 | 2.085780 | 0.10x | + + +##### S-size (1-0) + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------|----------|----------|----------|-----------| +| bioframe | 0.563159 | 0.578794 | 0.572864 | **0.33x** | +| polars_bio | 0.175278 | 0.206305 | 0.189767 | **1.00x** | +| pyranges0 | 0.683342 | 0.692020 | 0.687795 | 0.28x | +| pyranges1 | 0.747615 | 0.754387 | 0.750464 | 0.25x | +| pybedtools0 | 1.177251 | 1.192054 | 1.185509 | 0.16x | + +#### M-size +##### M-size (7-0) + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------|----------|----------|----------|-----------| +| bioframe | 1.200956 | 1.222905 | 1.210387 | 0.32x | +| polars_bio | 0.380992 | 0.388604 | 0.383601 | **1.00x** | +| pyranges0 | 0.811919 | 0.826886 | 0.821876 | **0.47x** | +| pyranges1 | 1.001142 | 1.039321 | 1.025727 | 0.37x | +| pybedtools0 | 5.498016 | 5.507600 | 5.503549 | 0.07x | + + +##### M-size (7-3) + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------|----------|----------|----------|-----------| +| bioframe | 1.254999 | 1.262944 | 1.259257 | 0.29x | +| polars_bio | 0.359952 | 0.380151 | 0.367453 | **1.00x** | +| pyranges0 | 0.772943 | 0.777694 | 0.775242 | **0.47x** | +| pyranges1 | 0.969036 | 0.976941 | 0.972361 | 0.38x | +| pybedtools0 | 5.394985 | 5.454826 | 5.431693 | 0.07x | + +#### L-size +##### L-size (0-8) + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------|-----------|-----------|-----------|-----------| +| bioframe | 21.325827 | 22.295620 | 21.664544 | 0.10x | +| polars_bio | 2.031079 | 2.123994 | 2.062699 | **1.00x** | +| pyranges0 | 4.146689 | 4.172250 | 4.161514 | **0.50x** | +| pyranges1 | 4.658245 | 5.014545 | 4.811681 | 0.43x | +| pybedtools0 | 16.245615 | 16.445935 | 16.373377 | 0.13x | + +##### L-size (4-8) + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------|-----------|-----------|-----------|-----------| +| bioframe | 29.156254 | 30.051563 | 29.682944 | 0.10x | +| polars_bio | 3.013091 | 3.045008 | 3.032196 | **1.00x** | +| pyranges0 | 5.610373 | 5.752500 | 5.693492 | **0.53x** | +| pyranges1 | 7.469939 | 7.503416 | 7.486032 | 0.41x | +| pybedtools0 | 39.047774 | 39.824156 | 39.436474 | 0.08x | + + +##### L-size (7-8) + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------|-----------|-----------|-----------|-----------| +| bioframe | 39.984802 | 40.155487 | 40.065113 | 0.05x | +| polars_bio | 1.868242 | 1.878759 | 1.873989 | **1.00x** | +| pyranges0 | 4.016616 | 4.034881 | 4.028447 | **0.47x** | +| pyranges1 | 4.251595 | 4.516436 | 4.341912 | 0.43x | +| pybedtools0 | 15.481021 | 15.533977 | 15.501447 | 0.12x | + +##### L-size (3-0) + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------|-----------|-----------|-----------|-----------| +| bioframe | 85.826377 | 86.023302 | 85.933492 | 0.01x | +| polars_bio | 1.093852 | 1.129010 | 1.113706 | **0.79x** | +| pyranges0 | 0.871503 | 0.903123 | 0.883908 | **1.00x** | +| pyranges1 | 1.151087 | 1.200064 | 1.168257 | 0.76x | +| pybedtools0 | 28.309991 | 28.624311 | 28.421618 | 0.03x | + + +#### XL-size +##### XL-size (0-4) + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------|------------|------------|------------|-----------| +| bioframe | 365.207028 | 365.455848 | 365.327366 | 0.01x | +| polars_bio | 3.553054 | 3.568899 | 3.559842 | 0.81x | +| pyranges0 | 2.867332 | 2.888607 | 2.879132 | **1.00x** | +| pyranges1 | 3.145913 | 3.294060 | 3.227092 | **0.89x** | +| pybedtools0 | 126.338178 | 127.104972 | 126.646993 | 0.02x | + + +##### XL-size (0-5) + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|------------|-----------|-----------|-----------|-----------| +| polars_bio | 15.814259 | 15.907476 | 15.845883 | **1.00x** | +| pyranges0 | 20.752479 | 20.837782 | 20.797340 | 0.76x | +| pyranges1 | 20.315355 | 20.490498 | 20.376382 | **0.78x** | + +## Parallel execution and scalability + +Apple Silicon and [c4-standard-32](https://gcloud-compute.com/c4-standard-32.html) machine were used for benchmarking. + +- cpu architecture: `x86_64` +- cpu name: `INTEL(R) XEON(R) PLATINUM 8581C CPU @ 2.30GHz` +- cpu cores: `16` +- memory: `118 GB` +- kernel: `#27~22.04.1-Ubuntu SMP Tue Jul 16 23:03:39 UTC 2024` +- system: `Linux` +- os-release: `Linux-6.5.0-1025-gcp-x86_64-with-glibc2.35` +- python: `3.12.8` +- polars-bio: `0.3.0` + +Two strategies were used for parallel execution (`n` - degree of parallelism): + +- `polars_bio-n`: Default, dynamic partitioning schema (median of 2 partitions/dataset) with repartitioning in DataFusion on Parquet scan and join operations: +```python +import polars_bio as pb +pb.ctx.set_option("datafusion.optimizer.repartition_joins", "true") +pb.ctx.set_option("datafusion.optimizer.repartition_file_scans", "true") +pb.ctx.set_option("datafusion.execution.coalesce_batches", "false") +``` +the `single-threaded` dataset was used (see [Test datasets](#test-datasets)) + + +- `polars_bio-n-p`: Custom partitioning schema (constant number of 8 partitions/dataset) without any repartitioning in DataFusion: +```python +import polars_bio as pb +pb.ctx.set_option("datafusion.optimizer.repartition_joins", "false") +pb.ctx.set_option("datafusion.optimizer.repartition_file_scans", "false") +pb.ctx.set_option("datafusion.execution.coalesce_batches", "false") +``` +the `parallel` dataset was used (see [Test datasets](#test-datasets)) + ### Overlap operation -![results-overlap-0.1.1.png](assets/results-overlap-0.1.1.png) -### Nearest interval operation -![results-nearest-0.1.1.png](assets/results-nearest-0.1.1.png) \ No newline at end of file +#### Apple Silicon (macOS) šŸŽ + +##### 0-8 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|----------------|-------------|-------------|-------------|-------------| +| pyranges0-1 | 9.146743 | 10.067171 | 9.512946 | 0.31x | +| pyranges1-1 | 17.084293 | 17.394639 | 17.207398 | 0.17x | +| polars_bio-1 | 2.784917 | 3.184688 | 2.963876 | **1.00x** | +| polars_bio-2 | 1.447746 | 2.194926 | 1.716935 | 1.73x | +| polars_bio-4 | 1.023359 | 1.031373 | 1.027862 | 2.88x | +| polars_bio-8 | 0.745024 | 0.766747 | 0.757039 | **3.92x** | +| -------------- | ----------- | ----------- | ----------- | ----------- | +| polars_bio-1-p | 3.106839 | 3.335528 | 3.221183 | 1.00x | +| polars_bio-2-p | 1.610237 | 1.643171 | 1.626704 | 1.98x | +| polars_bio-4-p | 0.947643 | 0.948290 | 0.947967 | 3.40x | +| polars_bio-8-p | 0.579332 | 0.585496 | 0.582414 | **5.53x** | + + +##### 7-8 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|----------------|-------------|-------------|-------------|-------------| +| pyranges0-1 | 16.015978 | 16.471722 | 16.183480 | 0.24x | +| pyranges1-1 | 30.504657 | 30.912445 | 30.752887 | 0.13x | +| polars_bio-1 | 3.582070 | 4.331780 | 3.930337 | **1.00x** | +| polars_bio-2 | 1.798026 | 1.866828 | 1.829596 | 2.15x | +| polars_bio-4 | 1.126025 | 1.135795 | 1.132349 | 3.47x | +| polars_bio-8 | 0.703821 | 0.707697 | 0.705424 | **5.57x** | +| -------------- | ----------- | ----------- | ----------- | ----------- | +| polars_bio-1-p | 3.862783 | 4.572159 | 4.217471 | 1.00x | +| polars_bio-2-p | 2.003091 | 2.006744 | 2.004917 | 2.10x | +| polars_bio-4-p | 1.081358 | 1.097517 | 1.089438 | 3.87x | +| polars_bio-8-p | 0.652152 | 0.653111 | 0.652631 | **6.46x** | + + + +##### 2-5 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|----------------|------------|------------|------------|-----------| +| pyranges0-1 | 7.359118 | 8.248676 | 7.747425 | 0.42x | +| pyranges1-1 | 12.017050 | 12.394313 | 12.172057 | 0.26x | +| polars_bio-1 | 3.168840 | 3.279239 | 3.221157 | **1.00x** | +| polars_bio-2 | 1.807984 | 1.896123 | 1.840286 | 1.75x | +| polars_bio-4 | 1.565173 | 1.855352 | 1.667814 | 1.93x | +| polars_bio-8 | 1.328546 | 1.644594 | 1.525987 | **2.11x** | +| -------------- | ---------- | ---------- | ---------- | --------- | +| polars_bio-1-p | 4.691770 | 4.771827 | 4.731799 | 1.00x | +| polars_bio-2-p | 2.498744 | 2.529678 | 2.514211 | 1.88x | +| polars_bio-4-p | 1.350183 | 1.360860 | 1.355522 | 3.49x | +| polars_bio-8-p | 0.746751 | 0.746974 | 0.746863 | **6.34x** | + + + +##### 3-0 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|----------------|-------------|-------------|-------------|-----------| +| pyranges0-1 | 78.437583 | 80.667906 | 79.691000 | 0.16x | +| pyranges1-1 | 149.301588 | 150.696560 | 150.214238 | 0.08x | +| polars_bio-1 | 8.699317 | 15.876707 | 12.749627 | **1.00x** | +| polars_bio-2 | 7.107510 | 11.556344 | 8.876861 | 1.44x | +| polars_bio-4 | 6.368686 | 6.746370 | 6.558874 | 1.94x | +| polars_bio-8 | 5.673492 | 6.341975 | 6.052686 | **2.11x** | +| -------------- | ----------- | ----------- | ----------- | --------- | +| polars_bio-1-p | 16.687511 | 19.602739 | 18.145125 | 1.00x | +| polars_bio-2-p | 9.592687 | 11.276648 | 10.434667 | 1.74x | +| polars_bio-4-p | 6.641342 | 6.712883 | 6.677113 | 2.72x | +| polars_bio-8-p | 5.365854 | 5.920471 | 5.643162 | **3.22x** | + + + + +#### Intel Emerald Rapids (Linux) 🐧 + +##### 0-8 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-----------------|-------------|-------------|-------------|-------------| +| pyranges0-1 | 22.427066 | 23.052440 | 22.637076 | 0.29x | +| pyranges1-1 | 35.304058 | 35.420546 | 35.342961 | 0.18x | +| polars_bio-1 | 5.664570 | 7.867539 | 6.508315 | **1.00x** | +| polars_bio-2 | 3.485226 | 3.621209 | 3.564963 | 1.83x | +| polars_bio-4 | 2.262268 | 2.320929 | 2.287944 | 2.84x | +| polars_bio-8 | 1.287120 | 1.311752 | 1.297510 | **5.02x** | +| --------------- | ----------- | ----------- | ----------- | ----------- | +| polars_bio-1-p | 5.825176 | 7.007628 | 6.252962 | 1.00x | +| polars_bio-2-p | 2.976644 | 3.025504 | 2.995113 | 2.09x | +| polars_bio-4-p | 1.622611 | 1.690197 | 1.650458 | 3.79x | +| polars_bio-8-p | 1.009492 | 1.046739 | 1.025886 | **6.10x** | + + +##### 7-8 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-----------------|-------------|-------------|-------------|-------------| +| pyranges0-1 | 41.676284 | 42.974216 | 42.485708 | 0.18x | +| pyranges1-1 | 63.524302 | 63.774618 | 63.679367 | 0.12x | +| polars_bio-1 | 6.510632 | 9.640636 | 7.619978 | **1.00x** | +| polars_bio-2 | 4.063316 | 4.558028 | 4.316856 | 1.77x | +| polars_bio-4 | 3.006938 | 3.116209 | 3.053199 | 2.50x | +| polars_bio-8 | 1.733345 | 1.782316 | 1.752699 | **4.35x** | +| --------------- | ----------- | ----------- | ----------- | ----------- | +| polars_bio-1-p | 6.666566 | 8.707044 | 7.364003 | 1.00x | +| polars_bio-2-p | 3.314721 | 3.438854 | 3.396223 | 2.17x | +| polars_bio-4-p | 1.755033 | 1.766559 | 1.760501 | 4.18x | +| polars_bio-8-p | 1.023208 | 1.055603 | 1.035804 | **7.11x** | + + + +##### 2-5 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-----------------|-------------|-------------|-------------|-------------| +| pyranges0-1 | 15.954215 | 17.879185 | 16.597961 | 0.32x | +| pyranges1-1 | 22.822777 | 23.005675 | 22.899582 | 0.23x | +| polars_bio-1 | 5.096198 | 5.652478 | 5.296669 | **1.00x** | +| polars_bio-2 | 3.216712 | 3.390962 | 3.296900 | 1.61x | +| polars_bio-4 | 2.941997 | 3.078842 | 3.004835 | 1.76x | +| polars_bio-8 | 2.373662 | 2.483793 | 2.423432 | **2.19x** | +| --------------- | ----------- | ----------- | ----------- | ----------- | +| polars_bio-1-p | 6.835908 | 8.957041 | 7.564713 | 1.00x | +| polars_bio-2-p | 3.406529 | 3.430781 | 3.416292 | 2.21x | +| polars_bio-4-p | 1.815182 | 1.942866 | 1.872337 | 4.04x | +| polars_bio-8-p | 1.026042 | 1.065482 | 1.039835 | **7.27x** | + + +##### 3-0 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|----------------|--------------|--------------|--------------|-------------| +| pyranges0-1 | 158.193622 | 159.014103 | 158.563798 | 0.17x | +| pyranges1-1 | OOM | OOM | OOM | OOM | +| polars_bio-1 | 26.957168 | 27.577231 | 27.316310 | **1.00x** | +| polars_bio-2 | 19.440849 | 19.631778 | 19.567068 | 1.40x | +| polars_bio-4 | 16.432316 | 16.657353 | 16.570284 | 1.65x | +| polars_bio-8 | 12.845359 | 13.136680 | 12.951113 | **2.11x** | +| -------------- | ------------ | ------------ | ------------ | ----------- | +| polars_bio-1-p | 34.869014 | 35.937479 | 35.249302 | 1.00x | +| polars_bio-2-p | 20.142638 | 20.460018 | 20.338156 | 1.73x | +| polars_bio-4-p | 11.641085 | 11.721084 | 11.672311 | 3.02x | +| polars_bio-8-p | 7.169329 | 7.339832 | 7.258024 | **4.86x** | + +### Nearest operation + +#### Apple Silicon (macOS) šŸŽ + +##### 7-8 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|----------------|------------|------------|------------|-----------| +| pyranges0-1 | 2.617098 | 2.632619 | 2.626817 | 0.39x | +| pyranges1-1 | 2.928071 | 2.952393 | 2.942198 | 0.35x | +| polars_bio-1 | 0.999672 | 1.038078 | 1.016733 | **1.00x** | +| polars_bio-2 | 0.624798 | 0.630383 | 0.627723 | 1.62x | +| polars_bio-4 | 0.412480 | 0.422400 | 0.417233 | 2.44x | +| polars_bio-8 | 0.286680 | 0.291932 | 0.290088 | **3.50x** | +| -------------- | ---------- | ---------- | ---------- | --------- | +| polars_bio-1-p | 1.450476 | 1.478374 | 1.466073 | 1.00x | +| polars_bio-2-p | 1.013673 | 1.029715 | 1.019719 | 1.44x | +| polars_bio-4-p | 0.812852 | 0.816052 | 0.814196 | 1.80x | +| polars_bio-8-p | 0.715727 | 0.726820 | 0.722109 | **2.03x** | + + +##### 0-8 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|----------------|------------|------------|------------|-----------| +| pyranges0-1 | 2.727178 | 2.788261 | 2.748268 | 0.39x | +| pyranges1-1 | 3.193758 | 3.290031 | 3.238138 | 0.33x | +| polars_bio-1 | 1.050470 | 1.111362 | 1.071476 | **1.00x** | +| polars_bio-2 | 0.603192 | 0.614378 | 0.607069 | 1.76x | +| polars_bio-4 | 0.477346 | 0.484047 | 0.480698 | 2.23x | +| polars_bio-8 | 0.371300 | 0.377496 | 0.374637 | **2.86x** | +| -------------- | ---------- | ---------- | ---------- | --------- | +| polars_bio-1-p | 1.459614 | 1.499385 | 1.485763 | 1.00x | +| polars_bio-2-p | 1.031476 | 1.032248 | 1.031815 | 1.44x | +| polars_bio-4-p | 0.813042 | 0.818795 | 0.815014 | 1.82x | +| polars_bio-8-p | 0.727105 | 0.735477 | 0.730848 | **2.03x** | + + + +##### 0-3 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|----------------|------------|------------|------------|-----------| +| pyranges0-1 | 0.605024 | 0.655083 | 0.628258 | 1.45x | +| pyranges1-1 | 0.892005 | 0.899846 | 0.895358 | 1.01x | +| polars_bio-1 | 0.901617 | 0.919927 | 0.908753 | **1.00x** | +| polars_bio-2 | 0.565947 | 0.570143 | 0.568091 | 1.60x | +| polars_bio-4 | 0.486143 | 0.487667 | 0.486668 | 1.87x | +| polars_bio-8 | 0.404343 | 0.408482 | 0.406183 | **2.24x** | +| -------------- | ---------- | ---------- | ---------- | --------- | +| polars_bio-1-p | 1.934625 | 1.983807 | 1.962461 | 1.00x | +| polars_bio-2-p | 1.063823 | 1.069980 | 1.067726 | 1.84x | +| polars_bio-4-p | 0.618193 | 0.620918 | 0.619740 | 3.17x | +| polars_bio-8-p | 0.378345 | 0.381553 | 0.380137 | **5.16x** | + + + +##### 2-5 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|----------------|------------|------------|------------|-----------| +| pyranges0-1 | 11.466866 | 11.731607 | 11.589608 | 0.16x | +| pyranges1-1 | 12.607366 | 12.686471 | 12.659969 | 0.15x | +| polars_bio-1 | 1.785067 | 1.984576 | 1.859738 | **1.00x** | +| polars_bio-2 | 1.550936 | 1.616606 | 1.576498 | 1.18x | +| polars_bio-4 | 1.293685 | 1.354271 | 1.327746 | 1.40x | +| polars_bio-8 | 1.229453 | 1.255038 | 1.244184 | **1.49x** | +| -------------- | ---------- | ---------- | ---------- | --------- | +| polars_bio-1-p | 4.099759 | 4.148830 | 4.119466 | 1.00x | +| polars_bio-2-p | 3.899533 | 3.927669 | 3.910608 | 1.05x | +| polars_bio-4-p | 3.730015 | 3.764352 | 3.748710 | 1.10x | +| polars_bio-8-p | 3.740107 | 3.776072 | 3.758196 | **1.10x** | + + + +##### Intel Emerald Rapids (Linux) 🐧 + +##### 7-8 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-----------------|------------|------------|------------|-----------| +| pyranges0-1 | 4.206312 | 4.294343 | 4.241896 | 0.45x | +| pyranges1-1 | 4.442628 | 4.488366 | 4.458621 | 0.43x | +| polars_bio-1 | 1.891354 | 1.948671 | 1.912490 | **1.00x** | +| polars_bio-2 | 1.283955 | 1.302282 | 1.295635 | 1.48x | +| polars_bio-4 | 1.078061 | 1.105893 | 1.094149 | 1.75x | +| polars_bio-8 | 0.712460 | 0.752014 | 0.727148 | **2.63x** | +| --------------- | ---------- | ---------- | ---------- | --------- | +| polars_bio-1-p | 2.828171 | 2.931478 | 2.890248 | 1.00x | +| polars_bio-2-p | 1.916772 | 1.936575 | 1.927385 | 1.50x | +| polars_bio-4-p | 1.456353 | 1.481438 | 1.472393 | 1.96x | +| polars_bio-8-p | 1.295097 | 1.350529 | 1.315073 | **2.20x** | + +##### 0-8 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-----------------|------------|------------|------------|-----------| +| pyranges0-1 | 4.231424 | 4.330897 | 4.274404 | 0.48x | +| pyranges1-1 | 4.763702 | 4.832694 | 4.797875 | 0.43x | +| polars_bio-1 | 2.041052 | 2.054510 | 2.048951 | **1.00x** | +| polars_bio-2 | 1.427670 | 1.462461 | 1.445207 | 1.42x | +| polars_bio-4 | 1.133872 | 1.182288 | 1.150375 | 1.78x | +| polars_bio-8 | 0.743850 | 0.786324 | 0.769738 | **2.66x** | +| --------------- | ---------- | ---------- | ---------- | --------- | +| polars_bio-1-p | 2.757630 | 2.817896 | 2.794401 | 1.00x | +| polars_bio-2-p | 1.912476 | 1.934266 | 1.926969 | 1.45x | +| polars_bio-4-p | 1.483118 | 1.571922 | 1.534062 | 1.82x | +| polars_bio-8-p | 1.345707 | 1.363905 | 1.356738 | **2.06x** | + + +##### 0-3 + + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-----------------|------------|------------|------------|-----------| +| pyranges0-1 | 0.929409 | 1.043995 | 0.989172 | 1.29x | +| pyranges1-1 | 1.232229 | 1.277243 | 1.250441 | 1.02x | +| polars_bio-1 | 1.121446 | 1.560456 | 1.272248 | **1.00x** | +| polars_bio-2 | 0.790184 | 0.798372 | 0.795170 | 1.60x | +| polars_bio-4 | 0.645712 | 0.662949 | 0.652850 | 1.95x | +| polars_bio-8 | 0.473802 | 0.505282 | 0.489050 | **2.60x** | +| --------------- | ---------- | ---------- | ---------- | --------- | +| polars_bio-1-p | 2.863790 | 3.048004 | 2.927503 | 1.00x | +| polars_bio-2-p | 1.545225 | 1.580199 | 1.560213 | 1.88x | +| polars_bio-4-p | 0.921394 | 0.944576 | 0.934756 | 3.13x | +| polars_bio-8-p | 0.625656 | 0.637595 | 0.632294 | **4.63x** | + + +##### 2-5 + + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-----------------|------------|------------|------------|-----------| +| pyranges0-1 | 21.188286 | 21.349862 | 21.267732 | 0.24x | +| pyranges1-1 | 19.789758 | 20.092196 | 19.913107 | 0.26x | +| polars_bio-1 | 5.085885 | 5.158123 | 5.120825 | **1.00x** | +| polars_bio-2 | 4.084694 | 4.328842 | 4.207706 | 1.22x | +| polars_bio-4 | 3.570746 | 3.885584 | 3.752306 | 1.36x | +| polars_bio-8 | 3.250405 | 3.413984 | 3.329296 | **1.54x** | +| --------------- | ---------- | ---------- | ---------- | --------- | +| polars_bio-1-p | 8.974429 | 9.101872 | 9.048213 | 1.00x | +| polars_bio-2-p | 8.297582 | 8.385287 | 8.339353 | 1.09x | +| polars_bio-4-p | 8.007553 | 8.099914 | 8.053293 | 1.12x | +| polars_bio-8-p | 7.851029 | 8.051397 | 7.939732 | 1.14x | +| polars_bio-16-p | 7.746810 | 7.985732 | 7.882904 | **1.15x** | + + +## DataFrames comparison + +!!! Note + In the following benchmarks we compared the perfoemance of Python DataFrames libraries in the following scenarios: + + - `polars_bio`: **native** Rust Parquet (*default*) reader and Polars **LazyFrame** (*default*) as an output. + - `polars_bio_pandas_lf`: **Pandas DataFrames** as an input and Polars **LazyFrame** as an output. + - `polars_bio_pandas_pd`: **Pandas DataFrames** as an input and Pandas **DataFrame** as an output. + - `polars_bio_polars_eager`: **Polars DataFrames** as an input and Polars **LazyFrame** as an output. + - `polars_bio_polars_lazy`: Polars **LazyFrames** as an input and Polars **LazyFrame** as an output. +### Apple Silicon (macOS) šŸŽ + +#### S-size +##### 1-2 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------------------|----------|----------|----------|-----------| +| polars_bio | 0.034696 | 0.036409 | 0.035352 | 0.83x | +| polars_bio_pandas_lf | 0.038730 | 0.040108 | 0.039277 | 0.75x | +| polars_bio_pandas_pd | 0.037271 | 0.038367 | 0.037958 | 0.77x | +| polars_bio_polars_eager | 0.029277 | 0.029464 | 0.029374 | **1.00x** | +| polars_bio_polars_lazy | 0.029450 | 0.030083 | 0.029727 | **0.99x** | + + + +##### 2-7 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------------------|----------|----------|----------|-----------| +| polars_bio | 0.091433 | 0.091646 | 0.091509 | 0.90x | +| polars_bio_pandas_lf | 0.104335 | 0.133236 | 0.114009 | 0.72x | +| polars_bio_pandas_pd | 0.102595 | 0.104520 | 0.103489 | 0.79x | +| polars_bio_polars_eager | 0.082429 | 0.085214 | 0.083439 | **0.98x** | +| polars_bio_polars_lazy | 0.081784 | 0.082521 | 0.082178 | **1.00x** | + + +##### 1-0 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------------------|----------|----------|----------|-----------| +| polars_bio | 0.137830 | 0.161670 | 0.145978 | 0.86x | +| polars_bio_pandas_lf | 0.153229 | 0.158764 | 0.155538 | 0.81x | +| polars_bio_pandas_pd | 0.153903 | 0.161426 | 0.156792 | 0.80x | +| polars_bio_polars_eager | 0.124594 | 0.130227 | 0.127729 | **0.98x** | +| polars_bio_polars_lazy | 0.124429 | 0.126208 | 0.125316 | **1.00x** | + + +#### M-size + +##### 7-0 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------------------|----------|----------|----------|-----------| +| polars_bio | 0.218274 | 0.241310 | 0.232544 | **1.00x** | +| polars_bio_pandas_lf | 0.279482 | 0.288486 | 0.283349 | 0.82x | +| polars_bio_pandas_pd | 0.292259 | 0.301428 | 0.295783 | 0.79x | +| polars_bio_polars_eager | 0.239037 | 0.242774 | 0.241256 | 0.96x | +| polars_bio_polars_lazy | 0.236283 | 0.243813 | 0.239054 | **0.97x** | + + +##### 7-3 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------------------|----------|----------|----------|-----------| +| polars_bio | 0.199343 | 0.224108 | 0.208181 | **1.00x** | +| polars_bio_pandas_lf | 0.284750 | 0.296619 | 0.290834 | 0.72x | +| polars_bio_pandas_pd | 0.308035 | 0.312373 | 0.309687 | 0.67x | +| polars_bio_polars_eager | 0.248849 | 0.251454 | 0.250025 | **0.83x** | +| polars_bio_polars_lazy | 0.252292 | 0.252924 | 0.252585 | 0.82x | + + +#### L-size + +##### 0-8 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------------------|----------|----------|----------|-----------| +| polars_bio | 2.933145 | 3.005864 | 2.958892 | **1.00x** | +| polars_bio_pandas_lf | 6.207847 | 6.345032 | 6.274848 | 0.47x | +| polars_bio_pandas_pd | 7.267690 | 7.322592 | 7.298297 | 0.41x | +| polars_bio_polars_eager | 6.114975 | 6.307444 | 6.194726 | **0.48x** | +| polars_bio_polars_lazy | 6.124255 | 6.229623 | 6.170878 | **0.48x** | + + +##### 4-8 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------------------|----------|----------|----------|-----------| +| polars_bio | 3.663420 | 3.810438 | 3.741928 | **1.00x** | +| polars_bio_pandas_lf | 7.970248 | 8.211973 | 8.109422 | 0.46x | +| polars_bio_pandas_pd | 9.233966 | 9.343848 | 9.288391 | 0.40x | +| polars_bio_polars_eager | 7.920726 | 8.045197 | 7.999649 | **0.47x** | +| polars_bio_polars_lazy | 7.851801 | 8.112940 | 7.952556 | **0.47x** | + +##### 7-8 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------------------|-----------|-----------|-----------|-----------| +| polars_bio | 3.931723 | 3.957598 | 3.945474 | **1.00x** | +| polars_bio_pandas_lf | 9.887706 | 10.987020 | 10.317384 | 0.38x | +| polars_bio_pandas_pd | 11.386133 | 11.489356 | 11.428774 | 0.35x | +| polars_bio_polars_eager | 9.334948 | 9.350016 | 9.343123 | **0.42x** | +| polars_bio_polars_lazy | 9.801333 | 10.048262 | 9.912648 | 0.40x | + + + +### Intel Emerald Rapids (Linux) 🐧 + +#### S-size + +##### 1-2 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------------------|----------|----------|----------|-----------| +| polars_bio | 0.044786 | 0.051431 | 0.047491 | 0.75x | +| polars_bio_pandas_lf | 0.049655 | 0.053397 | 0.051123 | 0.70x | +| polars_bio_pandas_pd | 0.049221 | 0.049408 | 0.049292 | 0.73x | +| polars_bio_polars_eager | 0.035443 | 0.037997 | 0.036327 | **0.99x** | +| polars_bio_polars_lazy | 0.035665 | 0.036124 | 0.035831 | **1.00x** | + +##### 2-7 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------------------|----------|----------|----------|-----------| +| polars_bio | 0.121025 | 0.125696 | 0.122869 | 0.88x | +| polars_bio_pandas_lf | 0.136112 | 0.146342 | 0.141704 | 0.76x | +| polars_bio_pandas_pd | 0.136125 | 0.137920 | 0.137167 | 0.79x | +| polars_bio_polars_eager | 0.106999 | 0.111473 | 0.108813 | **0.99x** | +| polars_bio_polars_lazy | 0.107742 | 0.108038 | 0.107885 | **1.00x** | + +##### 1-0 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------------------|----------|----------|----------|-----------| +| polars_bio | 0.180773 | 0.185704 | 0.183153 | 0.91x | +| polars_bio_pandas_lf | 0.210633 | 0.217342 | 0.213262 | 0.78x | +| polars_bio_pandas_pd | 0.211245 | 0.211972 | 0.211680 | 0.79x | +| polars_bio_polars_eager | 0.166366 | 0.169000 | 0.167294 | **1.00x** | +| polars_bio_polars_lazy | 0.166566 | 0.167847 | 0.167033 | **1.00x** | + +#### M-size +##### 7-0 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------------------|----------|----------|----------|---------| +| polars_bio | 0.306130 | 0.314524 | 0.309803 | 1.00x | +| polars_bio_pandas_lf | 0.416123 | 0.432397 | 0.422839 | 0.73x | +| polars_bio_pandas_pd | 0.410937 | 0.414566 | 0.412503 | 0.75x | +| polars_bio_polars_eager | 0.353321 | 0.364626 | 0.358433 | 0.86x | +| polars_bio_polars_lazy | 0.355099 | 0.359842 | 0.357666 | 0.87x | + +##### 7-3 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------------------|----------|----------|----------|------------| +| polars_bio | 0.283038 | 0.292933 | 0.288120 | ***1.00x** | +| polars_bio_pandas_lf | 0.496220 | 0.510444 | 0.502504 | 0.57x | +| polars_bio_pandas_pd | 0.495243 | 0.498179 | 0.497064 | 0.58x | +| polars_bio_polars_eager | 0.446789 | 0.455552 | 0.450521 | **0.64x** | +| polars_bio_polars_lazy | 0.450512 | 0.456530 | 0.453931 | 0.63x | + +#### L-size +##### 0-8 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------------------|-----------|-----------|-----------|------------| +| polars_bio | 4.519114 | 4.539367 | 4.532138 | ***1.00x** | +| polars_bio_pandas_lf | 12.710922 | 12.805014 | 12.751166 | 0.36x | +| polars_bio_pandas_pd | 12.699757 | 12.820158 | 12.759016 | 0.36x | +| polars_bio_polars_eager | 12.455788 | 12.555952 | 12.501217 | 0.36x | +| polars_bio_polars_lazy | 12.536595 | 12.579006 | 12.561026 | 0.36x | + +##### 4-8 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------------------|-----------|-----------|-----------|-----------| +| polars_bio | 6.043839 | 6.129112 | 6.088359 | **1.00x** | +| polars_bio_pandas_lf | 16.528438 | 16.674857 | 16.605654 | **0.37x** | +| polars_bio_pandas_pd | 16.575829 | 16.643302 | 16.600709 | 0.37x | +| polars_bio_polars_eager | 16.177433 | 16.185123 | 16.180217 | 0.38x | +| polars_bio_polars_lazy | 16.214009 | 16.395757 | 16.281422 | 0.37x | + +##### 7-8 + +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|-------------------------|-----------|-----------|-----------|------------| +| polars_bio | 4.600700 | 4.806215 | 4.689799 | ***1.00x** | +| polars_bio_pandas_lf | 19.858977 | 20.342740 | 20.104499 | 0.23x | +| polars_bio_pandas_pd | 20.263301 | 20.594552 | 20.402049 | 0.23x | +| polars_bio_polars_eager | 19.837098 | 20.012580 | 19.922743 | **0.24x** | +| polars_bio_polars_lazy | 19.803839 | 19.818197 | 19.813257 | **0.24x** | + + +### Parallel execution +#### Apple Silicon (macOS) šŸŽ + +##### 7-8 +| Library | Min (s) | Max (s) | Mean (s) | Speedup | +|---------------------------|----------|----------|----------|-----------| +| polars_bio-1 | 2.809130 | 3.025777 | 2.892455 | **1.00x** | +| polars_bio_pandas_lf-1 | 6.113947 | 6.343946 | 6.200402 | 0.47x | +| polars_bio_pandas_pd-1 | 7.101394 | 7.133803 | 7.121356 | 0.41x | +| polars_bio_polars_eager-1 | 6.083699 | 6.269502 | 6.188576 | 0.47x | +| polars_bio_polars_lazy-1 | 6.282692 | 6.359252 | 6.328352 | 0.46x | +| polars_bio-2 | 1.382220 | 1.489515 | 1.435259 | **2.02x** | +| polars_bio_pandas_lf-2 | 4.088560 | 4.139376 | 4.107673 | 0.70x | +| polars_bio_pandas_pd-2 | 5.591844 | 5.612861 | 5.603072 | 0.52x | +| polars_bio_polars_eager-2 | 3.995305 | 4.058894 | 4.020753 | 0.72x | +| polars_bio_polars_lazy-2 | 3.961027 | 4.047943 | 4.001683 | 0.72x | +| polars_bio-4 | 1.017920 | 1.077169 | 1.041166 | **2.78x** | +| polars_bio_pandas_lf-4 | 3.084727 | 3.126532 | 3.102596 | 0.93x | +| polars_bio_pandas_pd-4 | 4.925954 | 4.957415 | 4.943877 | 0.59x | +| polars_bio_polars_eager-4 | 2.914283 | 2.971686 | 2.935221 | 0.99x | +| polars_bio_polars_lazy-4 | 2.918793 | 2.944206 | 2.930453 | 0.99x | +| polars_bio-8 | 0.688430 | 0.751968 | 0.711147 | **4.07x** | +| polars_bio_pandas_lf-8 | 2.558258 | 2.606939 | 2.588139 | **1.12x** | +| polars_bio_pandas_pd-8 | 4.448074 | 4.490866 | 4.474837 | 0.65x | +| polars_bio_polars_eager-8 | 2.398288 | 2.513702 | 2.446019 | **1.18x** | +| polars_bio_polars_lazy-8 | 2.406907 | 2.418571 | 2.411573 | **1.20x** | + + + +## How to run the benchmarks +```bash +poetry env use python3.12 +poetry update +poetry shell +RUSTFLAGS="-Ctarget-cpu=native" maturin develop --release -m Cargo.toml +## export path with benchmark datasets, e.g. +export BENCH_DATA_ROOT=/Users/mwiewior/research/databio/ +## other test also in benchmark/src directory +python benchmark/src/bench_overlap.py +``` + +!!! todo + - Add more details on how to run the benchmarks \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 8c79567b..be6e3fdb 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -23,10 +23,11 @@ plugins: execute: true allow_errors: false - mkdocstrings: - default_handler: - python: - options: - docstring_style: google + default_handler: python + handlers: + options: + docstring_style: google + - markdown-exec theme: name: material logo: assets/logo.png diff --git a/poetry.lock b/poetry.lock index 7add96ed..efc20c33 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,24 +2,23 @@ [[package]] name = "anyio" -version = "4.7.0" +version = "4.8.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.9" files = [ - {file = "anyio-4.7.0-py3-none-any.whl", hash = "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352"}, - {file = "anyio-4.7.0.tar.gz", hash = "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48"}, + {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"}, + {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"}, ] [package.dependencies] -exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] trio = ["trio (>=0.26.1)"] [[package]] @@ -135,9 +134,6 @@ files = [ {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"}, ] -[package.dependencies] -typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} - [[package]] name = "attrs" version = "24.3.0" @@ -192,6 +188,42 @@ charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] +[[package]] +name = "biocframe" +version = "0.6.2" +description = "Flexible dataframe representation to support nested structures." +optional = false +python-versions = ">=3.9" +files = [ + {file = "BiocFrame-0.6.2-py3-none-any.whl", hash = "sha256:8fd427d45334b696661350a9aa490335c017158f8d270fcc97796d6fd40a37ee"}, + {file = "biocframe-0.6.2.tar.gz", hash = "sha256:0eb53268e010fbdd881ecf8c67cdfac8116cb205003f9609fe57790eb1eb64b5"}, +] + +[package.dependencies] +biocutils = ">=0.1.4" +numpy = "*" + +[package.extras] +optional = ["pandas", "polars"] +testing = ["pandas", "polars", "pytest", "pytest-cov", "setuptools"] + +[[package]] +name = "biocutils" +version = "0.2.1" +description = "Utilities to use across the biocpy packages." +optional = false +python-versions = ">=3.9" +files = [ + {file = "biocutils-0.2.1-py3-none-any.whl", hash = "sha256:3f09ed57a79e73c698f317e64c96386aee7d699046d6477987e2578af1836b6d"}, + {file = "biocutils-0.2.1.tar.gz", hash = "sha256:cec3c1c0166eea5a652da75ba9403e9fd270c297394f2745775c2b9c66085318"}, +] + +[package.dependencies] +numpy = "*" + +[package.extras] +testing = ["pandas", "pytest", "pytest-cov", "scipy", "setuptools"] + [[package]] name = "bioframe" version = "0.7.2" @@ -227,11 +259,185 @@ files = [ ] [package.dependencies] +tinycss2 = {version = ">=1.1.0,<1.5", optional = true, markers = "extra == \"css\""} webencodings = "*" [package.extras] css = ["tinycss2 (>=1.1.0,<1.5)"] +[[package]] +name = "brotli" +version = "1.1.0" +description = "Python bindings for the Brotli compression library" +optional = false +python-versions = "*" +files = [ + {file = "Brotli-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1140c64812cb9b06c922e77f1c26a75ec5e3f0fb2bf92cc8c58720dec276752"}, + {file = "Brotli-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c8fd5270e906eef71d4a8d19b7c6a43760c6abcfcc10c9101d14eb2357418de9"}, + {file = "Brotli-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ae56aca0402a0f9a3431cddda62ad71666ca9d4dc3a10a142b9dce2e3c0cda3"}, + {file = "Brotli-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43ce1b9935bfa1ede40028054d7f48b5469cd02733a365eec8a329ffd342915d"}, + {file = "Brotli-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7c4855522edb2e6ae7fdb58e07c3ba9111e7621a8956f481c68d5d979c93032e"}, + {file = "Brotli-1.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:38025d9f30cf4634f8309c6874ef871b841eb3c347e90b0851f63d1ded5212da"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e6a904cb26bfefc2f0a6f240bdf5233be78cd2488900a2f846f3c3ac8489ab80"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a37b8f0391212d29b3a91a799c8e4a2855e0576911cdfb2515487e30e322253d"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e84799f09591700a4154154cab9787452925578841a94321d5ee8fb9a9a328f0"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f66b5337fa213f1da0d9000bc8dc0cb5b896b726eefd9c6046f699b169c41b9e"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5dab0844f2cf82be357a0eb11a9087f70c5430b2c241493fc122bb6f2bb0917c"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e4fe605b917c70283db7dfe5ada75e04561479075761a0b3866c081d035b01c1"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1e9a65b5736232e7a7f91ff3d02277f11d339bf34099a56cdab6a8b3410a02b2"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:58d4b711689366d4a03ac7957ab8c28890415e267f9b6589969e74b6e42225ec"}, + {file = "Brotli-1.1.0-cp310-cp310-win32.whl", hash = "sha256:be36e3d172dc816333f33520154d708a2657ea63762ec16b62ece02ab5e4daf2"}, + {file = "Brotli-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:0c6244521dda65ea562d5a69b9a26120769b7a9fb3db2fe9545935ed6735b128"}, + {file = "Brotli-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a3daabb76a78f829cafc365531c972016e4aa8d5b4bf60660ad8ecee19df7ccc"}, + {file = "Brotli-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c8146669223164fc87a7e3de9f81e9423c67a79d6b3447994dfb9c95da16e2d6"}, + {file = "Brotli-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30924eb4c57903d5a7526b08ef4a584acc22ab1ffa085faceb521521d2de32dd"}, + {file = "Brotli-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ceb64bbc6eac5a140ca649003756940f8d6a7c444a68af170b3187623b43bebf"}, + {file = "Brotli-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a469274ad18dc0e4d316eefa616d1d0c2ff9da369af19fa6f3daa4f09671fd61"}, + {file = "Brotli-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:524f35912131cc2cabb00edfd8d573b07f2d9f21fa824bd3fb19725a9cf06327"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5b3cc074004d968722f51e550b41a27be656ec48f8afaeeb45ebf65b561481dd"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:19c116e796420b0cee3da1ccec3b764ed2952ccfcc298b55a10e5610ad7885f9"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:510b5b1bfbe20e1a7b3baf5fed9e9451873559a976c1a78eebaa3b86c57b4265"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a1fd8a29719ccce974d523580987b7f8229aeace506952fa9ce1d53a033873c8"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c247dd99d39e0338a604f8c2b3bc7061d5c2e9e2ac7ba9cc1be5a69cb6cd832f"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1b2c248cd517c222d89e74669a4adfa5577e06ab68771a529060cf5a156e9757"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2a24c50840d89ded6c9a8fdc7b6ed3692ed4e86f1c4a4a938e1e92def92933e0"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f31859074d57b4639318523d6ffdca586ace54271a73ad23ad021acd807eb14b"}, + {file = "Brotli-1.1.0-cp311-cp311-win32.whl", hash = "sha256:39da8adedf6942d76dc3e46653e52df937a3c4d6d18fdc94a7c29d263b1f5b50"}, + {file = "Brotli-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:aac0411d20e345dc0920bdec5548e438e999ff68d77564d5e9463a7ca9d3e7b1"}, + {file = "Brotli-1.1.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:32d95b80260d79926f5fab3c41701dbb818fde1c9da590e77e571eefd14abe28"}, + {file = "Brotli-1.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b760c65308ff1e462f65d69c12e4ae085cff3b332d894637f6273a12a482d09f"}, + {file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:316cc9b17edf613ac76b1f1f305d2a748f1b976b033b049a6ecdfd5612c70409"}, + {file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:caf9ee9a5775f3111642d33b86237b05808dafcd6268faa492250e9b78046eb2"}, + {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70051525001750221daa10907c77830bc889cb6d865cc0b813d9db7fefc21451"}, + {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f4bf76817c14aa98cc6697ac02f3972cb8c3da93e9ef16b9c66573a68014f91"}, + {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0c5516f0aed654134a2fc936325cc2e642f8a0e096d075209672eb321cff408"}, + {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c3020404e0b5eefd7c9485ccf8393cfb75ec38ce75586e046573c9dc29967a0"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4ed11165dd45ce798d99a136808a794a748d5dc38511303239d4e2363c0695dc"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4093c631e96fdd49e0377a9c167bfd75b6d0bad2ace734c6eb20b348bc3ea180"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e4c4629ddad63006efa0ef968c8e4751c5868ff0b1c5c40f76524e894c50248"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:861bf317735688269936f755fa136a99d1ed526883859f86e41a5d43c61d8966"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:87a3044c3a35055527ac75e419dfa9f4f3667a1e887ee80360589eb8c90aabb9"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c5529b34c1c9d937168297f2c1fde7ebe9ebdd5e121297ff9c043bdb2ae3d6fb"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ca63e1890ede90b2e4454f9a65135a4d387a4585ff8282bb72964fab893f2111"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e79e6520141d792237c70bcd7a3b122d00f2613769ae0cb61c52e89fd3443839"}, + {file = "Brotli-1.1.0-cp312-cp312-win32.whl", hash = "sha256:5f4d5ea15c9382135076d2fb28dde923352fe02951e66935a9efaac8f10e81b0"}, + {file = "Brotli-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951"}, + {file = "Brotli-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8bf32b98b75c13ec7cf774164172683d6e7891088f6316e54425fde1efc276d5"}, + {file = "Brotli-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7bc37c4d6b87fb1017ea28c9508b36bbcb0c3d18b4260fcdf08b200c74a6aee8"}, + {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c0ef38c7a7014ffac184db9e04debe495d317cc9c6fb10071f7fefd93100a4f"}, + {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91d7cc2a76b5567591d12c01f019dd7afce6ba8cba6571187e21e2fc418ae648"}, + {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93dde851926f4f2678e704fadeb39e16c35d8baebd5252c9fd94ce8ce68c4a0"}, + {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0db75f47be8b8abc8d9e31bc7aad0547ca26f24a54e6fd10231d623f183d089"}, + {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6967ced6730aed543b8673008b5a391c3b1076d834ca438bbd70635c73775368"}, + {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7eedaa5d036d9336c95915035fb57422054014ebdeb6f3b42eac809928e40d0c"}, + {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d487f5432bf35b60ed625d7e1b448e2dc855422e87469e3f450aa5552b0eb284"}, + {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:832436e59afb93e1836081a20f324cb185836c617659b07b129141a8426973c7"}, + {file = "Brotli-1.1.0-cp313-cp313-win32.whl", hash = "sha256:43395e90523f9c23a3d5bdf004733246fba087f2948f87ab28015f12359ca6a0"}, + {file = "Brotli-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:9011560a466d2eb3f5a6e4929cf4a09be405c64154e12df0dd72713f6500e32b"}, + {file = "Brotli-1.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a090ca607cbb6a34b0391776f0cb48062081f5f60ddcce5d11838e67a01928d1"}, + {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de9d02f5bda03d27ede52e8cfe7b865b066fa49258cbab568720aa5be80a47d"}, + {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2333e30a5e00fe0fe55903c8832e08ee9c3b1382aacf4db26664a16528d51b4b"}, + {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4d4a848d1837973bf0f4b5e54e3bec977d99be36a7895c61abb659301b02c112"}, + {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fdc3ff3bfccdc6b9cc7c342c03aa2400683f0cb891d46e94b64a197910dc4064"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:5eeb539606f18a0b232d4ba45adccde4125592f3f636a6182b4a8a436548b914"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:fd5f17ff8f14003595ab414e45fce13d073e0762394f957182e69035c9f3d7c2"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:069a121ac97412d1fe506da790b3e69f52254b9df4eb665cd42460c837193354"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e93dfc1a1165e385cc8239fab7c036fb2cd8093728cbd85097b284d7b99249a2"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:aea440a510e14e818e67bfc4027880e2fb500c2ccb20ab21c7a7c8b5b4703d75"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:6974f52a02321b36847cd19d1b8e381bf39939c21efd6ee2fc13a28b0d99348c"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:a7e53012d2853a07a4a79c00643832161a910674a893d296c9f1259859a289d2"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:d7702622a8b40c49bffb46e1e3ba2e81268d5c04a34f460978c6b5517a34dd52"}, + {file = "Brotli-1.1.0-cp36-cp36m-win32.whl", hash = "sha256:a599669fd7c47233438a56936988a2478685e74854088ef5293802123b5b2460"}, + {file = "Brotli-1.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d143fd47fad1db3d7c27a1b1d66162e855b5d50a89666af46e1679c496e8e579"}, + {file = "Brotli-1.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:11d00ed0a83fa22d29bc6b64ef636c4552ebafcef57154b4ddd132f5638fbd1c"}, + {file = "Brotli-1.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f733d788519c7e3e71f0855c96618720f5d3d60c3cb829d8bbb722dddce37985"}, + {file = "Brotli-1.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:929811df5462e182b13920da56c6e0284af407d1de637d8e536c5cd00a7daf60"}, + {file = "Brotli-1.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b63b949ff929fbc2d6d3ce0e924c9b93c9785d877a21a1b678877ffbbc4423a"}, + {file = "Brotli-1.1.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d192f0f30804e55db0d0e0a35d83a9fead0e9a359a9ed0285dbacea60cc10a84"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f296c40e23065d0d6650c4aefe7470d2a25fffda489bcc3eb66083f3ac9f6643"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:919e32f147ae93a09fe064d77d5ebf4e35502a8df75c29fb05788528e330fe74"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:23032ae55523cc7bccb4f6a0bf368cd25ad9bcdcc1990b64a647e7bbcce9cb5b"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:224e57f6eac61cc449f498cc5f0e1725ba2071a3d4f48d5d9dffba42db196438"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:cb1dac1770878ade83f2ccdf7d25e494f05c9165f5246b46a621cc849341dc01"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:3ee8a80d67a4334482d9712b8e83ca6b1d9bc7e351931252ebef5d8f7335a547"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:5e55da2c8724191e5b557f8e18943b1b4839b8efc3ef60d65985bcf6f587dd38"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:d342778ef319e1026af243ed0a07c97acf3bad33b9f29e7ae6a1f68fd083e90c"}, + {file = "Brotli-1.1.0-cp37-cp37m-win32.whl", hash = "sha256:587ca6d3cef6e4e868102672d3bd9dc9698c309ba56d41c2b9c85bbb903cdb95"}, + {file = "Brotli-1.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2954c1c23f81c2eaf0b0717d9380bd348578a94161a65b3a2afc62c86467dd68"}, + {file = "Brotli-1.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:efa8b278894b14d6da122a72fefcebc28445f2d3f880ac59d46c90f4c13be9a3"}, + {file = "Brotli-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:03d20af184290887bdea3f0f78c4f737d126c74dc2f3ccadf07e54ceca3bf208"}, + {file = "Brotli-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6172447e1b368dcbc458925e5ddaf9113477b0ed542df258d84fa28fc45ceea7"}, + {file = "Brotli-1.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a743e5a28af5f70f9c080380a5f908d4d21d40e8f0e0c8901604d15cfa9ba751"}, + {file = "Brotli-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0541e747cce78e24ea12d69176f6a7ddb690e62c425e01d31cc065e69ce55b48"}, + {file = "Brotli-1.1.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cdbc1fc1bc0bff1cef838eafe581b55bfbffaed4ed0318b724d0b71d4d377619"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:890b5a14ce214389b2cc36ce82f3093f96f4cc730c1cffdbefff77a7c71f2a97"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ab4fbee0b2d9098c74f3057b2bc055a8bd92ccf02f65944a241b4349229185a"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:141bd4d93984070e097521ed07e2575b46f817d08f9fa42b16b9b5f27b5ac088"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fce1473f3ccc4187f75b4690cfc922628aed4d3dd013d047f95a9b3919a86596"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d2b35ca2c7f81d173d2fadc2f4f31e88cc5f7a39ae5b6db5513cf3383b0e0ec7"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:af6fa6817889314555aede9a919612b23739395ce767fe7fcbea9a80bf140fe5"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:2feb1d960f760a575dbc5ab3b1c00504b24caaf6986e2dc2b01c09c87866a943"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4410f84b33374409552ac9b6903507cdb31cd30d2501fc5ca13d18f73548444a"}, + {file = "Brotli-1.1.0-cp38-cp38-win32.whl", hash = "sha256:db85ecf4e609a48f4b29055f1e144231b90edc90af7481aa731ba2d059226b1b"}, + {file = "Brotli-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3d7954194c36e304e1523f55d7042c59dc53ec20dd4e9ea9d151f1b62b4415c0"}, + {file = "Brotli-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5fb2ce4b8045c78ebbc7b8f3c15062e435d47e7393cc57c25115cfd49883747a"}, + {file = "Brotli-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7905193081db9bfa73b1219140b3d315831cbff0d8941f22da695832f0dd188f"}, + {file = "Brotli-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a77def80806c421b4b0af06f45d65a136e7ac0bdca3c09d9e2ea4e515367c7e9"}, + {file = "Brotli-1.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dadd1314583ec0bf2d1379f7008ad627cd6336625d6679cf2f8e67081b83acf"}, + {file = "Brotli-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:901032ff242d479a0efa956d853d16875d42157f98951c0230f69e69f9c09bac"}, + {file = "Brotli-1.1.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:22fc2a8549ffe699bfba2256ab2ed0421a7b8fadff114a3d201794e45a9ff578"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ae15b066e5ad21366600ebec29a7ccbc86812ed267e4b28e860b8ca16a2bc474"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:949f3b7c29912693cee0afcf09acd6ebc04c57af949d9bf77d6101ebb61e388c"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:89f4988c7203739d48c6f806f1e87a1d96e0806d44f0fba61dba81392c9e474d"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:de6551e370ef19f8de1807d0a9aa2cdfdce2e85ce88b122fe9f6b2b076837e59"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0737ddb3068957cf1b054899b0883830bb1fec522ec76b1098f9b6e0f02d9419"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4f3607b129417e111e30637af1b56f24f7a49e64763253bbc275c75fa887d4b2"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:6c6e0c425f22c1c719c42670d561ad682f7bfeeef918edea971a79ac5252437f"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:494994f807ba0b92092a163a0a283961369a65f6cbe01e8891132b7a320e61eb"}, + {file = "Brotli-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f0d8a7a6b5983c2496e364b969f0e526647a06b075d034f3297dc66f3b360c64"}, + {file = "Brotli-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cdad5b9014d83ca68c25d2e9444e28e967ef16e80f6b436918c700c117a85467"}, + {file = "Brotli-1.1.0.tar.gz", hash = "sha256:81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724"}, +] + +[[package]] +name = "brotlicffi" +version = "1.1.0.0" +description = "Python CFFI bindings to the Brotli library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "brotlicffi-1.1.0.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9b7ae6bd1a3f0df532b6d67ff674099a96d22bc0948955cb338488c31bfb8851"}, + {file = "brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19ffc919fa4fc6ace69286e0a23b3789b4219058313cf9b45625016bf7ff996b"}, + {file = "brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9feb210d932ffe7798ee62e6145d3a757eb6233aa9a4e7db78dd3690d7755814"}, + {file = "brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84763dbdef5dd5c24b75597a77e1b30c66604725707565188ba54bab4f114820"}, + {file = "brotlicffi-1.1.0.0-cp37-abi3-win32.whl", hash = "sha256:1b12b50e07c3911e1efa3a8971543e7648100713d4e0971b13631cce22c587eb"}, + {file = "brotlicffi-1.1.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:994a4f0681bb6c6c3b0925530a1926b7a189d878e6e5e38fae8efa47c5d9c613"}, + {file = "brotlicffi-1.1.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2e4aeb0bd2540cb91b069dbdd54d458da8c4334ceaf2d25df2f4af576d6766ca"}, + {file = "brotlicffi-1.1.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b7b0033b0d37bb33009fb2fef73310e432e76f688af76c156b3594389d81391"}, + {file = "brotlicffi-1.1.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54a07bb2374a1eba8ebb52b6fafffa2afd3c4df85ddd38fcc0511f2bb387c2a8"}, + {file = "brotlicffi-1.1.0.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7901a7dc4b88f1c1475de59ae9be59799db1007b7d059817948d8e4f12e24e35"}, + {file = "brotlicffi-1.1.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce01c7316aebc7fce59da734286148b1d1b9455f89cf2c8a4dfce7d41db55c2d"}, + {file = "brotlicffi-1.1.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:246f1d1a90279bb6069de3de8d75a8856e073b8ff0b09dcca18ccc14cec85979"}, + {file = "brotlicffi-1.1.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc4bc5d82bc56ebd8b514fb8350cfac4627d6b0743382e46d033976a5f80fab6"}, + {file = "brotlicffi-1.1.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c26ecb14386a44b118ce36e546ce307f4810bc9598a6e6cb4f7fca725ae7e6"}, + {file = "brotlicffi-1.1.0.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca72968ae4eaf6470498d5c2887073f7efe3b1e7d7ec8be11a06a79cc810e990"}, + {file = "brotlicffi-1.1.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:add0de5b9ad9e9aa293c3aa4e9deb2b61e99ad6c1634e01d01d98c03e6a354cc"}, + {file = "brotlicffi-1.1.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9b6068e0f3769992d6b622a1cd2e7835eae3cf8d9da123d7f51ca9c1e9c333e5"}, + {file = "brotlicffi-1.1.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8557a8559509b61e65083f8782329188a250102372576093c88930c875a69838"}, + {file = "brotlicffi-1.1.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a7ae37e5d79c5bdfb5b4b99f2715a6035e6c5bf538c3746abc8e26694f92f33"}, + {file = "brotlicffi-1.1.0.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391151ec86bb1c683835980f4816272a87eaddc46bb91cbf44f62228b84d8cca"}, + {file = "brotlicffi-1.1.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:2f3711be9290f0453de8eed5275d93d286abe26b08ab4a35d7452caa1fef532f"}, + {file = "brotlicffi-1.1.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1a807d760763e398bbf2c6394ae9da5815901aa93ee0a37bca5efe78d4ee3171"}, + {file = "brotlicffi-1.1.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa8ca0623b26c94fccc3a1fdd895be1743b838f3917300506d04aa3346fd2a14"}, + {file = "brotlicffi-1.1.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3de0cf28a53a3238b252aca9fed1593e9d36c1d116748013339f0949bfc84112"}, + {file = "brotlicffi-1.1.0.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6be5ec0e88a4925c91f3dea2bb0013b3a2accda6f77238f76a34a1ea532a1cb0"}, + {file = "brotlicffi-1.1.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d9eb71bb1085d996244439154387266fd23d6ad37161f6f52f1cd41dd95a3808"}, + {file = "brotlicffi-1.1.0.0.tar.gz", hash = "sha256:b77827a689905143f87915310b93b273ab17888fd43ef350d4832c4a71083c13"}, +] + +[package.dependencies] +cffi = ">=1.0.0" + [[package]] name = "certifi" version = "2024.12.14" @@ -335,127 +541,114 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.4.0" +version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.7" files = [ - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, - {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, - {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, + {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, + {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, ] [[package]] name = "click" -version = "8.1.7" +version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, + {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, + {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, ] [package.dependencies] @@ -491,76 +684,65 @@ test = ["pytest"] [[package]] name = "contourpy" -version = "1.3.0" +version = "1.3.1" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false -python-versions = ">=3.9" -files = [ - {file = "contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7"}, - {file = "contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42"}, - {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92f8557cbb07415a4d6fa191f20fd9d2d9eb9c0b61d1b2f52a8926e43c6e9af7"}, - {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36f965570cff02b874773c49bfe85562b47030805d7d8360748f3eca570f4cab"}, - {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cacd81e2d4b6f89c9f8a5b69b86490152ff39afc58a95af002a398273e5ce589"}, - {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69375194457ad0fad3a839b9e29aa0b0ed53bb54db1bfb6c3ae43d111c31ce41"}, - {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a52040312b1a858b5e31ef28c2e865376a386c60c0e248370bbea2d3f3b760d"}, - {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3faeb2998e4fcb256542e8a926d08da08977f7f5e62cf733f3c211c2a5586223"}, - {file = "contourpy-1.3.0-cp310-cp310-win32.whl", hash = "sha256:36e0cff201bcb17a0a8ecc7f454fe078437fa6bda730e695a92f2d9932bd507f"}, - {file = "contourpy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:87ddffef1dbe5e669b5c2440b643d3fdd8622a348fe1983fad7a0f0ccb1cd67b"}, - {file = "contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad"}, - {file = "contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49"}, - {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66"}, - {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081"}, - {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1"}, - {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d"}, - {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c"}, - {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb"}, - {file = "contourpy-1.3.0-cp311-cp311-win32.whl", hash = "sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c"}, - {file = "contourpy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67"}, - {file = "contourpy-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f"}, - {file = "contourpy-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6"}, - {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639"}, - {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c"}, - {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06"}, - {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09"}, - {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd"}, - {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35"}, - {file = "contourpy-1.3.0-cp312-cp312-win32.whl", hash = "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb"}, - {file = "contourpy-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b"}, - {file = "contourpy-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3"}, - {file = "contourpy-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7"}, - {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84"}, - {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0"}, - {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b"}, - {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da"}, - {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14"}, - {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8"}, - {file = "contourpy-1.3.0-cp313-cp313-win32.whl", hash = "sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294"}, - {file = "contourpy-1.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087"}, - {file = "contourpy-1.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8"}, - {file = "contourpy-1.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b"}, - {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973"}, - {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18"}, - {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8"}, - {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6"}, - {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2"}, - {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927"}, - {file = "contourpy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a11077e395f67ffc2c44ec2418cfebed032cd6da3022a94fc227b6faf8e2acb8"}, - {file = "contourpy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e8134301d7e204c88ed7ab50028ba06c683000040ede1d617298611f9dc6240c"}, - {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e12968fdfd5bb45ffdf6192a590bd8ddd3ba9e58360b29683c6bb71a7b41edca"}, - {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fd2a0fc506eccaaa7595b7e1418951f213cf8255be2600f1ea1b61e46a60c55f"}, - {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfb5c62ce023dfc410d6059c936dcf96442ba40814aefbfa575425a3a7f19dc"}, - {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68a32389b06b82c2fdd68276148d7b9275b5f5cf13e5417e4252f6d1a34f72a2"}, - {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94e848a6b83da10898cbf1311a815f770acc9b6a3f2d646f330d57eb4e87592e"}, - {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d78ab28a03c854a873787a0a42254a0ccb3cb133c672f645c9f9c8f3ae9d0800"}, - {file = "contourpy-1.3.0-cp39-cp39-win32.whl", hash = "sha256:81cb5ed4952aae6014bc9d0421dec7c5835c9c8c31cdf51910b708f548cf58e5"}, - {file = "contourpy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:14e262f67bd7e6eb6880bc564dcda30b15e351a594657e55b7eec94b6ef72843"}, - {file = "contourpy-1.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c"}, - {file = "contourpy-1.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779"}, - {file = "contourpy-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4"}, - {file = "contourpy-1.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:00ccd0dbaad6d804ab259820fa7cb0b8036bda0686ef844d24125d8287178ce0"}, - {file = "contourpy-1.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca947601224119117f7c19c9cdf6b3ab54c5726ef1d906aa4a69dfb6dd58102"}, - {file = "contourpy-1.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6ec93afeb848a0845a18989da3beca3eec2c0f852322efe21af1931147d12cb"}, - {file = "contourpy-1.3.0.tar.gz", hash = "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4"}, +python-versions = ">=3.10" +files = [ + {file = "contourpy-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab"}, + {file = "contourpy-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2f926efda994cdf3c8d3fdb40b9962f86edbc4457e739277b961eced3d0b4c1"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adce39d67c0edf383647a3a007de0a45fd1b08dedaa5318404f1a73059c2512b"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abbb49fb7dac584e5abc6636b7b2a7227111c4f771005853e7d25176daaf8453"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0cffcbede75c059f535725c1680dfb17b6ba8753f0c74b14e6a9c68c29d7ea3"}, + {file = "contourpy-1.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ab29962927945d89d9b293eabd0d59aea28d887d4f3be6c22deaefbb938a7277"}, + {file = "contourpy-1.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:974d8145f8ca354498005b5b981165b74a195abfae9a8129df3e56771961d595"}, + {file = "contourpy-1.3.1-cp310-cp310-win32.whl", hash = "sha256:ac4578ac281983f63b400f7fe6c101bedc10651650eef012be1ccffcbacf3697"}, + {file = "contourpy-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:174e758c66bbc1c8576992cec9599ce8b6672b741b5d336b5c74e35ac382b18e"}, + {file = "contourpy-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8b974d8db2c5610fb4e76307e265de0edb655ae8169e8b21f41807ccbeec4b"}, + {file = "contourpy-1.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:20914c8c973f41456337652a6eeca26d2148aa96dd7ac323b74516988bea89fc"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19d40d37c1c3a4961b4619dd9d77b12124a453cc3d02bb31a07d58ef684d3d86"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:113231fe3825ebf6f15eaa8bc1f5b0ddc19d42b733345eae0934cb291beb88b6"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4dbbc03a40f916a8420e420d63e96a1258d3d1b58cbdfd8d1f07b49fcbd38e85"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a04ecd68acbd77fa2d39723ceca4c3197cb2969633836ced1bea14e219d077c"}, + {file = "contourpy-1.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c414fc1ed8ee1dbd5da626cf3710c6013d3d27456651d156711fa24f24bd1291"}, + {file = "contourpy-1.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:31c1b55c1f34f80557d3830d3dd93ba722ce7e33a0b472cba0ec3b6535684d8f"}, + {file = "contourpy-1.3.1-cp311-cp311-win32.whl", hash = "sha256:f611e628ef06670df83fce17805c344710ca5cde01edfdc72751311da8585375"}, + {file = "contourpy-1.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b2bdca22a27e35f16794cf585832e542123296b4687f9fd96822db6bae17bfc9"}, + {file = "contourpy-1.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0ffa84be8e0bd33410b17189f7164c3589c229ce5db85798076a3fa136d0e509"}, + {file = "contourpy-1.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805617228ba7e2cbbfb6c503858e626ab528ac2a32a04a2fe88ffaf6b02c32bc"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade08d343436a94e633db932e7e8407fe7de8083967962b46bdfc1b0ced39454"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:47734d7073fb4590b4a40122b35917cd77be5722d80683b249dac1de266aac80"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ba94a401342fc0f8b948e57d977557fbf4d515f03c67682dd5c6191cb2d16ec"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efa874e87e4a647fd2e4f514d5e91c7d493697127beb95e77d2f7561f6905bd9"}, + {file = "contourpy-1.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1bf98051f1045b15c87868dbaea84f92408337d4f81d0e449ee41920ea121d3b"}, + {file = "contourpy-1.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:61332c87493b00091423e747ea78200659dc09bdf7fd69edd5e98cef5d3e9a8d"}, + {file = "contourpy-1.3.1-cp312-cp312-win32.whl", hash = "sha256:e914a8cb05ce5c809dd0fe350cfbb4e881bde5e2a38dc04e3afe1b3e58bd158e"}, + {file = "contourpy-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:08d9d449a61cf53033612cb368f3a1b26cd7835d9b8cd326647efe43bca7568d"}, + {file = "contourpy-1.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a761d9ccfc5e2ecd1bf05534eda382aa14c3e4f9205ba5b1684ecfe400716ef2"}, + {file = "contourpy-1.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:523a8ee12edfa36f6d2a49407f705a6ef4c5098de4f498619787e272de93f2d5"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece6df05e2c41bd46776fbc712e0996f7c94e0d0543af1656956d150c4ca7c81"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:573abb30e0e05bf31ed067d2f82500ecfdaec15627a59d63ea2d95714790f5c2"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fa36448e6a3a1a9a2ba23c02012c43ed88905ec80163f2ffe2421c7192a5d7"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ea9924d28fc5586bf0b42d15f590b10c224117e74409dd7a0be3b62b74a501c"}, + {file = "contourpy-1.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5b75aa69cb4d6f137b36f7eb2ace9280cfb60c55dc5f61c731fdf6f037f958a3"}, + {file = "contourpy-1.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:041b640d4ec01922083645a94bb3b2e777e6b626788f4095cf21abbe266413c1"}, + {file = "contourpy-1.3.1-cp313-cp313-win32.whl", hash = "sha256:36987a15e8ace5f58d4d5da9dca82d498c2bbb28dff6e5d04fbfcc35a9cb3a82"}, + {file = "contourpy-1.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:a7895f46d47671fa7ceec40f31fae721da51ad34bdca0bee83e38870b1f47ffd"}, + {file = "contourpy-1.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9ddeb796389dadcd884c7eb07bd14ef12408aaae358f0e2ae24114d797eede30"}, + {file = "contourpy-1.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19c1555a6801c2f084c7ddc1c6e11f02eb6a6016ca1318dd5452ba3f613a1751"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:841ad858cff65c2c04bf93875e384ccb82b654574a6d7f30453a04f04af71342"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4318af1c925fb9a4fb190559ef3eec206845f63e80fb603d47f2d6d67683901c"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:14c102b0eab282427b662cb590f2e9340a9d91a1c297f48729431f2dcd16e14f"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05e806338bfeaa006acbdeba0ad681a10be63b26e1b17317bfac3c5d98f36cda"}, + {file = "contourpy-1.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4d76d5993a34ef3df5181ba3c92fabb93f1eaa5729504fb03423fcd9f3177242"}, + {file = "contourpy-1.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:89785bb2a1980c1bd87f0cb1517a71cde374776a5f150936b82580ae6ead44a1"}, + {file = "contourpy-1.3.1-cp313-cp313t-win32.whl", hash = "sha256:8eb96e79b9f3dcadbad2a3891672f81cdcab7f95b27f28f1c67d75f045b6b4f1"}, + {file = "contourpy-1.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:287ccc248c9e0d0566934e7d606201abd74761b5703d804ff3df8935f523d546"}, + {file = "contourpy-1.3.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b457d6430833cee8e4b8e9b6f07aa1c161e5e0d52e118dc102c8f9bd7dd060d6"}, + {file = "contourpy-1.3.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb76c1a154b83991a3cbbf0dfeb26ec2833ad56f95540b442c73950af2013750"}, + {file = "contourpy-1.3.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:44a29502ca9c7b5ba389e620d44f2fbe792b1fb5734e8b931ad307071ec58c53"}, + {file = "contourpy-1.3.1.tar.gz", hash = "sha256:dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699"}, ] [package.dependencies] @@ -575,81 +757,97 @@ test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist" [[package]] name = "coverage" -version = "7.6.9" +version = "7.6.10" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" files = [ - {file = "coverage-7.6.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb"}, - {file = "coverage-7.6.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710"}, - {file = "coverage-7.6.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa"}, - {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1"}, - {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec"}, - {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3"}, - {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5"}, - {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073"}, - {file = "coverage-7.6.9-cp310-cp310-win32.whl", hash = "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198"}, - {file = "coverage-7.6.9-cp310-cp310-win_amd64.whl", hash = "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717"}, - {file = "coverage-7.6.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9"}, - {file = "coverage-7.6.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c"}, - {file = "coverage-7.6.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7"}, - {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9"}, - {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4"}, - {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1"}, - {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b"}, - {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3"}, - {file = "coverage-7.6.9-cp311-cp311-win32.whl", hash = "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0"}, - {file = "coverage-7.6.9-cp311-cp311-win_amd64.whl", hash = "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b"}, - {file = "coverage-7.6.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8"}, - {file = "coverage-7.6.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a"}, - {file = "coverage-7.6.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015"}, - {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3"}, - {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae"}, - {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4"}, - {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6"}, - {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f"}, - {file = "coverage-7.6.9-cp312-cp312-win32.whl", hash = "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692"}, - {file = "coverage-7.6.9-cp312-cp312-win_amd64.whl", hash = "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97"}, - {file = "coverage-7.6.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664"}, - {file = "coverage-7.6.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c"}, - {file = "coverage-7.6.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014"}, - {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00"}, - {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d"}, - {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a"}, - {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077"}, - {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb"}, - {file = "coverage-7.6.9-cp313-cp313-win32.whl", hash = "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba"}, - {file = "coverage-7.6.9-cp313-cp313-win_amd64.whl", hash = "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1"}, - {file = "coverage-7.6.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419"}, - {file = "coverage-7.6.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a"}, - {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4"}, - {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae"}, - {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030"}, - {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be"}, - {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e"}, - {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9"}, - {file = "coverage-7.6.9-cp313-cp313t-win32.whl", hash = "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b"}, - {file = "coverage-7.6.9-cp313-cp313t-win_amd64.whl", hash = "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611"}, - {file = "coverage-7.6.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902"}, - {file = "coverage-7.6.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be"}, - {file = "coverage-7.6.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599"}, - {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08"}, - {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464"}, - {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845"}, - {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf"}, - {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678"}, - {file = "coverage-7.6.9-cp39-cp39-win32.whl", hash = "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6"}, - {file = "coverage-7.6.9-cp39-cp39-win_amd64.whl", hash = "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4"}, - {file = "coverage-7.6.9-pp39.pp310-none-any.whl", hash = "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b"}, - {file = "coverage-7.6.9.tar.gz", hash = "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d"}, -] - -[package.dependencies] -tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + {file = "coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78"}, + {file = "coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c"}, + {file = "coverage-7.6.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a"}, + {file = "coverage-7.6.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165"}, + {file = "coverage-7.6.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988"}, + {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5"}, + {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3"}, + {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5"}, + {file = "coverage-7.6.10-cp310-cp310-win32.whl", hash = "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244"}, + {file = "coverage-7.6.10-cp310-cp310-win_amd64.whl", hash = "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e"}, + {file = "coverage-7.6.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3"}, + {file = "coverage-7.6.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43"}, + {file = "coverage-7.6.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132"}, + {file = "coverage-7.6.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f"}, + {file = "coverage-7.6.10-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994"}, + {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99"}, + {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd"}, + {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377"}, + {file = "coverage-7.6.10-cp311-cp311-win32.whl", hash = "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8"}, + {file = "coverage-7.6.10-cp311-cp311-win_amd64.whl", hash = "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609"}, + {file = "coverage-7.6.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853"}, + {file = "coverage-7.6.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078"}, + {file = "coverage-7.6.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0"}, + {file = "coverage-7.6.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50"}, + {file = "coverage-7.6.10-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022"}, + {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b"}, + {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0"}, + {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852"}, + {file = "coverage-7.6.10-cp312-cp312-win32.whl", hash = "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359"}, + {file = "coverage-7.6.10-cp312-cp312-win_amd64.whl", hash = "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247"}, + {file = "coverage-7.6.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9"}, + {file = "coverage-7.6.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b"}, + {file = "coverage-7.6.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690"}, + {file = "coverage-7.6.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18"}, + {file = "coverage-7.6.10-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c"}, + {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd"}, + {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e"}, + {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694"}, + {file = "coverage-7.6.10-cp313-cp313-win32.whl", hash = "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6"}, + {file = "coverage-7.6.10-cp313-cp313-win_amd64.whl", hash = "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e"}, + {file = "coverage-7.6.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe"}, + {file = "coverage-7.6.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273"}, + {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8"}, + {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098"}, + {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb"}, + {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0"}, + {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf"}, + {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2"}, + {file = "coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312"}, + {file = "coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d"}, + {file = "coverage-7.6.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:656c82b8a0ead8bba147de9a89bda95064874c91a3ed43a00e687f23cc19d53a"}, + {file = "coverage-7.6.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccc2b70a7ed475c68ceb548bf69cec1e27305c1c2606a5eb7c3afff56a1b3b27"}, + {file = "coverage-7.6.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5e37dc41d57ceba70956fa2fc5b63c26dba863c946ace9705f8eca99daecdc4"}, + {file = "coverage-7.6.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0aa9692b4fdd83a4647eeb7db46410ea1322b5ed94cd1715ef09d1d5922ba87f"}, + {file = "coverage-7.6.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa744da1820678b475e4ba3dfd994c321c5b13381d1041fe9c608620e6676e25"}, + {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0b1818063dc9e9d838c09e3a473c1422f517889436dd980f5d721899e66f315"}, + {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:59af35558ba08b758aec4d56182b222976330ef8d2feacbb93964f576a7e7a90"}, + {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7ed2f37cfce1ce101e6dffdfd1c99e729dd2ffc291d02d3e2d0af8b53d13840d"}, + {file = "coverage-7.6.10-cp39-cp39-win32.whl", hash = "sha256:4bcc276261505d82f0ad426870c3b12cb177752834a633e737ec5ee79bbdff18"}, + {file = "coverage-7.6.10-cp39-cp39-win_amd64.whl", hash = "sha256:457574f4599d2b00f7f637a0700a6422243b3565509457b2dbd3f50703e11f59"}, + {file = "coverage-7.6.10-pp39.pp310-none-any.whl", hash = "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f"}, + {file = "coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23"}, +] [package.extras] toml = ["tomli"] +[[package]] +name = "cssselect2" +version = "0.7.0" +description = "CSS selectors for Python ElementTree" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cssselect2-0.7.0-py3-none-any.whl", hash = "sha256:fd23a65bfd444595913f02fc71f6b286c29261e354c41d722ca7a261a49b5969"}, + {file = "cssselect2-0.7.0.tar.gz", hash = "sha256:1ccd984dab89fc68955043aca4e1b03e0cf29cad9880f6e28e3ba7a74b14aa5a"}, +] + +[package.dependencies] +tinycss2 = "*" +webencodings = "*" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["flake8", "isort", "pytest"] + [[package]] name = "cycler" version = "0.12.1" @@ -665,6 +863,25 @@ files = [ docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] tests = ["pytest", "pytest-cov", "pytest-xdist"] +[[package]] +name = "datafusion" +version = "43.1.0" +description = "Build and run queries against data" +optional = false +python-versions = ">=3.7" +files = [ + {file = "datafusion-43.1.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b40afe48762c7649d1ec3a0116e31d3ee5226812fc4896c0f309d3d490a855c8"}, + {file = "datafusion-43.1.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:a61d3efa91578108631ae5f8f070e15656d8eb125a34fe9a1df13db72ce1bcde"}, + {file = "datafusion-43.1.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb46deaf625558819cff708acb115d1d249a18adf51e1eaabda898979b344b5b"}, + {file = "datafusion-43.1.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0d9ae56162304475a147c8e7284b85bda1849659c4495da4d071834a2e6392cd"}, + {file = "datafusion-43.1.0-cp38-abi3-win_amd64.whl", hash = "sha256:930830dad47925b1a84b281184eafc00152f02a84a8acc770ac3ebd36b4db5ac"}, + {file = "datafusion-43.1.0.tar.gz", hash = "sha256:271fee9ed931e976bd095ceb50ba9907fd93267f4f9517a6ea83cd46c1aa42d5"}, +] + +[package.dependencies] +pyarrow = ">=11.0.0" +typing-extensions = {version = "*", markers = "python_version < \"3.13\""} + [[package]] name = "debugpy" version = "1.8.11" @@ -733,20 +950,6 @@ files = [ {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, ] -[[package]] -name = "exceptiongroup" -version = "1.2.2" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, - {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, -] - -[package.extras] -test = ["pytest (>=6)"] - [[package]] name = "executing" version = "2.1.0" @@ -850,6 +1053,11 @@ files = [ {file = "fonttools-4.55.3.tar.gz", hash = "sha256:3983313c2a04d6cc1fe9251f8fc647754cf49a61dac6cb1e7249ae67afaafc45"}, ] +[package.dependencies] +brotli = {version = ">=1.0.1", optional = true, markers = "platform_python_implementation == \"CPython\" and extra == \"woff\""} +brotlicffi = {version = ">=0.8.0", optional = true, markers = "platform_python_implementation != \"CPython\" and extra == \"woff\""} +zopfli = {version = ">=0.1.4", optional = true, markers = "extra == \"woff\""} + [package.extras] all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] @@ -875,6 +1083,27 @@ files = [ {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, ] +[[package]] +name = "genomicranges" +version = "0.5.0" +description = "Container class to represent and operate over genomic regions and annotations." +optional = false +python-versions = ">=3.9" +files = [ + {file = "GenomicRanges-0.5.0-py3-none-any.whl", hash = "sha256:b627e179390a71084d46c1706bf0f1644533e60c1d8324f42621f91da59f24ea"}, + {file = "genomicranges-0.5.0.tar.gz", hash = "sha256:9b8de867294805fcc642cef3b30db79a72a242b513fdbc675b877db7637751a8"}, +] + +[package.dependencies] +biocframe = ">=0.5.11" +biocutils = ">=0.1.3" +iranges = {version = ">=0.2.12", extras = ["optional"]} +numpy = "*" + +[package.extras] +optional = ["biobear", "joblib", "matplotlib", "pandas", "polars"] +testing = ["biobear", "joblib", "matplotlib", "pandas", "polars", "pytest", "pytest-cov", "rich", "seaborn", "setuptools"] + [[package]] name = "ghp-import" version = "2.1.0" @@ -894,13 +1123,13 @@ dev = ["flake8", "markdown", "twine", "wheel"] [[package]] name = "griffe" -version = "1.5.1" +version = "1.5.4" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.9" files = [ - {file = "griffe-1.5.1-py3-none-any.whl", hash = "sha256:ad6a7980f8c424c9102160aafa3bcdf799df0e75f7829d75af9ee5aef656f860"}, - {file = "griffe-1.5.1.tar.gz", hash = "sha256:72964f93e08c553257706d6cd2c42d1c172213feb48b2be386f243380b405d4b"}, + {file = "griffe-1.5.4-py3-none-any.whl", hash = "sha256:ed33af890586a5bebc842fcb919fc694b3dc1bc55b7d9e0228de41ce566b4a1d"}, + {file = "griffe-1.5.4.tar.gz", hash = "sha256:073e78ad3e10c8378c2f798bd4ef87b92d8411e9916e157fd366a17cc4fd4e52"}, ] [package.dependencies] @@ -964,13 +1193,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "identify" -version = "2.6.3" +version = "2.6.5" description = "File identification library for Python" optional = false python-versions = ">=3.9" files = [ - {file = "identify-2.6.3-py2.py3-none-any.whl", hash = "sha256:9edba65473324c2ea9684b1f944fe3191db3345e50b6d04571d10ed164f8d7bd"}, - {file = "identify-2.6.3.tar.gz", hash = "sha256:62f5dae9b5fef52c84cc188514e9ea4f3f636b1d8799ab5ebc475471f9e47a02"}, + {file = "identify-2.6.5-py2.py3-none-any.whl", hash = "sha256:14181a47091eb75b337af4c23078c9d09225cd4c48929f521f3bf16b09d02566"}, + {file = "identify-2.6.5.tar.gz", hash = "sha256:c10b33f250e5bba374fae86fb57f3adcebf1161bce7cdf92031915fd480c13bc"}, ] [package.extras] @@ -1015,18 +1244,15 @@ type = ["pytest-mypy"] [[package]] name = "importlib-resources" -version = "6.4.5" +version = "6.5.2" description = "Read resources from Python packages" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "importlib_resources-6.4.5-py3-none-any.whl", hash = "sha256:ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717"}, - {file = "importlib_resources-6.4.5.tar.gz", hash = "sha256:980862a1d16c9e147a59603677fa2aa5fd82b87f223b6cb870695bcfce830065"}, + {file = "importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec"}, + {file = "importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c"}, ] -[package.dependencies] -zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} - [package.extras] check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] cover = ["pytest-cov"] @@ -1081,40 +1307,39 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio [[package]] name = "ipython" -version = "8.18.1" +version = "8.31.0" description = "IPython: Productive Interactive Computing" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, - {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, + {file = "ipython-8.31.0-py3-none-any.whl", hash = "sha256:46ec58f8d3d076a61d128fe517a51eb730e3aaf0c184ea8c17d16e366660c6a6"}, + {file = "ipython-8.31.0.tar.gz", hash = "sha256:b6a2274606bec6166405ff05e54932ed6e5cfecaca1fc05f2cacde7bb074d70b"}, ] [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -prompt-toolkit = ">=3.0.41,<3.1.0" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt_toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" -stack-data = "*" -traitlets = ">=5" -typing-extensions = {version = "*", markers = "python_version < \"3.10\""} +stack_data = "*" +traitlets = ">=5.13.0" [package.extras] -all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] black = ["black"] -doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing_extensions"] kernel = ["ipykernel"] +matplotlib = ["matplotlib"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] -test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] +test = ["packaging", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] [[package]] name = "ipywidgets" @@ -1137,6 +1362,29 @@ widgetsnbextension = ">=4.0.12,<4.1.0" [package.extras] test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] +[[package]] +name = "iranges" +version = "0.3.0" +description = "Python implementation of the [**IRanges**](https://bioconductor.org/packages/IRanges) Bioconductor package." +optional = false +python-versions = ">=3.9" +files = [ + {file = "IRanges-0.3.0-py3-none-any.whl", hash = "sha256:ab2c0cfc84e40defc391b9cd2cdcfa3ef916f67d0dca06d9e9bc326d300b2de5"}, + {file = "iranges-0.3.0.tar.gz", hash = "sha256:096399c9f4d3edc4f0660937d11b0be9d2c5a941d8e56cbd502aa90e4746ae18"}, +] + +[package.dependencies] +biocframe = ">=0.5.11" +biocutils = ">=0.1.4" +ncls = "0.0.68" +numpy = "*" +pandas = {version = "*", optional = true, markers = "extra == \"optional\""} +polars = {version = "*", optional = true, markers = "extra == \"optional\""} + +[package.extras] +optional = ["numpy", "pandas", "polars"] +testing = ["biocframe", "biocutils", "ncls (==0.0.68)", "numpy", "pandas", "polars", "pytest", "pytest-cov", "setuptools"] + [[package]] name = "isoduration" version = "20.11.0" @@ -1172,13 +1420,13 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] [[package]] name = "jinja2" -version = "3.1.4" +version = "3.1.5" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, - {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, + {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, + {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, ] [package.dependencies] @@ -1286,7 +1534,6 @@ files = [ ] [package.dependencies] -importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" python-dateutil = ">=2.8.2" pyzmq = ">=23.0" @@ -1343,13 +1590,13 @@ test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout" [[package]] name = "jupyter-events" -version = "0.10.0" +version = "0.11.0" description = "Jupyter Event System library" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "jupyter_events-0.10.0-py3-none-any.whl", hash = "sha256:4b72130875e59d57716d327ea70d3ebc3af1944d3717e5a498b8a06c6c159960"}, - {file = "jupyter_events-0.10.0.tar.gz", hash = "sha256:670b8229d3cc882ec782144ed22e0d29e1c2d639263f92ca8383e66682845e22"}, + {file = "jupyter_events-0.11.0-py3-none-any.whl", hash = "sha256:36399b41ce1ca45fe8b8271067d6a140ffa54cec4028e95491c93b78a855cacf"}, + {file = "jupyter_events-0.11.0.tar.gz", hash = "sha256:c0bc56a37aac29c1fbc3bcfbddb8c8c49533f9cf11f1c4e6adadba936574ab90"}, ] [package.dependencies] @@ -1363,7 +1610,7 @@ traitlets = ">=5.3" [package.extras] cli = ["click", "rich"] -docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme", "sphinxcontrib-spelling"] +docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme (>=0.16)", "sphinx (>=8)", "sphinxcontrib-spelling"] test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "rich"] [[package]] @@ -1378,18 +1625,17 @@ files = [ ] [package.dependencies] -importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} jupyter-server = ">=1.1.2" [[package]] name = "jupyter-server" -version = "2.14.2" +version = "2.15.0" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "jupyter_server-2.14.2-py3-none-any.whl", hash = "sha256:47ff506127c2f7851a17bf4713434208fc490955d0e8632e95014a9a9afbeefd"}, - {file = "jupyter_server-2.14.2.tar.gz", hash = "sha256:66095021aa9638ced276c248b1d81862e4c50f292d575920bbe960de1c56b12b"}, + {file = "jupyter_server-2.15.0-py3-none-any.whl", hash = "sha256:872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3"}, + {file = "jupyter_server-2.15.0.tar.gz", hash = "sha256:9d446b8697b4f7337a1b7cdcac40778babdd93ba614b6d68ab1c0c918f1c4084"}, ] [package.dependencies] @@ -1398,7 +1644,7 @@ argon2-cffi = ">=21.1" jinja2 = ">=3.0.3" jupyter-client = ">=7.4.4" jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -jupyter-events = ">=0.9.0" +jupyter-events = ">=0.11.0" jupyter-server-terminals = ">=0.4.4" nbconvert = ">=6.4.4" nbformat = ">=5.3.0" @@ -1438,19 +1684,18 @@ test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (> [[package]] name = "jupyterlab" -version = "4.3.3" +version = "4.3.4" description = "JupyterLab computational environment" optional = false python-versions = ">=3.8" files = [ - {file = "jupyterlab-4.3.3-py3-none-any.whl", hash = "sha256:32a8fd30677e734ffcc3916a4758b9dab21b02015b668c60eb36f84357b7d4b1"}, - {file = "jupyterlab-4.3.3.tar.gz", hash = "sha256:76fa39e548fdac94dc1204af5956c556f54c785f70ee26aa47ea08eda4d5bbcd"}, + {file = "jupyterlab-4.3.4-py3-none-any.whl", hash = "sha256:b754c2601c5be6adf87cb5a1d8495d653ffb945f021939f77776acaa94dae952"}, + {file = "jupyterlab-4.3.4.tar.gz", hash = "sha256:f0bb9b09a04766e3423cccc2fc23169aa2ffedcdf8713e9e0fb33cac0b6859d0"}, ] [package.dependencies] async-lru = ">=1.0.0" httpx = ">=0.25.0" -importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} ipykernel = ">=6.5.0" jinja2 = ">=3.0.3" jupyter-core = "*" @@ -1460,7 +1705,6 @@ jupyterlab-server = ">=2.27.1,<3" notebook-shim = ">=0.2" packaging = "*" setuptools = ">=40.8.0" -tomli = {version = ">=1.2.2", markers = "python_version < \"3.11\""} tornado = ">=6.2.0" traitlets = "*" @@ -1495,7 +1739,6 @@ files = [ [package.dependencies] babel = ">=2.10" -importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} jinja2 = ">=3.0.3" json5 = ">=0.9.0" jsonschema = ">=4.18.0" @@ -1521,13 +1764,13 @@ files = [ [[package]] name = "jupytext" -version = "1.16.5" +version = "1.16.6" description = "Jupyter notebooks as Markdown documents, Julia, Python or R scripts" optional = false python-versions = ">=3.8" files = [ - {file = "jupytext-1.16.5-py3-none-any.whl", hash = "sha256:0c96841e364b0ac401e7f45ee67ee523d69eb7bee59476b8ee96ba39fc964491"}, - {file = "jupytext-1.16.5.tar.gz", hash = "sha256:2d5f896f11ebee8342f0f5f9c4818a336e12db164bcaec009ea612cd5dc2caa8"}, + {file = "jupytext-1.16.6-py3-none-any.whl", hash = "sha256:900132031f73fee15a1c9ebd862e05eb5f51e1ad6ab3a2c6fdd97ce2f9c913b4"}, + {file = "jupytext-1.16.6.tar.gz", hash = "sha256:dbd03f9263c34b737003f388fc069e9030834fb7136879c4c32c32473557baa0"}, ] [package.dependencies] @@ -1536,7 +1779,6 @@ mdit-py-plugins = "*" nbformat = "*" packaging = "*" pyyaml = "*" -tomli = {version = "*", markers = "python_version < \"3.11\""} [package.extras] dev = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (>=1.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-cov (>=2.6.1)", "pytest-randomly", "pytest-xdist", "sphinx (<8)", "sphinx-gallery (<0.8)"] @@ -1550,125 +1792,106 @@ test-ui = ["calysto-bash"] [[package]] name = "kiwisolver" -version = "1.4.7" +version = "1.4.8" description = "A fast implementation of the Cassowary constraint solver" optional = false +python-versions = ">=3.10" +files = [ + {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db"}, + {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b"}, + {file = "kiwisolver-1.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e"}, + {file = "kiwisolver-1.4.8-cp310-cp310-win_amd64.whl", hash = "sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751"}, + {file = "kiwisolver-1.4.8-cp310-cp310-win_arm64.whl", hash = "sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271"}, + {file = "kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84"}, + {file = "kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561"}, + {file = "kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67"}, + {file = "kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34"}, + {file = "kiwisolver-1.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2"}, + {file = "kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502"}, + {file = "kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31"}, + {file = "kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8"}, + {file = "kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50"}, + {file = "kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476"}, + {file = "kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09"}, + {file = "kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1"}, + {file = "kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb"}, + {file = "kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2"}, + {file = "kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b"}, + {file = "kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e"}, +] + +[[package]] +name = "libsass" +version = "0.23.0" +description = "Sass for Python: A straightforward binding of libsass for Python." +optional = false python-versions = ">=3.8" files = [ - {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6"}, - {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17"}, - {file = "kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9"}, - {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9"}, - {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c"}, - {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599"}, - {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05"}, - {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407"}, - {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278"}, - {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5"}, - {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad"}, - {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895"}, - {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3"}, - {file = "kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc"}, - {file = "kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c"}, - {file = "kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a"}, - {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54"}, - {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95"}, - {file = "kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935"}, - {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb"}, - {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02"}, - {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51"}, - {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052"}, - {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18"}, - {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545"}, - {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b"}, - {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36"}, - {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3"}, - {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523"}, - {file = "kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d"}, - {file = "kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b"}, - {file = "kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376"}, - {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2"}, - {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a"}, - {file = "kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee"}, - {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640"}, - {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f"}, - {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483"}, - {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258"}, - {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e"}, - {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107"}, - {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948"}, - {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038"}, - {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383"}, - {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520"}, - {file = "kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b"}, - {file = "kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb"}, - {file = "kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a"}, - {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e"}, - {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6"}, - {file = "kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750"}, - {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d"}, - {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379"}, - {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c"}, - {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34"}, - {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1"}, - {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f"}, - {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b"}, - {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27"}, - {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a"}, - {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee"}, - {file = "kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07"}, - {file = "kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76"}, - {file = "kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650"}, - {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5d5abf8f8ec1f4e22882273c423e16cae834c36856cac348cfbfa68e01c40f3a"}, - {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aeb3531b196ef6f11776c21674dba836aeea9d5bd1cf630f869e3d90b16cfade"}, - {file = "kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c"}, - {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08471d4d86cbaec61f86b217dd938a83d85e03785f51121e791a6e6689a3be95"}, - {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bbfcb7165ce3d54a3dfbe731e470f65739c4c1f85bb1018ee912bae139e263b"}, - {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d34eb8494bea691a1a450141ebb5385e4b69d38bb8403b5146ad279f4b30fa3"}, - {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9242795d174daa40105c1d86aba618e8eab7bf96ba8c3ee614da8302a9f95503"}, - {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf"}, - {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8e045731a5416357638d1700927529e2b8ab304811671f665b225f8bf8d8f933"}, - {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4322872d5772cae7369f8351da1edf255a604ea7087fe295411397d0cfd9655e"}, - {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e1631290ee9271dffe3062d2634c3ecac02c83890ada077d225e081aca8aab89"}, - {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:edcfc407e4eb17e037bca59be0e85a2031a2ac87e4fed26d3e9df88b4165f92d"}, - {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4d05d81ecb47d11e7f8932bd8b61b720bf0b41199358f3f5e36d38e28f0532c5"}, - {file = "kiwisolver-1.4.7-cp38-cp38-win32.whl", hash = "sha256:b38ac83d5f04b15e515fd86f312479d950d05ce2368d5413d46c088dda7de90a"}, - {file = "kiwisolver-1.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:d83db7cde68459fc803052a55ace60bea2bae361fc3b7a6d5da07e11954e4b09"}, - {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd"}, - {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583"}, - {file = "kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417"}, - {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904"}, - {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a"}, - {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8"}, - {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2"}, - {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88"}, - {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde"}, - {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c"}, - {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2"}, - {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb"}, - {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327"}, - {file = "kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644"}, - {file = "kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4"}, - {file = "kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f"}, - {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643"}, - {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706"}, - {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6"}, - {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2"}, - {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4"}, - {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a"}, - {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bfa1acfa0c54932d5607e19a2c24646fb4c1ae2694437789129cf099789a3b00"}, - {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:eee3ea935c3d227d49b4eb85660ff631556841f6e567f0f7bda972df6c2c9935"}, - {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f3160309af4396e0ed04db259c3ccbfdc3621b5559b5453075e5de555e1f3a1b"}, - {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a17f6a29cf8935e587cc8a4dbfc8368c55edc645283db0ce9801016f83526c2d"}, - {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10849fb2c1ecbfae45a693c070e0320a91b35dd4bcf58172c023b994283a124d"}, - {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ac542bf38a8a4be2dc6b15248d36315ccc65f0743f7b1a76688ffb6b5129a5c2"}, - {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39"}, - {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e"}, - {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608"}, - {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674"}, - {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225"}, - {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0"}, - {file = "kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60"}, + {file = "libsass-0.23.0-cp38-abi3-macosx_11_0_x86_64.whl", hash = "sha256:34cae047cbbfc4ffa832a61cbb110f3c95f5471c6170c842d3fed161e40814dc"}, + {file = "libsass-0.23.0-cp38-abi3-macosx_14_0_arm64.whl", hash = "sha256:ea97d1b45cdc2fc3590cb9d7b60f1d8915d3ce17a98c1f2d4dd47ee0d9c68ce6"}, + {file = "libsass-0.23.0-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4a218406d605f325d234e4678bd57126a66a88841cb95bee2caeafdc6f138306"}, + {file = "libsass-0.23.0-cp38-abi3-win32.whl", hash = "sha256:31e86d92a5c7a551df844b72d83fc2b5e50abc6fbbb31e296f7bebd6489ed1b4"}, + {file = "libsass-0.23.0-cp38-abi3-win_amd64.whl", hash = "sha256:a2ec85d819f353cbe807432d7275d653710d12b08ec7ef61c124a580a8352f3c"}, + {file = "libsass-0.23.0.tar.gz", hash = "sha256:6f209955ede26684e76912caf329f4ccb57e4a043fd77fe0e7348dd9574f1880"}, ] [[package]] @@ -1682,13 +1905,27 @@ files = [ {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, ] -[package.dependencies] -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} - [package.extras] docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] testing = ["coverage", "pyyaml"] +[[package]] +name = "markdown-exec" +version = "1.10.0" +description = "Utilities to execute code blocks in Markdown files." +optional = false +python-versions = ">=3.9" +files = [ + {file = "markdown_exec-1.10.0-py3-none-any.whl", hash = "sha256:dea4e8b78a3fe7d8e664088ebaccbd4de51b65c45b9e0db9509a9bb4fce33192"}, + {file = "markdown_exec-1.10.0.tar.gz", hash = "sha256:d1fa017995ef337ec59e7ce49fbf3e051145a62c3124ae687c17e987f1392cd0"}, +] + +[package.dependencies] +pymdown-extensions = ">=9" + +[package.extras] +ansi = ["pygments-ansi-color"] + [[package]] name = "markdown-it-py" version = "3.0.0" @@ -1785,59 +2022,51 @@ files = [ [[package]] name = "matplotlib" -version = "3.9.4" +version = "3.10.0" description = "Python plotting package" optional = false -python-versions = ">=3.9" -files = [ - {file = "matplotlib-3.9.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c5fdd7abfb706dfa8d307af64a87f1a862879ec3cd8d0ec8637458f0885b9c50"}, - {file = "matplotlib-3.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d89bc4e85e40a71d1477780366c27fb7c6494d293e1617788986f74e2a03d7ff"}, - {file = "matplotlib-3.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddf9f3c26aae695c5daafbf6b94e4c1a30d6cd617ba594bbbded3b33a1fcfa26"}, - {file = "matplotlib-3.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18ebcf248030173b59a868fda1fe42397253f6698995b55e81e1f57431d85e50"}, - {file = "matplotlib-3.9.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:974896ec43c672ec23f3f8c648981e8bc880ee163146e0312a9b8def2fac66f5"}, - {file = "matplotlib-3.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:4598c394ae9711cec135639374e70871fa36b56afae17bdf032a345be552a88d"}, - {file = "matplotlib-3.9.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d4dd29641d9fb8bc4492420c5480398dd40a09afd73aebe4eb9d0071a05fbe0c"}, - {file = "matplotlib-3.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30e5b22e8bcfb95442bf7d48b0d7f3bdf4a450cbf68986ea45fca3d11ae9d099"}, - {file = "matplotlib-3.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bb0030d1d447fd56dcc23b4c64a26e44e898f0416276cac1ebc25522e0ac249"}, - {file = "matplotlib-3.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aca90ed222ac3565d2752b83dbb27627480d27662671e4d39da72e97f657a423"}, - {file = "matplotlib-3.9.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a181b2aa2906c608fcae72f977a4a2d76e385578939891b91c2550c39ecf361e"}, - {file = "matplotlib-3.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:1f6882828231eca17f501c4dcd98a05abb3f03d157fbc0769c6911fe08b6cfd3"}, - {file = "matplotlib-3.9.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:dfc48d67e6661378a21c2983200a654b72b5c5cdbd5d2cf6e5e1ece860f0cc70"}, - {file = "matplotlib-3.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:47aef0fab8332d02d68e786eba8113ffd6f862182ea2999379dec9e237b7e483"}, - {file = "matplotlib-3.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fba1f52c6b7dc764097f52fd9ab627b90db452c9feb653a59945de16752e965f"}, - {file = "matplotlib-3.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:173ac3748acaac21afcc3fa1633924609ba1b87749006bc25051c52c422a5d00"}, - {file = "matplotlib-3.9.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320edea0cadc07007765e33f878b13b3738ffa9745c5f707705692df70ffe0e0"}, - {file = "matplotlib-3.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a4a4cfc82330b27042a7169533da7991e8789d180dd5b3daeaee57d75cd5a03b"}, - {file = "matplotlib-3.9.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37eeffeeca3c940985b80f5b9a7b95ea35671e0e7405001f249848d2b62351b6"}, - {file = "matplotlib-3.9.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3e7465ac859ee4abcb0d836137cd8414e7bb7ad330d905abced457217d4f0f45"}, - {file = "matplotlib-3.9.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4c12302c34afa0cf061bea23b331e747e5e554b0fa595c96e01c7b75bc3b858"}, - {file = "matplotlib-3.9.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b8c97917f21b75e72108b97707ba3d48f171541a74aa2a56df7a40626bafc64"}, - {file = "matplotlib-3.9.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0229803bd7e19271b03cb09f27db76c918c467aa4ce2ae168171bc67c3f508df"}, - {file = "matplotlib-3.9.4-cp313-cp313-win_amd64.whl", hash = "sha256:7c0d8ef442ebf56ff5e206f8083d08252ee738e04f3dc88ea882853a05488799"}, - {file = "matplotlib-3.9.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a04c3b00066a688834356d196136349cb32f5e1003c55ac419e91585168b88fb"}, - {file = "matplotlib-3.9.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:04c519587f6c210626741a1e9a68eefc05966ede24205db8982841826af5871a"}, - {file = "matplotlib-3.9.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:308afbf1a228b8b525fcd5cec17f246bbbb63b175a3ef6eb7b4d33287ca0cf0c"}, - {file = "matplotlib-3.9.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddb3b02246ddcffd3ce98e88fed5b238bc5faff10dbbaa42090ea13241d15764"}, - {file = "matplotlib-3.9.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8a75287e9cb9eee48cb79ec1d806f75b29c0fde978cb7223a1f4c5848d696041"}, - {file = "matplotlib-3.9.4-cp313-cp313t-win_amd64.whl", hash = "sha256:488deb7af140f0ba86da003e66e10d55ff915e152c78b4b66d231638400b1965"}, - {file = "matplotlib-3.9.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3c3724d89a387ddf78ff88d2a30ca78ac2b4c89cf37f2db4bd453c34799e933c"}, - {file = "matplotlib-3.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d5f0a8430ffe23d7e32cfd86445864ccad141797f7d25b7c41759a5b5d17cfd7"}, - {file = "matplotlib-3.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bb0141a21aef3b64b633dc4d16cbd5fc538b727e4958be82a0e1c92a234160e"}, - {file = "matplotlib-3.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57aa235109e9eed52e2c2949db17da185383fa71083c00c6c143a60e07e0888c"}, - {file = "matplotlib-3.9.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b18c600061477ccfdd1e6fd050c33d8be82431700f3452b297a56d9ed7037abb"}, - {file = "matplotlib-3.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:ef5f2d1b67d2d2145ff75e10f8c008bfbf71d45137c4b648c87193e7dd053eac"}, - {file = "matplotlib-3.9.4-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:44e0ed786d769d85bc787b0606a53f2d8d2d1d3c8a2608237365e9121c1a338c"}, - {file = "matplotlib-3.9.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:09debb9ce941eb23ecdbe7eab972b1c3e0276dcf01688073faff7b0f61d6c6ca"}, - {file = "matplotlib-3.9.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc53cf157a657bfd03afab14774d54ba73aa84d42cfe2480c91bd94873952db"}, - {file = "matplotlib-3.9.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ad45da51be7ad02387801fd154ef74d942f49fe3fcd26a64c94842ba7ec0d865"}, - {file = "matplotlib-3.9.4.tar.gz", hash = "sha256:1e00e8be7393cbdc6fedfa8a6fba02cf3e83814b285db1c60b906a023ba41bc3"}, +python-versions = ">=3.10" +files = [ + {file = "matplotlib-3.10.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2c5829a5a1dd5a71f0e31e6e8bb449bc0ee9dbfb05ad28fc0c6b55101b3a4be6"}, + {file = "matplotlib-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2a43cbefe22d653ab34bb55d42384ed30f611bcbdea1f8d7f431011a2e1c62e"}, + {file = "matplotlib-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:607b16c8a73943df110f99ee2e940b8a1cbf9714b65307c040d422558397dac5"}, + {file = "matplotlib-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01d2b19f13aeec2e759414d3bfe19ddfb16b13a1250add08d46d5ff6f9be83c6"}, + {file = "matplotlib-3.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e6c6461e1fc63df30bf6f80f0b93f5b6784299f721bc28530477acd51bfc3d1"}, + {file = "matplotlib-3.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:994c07b9d9fe8d25951e3202a68c17900679274dadfc1248738dcfa1bd40d7f3"}, + {file = "matplotlib-3.10.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:fd44fc75522f58612ec4a33958a7e5552562b7705b42ef1b4f8c0818e304a363"}, + {file = "matplotlib-3.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c58a9622d5dbeb668f407f35f4e6bfac34bb9ecdcc81680c04d0258169747997"}, + {file = "matplotlib-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:845d96568ec873be63f25fa80e9e7fae4be854a66a7e2f0c8ccc99e94a8bd4ef"}, + {file = "matplotlib-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5439f4c5a3e2e8eab18e2f8c3ef929772fd5641876db71f08127eed95ab64683"}, + {file = "matplotlib-3.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4673ff67a36152c48ddeaf1135e74ce0d4bce1bbf836ae40ed39c29edf7e2765"}, + {file = "matplotlib-3.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:7e8632baebb058555ac0cde75db885c61f1212e47723d63921879806b40bec6a"}, + {file = "matplotlib-3.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4659665bc7c9b58f8c00317c3c2a299f7f258eeae5a5d56b4c64226fca2f7c59"}, + {file = "matplotlib-3.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d44cb942af1693cced2604c33a9abcef6205601c445f6d0dc531d813af8a2f5a"}, + {file = "matplotlib-3.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a994f29e968ca002b50982b27168addfd65f0105610b6be7fa515ca4b5307c95"}, + {file = "matplotlib-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b0558bae37f154fffda54d779a592bc97ca8b4701f1c710055b609a3bac44c8"}, + {file = "matplotlib-3.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:503feb23bd8c8acc75541548a1d709c059b7184cde26314896e10a9f14df5f12"}, + {file = "matplotlib-3.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:c40ba2eb08b3f5de88152c2333c58cee7edcead0a2a0d60fcafa116b17117adc"}, + {file = "matplotlib-3.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96f2886f5c1e466f21cc41b70c5a0cd47bfa0015eb2d5793c88ebce658600e25"}, + {file = "matplotlib-3.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:12eaf48463b472c3c0f8dbacdbf906e573013df81a0ab82f0616ea4b11281908"}, + {file = "matplotlib-3.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fbbabc82fde51391c4da5006f965e36d86d95f6ee83fb594b279564a4c5d0d2"}, + {file = "matplotlib-3.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad2e15300530c1a94c63cfa546e3b7864bd18ea2901317bae8bbf06a5ade6dcf"}, + {file = "matplotlib-3.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3547d153d70233a8496859097ef0312212e2689cdf8d7ed764441c77604095ae"}, + {file = "matplotlib-3.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:c55b20591ced744aa04e8c3e4b7543ea4d650b6c3c4b208c08a05b4010e8b442"}, + {file = "matplotlib-3.10.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9ade1003376731a971e398cc4ef38bb83ee8caf0aee46ac6daa4b0506db1fd06"}, + {file = "matplotlib-3.10.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:95b710fea129c76d30be72c3b38f330269363fbc6e570a5dd43580487380b5ff"}, + {file = "matplotlib-3.10.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdbaf909887373c3e094b0318d7ff230b2ad9dcb64da7ade654182872ab2593"}, + {file = "matplotlib-3.10.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d907fddb39f923d011875452ff1eca29a9e7f21722b873e90db32e5d8ddff12e"}, + {file = "matplotlib-3.10.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3b427392354d10975c1d0f4ee18aa5844640b512d5311ef32efd4dd7db106ede"}, + {file = "matplotlib-3.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5fd41b0ec7ee45cd960a8e71aea7c946a28a0b8a4dcee47d2856b2af051f334c"}, + {file = "matplotlib-3.10.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:81713dd0d103b379de4516b861d964b1d789a144103277769238c732229d7f03"}, + {file = "matplotlib-3.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:359f87baedb1f836ce307f0e850d12bb5f1936f70d035561f90d41d305fdacea"}, + {file = "matplotlib-3.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae80dc3a4add4665cf2faa90138384a7ffe2a4e37c58d83e115b54287c4f06ef"}, + {file = "matplotlib-3.10.0.tar.gz", hash = "sha256:b886d02a581b96704c9d1ffe55709e49b4d2d52709ccebc4be42db856e511278"}, ] [package.dependencies] contourpy = ">=1.0.1" cycler = ">=0.10" fonttools = ">=4.22.0" -importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} kiwisolver = ">=1.3.1" numpy = ">=1.23" packaging = ">=20.0" @@ -1846,7 +2075,7 @@ pyparsing = ">=2.3.1" python-dateutil = ">=2.7" [package.extras] -dev = ["meson-python (>=0.13.1,<0.17.0)", "numpy (>=1.25)", "pybind11 (>=2.6,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] +dev = ["meson-python (>=0.13.1,<0.17.0)", "pybind11 (>=2.13.2,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] [[package]] name = "matplotlib-inline" @@ -1864,29 +2093,26 @@ traitlets = "*" [[package]] name = "maturin" -version = "1.7.8" +version = "1.8.1" description = "Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages" optional = false python-versions = ">=3.7" files = [ - {file = "maturin-1.7.8-py3-none-linux_armv6l.whl", hash = "sha256:c6950fd2790acd93265e1501cea66f9249cff19724654424ca75a3b17ebb315b"}, - {file = "maturin-1.7.8-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:f98288d5c382bacf0c076871dfd50c38f1eb2248f417551e98dd6f47f6ee8afa"}, - {file = "maturin-1.7.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b2d4e0f674ca29864e6b86c2eb9fee8236d1c7496c25f7300e34229272468f4c"}, - {file = "maturin-1.7.8-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:6cafb17bf57822bdc04423d9e3e766d42918d474848fe9833e397267514ba891"}, - {file = "maturin-1.7.8-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:2b2bdee0c3a84696b3a809054c43ead1a04b7b3321cbd5b8f5676e4ba4691d0f"}, - {file = "maturin-1.7.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:b8188b71259fc2bc568d9c8acc186fcfed96f42539bcb55b8e6f4ec26e411f37"}, - {file = "maturin-1.7.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:a4f58c2a53c2958a1bf090960b08b28e676136cd88ac2f5dfdcf1b14ea54ec06"}, - {file = "maturin-1.7.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:c5d6c0c631d1fc646cd3834795e6cfd72ab4271d289df7e0f911261a02bec75f"}, - {file = "maturin-1.7.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c23664d19dadcbf800ef70f26afb2e0485a985c62889930934f019c565534c23"}, - {file = "maturin-1.7.8-py3-none-win32.whl", hash = "sha256:403eebf1afa6f19b49425f089e39c53b8e597bc86a47f3a76e828dc78d27fa80"}, - {file = "maturin-1.7.8-py3-none-win_amd64.whl", hash = "sha256:1ce48d007438b895f8665314b6748ac0dab31e4f32049a60b52281dd2dccbdde"}, - {file = "maturin-1.7.8-py3-none-win_arm64.whl", hash = "sha256:cc92a62953205e8945b6cfe6943d6a8576a4442d30d9c67141f944f4f4640e62"}, - {file = "maturin-1.7.8.tar.gz", hash = "sha256:649c6ef3f0fa4c5f596140d761dc5a4d577c485cc32fb5b9b344a8280352880d"}, + {file = "maturin-1.8.1-py3-none-linux_armv6l.whl", hash = "sha256:7e590a23d9076b8a994f2e67bc63dc9a2d1c9a41b1e7b45ac354ba8275254e89"}, + {file = "maturin-1.8.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8d8251a95682c83ea60988c804b620c181911cd824aa107b4a49ac5333c92968"}, + {file = "maturin-1.8.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b9fc1a4354cac5e32c190410208039812ea88c4a36bd2b6499268ec49ef5de00"}, + {file = "maturin-1.8.1-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:621e171c6b39f95f1d0df69a118416034fbd59c0f89dcaea8c2ea62019deecba"}, + {file = "maturin-1.8.1-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:98f638739a5132962347871b85c91f525c9246ef4d99796ae98a2031e3df029f"}, + {file = "maturin-1.8.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:f9f5c47521924b6e515cbc652a042fe5f17f8747445be9d931048e5d8ddb50a4"}, + {file = "maturin-1.8.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:0f4407c7353c31bfbb8cdeb82bc2170e474cbfb97b5ba27568f440c9d6c1fdd4"}, + {file = "maturin-1.8.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:ec49cd70cad3c389946c6e2bc0bd50772a7fcb463040dd800720345897eec9bf"}, + {file = "maturin-1.8.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08767d794de8f8a11c5c8b1b47a4ff9fb6ae2d2d97679e27030f2f509c8c2a0"}, + {file = "maturin-1.8.1-py3-none-win32.whl", hash = "sha256:d678407713f3e10df33c5b3d7a343ec0551eb7f14d8ad9ba6febeb96f4e4c75c"}, + {file = "maturin-1.8.1-py3-none-win_amd64.whl", hash = "sha256:a526f90fe0e5cb59ffb81f4ff547ddc42e823bbdeae4a31012c0893ca6dcaf46"}, + {file = "maturin-1.8.1-py3-none-win_arm64.whl", hash = "sha256:e95f077fd2ddd2f048182880eed458c308571a534be3eb2add4d3dac55bf57f4"}, + {file = "maturin-1.8.1.tar.gz", hash = "sha256:49cd964aabf59f8b0a6969f9860d2cdf194ac331529caae14c884f5659568857"}, ] -[package.dependencies] -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} - [package.extras] patchelf = ["patchelf"] zig = ["ziglang (>=0.10.0,<0.13.0)"] @@ -1973,13 +2199,13 @@ test = ["coverage", "flake8 (>=3.0)", "flake8-quotes", "shtab"] [[package]] name = "mistune" -version = "3.0.2" +version = "3.1.0" description = "A sane and fast Markdown parser with useful plugins and renderers" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, - {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, + {file = "mistune-3.1.0-py3-none-any.whl", hash = "sha256:b05198cf6d671b3deba6c87ec6cf0d4eb7b72c524636eddb6dbf13823b52cee1"}, + {file = "mistune-3.1.0.tar.gz", hash = "sha256:dbcac2f78292b9dc066cd03b7a3a26b62d85f8159f2ea5fd28e55df79908d667"}, ] [[package]] @@ -1997,7 +2223,6 @@ files = [ click = ">=7.0" colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} ghp-import = ">=1.0" -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} jinja2 = ">=2.11.1" markdown = ">=3.3.6" markupsafe = ">=2.0.1" @@ -2041,7 +2266,6 @@ files = [ ] [package.dependencies] -importlib-metadata = {version = ">=4.3", markers = "python_version < \"3.10\""} mergedeep = ">=1.3.4" platformdirs = ">=2.2.0" pyyaml = ">=5.1" @@ -2105,6 +2329,23 @@ files = [ {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, ] +[[package]] +name = "mkdocs-with-pdf" +version = "0.9.3" +description = "Generate a single PDF file from MkDocs repository" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mkdocs-with-pdf-0.9.3.tar.gz", hash = "sha256:bda3375d7040d1b8871da17c6d71ea736bdca6c669608f28ed62771031d2e0c6"}, + {file = "mkdocs_with_pdf-0.9.3-py3-none-any.whl", hash = "sha256:002d76417b5cc584effdfdb6ec8d073266a308a85680c430562e97f00b886e49"}, +] + +[package.dependencies] +beautifulsoup4 = ">=4.6.3" +libsass = ">=0.15" +mkdocs = ">=1.1" +weasyprint = ">=0.44" + [[package]] name = "mkdocstrings" version = "0.27.0" @@ -2118,7 +2359,6 @@ files = [ [package.dependencies] click = ">=7.0" -importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""} Jinja2 = ">=2.11.1" Markdown = ">=3.6" MarkupSafe = ">=1.1" @@ -2126,7 +2366,6 @@ mkdocs = ">=1.4" mkdocs-autorefs = ">=1.2" platformdirs = ">=2.2" pymdown-extensions = ">=6.3" -typing-extensions = {version = ">=4.1", markers = "python_version < \"3.10\""} [package.extras] crystal = ["mkdocstrings-crystal (>=0.3.4)"] @@ -2135,13 +2374,13 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] [[package]] name = "mkdocstrings-python" -version = "1.12.2" +version = "1.13.0" description = "A Python handler for mkdocstrings." optional = false python-versions = ">=3.9" files = [ - {file = "mkdocstrings_python-1.12.2-py3-none-any.whl", hash = "sha256:7f7d40d6db3cb1f5d19dbcd80e3efe4d0ba32b073272c0c0de9de2e604eda62a"}, - {file = "mkdocstrings_python-1.12.2.tar.gz", hash = "sha256:7a1760941c0b52a2cd87b960a9e21112ffe52e7df9d0b9583d04d47ed2e186f3"}, + {file = "mkdocstrings_python-1.13.0-py3-none-any.whl", hash = "sha256:b88bbb207bab4086434743849f8e796788b373bd32e7bfefbf8560ac45d88f97"}, + {file = "mkdocstrings_python-1.13.0.tar.gz", hash = "sha256:2dbd5757e8375b9720e81db16f52f1856bf59905428fd7ef88005d1370e2f64c"}, ] [package.dependencies] @@ -2151,49 +2390,54 @@ mkdocstrings = ">=0.26" [[package]] name = "mypy" -version = "1.13.0" +version = "1.14.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"}, - {file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"}, - {file = "mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7"}, - {file = "mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f"}, - {file = "mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, - {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, - {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, - {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"}, - {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"}, - {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"}, - {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"}, - {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"}, - {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"}, - {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"}, - {file = "mypy-1.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a"}, - {file = "mypy-1.13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb"}, - {file = "mypy-1.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b"}, - {file = "mypy-1.13.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74"}, - {file = "mypy-1.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6"}, - {file = "mypy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc"}, - {file = "mypy-1.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732"}, - {file = "mypy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc"}, - {file = "mypy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d"}, - {file = "mypy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24"}, - {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, - {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, -] - -[package.dependencies] -mypy-extensions = ">=1.0.0" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.6.0" + {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, + {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, + {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90716d8b2d1f4cd503309788e51366f07c56635a3309b0f6a32547eaaa36a64d"}, + {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae753f5c9fef278bcf12e1a564351764f2a6da579d4a81347e1d5a15819997b"}, + {file = "mypy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0fe0f5feaafcb04505bcf439e991c6d8f1bf8b15f12b05feeed96e9e7bf1427"}, + {file = "mypy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d54bd85b925e501c555a3227f3ec0cfc54ee8b6930bd6141ec872d1c572f81f"}, + {file = "mypy-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f995e511de847791c3b11ed90084a7a0aafdc074ab88c5a9711622fe4751138c"}, + {file = "mypy-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d64169ec3b8461311f8ce2fd2eb5d33e2d0f2c7b49116259c51d0d96edee48d1"}, + {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba24549de7b89b6381b91fbc068d798192b1b5201987070319889e93038967a8"}, + {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:183cf0a45457d28ff9d758730cd0210419ac27d4d3f285beda038c9083363b1f"}, + {file = "mypy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f2a0ecc86378f45347f586e4163d1769dd81c5a223d577fe351f26b179e148b1"}, + {file = "mypy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:ad3301ebebec9e8ee7135d8e3109ca76c23752bac1e717bc84cd3836b4bf3eae"}, + {file = "mypy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14"}, + {file = "mypy-1.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9"}, + {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11"}, + {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e"}, + {file = "mypy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89"}, + {file = "mypy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b"}, + {file = "mypy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255"}, + {file = "mypy-1.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34"}, + {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a"}, + {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9"}, + {file = "mypy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd"}, + {file = "mypy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107"}, + {file = "mypy-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7084fb8f1128c76cd9cf68fe5971b37072598e7c31b2f9f95586b65c741a9d31"}, + {file = "mypy-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f845a00b4f420f693f870eaee5f3e2692fa84cc8514496114649cfa8fd5e2c6"}, + {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44bf464499f0e3a2d14d58b54674dee25c031703b2ffc35064bd0df2e0fac319"}, + {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c99f27732c0b7dc847adb21c9d47ce57eb48fa33a17bc6d7d5c5e9f9e7ae5bac"}, + {file = "mypy-1.14.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:bce23c7377b43602baa0bd22ea3265c49b9ff0b76eb315d6c34721af4cdf1d9b"}, + {file = "mypy-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:8edc07eeade7ebc771ff9cf6b211b9a7d93687ff892150cb5692e4f4272b0837"}, + {file = "mypy-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3888a1816d69f7ab92092f785a462944b3ca16d7c470d564165fe703b0970c35"}, + {file = "mypy-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46c756a444117c43ee984bd055db99e498bc613a70bbbc120272bd13ca579fbc"}, + {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27fc248022907e72abfd8e22ab1f10e903915ff69961174784a3900a8cba9ad9"}, + {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:499d6a72fb7e5de92218db961f1a66d5f11783f9ae549d214617edab5d4dbdbb"}, + {file = "mypy-1.14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57961db9795eb566dc1d1b4e9139ebc4c6b0cb6e7254ecde69d1552bf7613f60"}, + {file = "mypy-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:07ba89fdcc9451f2ebb02853deb6aaaa3d2239a236669a63ab3801bbf923ef5c"}, + {file = "mypy-1.14.1-py3-none-any.whl", hash = "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1"}, + {file = "mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6"}, +] + +[package.dependencies] +mypy_extensions = ">=1.0.0" +typing_extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] @@ -2213,15 +2457,30 @@ files = [ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] +[[package]] +name = "natsort" +version = "8.4.0" +description = "Simple yet flexible natural sorting in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c"}, + {file = "natsort-8.4.0.tar.gz", hash = "sha256:45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581"}, +] + +[package.extras] +fast = ["fastnumbers (>=2.0.0)"] +icu = ["PyICU (>=1.0.0)"] + [[package]] name = "nbclient" -version = "0.10.1" +version = "0.10.2" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." optional = false -python-versions = ">=3.8.0" +python-versions = ">=3.9.0" files = [ - {file = "nbclient-0.10.1-py3-none-any.whl", hash = "sha256:949019b9240d66897e442888cfb618f69ef23dc71c01cb5fced8499c2cfc084d"}, - {file = "nbclient-0.10.1.tar.gz", hash = "sha256:3e93e348ab27e712acd46fccd809139e356eb9a31aab641d1a7991a6eb4e6f68"}, + {file = "nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d"}, + {file = "nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193"}, ] [package.dependencies] @@ -2232,25 +2491,24 @@ traitlets = ">=5.4" [package.extras] dev = ["pre-commit"] -docs = ["autodoc-traits", "flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "mock", "moto", "myst-parser", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling", "testpath", "xmltodict"] -test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] +docs = ["autodoc-traits", "flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "mock", "moto", "myst-parser", "nbconvert (>=7.1.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling", "testpath", "xmltodict"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.1.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] [[package]] name = "nbconvert" -version = "7.16.4" +version = "7.16.5" description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." optional = false python-versions = ">=3.8" files = [ - {file = "nbconvert-7.16.4-py3-none-any.whl", hash = "sha256:05873c620fe520b6322bf8a5ad562692343fe3452abda5765c7a34b7d1aa3eb3"}, - {file = "nbconvert-7.16.4.tar.gz", hash = "sha256:86ca91ba266b0a448dc96fa6c5b9d98affabde2867b363258703536807f9f7f4"}, + {file = "nbconvert-7.16.5-py3-none-any.whl", hash = "sha256:e12eac052d6fd03040af4166c563d76e7aeead2e9aadf5356db552a1784bd547"}, + {file = "nbconvert-7.16.5.tar.gz", hash = "sha256:c83467bb5777fdfaac5ebbb8e864f300b277f68692ecc04d6dab72f2d8442344"}, ] [package.dependencies] beautifulsoup4 = "*" -bleach = "!=5.0.0" +bleach = {version = "!=5.0.0", extras = ["css"]} defusedxml = "*" -importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} jinja2 = ">=3.0" jupyter-core = ">=4.7" jupyterlab-pygments = "*" @@ -2261,7 +2519,6 @@ nbformat = ">=5.7" packaging = "*" pandocfilters = ">=1.4.1" pygments = ">=2.4.1" -tinycss2 = "*" traitlets = ">=5.1" [package.extras] @@ -2294,6 +2551,69 @@ traitlets = ">=5.1" docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] test = ["pep440", "pre-commit", "pytest", "testpath"] +[[package]] +name = "ncls" +version = "0.0.68" +description = "A fast interval tree-like implementation in C, wrapped for the Python ecosystem." +optional = false +python-versions = "*" +files = [ + {file = "ncls-0.0.68-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2b0ec9876a5184ac07a11cf1bde6bbfbeb5f5a18943e213fee41233fd93c6f53"}, + {file = "ncls-0.0.68-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:012f997b767fb68b43bbad49fc8129cf14d742022234d7dc6fb3d01dd5b6b1b0"}, + {file = "ncls-0.0.68-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f67cb6531e4044663d89d27ff7baf0cf69e253751663aac84798e282ce8cfdd2"}, + {file = "ncls-0.0.68-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3eceb9c63e2d2c87cec79082c9907eae6c84800714e614701a890167b4063df2"}, + {file = "ncls-0.0.68-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:94b64e294cd42f45989b6f49263108e114a6410d013f39778712f52bee9de52e"}, + {file = "ncls-0.0.68-cp310-cp310-win32.whl", hash = "sha256:e19a94ac781dcab1e46f8d89f596687ee13745cb402414586dbf1c4dab47338b"}, + {file = "ncls-0.0.68-cp310-cp310-win_amd64.whl", hash = "sha256:2f97e23aaebe126d1dbbfb5d9830c85b140cae03dbecbc24e3f4b1e01e56c383"}, + {file = "ncls-0.0.68-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2738326cb1eac9c5d9e94f950ce5ac3113af3318568c85e9d04dfd97ef399798"}, + {file = "ncls-0.0.68-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ded131057fbe6d5d801b09a55ecaab3c5737a3b44950ce9031489cf8082ef58"}, + {file = "ncls-0.0.68-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d82c099ff0bc57fe38c018bcab20f2e7da819f3cb5167d475e22f1bcd1bdeae8"}, + {file = "ncls-0.0.68-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5150c05b79537e9be0571537ffefa246ae6b64d62bf6caa4e8a78e56a73bdb47"}, + {file = "ncls-0.0.68-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:232e20be1f60595eb980b1c7251c8c1cb6cc7d9f1106f7070fd5790712befa08"}, + {file = "ncls-0.0.68-cp311-cp311-win32.whl", hash = "sha256:04ec4589c8dec4eddeac722c24a79fa411adc6e61ddd5a43e4b06d17c1bb007e"}, + {file = "ncls-0.0.68-cp311-cp311-win_amd64.whl", hash = "sha256:6cbe316a9e47c087a69be63cce457b358396a1147b1bfc5420f39d6152ae157e"}, + {file = "ncls-0.0.68-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8730ab749b00796a044fe0ed12a0393d92327bddbc3d27760be7b0c67e9ef076"}, + {file = "ncls-0.0.68-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:06291311f8a1e61c9dce55af06c16cf6407d7b490f29baa266c85161818b6d92"}, + {file = "ncls-0.0.68-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ff5042a0ac6ff40ba14ba127c5d5f7fdc988b8ebdbeb463ec0e56e50578557a"}, + {file = "ncls-0.0.68-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6e27da7e43f63a5a55bd6573cdd90f4b22f81ce28527392ba830be56829f942a"}, + {file = "ncls-0.0.68-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:557556ebf9fc437ef75a2626130c70085bbe389d08dfc73a1fd6ccbc67b5fa3d"}, + {file = "ncls-0.0.68-cp37-cp37m-win32.whl", hash = "sha256:e27b504899dc2278fc6d9eb14b8226b1a64fb5cb7d1e12ff6dd1ffc6449aae08"}, + {file = "ncls-0.0.68-cp37-cp37m-win_amd64.whl", hash = "sha256:51db112d667899e727db8a58469fee7c50cf6a78d6c7a1068b1091302ab3190b"}, + {file = "ncls-0.0.68-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b201c8298d8b23b49f8f1c75a462f9a0a59db3a151f01a332667c808ae62bd79"}, + {file = "ncls-0.0.68-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2243c31ed0101768561e43abaffafe9c5783140f121416f072db922c197469cd"}, + {file = "ncls-0.0.68-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6553f2121e933e8bf816cfc3bdea2fc2d2d2ccaec41c7a72f57c0e7ba2dc6d9"}, + {file = "ncls-0.0.68-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2b9ba8760f2a9b83a22271fe5e899ad85658325e010bc68dde62327a9d3979f8"}, + {file = "ncls-0.0.68-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dec914444a3208c2220b49f9afa2790ac2f1cee758afc0a488b8f814a24b0c3"}, + {file = "ncls-0.0.68-cp38-cp38-win32.whl", hash = "sha256:1e3e1111628388fd8b957c8c293c76ed4cfbcf5491c11d8d251edfb30e23edd6"}, + {file = "ncls-0.0.68-cp38-cp38-win_amd64.whl", hash = "sha256:6e069b3d2523e73ec4f0588b29cfa0cc3af739cdad7f53b6c8d68ceb5930dbdf"}, + {file = "ncls-0.0.68-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bf9591296bd8c5ac722baf59512317b6e029bd832c5d25e5d8b01a4addc4388e"}, + {file = "ncls-0.0.68-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7312b2c7f97b7c91a31feeb53462301c15af286676932d3ae92371cbe57174c"}, + {file = "ncls-0.0.68-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:906af9e789412ef6d0a8b08d6870b40d39304865973f550b0eb6994d3d3217e8"}, + {file = "ncls-0.0.68-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:988f63ab36fb949ee5177c4384a0b7edf9e284a7cd5d4c590219b79df7caa6ea"}, + {file = "ncls-0.0.68-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:36d3412d19bf77200c24d9f72e14d1500171268f715296e076d468c7291476e4"}, + {file = "ncls-0.0.68-cp39-cp39-win32.whl", hash = "sha256:b6403dd279c4696efd3ae697a20dfc1dd7ace0e54f816ee0ad91cf21fc57346a"}, + {file = "ncls-0.0.68-cp39-cp39-win_amd64.whl", hash = "sha256:9455875acc2096fd64c38913445f2e858016aa1b9a09bcd371541a4f81302aca"}, + {file = "ncls-0.0.68-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:197982e0ab2b4b26fa94203a6138433cc324f3d7398f13deae736358ae69d0fd"}, + {file = "ncls-0.0.68-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6346c6a91d8958bf2bd550130998a4e786a357d3cd20d6c7d58eefa14e830534"}, + {file = "ncls-0.0.68-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7e1b7581c0a013f13c38865e9fb3874e2275d3cb326ffa48dd11eea9b5b7daa"}, + {file = "ncls-0.0.68-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:9bba731f161578c5b5d2407cc7072418debe784a68e564480c2a882361863a62"}, + {file = "ncls-0.0.68-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6c347d9fc5ddc09f20093f10e06c882099864438902f1bd3d2d0e07d5f27f9cc"}, + {file = "ncls-0.0.68-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:309ff2b68b6b71561ba84897b772cd2ea877a571e6bc08ea4a61af6366d998c3"}, + {file = "ncls-0.0.68-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a44716b47f18638bfe29ae87b4b90573ca22f88c545047cfc07fbae728bf56a"}, + {file = "ncls-0.0.68-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7db58d8f9cad500d42f114fb5f45ab752fc35a69d28c768a7ae8bc7edb7c9561"}, + {file = "ncls-0.0.68-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8be2a86e03e21e2fe988e66780d1f5986e698d37397d3e282cbb70c5db68b5f7"}, + {file = "ncls-0.0.68-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb36432b476a09f71f8b5961e1d82fb328094324cfa4808a5899f42afe2e7ec7"}, + {file = "ncls-0.0.68-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48f81075b95c78bff50bc7fc123a4a88bbeacbf0294dab36b2cfc03cf68bfb00"}, + {file = "ncls-0.0.68-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6a69a75d74bbfd0594c1e0b5c8e50abb1375427374cc058f92010c9cc5855306"}, + {file = "ncls-0.0.68.tar.gz", hash = "sha256:81aaa5abb123bb21797ed2f8ef921e20222db14a3ecbc61ccf447532f2b7ba93"}, +] + +[package.dependencies] +numpy = "*" + +[package.extras] +dev = ["black", "bumpver", "isort", "pip-tools", "pytest"] + [[package]] name = "nest-asyncio" version = "1.6.0" @@ -2318,18 +2638,18 @@ files = [ [[package]] name = "notebook" -version = "7.3.1" +version = "7.3.2" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" optional = false python-versions = ">=3.8" files = [ - {file = "notebook-7.3.1-py3-none-any.whl", hash = "sha256:212e1486b2230fe22279043f33c7db5cf9a01d29feb063a85cb139747b7c9483"}, - {file = "notebook-7.3.1.tar.gz", hash = "sha256:84381c2a82d867517fd25b86e986dae1fe113a70b98f03edff9b94e499fec8fa"}, + {file = "notebook-7.3.2-py3-none-any.whl", hash = "sha256:e5f85fc59b69d3618d73cf27544418193ff8e8058d5bf61d315ce4f473556288"}, + {file = "notebook-7.3.2.tar.gz", hash = "sha256:705e83a1785f45b383bf3ee13cb76680b92d24f56fb0c7d2136fe1d850cd3ca8"}, ] [package.dependencies] jupyter-server = ">=2.4.0,<3" -jupyterlab = ">=4.3.2,<4.4" +jupyterlab = ">=4.3.4,<4.4" jupyterlab-server = ">=2.27.1,<3" notebook-shim = ">=0.2,<0.3" tornado = ">=6.2.0" @@ -2490,11 +2810,7 @@ files = [ ] [package.dependencies] -numpy = [ - {version = ">=1.22.4", markers = "python_version < \"3.11\""}, - {version = ">=1.23.2", markers = "python_version == \"3.11\""}, - {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, -] +numpy = {version = ">=1.26.0", markers = "python_version >= \"3.12\""} python-dateutil = ">=2.8.2" pytz = ">=2020.1" tzdata = ">=2022.7" @@ -2577,93 +2893,89 @@ ptyprocess = ">=0.5" [[package]] name = "pillow" -version = "11.0.0" +version = "11.1.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.9" files = [ - {file = "pillow-11.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6619654954dc4936fcff82db8eb6401d3159ec6be81e33c6000dfd76ae189947"}, - {file = "pillow-11.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3c5ac4bed7519088103d9450a1107f76308ecf91d6dabc8a33a2fcfb18d0fba"}, - {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a65149d8ada1055029fcb665452b2814fe7d7082fcb0c5bed6db851cb69b2086"}, - {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88a58d8ac0cc0e7f3a014509f0455248a76629ca9b604eca7dc5927cc593c5e9"}, - {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c26845094b1af3c91852745ae78e3ea47abf3dbcd1cf962f16b9a5fbe3ee8488"}, - {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:1a61b54f87ab5786b8479f81c4b11f4d61702830354520837f8cc791ebba0f5f"}, - {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:674629ff60030d144b7bca2b8330225a9b11c482ed408813924619c6f302fdbb"}, - {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:598b4e238f13276e0008299bd2482003f48158e2b11826862b1eb2ad7c768b97"}, - {file = "pillow-11.0.0-cp310-cp310-win32.whl", hash = "sha256:9a0f748eaa434a41fccf8e1ee7a3eed68af1b690e75328fd7a60af123c193b50"}, - {file = "pillow-11.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:a5629742881bcbc1f42e840af185fd4d83a5edeb96475a575f4da50d6ede337c"}, - {file = "pillow-11.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:ee217c198f2e41f184f3869f3e485557296d505b5195c513b2bfe0062dc537f1"}, - {file = "pillow-11.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc"}, - {file = "pillow-11.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a"}, - {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8b2351c85d855293a299038e1f89db92a2f35e8d2f783489c6f0b2b5f3fe8a3"}, - {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f4dba50cfa56f910241eb7f883c20f1e7b1d8f7d91c750cd0b318bad443f4d5"}, - {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b"}, - {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa"}, - {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b4fd7bd29610a83a8c9b564d457cf5bd92b4e11e79a4ee4716a63c959699b306"}, - {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cb929ca942d0ec4fac404cbf520ee6cac37bf35be479b970c4ffadf2b6a1cad9"}, - {file = "pillow-11.0.0-cp311-cp311-win32.whl", hash = "sha256:006bcdd307cc47ba43e924099a038cbf9591062e6c50e570819743f5607404f5"}, - {file = "pillow-11.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291"}, - {file = "pillow-11.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:16095692a253047fe3ec028e951fa4221a1f3ed3d80c397e83541a3037ff67c9"}, - {file = "pillow-11.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923"}, - {file = "pillow-11.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903"}, - {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4"}, - {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f"}, - {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9"}, - {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7"}, - {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6"}, - {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc"}, - {file = "pillow-11.0.0-cp312-cp312-win32.whl", hash = "sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6"}, - {file = "pillow-11.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47"}, - {file = "pillow-11.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25"}, - {file = "pillow-11.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699"}, - {file = "pillow-11.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38"}, - {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2"}, - {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2"}, - {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527"}, - {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa"}, - {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f"}, - {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb"}, - {file = "pillow-11.0.0-cp313-cp313-win32.whl", hash = "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798"}, - {file = "pillow-11.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de"}, - {file = "pillow-11.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84"}, - {file = "pillow-11.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b"}, - {file = "pillow-11.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003"}, - {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2"}, - {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a"}, - {file = "pillow-11.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8"}, - {file = "pillow-11.0.0-cp313-cp313t-win32.whl", hash = "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8"}, - {file = "pillow-11.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904"}, - {file = "pillow-11.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3"}, - {file = "pillow-11.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2e46773dc9f35a1dd28bd6981332fd7f27bec001a918a72a79b4133cf5291dba"}, - {file = "pillow-11.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2679d2258b7f1192b378e2893a8a0a0ca472234d4c2c0e6bdd3380e8dfa21b6a"}, - {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda2616eb2313cbb3eebbe51f19362eb434b18e3bb599466a1ffa76a033fb916"}, - {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ec184af98a121fb2da42642dea8a29ec80fc3efbaefb86d8fdd2606619045d"}, - {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:8594f42df584e5b4bb9281799698403f7af489fba84c34d53d1c4bfb71b7c4e7"}, - {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:c12b5ae868897c7338519c03049a806af85b9b8c237b7d675b8c5e089e4a618e"}, - {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:70fbbdacd1d271b77b7721fe3cdd2d537bbbd75d29e6300c672ec6bb38d9672f"}, - {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5178952973e588b3f1360868847334e9e3bf49d19e169bbbdfaf8398002419ae"}, - {file = "pillow-11.0.0-cp39-cp39-win32.whl", hash = "sha256:8c676b587da5673d3c75bd67dd2a8cdfeb282ca38a30f37950511766b26858c4"}, - {file = "pillow-11.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:94f3e1780abb45062287b4614a5bc0874519c86a777d4a7ad34978e86428b8dd"}, - {file = "pillow-11.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:290f2cc809f9da7d6d622550bbf4c1e57518212da51b6a30fe8e0a270a5b78bd"}, - {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1187739620f2b365de756ce086fdb3604573337cc28a0d3ac4a01ab6b2d2a6d2"}, - {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fbbcb7b57dc9c794843e3d1258c0fbf0f48656d46ffe9e09b63bbd6e8cd5d0a2"}, - {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d203af30149ae339ad1b4f710d9844ed8796e97fda23ffbc4cc472968a47d0b"}, - {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21a0d3b115009ebb8ac3d2ebec5c2982cc693da935f4ab7bb5c8ebe2f47d36f2"}, - {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:73853108f56df97baf2bb8b522f3578221e56f646ba345a372c78326710d3830"}, - {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e58876c91f97b0952eb766123bfef372792ab3f4e3e1f1a2267834c2ab131734"}, - {file = "pillow-11.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:224aaa38177597bb179f3ec87eeefcce8e4f85e608025e9cfac60de237ba6316"}, - {file = "pillow-11.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5bd2d3bdb846d757055910f0a59792d33b555800813c3b39ada1829c372ccb06"}, - {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:375b8dd15a1f5d2feafff536d47e22f69625c1aa92f12b339ec0b2ca40263273"}, - {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:daffdf51ee5db69a82dd127eabecce20729e21f7a3680cf7cbb23f0829189790"}, - {file = "pillow-11.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7326a1787e3c7b0429659e0a944725e1b03eeaa10edd945a86dead1913383944"}, - {file = "pillow-11.0.0.tar.gz", hash = "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739"}, + {file = "pillow-11.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8"}, + {file = "pillow-11.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a07dba04c5e22824816b2615ad7a7484432d7f540e6fa86af60d2de57b0fcee2"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e267b0ed063341f3e60acd25c05200df4193e15a4a5807075cd71225a2386e26"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bd165131fd51697e22421d0e467997ad31621b74bfc0b75956608cb2906dda07"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:abc56501c3fd148d60659aae0af6ddc149660469082859fa7b066a298bde9482"}, + {file = "pillow-11.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:54ce1c9a16a9561b6d6d8cb30089ab1e5eb66918cb47d457bd996ef34182922e"}, + {file = "pillow-11.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:73ddde795ee9b06257dac5ad42fcb07f3b9b813f8c1f7f870f402f4dc54b5269"}, + {file = "pillow-11.1.0-cp310-cp310-win32.whl", hash = "sha256:3a5fe20a7b66e8135d7fd617b13272626a28278d0e578c98720d9ba4b2439d49"}, + {file = "pillow-11.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:b6123aa4a59d75f06e9dd3dac5bf8bc9aa383121bb3dd9a7a612e05eabc9961a"}, + {file = "pillow-11.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:a76da0a31da6fcae4210aa94fd779c65c75786bc9af06289cd1c184451ef7a65"}, + {file = "pillow-11.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e06695e0326d05b06833b40b7ef477e475d0b1ba3a6d27da1bb48c23209bf457"}, + {file = "pillow-11.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96f82000e12f23e4f29346e42702b6ed9a2f2fea34a740dd5ffffcc8c539eb35"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3cd561ded2cf2bbae44d4605837221b987c216cff94f49dfeed63488bb228d2"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f189805c8be5ca5add39e6f899e6ce2ed824e65fb45f3c28cb2841911da19070"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dd0052e9db3474df30433f83a71b9b23bd9e4ef1de13d92df21a52c0303b8ab6"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:837060a8599b8f5d402e97197d4924f05a2e0d68756998345c829c33186217b1"}, + {file = "pillow-11.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:aa8dd43daa836b9a8128dbe7d923423e5ad86f50a7a14dc688194b7be5c0dea2"}, + {file = "pillow-11.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0a2f91f8a8b367e7a57c6e91cd25af510168091fb89ec5146003e424e1558a96"}, + {file = "pillow-11.1.0-cp311-cp311-win32.whl", hash = "sha256:c12fc111ef090845de2bb15009372175d76ac99969bdf31e2ce9b42e4b8cd88f"}, + {file = "pillow-11.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbd43429d0d7ed6533b25fc993861b8fd512c42d04514a0dd6337fb3ccf22761"}, + {file = "pillow-11.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:f7955ecf5609dee9442cbface754f2c6e541d9e6eda87fad7f7a989b0bdb9d71"}, + {file = "pillow-11.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2062ffb1d36544d42fcaa277b069c88b01bb7298f4efa06731a7fd6cc290b81a"}, + {file = "pillow-11.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a85b653980faad27e88b141348707ceeef8a1186f75ecc600c395dcac19f385b"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9409c080586d1f683df3f184f20e36fb647f2e0bc3988094d4fd8c9f4eb1b3b3"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fdadc077553621911f27ce206ffcbec7d3f8d7b50e0da39f10997e8e2bb7f6a"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:93a18841d09bcdd774dcdc308e4537e1f867b3dec059c131fde0327899734aa1"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9aa9aeddeed452b2f616ff5507459e7bab436916ccb10961c4a382cd3e03f47f"}, + {file = "pillow-11.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3cdcdb0b896e981678eee140d882b70092dac83ac1cdf6b3a60e2216a73f2b91"}, + {file = "pillow-11.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36ba10b9cb413e7c7dfa3e189aba252deee0602c86c309799da5a74009ac7a1c"}, + {file = "pillow-11.1.0-cp312-cp312-win32.whl", hash = "sha256:cfd5cd998c2e36a862d0e27b2df63237e67273f2fc78f47445b14e73a810e7e6"}, + {file = "pillow-11.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf"}, + {file = "pillow-11.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:4dd43a78897793f60766563969442020e90eb7847463eca901e41ba186a7d4a5"}, + {file = "pillow-11.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc"}, + {file = "pillow-11.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114"}, + {file = "pillow-11.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352"}, + {file = "pillow-11.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3"}, + {file = "pillow-11.1.0-cp313-cp313-win32.whl", hash = "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9"}, + {file = "pillow-11.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c"}, + {file = "pillow-11.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65"}, + {file = "pillow-11.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861"}, + {file = "pillow-11.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081"}, + {file = "pillow-11.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c"}, + {file = "pillow-11.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547"}, + {file = "pillow-11.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab"}, + {file = "pillow-11.1.0-cp313-cp313t-win32.whl", hash = "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9"}, + {file = "pillow-11.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe"}, + {file = "pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756"}, + {file = "pillow-11.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:bf902d7413c82a1bfa08b06a070876132a5ae6b2388e2712aab3a7cbc02205c6"}, + {file = "pillow-11.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c1eec9d950b6fe688edee07138993e54ee4ae634c51443cfb7c1e7613322718e"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e275ee4cb11c262bd108ab2081f750db2a1c0b8c12c1897f27b160c8bd57bbc"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4db853948ce4e718f2fc775b75c37ba2efb6aaea41a1a5fc57f0af59eee774b2"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:ab8a209b8485d3db694fa97a896d96dd6533d63c22829043fd9de627060beade"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:54251ef02a2309b5eec99d151ebf5c9904b77976c8abdcbce7891ed22df53884"}, + {file = "pillow-11.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5bb94705aea800051a743aa4874bb1397d4695fb0583ba5e425ee0328757f196"}, + {file = "pillow-11.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89dbdb3e6e9594d512780a5a1c42801879628b38e3efc7038094430844e271d8"}, + {file = "pillow-11.1.0-cp39-cp39-win32.whl", hash = "sha256:e5449ca63da169a2e6068dd0e2fcc8d91f9558aba89ff6d02121ca8ab11e79e5"}, + {file = "pillow-11.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:3362c6ca227e65c54bf71a5f88b3d4565ff1bcbc63ae72c34b07bbb1cc59a43f"}, + {file = "pillow-11.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:b20be51b37a75cc54c2c55def3fa2c65bb94ba859dde241cd0a4fd302de5ae0a"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8c730dc3a83e5ac137fbc92dfcfe1511ce3b2b5d7578315b63dbbb76f7f51d90"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7d33d2fae0e8b170b6a6c57400e077412240f6f5bb2a342cf1ee512a787942bb"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8d65b38173085f24bc07f8b6c505cbb7418009fa1a1fcb111b1f4961814a442"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:015c6e863faa4779251436db398ae75051469f7c903b043a48f078e437656f83"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d44ff19eea13ae4acdaaab0179fa68c0c6f2f45d66a4d8ec1eda7d6cecbcc15f"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d3d8da4a631471dfaf94c10c85f5277b1f8e42ac42bade1ac67da4b4a7359b73"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4637b88343166249fe8aa94e7c4a62a180c4b3898283bb5d3d2fd5fe10d8e4e0"}, + {file = "pillow-11.1.0.tar.gz", hash = "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20"}, ] [package.extras] docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] -tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "trove-classifiers (>=2024.10.12)"] typing = ["typing-extensions"] xmp = ["defusedxml"] @@ -2700,17 +3012,18 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "polars" -version = "1.17.1" +version = "1.19.0" description = "Blazingly fast DataFrame library" optional = false python-versions = ">=3.9" files = [ - {file = "polars-1.17.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:d3a2172f7cf332010f0b034345111e9c86d59b5a5b0fc5aa0509121f40d9e43c"}, - {file = "polars-1.17.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:82e98c69197df0d8ddc341a6175008508ceaea88f723f32044027810bcdb43fa"}, - {file = "polars-1.17.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59abdab015ed2ecfa0c63862b960816c35096e1f4df057dde3c44cd973af5029"}, - {file = "polars-1.17.1-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:6d2f922c403b8900b3ae3c23a27b2cae3a2db40ad790cc4fc368402b92629b11"}, - {file = "polars-1.17.1-cp39-abi3-win_amd64.whl", hash = "sha256:d38156c8259554cbcb17874d91e6dfa9c404335f08a3307496aadfdee46baa31"}, - {file = "polars-1.17.1.tar.gz", hash = "sha256:5a3dac3cb7cbe174d1fa898cba9afbede0c08e8728feeeab515554d762127019"}, + {file = "polars-1.19.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:51c01837268a1aa41785e60ed7d3363d4b52f652ab0eef4981f887bdfa2e9ca7"}, + {file = "polars-1.19.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:20f8235e810f6ee795d7a215a3560945e6a1b57d017f87ba0c8542dced1fc665"}, + {file = "polars-1.19.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be0ea51f7b3553652bf0d53f3b925e969a898d4feb9980acecf8e3037d696903"}, + {file = "polars-1.19.0-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:30305ef4e1b634c67a5d985832296fade9908482c5b1abb0100800808b2d090e"}, + {file = "polars-1.19.0-cp39-abi3-win_amd64.whl", hash = "sha256:de4aa45e24f8f94a1da9cc6031a7db6fa65ac7de8246fac0bc581ebb427d0643"}, + {file = "polars-1.19.0-cp39-abi3-win_arm64.whl", hash = "sha256:d7ca7aeb63fa22c0a00f6cfa95dd5252c249e83dd4d1b954583a59f97a8e407b"}, + {file = "polars-1.19.0.tar.gz", hash = "sha256:b52ada5c43fcdadf64f282522198c5549ee4e46ea57d236a4d7e572643070d9d"}, ] [package.extras] @@ -2735,7 +3048,7 @@ pyarrow = ["pyarrow (>=7.0.0)"] pydantic = ["pydantic"] sqlalchemy = ["polars[pandas]", "sqlalchemy"] style = ["great-tables (>=0.8.0)"] -timezone = ["backports-zoneinfo", "tzdata"] +timezone = ["tzdata"] xlsx2csv = ["xlsx2csv (>=0.8.0)"] xlsxwriter = ["xlsxwriter"] @@ -2787,32 +3100,32 @@ wcwidth = "*" [[package]] name = "psutil" -version = "6.1.0" +version = "6.1.1" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "psutil-6.1.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0"}, - {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942"}, - {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:000d1d1ebd634b4efb383f4034437384e44a6d455260aaee2eca1e9c1b55f047"}, - {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5cd2bcdc75b452ba2e10f0e8ecc0b57b827dd5d7aaffbc6821b2a9a242823a76"}, - {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:045f00a43c737f960d273a83973b2511430d61f283a44c96bf13a6e829ba8fdc"}, - {file = "psutil-6.1.0-cp27-none-win32.whl", hash = "sha256:9118f27452b70bb1d9ab3198c1f626c2499384935aaf55388211ad982611407e"}, - {file = "psutil-6.1.0-cp27-none-win_amd64.whl", hash = "sha256:a8506f6119cff7015678e2bce904a4da21025cc70ad283a53b099e7620061d85"}, - {file = "psutil-6.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688"}, - {file = "psutil-6.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e"}, - {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dcbfce5d89f1d1f2546a2090f4fcf87c7f669d1d90aacb7d7582addece9fb38"}, - {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b"}, - {file = "psutil-6.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a"}, - {file = "psutil-6.1.0-cp36-cp36m-win32.whl", hash = "sha256:6d3fbbc8d23fcdcb500d2c9f94e07b1342df8ed71b948a2649b5cb060a7c94ca"}, - {file = "psutil-6.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1209036fbd0421afde505a4879dee3b2fd7b1e14fee81c0069807adcbbcca747"}, - {file = "psutil-6.1.0-cp37-abi3-win32.whl", hash = "sha256:1ad45a1f5d0b608253b11508f80940985d1d0c8f6111b5cb637533a0e6ddc13e"}, - {file = "psutil-6.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be"}, - {file = "psutil-6.1.0.tar.gz", hash = "sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a"}, -] - -[package.extras] -dev = ["black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "wheel"] + {file = "psutil-6.1.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9ccc4316f24409159897799b83004cb1e24f9819b0dcf9c0b68bdcb6cefee6a8"}, + {file = "psutil-6.1.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ca9609c77ea3b8481ab005da74ed894035936223422dc591d6772b147421f777"}, + {file = "psutil-6.1.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:8df0178ba8a9e5bc84fed9cfa61d54601b371fbec5c8eebad27575f1e105c0d4"}, + {file = "psutil-6.1.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:1924e659d6c19c647e763e78670a05dbb7feaf44a0e9c94bf9e14dfc6ba50468"}, + {file = "psutil-6.1.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:018aeae2af92d943fdf1da6b58665124897cfc94faa2ca92098838f83e1b1bca"}, + {file = "psutil-6.1.1-cp27-none-win32.whl", hash = "sha256:6d4281f5bbca041e2292be3380ec56a9413b790579b8e593b1784499d0005dac"}, + {file = "psutil-6.1.1-cp27-none-win_amd64.whl", hash = "sha256:c777eb75bb33c47377c9af68f30e9f11bc78e0f07fbf907be4a5d70b2fe5f030"}, + {file = "psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8"}, + {file = "psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377"}, + {file = "psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003"}, + {file = "psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160"}, + {file = "psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3"}, + {file = "psutil-6.1.1-cp36-cp36m-win32.whl", hash = "sha256:384636b1a64b47814437d1173be1427a7c83681b17a450bfc309a1953e329603"}, + {file = "psutil-6.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8be07491f6ebe1a693f17d4f11e69d0dc1811fa082736500f649f79df7735303"}, + {file = "psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53"}, + {file = "psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649"}, + {file = "psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5"}, +] + +[package.extras] +dev = ["abi3audit", "black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] test = ["pytest", "pytest-xdist", "setuptools"] [[package]] @@ -2840,6 +3153,85 @@ files = [ [package.extras] tests = ["pytest"] +[[package]] +name = "py-cpuinfo" +version = "9.0.0" +description = "Get CPU info with pure Python" +optional = false +python-versions = "*" +files = [ + {file = "py-cpuinfo-9.0.0.tar.gz", hash = "sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690"}, + {file = "py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5"}, +] + +[[package]] +name = "pyarrow" +version = "18.1.0" +description = "Python library for Apache Arrow" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pyarrow-18.1.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e21488d5cfd3d8b500b3238a6c4b075efabc18f0f6d80b29239737ebd69caa6c"}, + {file = "pyarrow-18.1.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:b516dad76f258a702f7ca0250885fc93d1fa5ac13ad51258e39d402bd9e2e1e4"}, + {file = "pyarrow-18.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f443122c8e31f4c9199cb23dca29ab9427cef990f283f80fe15b8e124bcc49b"}, + {file = "pyarrow-18.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0a03da7f2758645d17b7b4f83c8bffeae5bbb7f974523fe901f36288d2eab71"}, + {file = "pyarrow-18.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ba17845efe3aa358ec266cf9cc2800fa73038211fb27968bfa88acd09261a470"}, + {file = "pyarrow-18.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:3c35813c11a059056a22a3bef520461310f2f7eea5c8a11ef9de7062a23f8d56"}, + {file = "pyarrow-18.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:9736ba3c85129d72aefa21b4f3bd715bc4190fe4426715abfff90481e7d00812"}, + {file = "pyarrow-18.1.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:eaeabf638408de2772ce3d7793b2668d4bb93807deed1725413b70e3156a7854"}, + {file = "pyarrow-18.1.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:3b2e2239339c538f3464308fd345113f886ad031ef8266c6f004d49769bb074c"}, + {file = "pyarrow-18.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f39a2e0ed32a0970e4e46c262753417a60c43a3246972cfc2d3eb85aedd01b21"}, + {file = "pyarrow-18.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e31e9417ba9c42627574bdbfeada7217ad8a4cbbe45b9d6bdd4b62abbca4c6f6"}, + {file = "pyarrow-18.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:01c034b576ce0eef554f7c3d8c341714954be9b3f5d5bc7117006b85fcf302fe"}, + {file = "pyarrow-18.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:f266a2c0fc31995a06ebd30bcfdb7f615d7278035ec5b1cd71c48d56daaf30b0"}, + {file = "pyarrow-18.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:d4f13eee18433f99adefaeb7e01d83b59f73360c231d4782d9ddfaf1c3fbde0a"}, + {file = "pyarrow-18.1.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:9f3a76670b263dc41d0ae877f09124ab96ce10e4e48f3e3e4257273cee61ad0d"}, + {file = "pyarrow-18.1.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:da31fbca07c435be88a0c321402c4e31a2ba61593ec7473630769de8346b54ee"}, + {file = "pyarrow-18.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:543ad8459bc438efc46d29a759e1079436290bd583141384c6f7a1068ed6f992"}, + {file = "pyarrow-18.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0743e503c55be0fdb5c08e7d44853da27f19dc854531c0570f9f394ec9671d54"}, + {file = "pyarrow-18.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:d4b3d2a34780645bed6414e22dda55a92e0fcd1b8a637fba86800ad737057e33"}, + {file = "pyarrow-18.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:c52f81aa6f6575058d8e2c782bf79d4f9fdc89887f16825ec3a66607a5dd8e30"}, + {file = "pyarrow-18.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:0ad4892617e1a6c7a551cfc827e072a633eaff758fa09f21c4ee548c30bcaf99"}, + {file = "pyarrow-18.1.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:84e314d22231357d473eabec709d0ba285fa706a72377f9cc8e1cb3c8013813b"}, + {file = "pyarrow-18.1.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:f591704ac05dfd0477bb8f8e0bd4b5dc52c1cadf50503858dce3a15db6e46ff2"}, + {file = "pyarrow-18.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acb7564204d3c40babf93a05624fc6a8ec1ab1def295c363afc40b0c9e66c191"}, + {file = "pyarrow-18.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74de649d1d2ccb778f7c3afff6085bd5092aed4c23df9feeb45dd6b16f3811aa"}, + {file = "pyarrow-18.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:f96bd502cb11abb08efea6dab09c003305161cb6c9eafd432e35e76e7fa9b90c"}, + {file = "pyarrow-18.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:36ac22d7782554754a3b50201b607d553a8d71b78cdf03b33c1125be4b52397c"}, + {file = "pyarrow-18.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:25dbacab8c5952df0ca6ca0af28f50d45bd31c1ff6fcf79e2d120b4a65ee7181"}, + {file = "pyarrow-18.1.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6a276190309aba7bc9d5bd2933230458b3521a4317acfefe69a354f2fe59f2bc"}, + {file = "pyarrow-18.1.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:ad514dbfcffe30124ce655d72771ae070f30bf850b48bc4d9d3b25993ee0e386"}, + {file = "pyarrow-18.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aebc13a11ed3032d8dd6e7171eb6e86d40d67a5639d96c35142bd568b9299324"}, + {file = "pyarrow-18.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6cf5c05f3cee251d80e98726b5c7cc9f21bab9e9783673bac58e6dfab57ecc8"}, + {file = "pyarrow-18.1.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:11b676cd410cf162d3f6a70b43fb9e1e40affbc542a1e9ed3681895f2962d3d9"}, + {file = "pyarrow-18.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:b76130d835261b38f14fc41fdfb39ad8d672afb84c447126b84d5472244cfaba"}, + {file = "pyarrow-18.1.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:0b331e477e40f07238adc7ba7469c36b908f07c89b95dd4bd3a0ec84a3d1e21e"}, + {file = "pyarrow-18.1.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:2c4dd0c9010a25ba03e198fe743b1cc03cd33c08190afff371749c52ccbbaf76"}, + {file = "pyarrow-18.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f97b31b4c4e21ff58c6f330235ff893cc81e23da081b1a4b1c982075e0ed4e9"}, + {file = "pyarrow-18.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a4813cb8ecf1809871fd2d64a8eff740a1bd3691bbe55f01a3cf6c5ec869754"}, + {file = "pyarrow-18.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:05a5636ec3eb5cc2a36c6edb534a38ef57b2ab127292a716d00eabb887835f1e"}, + {file = "pyarrow-18.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:73eeed32e724ea3568bb06161cad5fa7751e45bc2228e33dcb10c614044165c7"}, + {file = "pyarrow-18.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:a1880dd6772b685e803011a6b43a230c23b566859a6e0c9a276c1e0faf4f4052"}, + {file = "pyarrow-18.1.0.tar.gz", hash = "sha256:9386d3ca9c145b5539a1cfc75df07757dff870168c959b473a0bccbc3abc8c73"}, +] + +[package.extras] +test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"] + +[[package]] +name = "pybedtools" +version = "0.10.0" +description = "Wrapper around BEDTools for bioinformatics work" +optional = false +python-versions = "*" +files = [ + {file = "pybedtools-0.10.0.tar.gz", hash = "sha256:1a6fbaad23b013becc741d7d5922a2df03e391bc44ff92772ffb7dd456711161"}, +] + +[package.dependencies] +numpy = "*" +pysam = "*" + [[package]] name = "pycparser" version = "2.22" @@ -2851,15 +3243,45 @@ files = [ {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] +[[package]] +name = "pydyf" +version = "0.11.0" +description = "A low-level PDF generator." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydyf-0.11.0-py3-none-any.whl", hash = "sha256:0aaf9e2ebbe786ec7a78ec3fbffa4cdcecde53fd6f563221d53c6bc1328848a3"}, + {file = "pydyf-0.11.0.tar.gz", hash = "sha256:394dddf619cca9d0c55715e3c55ea121a9bf9cbc780cdc1201a2427917b86b64"}, +] + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["pillow", "pytest", "ruff"] + +[[package]] +name = "pygenomics" +version = "0.1.1" +description = "Manipulating genomic intervals and data files in Python" +optional = false +python-versions = "^3.7.2" +files = [] +develop = false + +[package.source] +type = "git" +url = "https://gitlab.com/gtamazian/pygenomics.git" +reference = "0.1.1" +resolved_reference = "44289a1685bffcdb7d09058ddf26cbb288477962" + [[package]] name = "pygments" -version = "2.18.0" +version = "2.19.0" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" files = [ - {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, - {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, + {file = "pygments-2.19.0-py3-none-any.whl", hash = "sha256:4755e6e64d22161d5b61432c0600c923c5927214e7c956e31c23923c89251a9b"}, + {file = "pygments-2.19.0.tar.gz", hash = "sha256:afc4146269910d4bdfabcd27c24923137a74d562a23a320a41a55ad303e19783"}, ] [package.extras] @@ -2867,13 +3289,13 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pymdown-extensions" -version = "10.12" +version = "10.13" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.12-py3-none-any.whl", hash = "sha256:49f81412242d3527b8b4967b990df395c89563043bc51a3d2d7d500e52123b77"}, - {file = "pymdown_extensions-10.12.tar.gz", hash = "sha256:b0ee1e0b2bef1071a47891ab17003bfe5bf824a398e13f49f8ed653b699369a7"}, + {file = "pymdown_extensions-10.13-py3-none-any.whl", hash = "sha256:80bc33d715eec68e683e04298946d47d78c7739e79d808203df278ee8ef89428"}, + {file = "pymdown_extensions-10.13.tar.gz", hash = "sha256:e0b351494dc0d8d14a1f52b39b1499a00ef1566b4ba23dc74f1eba75c736f5dd"}, ] [package.dependencies] @@ -2885,18 +3307,122 @@ extra = ["pygments (>=2.12)"] [[package]] name = "pyparsing" -version = "3.2.0" +version = "3.2.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" files = [ - {file = "pyparsing-3.2.0-py3-none-any.whl", hash = "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84"}, - {file = "pyparsing-3.2.0.tar.gz", hash = "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"}, + {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, + {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, ] [package.extras] diagrams = ["jinja2", "railroad-diagrams"] +[[package]] +name = "pyphen" +version = "0.17.0" +description = "Pure Python module to hyphenate text" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pyphen-0.17.0-py3-none-any.whl", hash = "sha256:dad0b2e4aa80f6d70bf06711b2da36c47a756b933c1d0c4cbbab40f643a5958c"}, + {file = "pyphen-0.17.0.tar.gz", hash = "sha256:1d13acd1ce37a384d7612954ae6c7801bb4c5316da0e2b937b2127ba702a3da4"}, +] + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["pytest", "ruff"] + +[[package]] +name = "pyranges" +version = "0.1.2" +description = "GenomicRanges for Python." +optional = false +python-versions = "*" +files = [] +develop = false + +[package.dependencies] +natsort = "*" +ncls = ">=0.0.63" +pandas = "*" +sorted_nearest = ">=0.0.33" +tabulate = "*" + +[package.extras] +dev = ["black (==24.4.2)", "bumpver", "isort (==5.13.2)", "mypy (==1.8.0)", "pip-tools", "pytest (==7.4.3)"] + +[package.source] +type = "git" +url = "https://github.com/pyranges/pyranges.git" +reference = "4f0a153336e7153cdfea15b141ce4ea35a24e233" +resolved_reference = "4f0a153336e7153cdfea15b141ce4ea35a24e233" + +[[package]] +name = "pyranges1" +version = "1.0.3" +description = "GenomicRanges for Python." +optional = false +python-versions = ">=3.12.0" +files = [] +develop = false + +[package.dependencies] +natsort = "*" +ncls = ">=0.0.63" +pandas = "*" +sorted_nearest = ">=0.0.33" +tabulate = "*" + +[package.extras] +add-ons = ["bamread", "joblib", "pyBigWig", "pyfaidx", "pyrle (>=0.0.39)"] +all = ["pyranges1[add-ons]", "pyranges1[dev]", "pyranges1[docs]"] +dev = ["hypothesis (>=6.92.1)", "pandas-stubs", "pyright", "pytest-watcher", "pytest-xdist", "ruff (==0.3.0)", "tox", "types-tabulate"] +docs = ["sphinx", "sphinx-autoapi", "sphinx_rtd_theme", "sphinxcontrib-napoleon"] + +[package.source] +type = "git" +url = "https://github.com/mwiewior/pyranges1.git" +reference = "949d7c15c1c2e217f4404415f79b386f326b6f8d" +resolved_reference = "949d7c15c1c2e217f4404415f79b386f326b6f8d" + +[[package]] +name = "pysam" +version = "0.22.1" +description = "Package for reading, manipulating, and writing genomic data" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pysam-0.22.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f18e72013ef2db9a9bb7e8ac421934d054427f6c03e66ce8abc39b09c846ba72"}, + {file = "pysam-0.22.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:79cd94eeb96541385fa99e759a8f83d21428e092c8b577d50b4eee5823e757cd"}, + {file = "pysam-0.22.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c71ea45461ee596949061f321a799a97c418164485fdd7e8db89aea2ff979092"}, + {file = "pysam-0.22.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ab3343f221994d163e1ba2691430ce0f6e7da13762473e0d7f9a2d5db3bec235"}, + {file = "pysam-0.22.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:503c833e6cf348d87aec9113b1386d5c85c031d64deb914c29f5ad1792d103e6"}, + {file = "pysam-0.22.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4447fdc2630519a00b6bf598995f1440e6f398eb0c084a7c141db026990ae07a"}, + {file = "pysam-0.22.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:1be663a73cf56ddd1d309b91d314a0c94c9bf352eaa3c6eda30cef12699843f0"}, + {file = "pysam-0.22.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:aeb31472365014fd8b37da4a88af758094b5872a8a16a25635a52cf8ceff5a9f"}, + {file = "pysam-0.22.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e72e129d245574801125029a5892c9e18d2956b13c4203ea585cbd64ccde9351"}, + {file = "pysam-0.22.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f8f00bb1fb977fc33c87cf5fe9023eefc2ba3d43d30ab4875a1765827018c949"}, + {file = "pysam-0.22.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:c0e051fda433c1c7ff94532f60477bb83b97f4bb183567a0ae23f340e1c200b4"}, + {file = "pysam-0.22.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:860c7c78ddb1539b83d5476502ba14c8b4e8435810dc7a5b715196da3dfb86b6"}, + {file = "pysam-0.22.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:18d886d50d75d8f853057fbbb284f0f0e98afad1f76b1a6f55660ea167d31c17"}, + {file = "pysam-0.22.1-cp36-cp36m-manylinux_2_28_aarch64.whl", hash = "sha256:44420290a619c02da48ca0956548eb82a1665ae97b6ee69c094f9da5a6206431"}, + {file = "pysam-0.22.1-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:acff506c921af36f364c5a87f3a30b3c105ebeb270d0e821c2ca571eaf60ca20"}, + {file = "pysam-0.22.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:098e0bf12d8b0399613065843310c91ba31a02d014b1f6b4e9d7f2d0d1254ff8"}, + {file = "pysam-0.22.1-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:cd9d457063272df16136640515183ea501bf3371f140a134b2f0a42f425a37d9"}, + {file = "pysam-0.22.1-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:af9fb53157ba2431b7b20a550c0223f4a039304c9f180d8da98ea9d2d3ef3fbf"}, + {file = "pysam-0.22.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d3fd6fe5aca79933632f38e5b568ce8d4e67e5c4f3bd39bff55fd9646af814d2"}, + {file = "pysam-0.22.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b6cf1871c99cfc9c01261ec5f628519c2c889f0ff070e7a26aa5adbf9f69af1"}, + {file = "pysam-0.22.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:b1addca11c5cfceefaebdfcf3d83bc42f4b89fb1e8ae645a4bdab971cbcd2bc0"}, + {file = "pysam-0.22.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:17fac22fc89c86241a71084ca097878c61c97f6ff5fd4535d718681a849852a7"}, + {file = "pysam-0.22.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4aff9b41856d5dba6585ffd60884b8f3778c5d2688f33989662aabe7f4cd0fe0"}, + {file = "pysam-0.22.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:faa5298291b54f185c7b8f84510224918bddc64bbdcb2e8426ff43e83452310f"}, + {file = "pysam-0.22.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:4dfae1de006d1c6491a59b00052a3f67c53a136165cf4edd7789b5dcb1e6806f"}, + {file = "pysam-0.22.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:78ed746a39c9cebe489b8f0f86cf23c09c942e76c901260fb2794906e4cd0e26"}, + {file = "pysam-0.22.1.tar.gz", hash = "sha256:18a0b97be95bd71e584de698441c46651cdff378db1c9a4fb3f541e560253b22"}, +] + [[package]] name = "pytest" version = "8.3.4" @@ -2910,11 +3436,9 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" pluggy = ">=1.5,<2" -tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] @@ -2962,9 +3486,6 @@ files = [ {file = "python_json_logger-3.2.1.tar.gz", hash = "sha256:8eb0554ea17cb75b05d2848bc14fb02fbdbd9d6972120781b974380bfa162008"}, ] -[package.dependencies] -typing_extensions = {version = "*", markers = "python_version < \"3.10\""} - [package.extras] dev = ["backports.zoneinfo", "black", "build", "freezegun", "mdx_truly_sane_lists", "mike", "mkdocs", "mkdocs-awesome-pages-plugin", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-material (>=8.5)", "mkdocstrings[python]", "msgspec", "msgspec-python313-pre", "mypy", "orjson", "pylint", "pytest", "tzdata", "validate-pyproject[all]"] @@ -3382,6 +3903,24 @@ files = [ {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, ] +[[package]] +name = "rich" +version = "13.9.4" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"}, + {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + [[package]] name = "rpds-py" version = "0.22.3" @@ -3496,29 +4035,29 @@ files = [ [[package]] name = "ruff" -version = "0.8.3" +version = "0.8.6" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.8.3-py3-none-linux_armv6l.whl", hash = "sha256:8d5d273ffffff0acd3db5bf626d4b131aa5a5ada1276126231c4174543ce20d6"}, - {file = "ruff-0.8.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e4d66a21de39f15c9757d00c50c8cdd20ac84f55684ca56def7891a025d7e939"}, - {file = "ruff-0.8.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c356e770811858bd20832af696ff6c7e884701115094f427b64b25093d6d932d"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c0a60a825e3e177116c84009d5ebaa90cf40dfab56e1358d1df4e29a9a14b13"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:75fb782f4db39501210ac093c79c3de581d306624575eddd7e4e13747e61ba18"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f26bc76a133ecb09a38b7868737eded6941b70a6d34ef53a4027e83913b6502"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:01b14b2f72a37390c1b13477c1c02d53184f728be2f3ffc3ace5b44e9e87b90d"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53babd6e63e31f4e96ec95ea0d962298f9f0d9cc5990a1bbb023a6baf2503a82"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ae441ce4cf925b7f363d33cd6570c51435972d697e3e58928973994e56e1452"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7c65bc0cadce32255e93c57d57ecc2cca23149edd52714c0c5d6fa11ec328cd"}, - {file = "ruff-0.8.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5be450bb18f23f0edc5a4e5585c17a56ba88920d598f04a06bd9fd76d324cb20"}, - {file = "ruff-0.8.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8faeae3827eaa77f5721f09b9472a18c749139c891dbc17f45e72d8f2ca1f8fc"}, - {file = "ruff-0.8.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:db503486e1cf074b9808403991663e4277f5c664d3fe237ee0d994d1305bb060"}, - {file = "ruff-0.8.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:6567be9fb62fbd7a099209257fef4ad2c3153b60579818b31a23c886ed4147ea"}, - {file = "ruff-0.8.3-py3-none-win32.whl", hash = "sha256:19048f2f878f3ee4583fc6cb23fb636e48c2635e30fb2022b3a1cd293402f964"}, - {file = "ruff-0.8.3-py3-none-win_amd64.whl", hash = "sha256:f7df94f57d7418fa7c3ffb650757e0c2b96cf2501a0b192c18e4fb5571dfada9"}, - {file = "ruff-0.8.3-py3-none-win_arm64.whl", hash = "sha256:fe2756edf68ea79707c8d68b78ca9a58ed9af22e430430491ee03e718b5e4936"}, - {file = "ruff-0.8.3.tar.gz", hash = "sha256:5e7558304353b84279042fc584a4f4cb8a07ae79b2bf3da1a7551d960b5626d3"}, + {file = "ruff-0.8.6-py3-none-linux_armv6l.whl", hash = "sha256:defed167955d42c68b407e8f2e6f56ba52520e790aba4ca707a9c88619e580e3"}, + {file = "ruff-0.8.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:54799ca3d67ae5e0b7a7ac234baa657a9c1784b48ec954a094da7c206e0365b1"}, + {file = "ruff-0.8.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e88b8f6d901477c41559ba540beeb5a671e14cd29ebd5683903572f4b40a9807"}, + {file = "ruff-0.8.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0509e8da430228236a18a677fcdb0c1f102dd26d5520f71f79b094963322ed25"}, + {file = "ruff-0.8.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:91a7ddb221779871cf226100e677b5ea38c2d54e9e2c8ed847450ebbdf99b32d"}, + {file = "ruff-0.8.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:248b1fb3f739d01d528cc50b35ee9c4812aa58cc5935998e776bf8ed5b251e75"}, + {file = "ruff-0.8.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:bc3c083c50390cf69e7e1b5a5a7303898966be973664ec0c4a4acea82c1d4315"}, + {file = "ruff-0.8.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52d587092ab8df308635762386f45f4638badb0866355b2b86760f6d3c076188"}, + {file = "ruff-0.8.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:61323159cf21bc3897674e5adb27cd9e7700bab6b84de40d7be28c3d46dc67cf"}, + {file = "ruff-0.8.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ae4478b1471fc0c44ed52a6fb787e641a2ac58b1c1f91763bafbc2faddc5117"}, + {file = "ruff-0.8.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:0c000a471d519b3e6cfc9c6680025d923b4ca140ce3e4612d1a2ef58e11f11fe"}, + {file = "ruff-0.8.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:9257aa841e9e8d9b727423086f0fa9a86b6b420fbf4bf9e1465d1250ce8e4d8d"}, + {file = "ruff-0.8.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:45a56f61b24682f6f6709636949ae8cc82ae229d8d773b4c76c09ec83964a95a"}, + {file = "ruff-0.8.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:496dd38a53aa173481a7d8866bcd6451bd934d06976a2505028a50583e001b76"}, + {file = "ruff-0.8.6-py3-none-win32.whl", hash = "sha256:e169ea1b9eae61c99b257dc83b9ee6c76f89042752cb2d83486a7d6e48e8f764"}, + {file = "ruff-0.8.6-py3-none-win_amd64.whl", hash = "sha256:f1d70bef3d16fdc897ee290d7d20da3cbe4e26349f62e8a0274e7a3f4ce7a905"}, + {file = "ruff-0.8.6-py3-none-win_arm64.whl", hash = "sha256:7d7fc2377a04b6e04ffe588caad613d0c460eb2ecba4c0ccbbfe2bc973cbc162"}, + {file = "ruff-0.8.6.tar.gz", hash = "sha256:dcad24b81b62650b0eb8814f576fc65cfee8674772a6e24c9b747911801eeaa5"}, ] [[package]] @@ -3539,23 +4078,23 @@ win32 = ["pywin32"] [[package]] name = "setuptools" -version = "75.6.0" +version = "75.7.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.9" files = [ - {file = "setuptools-75.6.0-py3-none-any.whl", hash = "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d"}, - {file = "setuptools-75.6.0.tar.gz", hash = "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6"}, + {file = "setuptools-75.7.0-py3-none-any.whl", hash = "sha256:84fb203f278ebcf5cd08f97d3fb96d3fbed4b629d500b29ad60d11e00769b183"}, + {file = "setuptools-75.7.0.tar.gz", hash = "sha256:886ff7b16cd342f1d1defc16fc98c9ce3fde69e087a4e1983d7ab634e5f41f4f"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.7.0)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"] core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (>=1.12,<1.14)", "pytest-mypy"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.14.*)", "pytest-mypy"] [[package]] name = "six" @@ -3579,6 +4118,69 @@ files = [ {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] +[[package]] +name = "sorted-nearest" +version = "0.0.39" +description = "Find nearest intervals." +optional = false +python-versions = "*" +files = [ + {file = "sorted_nearest-0.0.39-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:057bfa08654ab4c4d23b06168a3aba1c7cb6a77e20c691a92260d3210adbc9e5"}, + {file = "sorted_nearest-0.0.39-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c97d2088baffb19dcb0bf0a3921bf0b6ecd40157e24c0eabd881215994ee917"}, + {file = "sorted_nearest-0.0.39-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02af85e8a893292b214362f79f367dfcf223d4cf9266b18ad08cb46f5966fe4f"}, + {file = "sorted_nearest-0.0.39-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ed1ae5750afa64e810a7e330ab26807e6c81d4f7a00fcb39e707cf7a1bd5c92f"}, + {file = "sorted_nearest-0.0.39-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b84a7285ac4609251e14480a59eb8313dcbdfa0adf9d31e8fc439a0e30993862"}, + {file = "sorted_nearest-0.0.39-cp310-cp310-win32.whl", hash = "sha256:0924ce55d7e0783ad352c9c617964f2ea9d1bb5c1b3e2ba4d5cbdd2511e4b3d2"}, + {file = "sorted_nearest-0.0.39-cp310-cp310-win_amd64.whl", hash = "sha256:70dd4dcbd397c87cf2ae9792428ef9e65da3daca0f41c96f6229011da8ae4142"}, + {file = "sorted_nearest-0.0.39-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bfc0054ff2974486746914402ad94bb91cc7496e79dd570c400c0b7fcc017b6a"}, + {file = "sorted_nearest-0.0.39-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b64681f8e76fc687a2133233be262efecded92403318c040d688076f461e0a3"}, + {file = "sorted_nearest-0.0.39-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c144167a1e58d8e67efeef6694f0213f669a1f767c6060d65abdfc489224517"}, + {file = "sorted_nearest-0.0.39-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7ce5e50b1c69e0615807e6cc7c7b5e17af7eccb7a6dde59330c92961df6dc31b"}, + {file = "sorted_nearest-0.0.39-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f8265077a83ba8a5cd9acb3f073a5cbfbb71a655e35b0baf53d6840825570b3c"}, + {file = "sorted_nearest-0.0.39-cp311-cp311-win32.whl", hash = "sha256:acb5bec03c1d0ed18f91f1a1085a6fe797d2ac511cdeb3ca2074346ff1a32595"}, + {file = "sorted_nearest-0.0.39-cp311-cp311-win_amd64.whl", hash = "sha256:329ca49391ddd9b87c87db9d2f96ec9f8820e3ae15143fe31bc8c847b850f9f6"}, + {file = "sorted_nearest-0.0.39-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:048423471944b83b6e94eca1d32107faff76ca1b522ad307453570b369cd8a3f"}, + {file = "sorted_nearest-0.0.39-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:852524ad8c4975bcdda9eddb3ebc8686c4242bd94b1e520b14e239e384a4597c"}, + {file = "sorted_nearest-0.0.39-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40f6ef3477923ad160cee296e48613b3beaefbbadb3cae5f92c843eda2a218c9"}, + {file = "sorted_nearest-0.0.39-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:12bcc4da3ccaa329ada8efc029f407e4fdecbe9038d0ac256902b518737706bc"}, + {file = "sorted_nearest-0.0.39-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:573a36988875c1b886fbc07aaee9594a6fd661664425afe6b10b85e5ba395a02"}, + {file = "sorted_nearest-0.0.39-cp37-cp37m-win32.whl", hash = "sha256:2cab765d75f595b1b5d5724150a11c9b9b97f2b59941cb0a8420589b0262c6c6"}, + {file = "sorted_nearest-0.0.39-cp37-cp37m-win_amd64.whl", hash = "sha256:4eba6a0204fb60fef3edb440c3f6575edd25f8976583d231932637c07e5ea89a"}, + {file = "sorted_nearest-0.0.39-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e563827c59cf21c69193f1ebfffd81fe8b3f47bd91e21da038d6fa72313ecd14"}, + {file = "sorted_nearest-0.0.39-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a568e0b17727fed91fe424ad424c4a7575063f9fc40877420fa16ec60d7b60c0"}, + {file = "sorted_nearest-0.0.39-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a12d4d90812a03f9561aeffa3da854a5352f25f3f26537d4da9598cc9efcac61"}, + {file = "sorted_nearest-0.0.39-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:563022632cf208a7d8375e4d1c490999c177530b16ab67443b53ea0d1351890b"}, + {file = "sorted_nearest-0.0.39-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0e9523ba8fc414ec9d0acb7bbfd224260fa1503e1bba46e9b10fa5aba93ddc79"}, + {file = "sorted_nearest-0.0.39-cp38-cp38-win32.whl", hash = "sha256:e8a0c7d3f6bf5e5542bd5b14a848971e897b4c9fe94f7c105069266d2b3eaf10"}, + {file = "sorted_nearest-0.0.39-cp38-cp38-win_amd64.whl", hash = "sha256:b9b2e110ed2be031b3aa40c6ad81f86d8c3b51f78ccead9db1e9f1aba874d8a9"}, + {file = "sorted_nearest-0.0.39-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:16b511c9a80b61fc51744cbc7324dc64658c4b955acd2a3b1138af28a1ae7b3c"}, + {file = "sorted_nearest-0.0.39-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d74dcc0aae9ca582541a83057def578d56ae8fb32ea8de576bcb2546c8a9f5e8"}, + {file = "sorted_nearest-0.0.39-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96be7c58eb2683b831ff264c07ceac236e7b760552fca7f96f478a0e65b60713"}, + {file = "sorted_nearest-0.0.39-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3b025375d140ba1328f4ff1f01116e66c1ec84e30b6565e5af863cc906fd88d3"}, + {file = "sorted_nearest-0.0.39-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:51f1979159025bc2587ce939562fb4308317b4c9ebbd28aa313efe099e42f2f0"}, + {file = "sorted_nearest-0.0.39-cp39-cp39-win32.whl", hash = "sha256:9ec62a8d297a3ae22517d62bf0fe0959ab22395516bad9cee188a8061d16b38d"}, + {file = "sorted_nearest-0.0.39-cp39-cp39-win_amd64.whl", hash = "sha256:62dcd58c94717114965d9cdecb7f6c839e92bd82d5ff840f22fd32b2823972bd"}, + {file = "sorted_nearest-0.0.39-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8e48cead83b07d9603c359824b1c4228ab0979f301009bc643e6635e253c09bf"}, + {file = "sorted_nearest-0.0.39-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a5ff1fd80cca946ba197b9f56fe11489e16fe4879fe9a6be150cf7f06435569"}, + {file = "sorted_nearest-0.0.39-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b545b1b89c965cb40306b0746bbcda8253b6fcfb1dbac2439280da5fe56aac33"}, + {file = "sorted_nearest-0.0.39-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:20df0acea50a7378353773998d40cb4d29c91372961939e81aae5377d3e2ee07"}, + {file = "sorted_nearest-0.0.39-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:caa55b3356b8e2f74327633513424b81ea7276974c6dfdbcfee89bd7b3b637ca"}, + {file = "sorted_nearest-0.0.39-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dccdfe5245d982b1d8938c27ab844e78ac6cdf4301ed3d37f697602b4dd86aed"}, + {file = "sorted_nearest-0.0.39-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5640ef3468036914749114d755e1f9edd90846ae61c7de919ea355cf5b168fe"}, + {file = "sorted_nearest-0.0.39-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:74a5cb5f072235d3b4a6d11a600effa3a0f3bd2c891a5aae785f4eb0bb46a157"}, + {file = "sorted_nearest-0.0.39-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bb19c696bd544adc6ed64d4f04e87df1cb0ce335f1830049aa92c04c4a48c9ad"}, + {file = "sorted_nearest-0.0.39-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46c873f0b77b1b3fd4e3e0046ddebd48c5e4182846492df8f09a16f1f7111099"}, + {file = "sorted_nearest-0.0.39-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aed70454644d840c16592616ff8a0a211a8579bd28a31d79dcdf1bfcc6ef708c"}, + {file = "sorted_nearest-0.0.39-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:95c935fd62ba06d7a00cc9c25cac2d89499df17a75e8fad49bf9a09f826c6056"}, + {file = "sorted_nearest-0.0.39.tar.gz", hash = "sha256:16a51d5db87ae226b47ace43c176bb672477a1b7ba8052ea9291a6356c9c69b1"}, +] + +[package.dependencies] +numpy = "*" + +[package.extras] +dev = ["black", "bumpver", "isort", "pip-tools", "pytest"] + [[package]] name = "soupsieve" version = "2.6" @@ -3609,6 +4211,20 @@ pure-eval = "*" [package.extras] tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] +[[package]] +name = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] + +[package.extras] +widechars = ["wcwidth"] + [[package]] name = "terminado" version = "0.18.1" @@ -3649,46 +4265,23 @@ doc = ["sphinx", "sphinx_rtd_theme"] test = ["pytest", "ruff"] [[package]] -name = "tomli" -version = "2.2.1" -description = "A lil' TOML parser" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, - {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, - {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, - {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, - {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, - {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, - {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, - {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, - {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, - {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, +name = "tinyhtml5" +version = "2.0.0" +description = "HTML parser based on the WHATWG HTML specification" +optional = false +python-versions = ">=3.9" +files = [ + {file = "tinyhtml5-2.0.0-py3-none-any.whl", hash = "sha256:13683277c5b176d070f82d099d977194b7a1e26815b016114f581a74bbfbf47e"}, + {file = "tinyhtml5-2.0.0.tar.gz", hash = "sha256:086f998833da24c300c414d9fe81d9b368fd04cb9d2596a008421cbc705fcfcc"}, ] +[package.dependencies] +webencodings = ">=0.5.1" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["pytest", "ruff"] + [[package]] name = "tornado" version = "6.4.2" @@ -3773,13 +4366,13 @@ dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake [[package]] name = "urllib3" -version = "2.2.3" +version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, - {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, + {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, + {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, ] [package.extras] @@ -3804,13 +4397,13 @@ test = ["coverage", "flake8 (>=3.7)", "mypy", "pretend", "pytest"] [[package]] name = "virtualenv" -version = "20.28.0" +version = "20.28.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" files = [ - {file = "virtualenv-20.28.0-py3-none-any.whl", hash = "sha256:23eae1b4516ecd610481eda647f3a7c09aea295055337331bb4e6892ecce47b0"}, - {file = "virtualenv-20.28.0.tar.gz", hash = "sha256:2c9c3262bb8e7b87ea801d715fae4495e6032450c71d2309be9550e7364049aa"}, + {file = "virtualenv-20.28.1-py3-none-any.whl", hash = "sha256:412773c85d4dab0409b83ec36f7a6499e72eaf08c80e81e9576bca61831c71cb"}, + {file = "virtualenv-20.28.1.tar.gz", hash = "sha256:5d34ab240fdb5d21549b76f9e8ff3af28252f5499fb6d6f031adac4e5a8c5329"}, ] [package.dependencies] @@ -3875,6 +4468,31 @@ files = [ {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] +[[package]] +name = "weasyprint" +version = "63.1" +description = "The Awesome Document Factory" +optional = false +python-versions = ">=3.9" +files = [ + {file = "weasyprint-63.1-py3-none-any.whl", hash = "sha256:9d0319fe3ba553c9a77dc43a2d35b64a70c2b8809ad55a139a214803fde62bce"}, + {file = "weasyprint-63.1.tar.gz", hash = "sha256:cb424e63e8dd3f14195bfe5f203527646aa40a2f00ac819f9d39b8304cec0044"}, +] + +[package.dependencies] +cffi = ">=0.6" +cssselect2 = ">=0.1" +fonttools = {version = ">=4.0.0", extras = ["woff"]} +Pillow = ">=9.1.0" +pydyf = ">=0.11.0" +Pyphen = ">=0.9.1" +tinycss2 = ">=1.4.0" +tinyhtml5 = ">=2.0.0b1" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["pytest", "ruff"] + [[package]] name = "webcolors" version = "24.11.1" @@ -3943,7 +4561,90 @@ enabler = ["pytest-enabler (>=2.2)"] test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] type = ["pytest-mypy"] +[[package]] +name = "zopfli" +version = "0.2.3.post1" +description = "Zopfli module for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zopfli-0.2.3.post1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0137dd64a493ba6a4be37405cfd6febe650a98cc1e9dca8f6b8c63b1db11b41"}, + {file = "zopfli-0.2.3.post1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aa588b21044f8a74e423d8c8a4c7fc9988501878aacced793467010039c50734"}, + {file = "zopfli-0.2.3.post1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9f4a7ec2770e6af05f5a02733fd3900f30a9cd58e5d6d3727e14c5bcd6e7d587"}, + {file = "zopfli-0.2.3.post1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f7d69c1a7168ad0e9cb864e8663acb232986a0c9c9cb9801f56bf6214f53a54d"}, + {file = "zopfli-0.2.3.post1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c2d2bc8129707e34c51f9352c4636ca313b52350bbb7e04637c46c1818a2a70"}, + {file = "zopfli-0.2.3.post1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:39e576f93576c5c223b41d9c780bbb91fd6db4babf3223d2a4fe7bf568e2b5a8"}, + {file = "zopfli-0.2.3.post1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:cbe6df25807227519debd1a57ab236f5f6bad441500e85b13903e51f93a43214"}, + {file = "zopfli-0.2.3.post1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7cce242b5df12b2b172489daf19c32e5577dd2fac659eb4b17f6a6efb446fd5c"}, + {file = "zopfli-0.2.3.post1-cp310-cp310-win32.whl", hash = "sha256:f815fcc2b2a457977724bad97fb4854022980f51ce7b136925e336b530545ae1"}, + {file = "zopfli-0.2.3.post1-cp310-cp310-win_amd64.whl", hash = "sha256:0cc20b02a9531559945324c38302fd4ba763311632d0ec8a1a0aa9c10ea363e6"}, + {file = "zopfli-0.2.3.post1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:518f1f4ed35dd69ce06b552f84e6d081f07c552b4c661c5312d950a0b764a58a"}, + {file = "zopfli-0.2.3.post1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:615a8ac9dda265e9cc38b2a76c3142e4a9f30fea4a79c85f670850783bc6feb4"}, + {file = "zopfli-0.2.3.post1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a82fc2dbebe6eb908b9c665e71496f8525c1bc4d2e3a7a7722ef2b128b6227c8"}, + {file = "zopfli-0.2.3.post1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37d011e92f7b9622742c905fdbed9920a1d0361df84142807ea2a528419dea7f"}, + {file = "zopfli-0.2.3.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e63d558847166543c2c9789e6f985400a520b7eacc4b99181668b2c3aeadd352"}, + {file = "zopfli-0.2.3.post1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:60db20f06c3d4c5934b16cfa62a2cc5c3f0686bffe0071ed7804d3c31ab1a04e"}, + {file = "zopfli-0.2.3.post1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:716cdbfc57bfd3d3e31a58e6246e8190e6849b7dbb7c4ce39ef8bbf0edb8f6d5"}, + {file = "zopfli-0.2.3.post1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3a89277ed5f8c0fb2d0b46d669aa0633123aa7381f1f6118c12f15e0fb48f8ca"}, + {file = "zopfli-0.2.3.post1-cp311-cp311-win32.whl", hash = "sha256:75a26a2307b10745a83b660c404416e984ee6fca515ec7f0765f69af3ce08072"}, + {file = "zopfli-0.2.3.post1-cp311-cp311-win_amd64.whl", hash = "sha256:81c341d9bb87a6dbbb0d45d6e272aca80c7c97b4b210f9b6e233bf8b87242f29"}, + {file = "zopfli-0.2.3.post1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3f0197b6aa6eb3086ae9e66d6dd86c4d502b6c68b0ec490496348ae8c05ecaef"}, + {file = "zopfli-0.2.3.post1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5fcfc0dc2761e4fcc15ad5d273b4d58c2e8e059d3214a7390d4d3c8e2aee644e"}, + {file = "zopfli-0.2.3.post1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cac2b37ab21c2b36a10b685b1893ebd6b0f83ae26004838ac817680881576567"}, + {file = "zopfli-0.2.3.post1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d5ab297d660b75c159190ce6d73035502310e40fd35170aed7d1a1aea7ddd65"}, + {file = "zopfli-0.2.3.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ba214f4f45bec195ee8559651154d3ac2932470b9d91c5715fc29c013349f8c"}, + {file = "zopfli-0.2.3.post1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c1e0ed5d84ffa2d677cc9582fc01e61dab2e7ef8b8996e055f0a76167b1b94df"}, + {file = "zopfli-0.2.3.post1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bfa1eb759e07d8b7aa7a310a2bc535e127ee70addf90dc8d4b946b593c3e51a8"}, + {file = "zopfli-0.2.3.post1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cd2c002f160502608dcc822ed2441a0f4509c52e86fcfd1a09e937278ed1ca14"}, + {file = "zopfli-0.2.3.post1-cp312-cp312-win32.whl", hash = "sha256:7be5cc6732eb7b4df17305d8a7b293223f934a31783a874a01164703bc1be6cd"}, + {file = "zopfli-0.2.3.post1-cp312-cp312-win_amd64.whl", hash = "sha256:4e50ffac74842c1c1018b9b73875a0d0a877c066ab06bf7cccbaa84af97e754f"}, + {file = "zopfli-0.2.3.post1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecb7572df5372abce8073df078207d9d1749f20b8b136089916a4a0868d56051"}, + {file = "zopfli-0.2.3.post1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1cf720896d2ce998bc8e051d4b4ce0d8bec007aab6243102e8e1d22a0b2fb3f"}, + {file = "zopfli-0.2.3.post1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aad740b4d4fcbaaae4887823925166ffd062db3b248b3f432198fc287381d1a"}, + {file = "zopfli-0.2.3.post1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6617fb10f9e4393b331941861d73afb119cd847e88e4974bdbe8068ceef3f73f"}, + {file = "zopfli-0.2.3.post1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a53b18797cdef27e019db595d66c4b077325afe2fd62145953275f53d84ce40c"}, + {file = "zopfli-0.2.3.post1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b78008a69300d929ca2efeffec951b64a312e9a811e265ea4a907ab546d79fa6"}, + {file = "zopfli-0.2.3.post1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0aa5f90d6298bda02a95bc8dc8c3c19004d5a4e44bda00b67ca7431d857b4b54"}, + {file = "zopfli-0.2.3.post1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2768c877f76c8a0e7519b1c86c93757f3c01492ddde55751e9988afb7eff64e1"}, + {file = "zopfli-0.2.3.post1-cp313-cp313-win32.whl", hash = "sha256:71390dbd3fbf6ebea9a5d85ffed8c26ee1453ee09248e9b88486e30e0397b775"}, + {file = "zopfli-0.2.3.post1-cp313-cp313-win_amd64.whl", hash = "sha256:a86eb88e06bd87e1fff31dac878965c26b0c26db59ddcf78bb0379a954b120de"}, + {file = "zopfli-0.2.3.post1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3827170de28faf144992d3d4dcf8f3998fe3c8a6a6f4a08f1d42c2ec6119d2bb"}, + {file = "zopfli-0.2.3.post1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b0ec13f352ea5ae0fc91f98a48540512eed0767d0ec4f7f3cb92d92797983d18"}, + {file = "zopfli-0.2.3.post1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f272186e03ad55e7af09ab78055535c201b1a0bcc2944edb1768298d9c483a4"}, + {file = "zopfli-0.2.3.post1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:29ea74e72ffa6e291b8c6f2504ce6c146b4fe990c724c1450eb8e4c27fd31431"}, + {file = "zopfli-0.2.3.post1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:eb45a34f23da4f8bc712b6376ca5396914b0b7c09adbb001dad964eb7f3132f8"}, + {file = "zopfli-0.2.3.post1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6482db9876c68faac2d20a96b566ffbf65ddaadd97b222e4e73641f4f8722fc4"}, + {file = "zopfli-0.2.3.post1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:95a260cafd56b8fffa679918937401c80bb38e1681c448b988022e4c3610965d"}, + {file = "zopfli-0.2.3.post1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:676919fba7311125244eb0c4393679ac5fe856e5864a15d122bd815205369fa0"}, + {file = "zopfli-0.2.3.post1-cp38-cp38-win32.whl", hash = "sha256:b9026a21b6d41eb0e2e63f5bc1242c3fcc43ecb770963cda99a4307863dac12e"}, + {file = "zopfli-0.2.3.post1-cp38-cp38-win_amd64.whl", hash = "sha256:3c163911f8bad94b3e1db0a572e7c28ba681a0c91d0002ea1e4fa9264c21ef17"}, + {file = "zopfli-0.2.3.post1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b05296e8bc88c92e2b21e0a9bae4740c1551ee613c1d93a51fd28a7a0b2b6fbb"}, + {file = "zopfli-0.2.3.post1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f12000a6accdd4bf0a3fa6eaa1b1c7a7bc80af0a2edf3f89d770d3dcce1d0e22"}, + {file = "zopfli-0.2.3.post1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a241a68581d34d67b40c425cce3d1fd211c092f99d9250947824ccba9f491949"}, + {file = "zopfli-0.2.3.post1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3657e416ffb8f31d9d3424af12122bb251befae109f2e271d87d825c92fc5b7b"}, + {file = "zopfli-0.2.3.post1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4915a41375bdee4db749ecd07d985a0486eb688a6619f713b7bf6fbfd145e960"}, + {file = "zopfli-0.2.3.post1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bbe429fc50686bb2a2608a30843e36fbaa123462a5284f136c7d9e0145220bfd"}, + {file = "zopfli-0.2.3.post1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2345e713260a350bea0b01a816a469ea356bc2d63d009a0d777691ecbbcf7493"}, + {file = "zopfli-0.2.3.post1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:fc39f5c27f962ec8660d8d20c24762431131b5d8c672b44b0a54cf2b5bcde9b9"}, + {file = "zopfli-0.2.3.post1-cp39-cp39-win32.whl", hash = "sha256:9a6aec38a989bad7ddd1ef53f1265699e49e294d08231b5313d61293f3cd6237"}, + {file = "zopfli-0.2.3.post1-cp39-cp39-win_amd64.whl", hash = "sha256:b3df42f52502438ee973042cc551877d24619fa1cd38ef7b7e9ac74200daca8b"}, + {file = "zopfli-0.2.3.post1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4c1226a7e2c7105ac31503a9bb97454743f55d88164d6d46bc138051b77f609b"}, + {file = "zopfli-0.2.3.post1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48dba9251060289101343110ab47c0756f66f809bb4d1ddbb6d5c7e7752115c5"}, + {file = "zopfli-0.2.3.post1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89899641d4de97dbad8e0cde690040d078b6aea04066dacaab98e0b5a23573f2"}, + {file = "zopfli-0.2.3.post1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3654bfc927bc478b1c3f3ff5056ed7b20a1a37fa108ca503256d0a699c03bbb1"}, + {file = "zopfli-0.2.3.post1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c4278d1873ce6e803e5d4f8d702fd3026bd67fca744aa98881324d1157ddf748"}, + {file = "zopfli-0.2.3.post1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:1d8cc06605519e82b16df090e17cb3990d1158861b2872c3117f1168777b81e4"}, + {file = "zopfli-0.2.3.post1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1f990634fd5c5c8ced8edddd8bd45fab565123b4194d6841e01811292650acae"}, + {file = "zopfli-0.2.3.post1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91a2327a4d7e77471fa4fbb26991c6de4a738c6fc6a33e09bb25f56a870a4b7b"}, + {file = "zopfli-0.2.3.post1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fbe5bcf10d01aab3513550f284c09fef32f342b36f56bfae2120a9c4d12c130"}, + {file = "zopfli-0.2.3.post1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:34a99592f3d9eb6f737616b5bd74b48a589fdb3cb59a01a50d636ea81d6af272"}, + {file = "zopfli-0.2.3.post1.tar.gz", hash = "sha256:96484dc0f48be1c5d7ae9f38ed1ce41e3675fd506b27c11a6607f14b49101e99"}, +] + +[package.extras] +test = ["pytest"] + [metadata] lock-version = "2.0" -python-versions = ">=3.9,<3.13" -content-hash = "ad226a6075f3e40c05fff94d70cec8a021163d36f911467191bf3d56af3d422c" +python-versions = ">=3.12,<3.13" +content-hash = "9edd9b53e863ec039bd8dcf2a0c9eb3abf9e7f6163571a0887456d392e9bbed6" diff --git a/polars_bio/__init__.py b/polars_bio/__init__.py index 4dd35a71..d32bc016 100644 --- a/polars_bio/__init__.py +++ b/polars_bio/__init__.py @@ -1,11 +1,11 @@ import logging -from .range_op import ctx, nearest, overlap +from .range_op import FilterOp, ctx, nearest, overlap logging.basicConfig() logging.getLogger().setLevel(logging.WARN) logger = logging.getLogger("polars_bio") logger.setLevel(logging.INFO) - +__version__ = "0.3.0" __all__ = ["overlap", "nearest", "ctx", "FilterOp", "vizualize_intervals"] diff --git a/polars_bio/range_op.py b/polars_bio/range_op.py index 20ad5af5..6bc75655 100644 --- a/polars_bio/range_op.py +++ b/polars_bio/range_op.py @@ -21,9 +21,10 @@ def overlap( how: str = "inner", overlap_filter: FilterOp = FilterOp.Strict, suffixes: tuple[str, str] = ("_1", "_2"), - on_cols=None, + on_cols: Union[list[str], None] = None, col1: Union[list[str], None] = None, col2: Union[list[str], None] = None, + algorithm: str = "Coitrees", output_type: str = "polars.LazyFrame", ) -> Union[pl.LazyFrame, pl.DataFrame, pd.DataFrame]: """ @@ -43,6 +44,7 @@ def overlap( values are 'chrom', 'start', 'end'. suffixes: Suffixes for the columns of the two overlapped sets. on_cols: List of additional column names to join on. default is None. + algorithm: The algorithm to use for the overlap operation. default is "Coitrees". output_type: Type of the output. default is "polars.LazyFrame", "polars.DataFrame", or "pandas.DataFrame" are also supported. Returns: @@ -93,6 +95,7 @@ def overlap( suffixes=suffixes, columns_1=col1, columns_2=col2, + overlap_alg=algorithm, ) return range_operation(df1, df2, range_options, output_type, ctx) diff --git a/polars_bio/range_op_io.py b/polars_bio/range_op_io.py index e9fecbf8..02d63e05 100644 --- a/polars_bio/range_op_io.py +++ b/polars_bio/range_op_io.py @@ -34,6 +34,10 @@ def range_lazy_scan( range_function = range_operation_frame df_1 = _df_to_arrow(df_1, range_options.columns_1[0]).to_reader() df_2 = _df_to_arrow(df_2, range_options.columns_2[0]).to_reader() + elif isinstance(df_1, pl.LazyFrame) and isinstance(df_2, pl.LazyFrame): + range_function = range_operation_frame + df_1 = df_1.collect().to_arrow().to_reader() + df_2 = df_2.collect().to_arrow().to_reader() else: raise ValueError("Only polars and pandas dataframes are supported") @@ -56,7 +60,7 @@ def _overlap_source( # but for now we'll do it here. if with_columns is not None: df = df.select(with_columns) - yield df + yield df return register_io_source(_overlap_source, schema=schema) @@ -68,7 +72,7 @@ def _rename_columns_pl(df: pl.DataFrame, suffix: str) -> pl.DataFrame: def _rename_columns( df: Union[pl.DataFrame, pd.DataFrame], suffix: str ) -> Union[pl.DataFrame, pd.DataFrame]: - if isinstance(df, pl.DataFrame): + if isinstance(df, pl.DataFrame) or isinstance(df, pl.LazyFrame): df = pl.DataFrame(schema=df.schema) return _rename_columns_pl(df, suffix) elif isinstance(df, pd.DataFrame): diff --git a/pyproject.toml b/pyproject.toml index e02e19ae..bdfc9075 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,10 +15,10 @@ classifiers = [ ] dependencies = [ - "polars~=1.16.0", + "polars~=1.18.0", "pandas~=2.2.3", "pyarrow~=18.1.0", - "datafusion ~=42.0.0", + "datafusion ~=43.1.0", "bioframe ~=0.7.2"] [tool.maturin] @@ -36,11 +36,11 @@ authors = ["Marek Wiewiórka "] readme = "README.md" [tool.poetry.dependencies] -python = ">=3.9,<3.13" -polars = "^1.16.0" +python = ">=3.12,<3.13" +polars = "^1.18.0" pandas = "^2.2.3" pyarrow = "^18.1.0" -datafusion = "^42.0.0" +datafusion = "^43.1.0" bioframe = "^0.7.2" [tool.poetry.dev-dependencies] @@ -56,4 +56,15 @@ mkdocs-jupyter = "^0.25.1" mkdocs-material = "^9.5.48" mike = "^2.1.3" mkdocstrings-python = "^1.12.2" -mypy = "^1.13.0" \ No newline at end of file +markdown-exec = "^1.10.0" +mkdocs-with-pdf = "^0.9.3" +mypy = "^1.13.0" +py-cpuinfo = "^9.0.0" +jupyter_client = "^8.6.3" +psutil = "^6.1.1" +rich = "^13.9.4" +pyranges = {git = "https://github.com/pyranges/pyranges.git", rev = "4f0a153336e7153cdfea15b141ce4ea35a24e233" } +GenomicRanges = "^0.5.0" +pyranges1 = { git = "https://github.com/mwiewior/pyranges1.git", rev = "949d7c15c1c2e217f4404415f79b386f326b6f8d"} +pybedtools = "^0.10.0" +pygenomics = { git = "https://gitlab.com/gtamazian/pygenomics.git", rev = "0.1.1"} \ No newline at end of file diff --git a/somefile.ipc b/somefile.ipc new file mode 100644 index 00000000..9cd6a65c Binary files /dev/null and b/somefile.ipc differ diff --git a/somefile.parquet b/somefile.parquet new file mode 100644 index 00000000..4f29db48 Binary files /dev/null and b/somefile.parquet differ