diff --git a/.gitignore b/.gitignore index 7a58d6b..8ffea13 100755 --- a/.gitignore +++ b/.gitignore @@ -147,3 +147,4 @@ cython_debug/ # just a local scripts dir for us to be able to run things in local_scripts/ + diff --git a/README.md b/README.md index 7324387..11d69a1 100755 --- a/README.md +++ b/README.md @@ -16,4 +16,4 @@ Build with `just`, preferred over `do.sh` I think. ## CLI -the json files for dots and dipoles have a specific format that ignores extraneous data but is sad about missing fields. \ No newline at end of file +The json files for dots and dipoles have a specific format that ignores extraneous data but is sad about missing fields. diff --git a/flake.lock b/flake.lock index bdfaa37..1e32998 100644 --- a/flake.lock +++ b/flake.lock @@ -39,6 +39,7 @@ "nix-github-actions": { "inputs": { "nixpkgs": [ + "poetry2nixSrc", "nixpkgs" ] }, @@ -58,11 +59,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1716715802, - "narHash": "sha256-usk0vE7VlxPX8jOavrtpOqphdfqEQpf9lgedlY/r66c=", + "lastModified": 1719468428, + "narHash": "sha256-vN5xJAZ4UGREEglh3lfbbkIj+MPEYMuqewMn4atZFaQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "e2dd4e18cc1c7314e24154331bae07df76eb582f", + "rev": "1e3deb3d8a86a870d925760db1a5adecc64d329d", "type": "github" }, "original": { @@ -83,11 +84,11 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1716813403, - "narHash": "sha256-9+G8tEOh3QkjSUV2UMC+TpvzKOR8IUFlkJJTMpVQMkc=", + "lastModified": 1719549552, + "narHash": "sha256-efvBV+45uQA6r7aov48H6MhvKp1QUIyIX5gh9oueUzs=", "owner": "nix-community", "repo": "poetry2nix", - "rev": "12599ecaa9ec641c29dc8fd07f8267b23874bf3a", + "rev": "4fd045cdb85f2a0173021a4717dc01d92d7ab2b2", "type": "github" }, "original": { @@ -150,15 +151,16 @@ "treefmt-nix": { "inputs": { "nixpkgs": [ + "poetry2nixSrc", "nixpkgs" ] }, "locked": { - "lastModified": 1715940852, - "narHash": "sha256-wJqHMg/K6X3JGAE9YLM0LsuKrKb4XiBeVaoeMNlReZg=", + "lastModified": 1718522839, + "narHash": "sha256-ULzoKzEaBOiLRtjeY3YoGFJMwWSKRYOic6VNw2UyTls=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "2fba33a182602b9d49f0b2440513e5ee091d838b", + "rev": "68eb1dc333ce82d0ab0c0357363ea17c31ea1f81", "type": "github" }, "original": { diff --git a/poetry.lock b/poetry.lock index c6c6a38..d6dc88e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,5 +1,23 @@ # This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +[[package]] +name = "asttokens" +version = "2.4.1" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = "*" +files = [ + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, +] + +[package.dependencies] +six = ">=1.12.0" + +[package.extras] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] + [[package]] name = "black" version = "22.12.0" @@ -125,63 +143,63 @@ test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" -version = "7.4.4" +version = "7.5.4" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2"}, - {file = "coverage-7.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf"}, - {file = "coverage-7.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fa497a8ab37784fbb20ab699c246053ac294d13fc7eb40ec007a5043ec91f8"}, - {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1a93009cb80730c9bca5d6d4665494b725b6e8e157c1cb7f2db5b4b122ea562"}, - {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:690db6517f09336559dc0b5f55342df62370a48f5469fabf502db2c6d1cffcd2"}, - {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:09c3255458533cb76ef55da8cc49ffab9e33f083739c8bd4f58e79fecfe288f7"}, - {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ce1415194b4a6bd0cdcc3a1dfbf58b63f910dcb7330fe15bdff542c56949f87"}, - {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b91cbc4b195444e7e258ba27ac33769c41b94967919f10037e6355e998af255c"}, - {file = "coverage-7.4.4-cp310-cp310-win32.whl", hash = "sha256:598825b51b81c808cb6f078dcb972f96af96b078faa47af7dfcdf282835baa8d"}, - {file = "coverage-7.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:09ef9199ed6653989ebbcaacc9b62b514bb63ea2f90256e71fea3ed74bd8ff6f"}, - {file = "coverage-7.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f9f50e7ef2a71e2fae92774c99170eb8304e3fdf9c8c3c7ae9bab3e7229c5cf"}, - {file = "coverage-7.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:623512f8ba53c422fcfb2ce68362c97945095b864cda94a92edbaf5994201083"}, - {file = "coverage-7.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0513b9508b93da4e1716744ef6ebc507aff016ba115ffe8ecff744d1322a7b63"}, - {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40209e141059b9370a2657c9b15607815359ab3ef9918f0196b6fccce8d3230f"}, - {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a2b2b78c78293782fd3767d53e6474582f62443d0504b1554370bde86cc8227"}, - {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:73bfb9c09951125d06ee473bed216e2c3742f530fc5acc1383883125de76d9cd"}, - {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f384c3cc76aeedce208643697fb3e8437604b512255de6d18dae3f27655a384"}, - {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:54eb8d1bf7cacfbf2a3186019bcf01d11c666bd495ed18717162f7eb1e9dd00b"}, - {file = "coverage-7.4.4-cp311-cp311-win32.whl", hash = "sha256:cac99918c7bba15302a2d81f0312c08054a3359eaa1929c7e4b26ebe41e9b286"}, - {file = "coverage-7.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:b14706df8b2de49869ae03a5ccbc211f4041750cd4a66f698df89d44f4bd30ec"}, - {file = "coverage-7.4.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:201bef2eea65e0e9c56343115ba3814e896afe6d36ffd37bab783261db430f76"}, - {file = "coverage-7.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41c9c5f3de16b903b610d09650e5e27adbfa7f500302718c9ffd1c12cf9d6818"}, - {file = "coverage-7.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d898fe162d26929b5960e4e138651f7427048e72c853607f2b200909794ed978"}, - {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ea79bb50e805cd6ac058dfa3b5c8f6c040cb87fe83de10845857f5535d1db70"}, - {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce4b94265ca988c3f8e479e741693d143026632672e3ff924f25fab50518dd51"}, - {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00838a35b882694afda09f85e469c96367daa3f3f2b097d846a7216993d37f4c"}, - {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fdfafb32984684eb03c2d83e1e51f64f0906b11e64482df3c5db936ce3839d48"}, - {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:69eb372f7e2ece89f14751fbcbe470295d73ed41ecd37ca36ed2eb47512a6ab9"}, - {file = "coverage-7.4.4-cp312-cp312-win32.whl", hash = "sha256:137eb07173141545e07403cca94ab625cc1cc6bc4c1e97b6e3846270e7e1fea0"}, - {file = "coverage-7.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:d71eec7d83298f1af3326ce0ff1d0ea83c7cb98f72b577097f9083b20bdaf05e"}, - {file = "coverage-7.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ae728ff3b5401cc320d792866987e7e7e880e6ebd24433b70a33b643bb0384"}, - {file = "coverage-7.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc4f1358cb0c78edef3ed237ef2c86056206bb8d9140e73b6b89fbcfcbdd40e1"}, - {file = "coverage-7.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8130a2aa2acb8788e0b56938786c33c7c98562697bf9f4c7d6e8e5e3a0501e4a"}, - {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf271892d13e43bc2b51e6908ec9a6a5094a4df1d8af0bfc360088ee6c684409"}, - {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4cdc86d54b5da0df6d3d3a2f0b710949286094c3a6700c21e9015932b81447e"}, - {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae71e7ddb7a413dd60052e90528f2f65270aad4b509563af6d03d53e979feafd"}, - {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:38dd60d7bf242c4ed5b38e094baf6401faa114fc09e9e6632374388a404f98e7"}, - {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa5b1c1bfc28384f1f53b69a023d789f72b2e0ab1b3787aae16992a7ca21056c"}, - {file = "coverage-7.4.4-cp38-cp38-win32.whl", hash = "sha256:dfa8fe35a0bb90382837b238fff375de15f0dcdb9ae68ff85f7a63649c98527e"}, - {file = "coverage-7.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:b2991665420a803495e0b90a79233c1433d6ed77ef282e8e152a324bbbc5e0c8"}, - {file = "coverage-7.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b799445b9f7ee8bf299cfaed6f5b226c0037b74886a4e11515e569b36fe310d"}, - {file = "coverage-7.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b4d33f418f46362995f1e9d4f3a35a1b6322cb959c31d88ae56b0298e1c22357"}, - {file = "coverage-7.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aadacf9a2f407a4688d700e4ebab33a7e2e408f2ca04dbf4aef17585389eff3e"}, - {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c95949560050d04d46b919301826525597f07b33beba6187d04fa64d47ac82e"}, - {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff7687ca3d7028d8a5f0ebae95a6e4827c5616b31a4ee1192bdfde697db110d4"}, - {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5fc1de20b2d4a061b3df27ab9b7c7111e9a710f10dc2b84d33a4ab25065994ec"}, - {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c74880fc64d4958159fbd537a091d2a585448a8f8508bf248d72112723974cbd"}, - {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:742a76a12aa45b44d236815d282b03cfb1de3b4323f3e4ec933acfae08e54ade"}, - {file = "coverage-7.4.4-cp39-cp39-win32.whl", hash = "sha256:d89d7b2974cae412400e88f35d86af72208e1ede1a541954af5d944a8ba46c57"}, - {file = "coverage-7.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:9ca28a302acb19b6af89e90f33ee3e1906961f94b54ea37de6737b7ca9d8827c"}, - {file = "coverage-7.4.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b2c5edc4ac10a7ef6605a966c58929ec6c1bd0917fb8c15cb3363f65aa40e677"}, - {file = "coverage-7.4.4.tar.gz", hash = "sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49"}, + {file = "coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99"}, + {file = "coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9"}, + {file = "coverage-7.5.4-cp310-cp310-win32.whl", hash = "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8"}, + {file = "coverage-7.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f"}, + {file = "coverage-7.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5"}, + {file = "coverage-7.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078"}, + {file = "coverage-7.5.4-cp311-cp311-win32.whl", hash = "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806"}, + {file = "coverage-7.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d"}, + {file = "coverage-7.5.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233"}, + {file = "coverage-7.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805"}, + {file = "coverage-7.5.4-cp312-cp312-win32.whl", hash = "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b"}, + {file = "coverage-7.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7"}, + {file = "coverage-7.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882"}, + {file = "coverage-7.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f"}, + {file = "coverage-7.5.4-cp38-cp38-win32.whl", hash = "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f"}, + {file = "coverage-7.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633"}, + {file = "coverage-7.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088"}, + {file = "coverage-7.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7"}, + {file = "coverage-7.5.4-cp39-cp39-win32.whl", hash = "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace"}, + {file = "coverage-7.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d"}, + {file = "coverage-7.5.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5"}, + {file = "coverage-7.5.4.tar.gz", hash = "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353"}, ] [package.dependencies] @@ -205,6 +223,17 @@ files = [ docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] tests = ["pytest", "pytest-cov", "pytest-xdist"] +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + [[package]] name = "exceptiongroup" version = "1.2.1" @@ -219,6 +248,20 @@ files = [ [package.extras] test = ["pytest (>=6)"] +[[package]] +name = "executing" +version = "2.0.1" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.5" +files = [ + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + [[package]] name = "flake8" version = "4.0.1" @@ -237,53 +280,53 @@ pyflakes = ">=2.4.0,<2.5.0" [[package]] name = "fonttools" -version = "4.52.4" +version = "4.53.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.52.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fb8cd6559f0ae3a8f5e146f80ab2a90ad0325a759be8d48ee82758a0b89fa0aa"}, - {file = "fonttools-4.52.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ecb88318ff249bd2a715e7aec36774ce7ae3441128007ef72a39a60601f4a8f"}, - {file = "fonttools-4.52.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9a22cf1adaae7b2ba2ed7d8651a4193a4f348744925b4b740e6b38a94599c5b"}, - {file = "fonttools-4.52.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8873d6edd1dae5c088dd3d61c9fd4dd80c827c486fa224d368233e7f33dc98af"}, - {file = "fonttools-4.52.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:73ba38b98c012957940a04d9eb5439b42565ac892bba8cfc32e10d88e73921fe"}, - {file = "fonttools-4.52.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9725687db3c1cef13c0f40b380c3c15bea0113f4d0231b204d58edd5f2a53d90"}, - {file = "fonttools-4.52.4-cp310-cp310-win32.whl", hash = "sha256:9180775c9535389a665cae7c5282f8e07754beabf59b66aeba7f6bfeb32a3652"}, - {file = "fonttools-4.52.4-cp310-cp310-win_amd64.whl", hash = "sha256:46cc5d06ee05fd239c45d7935aaffd060ee773a88b97e901df50478247472643"}, - {file = "fonttools-4.52.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d272c7e173c3085308345ccc7fb2ad6ce7f415d777791dd6ce4e8140e354d09c"}, - {file = "fonttools-4.52.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:21921e5855c399d10ddfc373538b425cabcf8b3258720b51450909e108896450"}, - {file = "fonttools-4.52.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f6001814ec5e0c961cabe89642f7e8d7e07892b565057aa526569b9ebb711c"}, - {file = "fonttools-4.52.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b0b9eb0f55dce9c7278ad4175f1cbaed23b799dce5ecc20e3213da241584140"}, - {file = "fonttools-4.52.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:70d87f2099006304d33438bdaa5101953b7e22e23a93b1c7b7ed0f32ff44b423"}, - {file = "fonttools-4.52.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e176249292eccd89f81d39f514f2b5e8c75dfc9cef8653bdc3021d06697e9eff"}, - {file = "fonttools-4.52.4-cp311-cp311-win32.whl", hash = "sha256:bb7d206fa5ba6e082ba5d5e1b7107731029fc3a55c71c48de65121710d817986"}, - {file = "fonttools-4.52.4-cp311-cp311-win_amd64.whl", hash = "sha256:346d08ff92e577b2dc5a0c228487667d23fe2da35a8b9a8bba22c2b6ba8be21c"}, - {file = "fonttools-4.52.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d2cc7906bc0afdd2689aaf88b910307333b1f936262d1d98f25dbf8a5eb2e829"}, - {file = "fonttools-4.52.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:00d9abf4b400f98fb895566eb298f60432b4b29048e3dc02807427b09a06604e"}, - {file = "fonttools-4.52.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b419207e53db1599b3d385afd4bca6692c219d53732890d0814a2593104d0e2"}, - {file = "fonttools-4.52.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf694159528022daa71b1777cb6ec9e0ebbdd29859f3e9c845826cafaef4ca29"}, - {file = "fonttools-4.52.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9a5d1b0475050056d2e3bc378014f2ea2230e8ae434eeac8dfb182aa8efaf642"}, - {file = "fonttools-4.52.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4c3ad89204c2d7f419436f1d6fde681b070c5e20b888beb57ccf92f640628cc9"}, - {file = "fonttools-4.52.4-cp312-cp312-win32.whl", hash = "sha256:1dc626de4b204d025d029e646bae8fdbf5acd9217158283a567f4b523fda3bae"}, - {file = "fonttools-4.52.4-cp312-cp312-win_amd64.whl", hash = "sha256:309b617942041073ffa96090d320b99d75648ed16e0c67fb1aa7788e06c834de"}, - {file = "fonttools-4.52.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8b186cd6b8844f6cf04a7e0a174bc3649d3deddbfc10dc59846a4381f796d348"}, - {file = "fonttools-4.52.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9ed23a03b7d9f0e29ca0679eafe5152aeccb0580312a3fc36f0662e178b4791b"}, - {file = "fonttools-4.52.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89b53386214197bd5b3e3c753895bad691de84726ced3c222a59cde1dd12d57b"}, - {file = "fonttools-4.52.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7467161f1eed557dbcec152d5ee95540200b1935709fa73307da16bc0b7ca361"}, - {file = "fonttools-4.52.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b4cba644e2515d685d4ee3ca2fbb5d53930a0e9ec2cf332ed704dc341b145878"}, - {file = "fonttools-4.52.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:890e7a657574610330e42dd1e38d3b9e0a8cb0eff3da080f80995460a256d3dd"}, - {file = "fonttools-4.52.4-cp38-cp38-win32.whl", hash = "sha256:7dccf4666f716e5e0753f0fa28dad2f4431154c87747bc781c838b8a5dca990e"}, - {file = "fonttools-4.52.4-cp38-cp38-win_amd64.whl", hash = "sha256:a791f002d1b717268235cfae7e4957b7fd132e92e2c5400e521bf191f1b3a9a5"}, - {file = "fonttools-4.52.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:05e4291db6af66f466a203d9922e4c1d3e18ef16868f76f10b00e2c3b9814df2"}, - {file = "fonttools-4.52.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a64e72d2c144630e017ac9c1c416ddf8ac43bef9a083bf81fe08c0695f0baa95"}, - {file = "fonttools-4.52.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebb183ed8b789cece0bd6363121913fb6da4034af89a2fa5408e42a1592889a8"}, - {file = "fonttools-4.52.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4daf2751a98c69d9620717826ed6c5743b662ef0ae7bb33dc6c205425e48eba"}, - {file = "fonttools-4.52.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:15efb2ba4b8c2d012ee0bb7a850c2e4780c530cc83ec8e843b2a97f8b3a5fd4b"}, - {file = "fonttools-4.52.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:35af630404223273f1d7acd4761f399131c62820366f53eac029337069f5826a"}, - {file = "fonttools-4.52.4-cp39-cp39-win32.whl", hash = "sha256:d0184aa88865339d96f7f452e8c5b621186ef7638744d78bf9b775d67e206819"}, - {file = "fonttools-4.52.4-cp39-cp39-win_amd64.whl", hash = "sha256:e03dae26084bb3632b4a77b1cd0419159d2226911aff6dc4c7e3058df68648c6"}, - {file = "fonttools-4.52.4-py3-none-any.whl", hash = "sha256:95e8a5975d08d0b624a14eec0f987e204ad81b480e24c5436af99170054434b8"}, - {file = "fonttools-4.52.4.tar.gz", hash = "sha256:859399b7adc8ac067be8e5c80ef4bb2faddff97e9b40896a9de75606a43d0469"}, + {file = "fonttools-4.53.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:52a6e0a7a0bf611c19bc8ec8f7592bdae79c8296c70eb05917fd831354699b20"}, + {file = "fonttools-4.53.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:099634631b9dd271d4a835d2b2a9e042ccc94ecdf7e2dd9f7f34f7daf333358d"}, + {file = "fonttools-4.53.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e40013572bfb843d6794a3ce076c29ef4efd15937ab833f520117f8eccc84fd6"}, + {file = "fonttools-4.53.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715b41c3e231f7334cbe79dfc698213dcb7211520ec7a3bc2ba20c8515e8a3b5"}, + {file = "fonttools-4.53.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74ae2441731a05b44d5988d3ac2cf784d3ee0a535dbed257cbfff4be8bb49eb9"}, + {file = "fonttools-4.53.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:95db0c6581a54b47c30860d013977b8a14febc206c8b5ff562f9fe32738a8aca"}, + {file = "fonttools-4.53.0-cp310-cp310-win32.whl", hash = "sha256:9cd7a6beec6495d1dffb1033d50a3f82dfece23e9eb3c20cd3c2444d27514068"}, + {file = "fonttools-4.53.0-cp310-cp310-win_amd64.whl", hash = "sha256:daaef7390e632283051e3cf3e16aff2b68b247e99aea916f64e578c0449c9c68"}, + {file = "fonttools-4.53.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a209d2e624ba492df4f3bfad5996d1f76f03069c6133c60cd04f9a9e715595ec"}, + {file = "fonttools-4.53.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f520d9ac5b938e6494f58a25c77564beca7d0199ecf726e1bd3d56872c59749"}, + {file = "fonttools-4.53.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eceef49f457253000e6a2d0f7bd08ff4e9fe96ec4ffce2dbcb32e34d9c1b8161"}, + {file = "fonttools-4.53.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1f3e34373aa16045484b4d9d352d4c6b5f9f77ac77a178252ccbc851e8b2ee"}, + {file = "fonttools-4.53.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:28d072169fe8275fb1a0d35e3233f6df36a7e8474e56cb790a7258ad822b6fd6"}, + {file = "fonttools-4.53.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4a2a6ba400d386e904fd05db81f73bee0008af37799a7586deaa4aef8cd5971e"}, + {file = "fonttools-4.53.0-cp311-cp311-win32.whl", hash = "sha256:bb7273789f69b565d88e97e9e1da602b4ee7ba733caf35a6c2affd4334d4f005"}, + {file = "fonttools-4.53.0-cp311-cp311-win_amd64.whl", hash = "sha256:9fe9096a60113e1d755e9e6bda15ef7e03391ee0554d22829aa506cdf946f796"}, + {file = "fonttools-4.53.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d8f191a17369bd53a5557a5ee4bab91d5330ca3aefcdf17fab9a497b0e7cff7a"}, + {file = "fonttools-4.53.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:93156dd7f90ae0a1b0e8871032a07ef3178f553f0c70c386025a808f3a63b1f4"}, + {file = "fonttools-4.53.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bff98816cb144fb7b85e4b5ba3888a33b56ecef075b0e95b95bcd0a5fbf20f06"}, + {file = "fonttools-4.53.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:973d030180eca8255b1bce6ffc09ef38a05dcec0e8320cc9b7bcaa65346f341d"}, + {file = "fonttools-4.53.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c4ee5a24e281fbd8261c6ab29faa7fd9a87a12e8c0eed485b705236c65999109"}, + {file = "fonttools-4.53.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bd5bc124fae781a4422f61b98d1d7faa47985f663a64770b78f13d2c072410c2"}, + {file = "fonttools-4.53.0-cp312-cp312-win32.whl", hash = "sha256:a239afa1126b6a619130909c8404070e2b473dd2b7fc4aacacd2e763f8597fea"}, + {file = "fonttools-4.53.0-cp312-cp312-win_amd64.whl", hash = "sha256:45b4afb069039f0366a43a5d454bc54eea942bfb66b3fc3e9a2c07ef4d617380"}, + {file = "fonttools-4.53.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:93bc9e5aaa06ff928d751dc6be889ff3e7d2aa393ab873bc7f6396a99f6fbb12"}, + {file = "fonttools-4.53.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2367d47816cc9783a28645bc1dac07f8ffc93e0f015e8c9fc674a5b76a6da6e4"}, + {file = "fonttools-4.53.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:907fa0b662dd8fc1d7c661b90782ce81afb510fc4b7aa6ae7304d6c094b27bce"}, + {file = "fonttools-4.53.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e0ad3c6ea4bd6a289d958a1eb922767233f00982cf0fe42b177657c86c80a8f"}, + {file = "fonttools-4.53.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:73121a9b7ff93ada888aaee3985a88495489cc027894458cb1a736660bdfb206"}, + {file = "fonttools-4.53.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ee595d7ba9bba130b2bec555a40aafa60c26ce68ed0cf509983e0f12d88674fd"}, + {file = "fonttools-4.53.0-cp38-cp38-win32.whl", hash = "sha256:fca66d9ff2ac89b03f5aa17e0b21a97c21f3491c46b583bb131eb32c7bab33af"}, + {file = "fonttools-4.53.0-cp38-cp38-win_amd64.whl", hash = "sha256:31f0e3147375002aae30696dd1dc596636abbd22fca09d2e730ecde0baad1d6b"}, + {file = "fonttools-4.53.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d6166192dcd925c78a91d599b48960e0a46fe565391c79fe6de481ac44d20ac"}, + {file = "fonttools-4.53.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef50ec31649fbc3acf6afd261ed89d09eb909b97cc289d80476166df8438524d"}, + {file = "fonttools-4.53.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f193f060391a455920d61684a70017ef5284ccbe6023bb056e15e5ac3de11d1"}, + {file = "fonttools-4.53.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba9f09ff17f947392a855e3455a846f9855f6cf6bec33e9a427d3c1d254c712f"}, + {file = "fonttools-4.53.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0c555e039d268445172b909b1b6bdcba42ada1cf4a60e367d68702e3f87e5f64"}, + {file = "fonttools-4.53.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a4788036201c908079e89ae3f5399b33bf45b9ea4514913f4dbbe4fac08efe0"}, + {file = "fonttools-4.53.0-cp39-cp39-win32.whl", hash = "sha256:d1a24f51a3305362b94681120c508758a88f207fa0a681c16b5a4172e9e6c7a9"}, + {file = "fonttools-4.53.0-cp39-cp39-win_amd64.whl", hash = "sha256:1e677bfb2b4bd0e5e99e0f7283e65e47a9814b0486cb64a41adf9ef110e078f2"}, + {file = "fonttools-4.53.0-py3-none-any.whl", hash = "sha256:6b4f04b1fbc01a3569d63359f2227c89ab294550de277fd09d8fca6185669fa4"}, + {file = "fonttools-4.53.0.tar.gz", hash = "sha256:c93ed66d32de1559b6fc348838c7572d5c0ac1e4a258e76763a5caddd8944002"}, ] [package.extras] @@ -329,6 +372,62 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] +[[package]] +name = "ipython" +version = "8.18.1" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, + {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, +] + +[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" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5" +typing-extensions = {version = "*", markers = "python_version < \"3.10\""} + +[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"] +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"] +kernel = ["ipykernel"] +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"] + +[[package]] +name = "jedi" +version = "0.19.1" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + [[package]] name = "kiwisolver" version = "1.4.5" @@ -495,6 +594,20 @@ python-dateutil = ">=2.7" [package.extras] dev = ["meson-python (>=0.13.1)", "numpy (>=1.25)", "pybind11 (>=2.6)", "setuptools (>=64)", "setuptools_scm (>=7)"] +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, +] + +[package.dependencies] +traitlets = "*" + [[package]] name = "mccabe" version = "0.6.1" @@ -561,52 +674,75 @@ files = [ [[package]] name = "numpy" -version = "1.24.4" +version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "numpy-1.24.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64"}, - {file = "numpy-1.24.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1"}, - {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4"}, - {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6"}, - {file = "numpy-1.24.4-cp310-cp310-win32.whl", hash = "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc"}, - {file = "numpy-1.24.4-cp310-cp310-win_amd64.whl", hash = "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e"}, - {file = "numpy-1.24.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810"}, - {file = "numpy-1.24.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254"}, - {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7"}, - {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5"}, - {file = "numpy-1.24.4-cp311-cp311-win32.whl", hash = "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d"}, - {file = "numpy-1.24.4-cp311-cp311-win_amd64.whl", hash = "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694"}, - {file = "numpy-1.24.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61"}, - {file = "numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f"}, - {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e"}, - {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc"}, - {file = "numpy-1.24.4-cp38-cp38-win32.whl", hash = "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2"}, - {file = "numpy-1.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706"}, - {file = "numpy-1.24.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400"}, - {file = "numpy-1.24.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f"}, - {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9"}, - {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d"}, - {file = "numpy-1.24.4-cp39-cp39-win32.whl", hash = "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835"}, - {file = "numpy-1.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2"}, - {file = "numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] [[package]] name = "packaging" -version = "24.0" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] +[[package]] +name = "parso" +version = "0.8.4" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, +] + +[package.extras] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] + [[package]] name = "pathspec" version = "0.12.1" @@ -618,6 +754,20 @@ files = [ {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + [[package]] name = "pillow" version = "10.3.0" @@ -706,18 +856,19 @@ xmp = ["defusedxml"] [[package]] name = "platformdirs" -version = "4.2.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "4.2.2" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, - {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, ] [package.extras] docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] [[package]] name = "pluggy" @@ -734,6 +885,45 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "prompt-toolkit" +version = "3.0.47" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, + {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] + +[package.extras] +tests = ["pytest"] + [[package]] name = "pycodestyle" version = "2.8.0" @@ -756,6 +946,20 @@ files = [ {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, ] +[[package]] +name = "pygments" +version = "2.18.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"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + [[package]] name = "pyparsing" version = "3.1.2" @@ -772,13 +976,13 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "8.1.1" +version = "8.2.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.1.1-py3-none-any.whl", hash = "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7"}, - {file = "pytest-8.1.1.tar.gz", hash = "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044"}, + {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, + {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, ] [package.dependencies] @@ -786,11 +990,11 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=1.4,<2.0" +pluggy = ">=1.5,<2.0" tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-cov" @@ -873,6 +1077,25 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + [[package]] name = "syrupy" version = "4.6.1" @@ -898,33 +1121,59 @@ files = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] +[[package]] +name = "traitlets" +version = "5.14.3" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + [[package]] name = "typing-extensions" -version = "4.11.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, - {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] [[package]] name = "zipp" -version = "3.19.0" +version = "3.19.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.19.0-py3-none-any.whl", hash = "sha256:96dc6ad62f1441bcaccef23b274ec471518daf4fbbc580341204936a5a3dddec"}, - {file = "zipp-3.19.0.tar.gz", hash = "sha256:952df858fb3164426c976d9338d3961e8e8b3758e2e059e0f754b8c4262625ee"}, + {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, + {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.10" -content-hash = "872b3583d0fd4cfdd9ce8449ba50feb0deb575e8ac7453a777d9cb2d5a69eb4d" +content-hash = "5bfa5aed1086efa011fcb18206b79ef04aff5dc443b45278bdcf01f9b0e25b72" diff --git a/pyproject.toml b/pyproject.toml index 99cbc75..9d5e7a4 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,6 +20,7 @@ mypy = "^0.961" black = "^22.3.0" syrupy = "^4.0.8" matplotlib = "^3.9.0" +ipython = ">=7" [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/tantri/cli/__init__.py b/tantri/cli/__init__.py index 19ca99a..3e454a1 100755 --- a/tantri/cli/__init__.py +++ b/tantri/cli/__init__.py @@ -6,6 +6,7 @@ import tantri.cli.input_files.write_dipoles import tantri.cli.file_importer import json import tantri.dipoles +import tantri.dipoles.event_time_series import pathlib @@ -97,6 +98,9 @@ def cli(log, log_file): required=True, ) @click.option("--header-row/--no-header-row", default=False, help="Write a header row") +@click.option( + "--event-based/--no-event-based", default=False, help="Use new event-based method" +) def write_time_series( dipoles_file, dots_file, @@ -106,6 +110,7 @@ def write_time_series( time_series_rng_seed, output_file, header_row, + event_based, ): """ Generate a time series for the passed in parameters. @@ -119,6 +124,7 @@ def write_time_series( time_series_rng_seed, output_file, header_row, + event_based, ) @@ -131,6 +137,7 @@ def _write_time_series( time_series_rng_seed, output_file, header_row, + new_method, ): _logger.debug( f"Received parameters [dipoles_file: {dipoles_file}] and [dots_file: {dots_file}]" @@ -156,21 +163,42 @@ def _write_time_series( f"Going to simulate {num_iterations} iterations with a delta t of {delta_t}" ) - _logger.debug(f"Got seed {time_series_rng_seed}") - if time_series_rng_seed is None: - time_series = tantri.dipoles.DipoleTimeSeries( - dipoles, dots, measurement_enum, delta_t - ) - else: - rng = numpy.random.default_rng(time_series_rng_seed) - time_series = tantri.dipoles.DipoleTimeSeries( - dipoles, dots, measurement_enum, delta_t, rng - ) + if new_method: + _logger.info("Using new method") + _logger.debug(f"Got seed {time_series_rng_seed}") + if time_series_rng_seed is None: + time_series = tantri.dipoles.event_time_series.EventDipoleTimeSeries( + dipoles, dots, measurement_enum, delta_t, num_iterations + ) + else: + rng = numpy.random.default_rng(time_series_rng_seed) + time_series = tantri.dipoles.event_time_series.EventDipoleTimeSeries( + dipoles, dots, measurement_enum, delta_t, num_iterations, rng + ) + output_series = time_series.create_time_series() + for time, time_series_dict in output_series: + values = ", ".join(str(time_series_dict[label]) for label in labels) + out.write(f"{time}, {values}\n") - for i in range(num_iterations): - transition = time_series.transition() - transition_values = ", ".join(str(transition[label]) for label in labels) - out.write(f"{i * delta_t}, {transition_values}\n") + else: + # in the old method + _logger.debug(f"Got seed {time_series_rng_seed}") + if time_series_rng_seed is None: + time_series = tantri.dipoles.DipoleTimeSeries( + dipoles, dots, measurement_enum, delta_t + ) + else: + rng = numpy.random.default_rng(time_series_rng_seed) + time_series = tantri.dipoles.DipoleTimeSeries( + dipoles, dots, measurement_enum, delta_t, rng + ) + + for i in range(num_iterations): + transition = time_series.transition() + transition_values = ", ".join( + str(transition[label]) for label in labels + ) + out.write(f"{i * delta_t}, {transition_values}\n") @cli.command() diff --git a/tantri/dipoles/event_time_series.py b/tantri/dipoles/event_time_series.py new file mode 100644 index 0000000..000ccda --- /dev/null +++ b/tantri/dipoles/event_time_series.py @@ -0,0 +1,154 @@ +import numpy.random +from typing import Callable, Sequence, Tuple, Optional, Dict, List +from dataclasses import dataclass +from tantri.dipoles.types import DipoleTO, DotPosition, DipoleMeasurementType +import logging + +_logger = logging.getLogger(__name__) + + +@dataclass +class EventWrappedDipole: + # assumed len 3 + p: numpy.ndarray + s: numpy.ndarray + + # should be 1/tau up to some pis + w: float + + # For caching purposes tell each dipole where the dots are + # TODO: This can be done better by only passing into the time series the non-repeated p s and w, + # TODO: and then creating a new wrapper type to include all the cached stuff. + # TODO: Realistically, the dot positions and measurement type data should live in the time series. + dot_positions: Sequence[DotPosition] + + measurement_type: DipoleMeasurementType + + def __post_init__(self) -> None: + """ + Coerce the inputs into numpy arrays. + """ + self.p = numpy.array(self.p) + self.s = numpy.array(self.s) + + self.state = 1 + self.cache = {} + for pos in self.dot_positions: + if self.measurement_type is DipoleMeasurementType.ELECTRIC_POTENTIAL: + self.cache[pos.label] = self.potential(pos) + elif self.measurement_type is DipoleMeasurementType.X_ELECTRIC_FIELD: + self.cache[pos.label] = self.e_field_x(pos) + + def potential(self, dot: DotPosition) -> float: + # let's assume single dot at origin for now + r_diff = self.s - dot.r + return self.p.dot(r_diff) / (numpy.linalg.norm(r_diff) ** 3) + + def e_field_x(self, dot: DotPosition) -> float: + # let's assume single dot at origin for now + r_diff = self.s - dot.r + norm = numpy.linalg.norm(r_diff) + + return ( + ((3 * self.p.dot(r_diff) * r_diff / (norm**2)) - self.p) / (norm**3) + )[0] + + def get_time_series( + self, dt: float, num_samples: int, rng: numpy.random.Generator + ) -> Sequence[Tuple[float, Dict[str, float]]]: + _logger.debug( + f"Creating time series with params {dt=}, {num_samples=}, scale={self.w}" + ) + raw_time_series = create_exponential_time_series(rng, dt, num_samples, self.w) + output = [] + + for time, state in raw_time_series: + output.append((time, {k: state * v for k, v in self.cache.items()})) + return output + + +def get_event_wrapped_dipoles( + dipole_tos: Sequence[DipoleTO], + dots: Sequence[DotPosition], + measurement_type: DipoleMeasurementType, +) -> Sequence[EventWrappedDipole]: + return [ + EventWrappedDipole( + p=dipole_to.p, + s=dipole_to.s, + w=dipole_to.w, + dot_positions=dots, + measurement_type=measurement_type, + ) + for dipole_to in dipole_tos + ] + + +class EventDipoleTimeSeries: + def __init__( + self, + dipoles: Sequence[DipoleTO], + dots: Sequence[DotPosition], + measurement_type: DipoleMeasurementType, + dt: float, + num_samples: int, + rng_to_use: Optional[numpy.random.Generator] = None, + ): + self.rng: numpy.random.Generator + if rng_to_use is None: + self.rng = numpy.random.default_rng() + else: + self.rng = rng_to_use + + self.dt = dt + self.num_samples = num_samples + self.dipoles = get_event_wrapped_dipoles(dipoles, dots, measurement_type) + + def create_time_series(self) -> Sequence[Tuple[float, Dict[str, float]]]: + collected_dictionary: Dict[float, Dict[str, float]] = {} + _logger.debug("Creating time series") + + for dipole in self.dipoles: + _logger.debug(f"Doing dipole {dipole}") + series = dipole.get_time_series(self.dt, self.num_samples, self.rng) + for time, meases in series: + if time in collected_dictionary: + for k, v in meases.items(): + + collected_dictionary[time][k] += v + else: + collected_dictionary[time] = meases + + return [(k, v) for k, v in collected_dictionary.items()] + + +def get_num_events_before( + rng: numpy.random.Generator, scale: float, total_time: float +) -> Callable[[float], int]: + + _logger.debug( + f"Creating the events before function for params {scale=} {total_time=}" + ) + event_times: List = [] + random_size = max(1, int(total_time // scale)) + while sum(event_times) < total_time: + event_times.extend(rng.exponential(scale=scale, size=random_size)) + + accumulator = 0 + scanned_times = [accumulator := accumulator + t for t in event_times] + + def num_events_before(time: float) -> int: + return len([t for t in scanned_times if t < time]) + + return num_events_before + + +def create_exponential_time_series( + rng: numpy.random.Generator, dt: float, num_samples: int, scale: float +) -> Sequence[Tuple[float, int]]: + _logger.debug("Creating an exponential time series") + total_time = dt * num_samples + _logger.debug(f"Have a total time {total_time}") + events_before = get_num_events_before(rng, scale, total_time) + _logger.debug("Finished getting the events before function") + return [(dt * i, (events_before(dt * i) % 2) * 2 - 1) for i in range(num_samples)] diff --git a/tantri/dipoles/types.py b/tantri/dipoles/types.py index 841cd0a..c7106c1 100755 --- a/tantri/dipoles/types.py +++ b/tantri/dipoles/types.py @@ -21,7 +21,7 @@ class DipoleTO: class Orientation(str, Enum): # Enum for orientation, making string for json serialisation purposes # - # Note that htis might not be infinitely extensible? + # Note that this might not be infinitely extensible? # https://stackoverflow.com/questions/75040733/is-there-a-way-to-use-strenum-in-earlier-python-versions XY = "XY" Z = "Z" diff --git a/tests/dipoles/__snapshots__/test_event_time_series.ambr b/tests/dipoles/__snapshots__/test_event_time_series.ambr new file mode 100644 index 0000000..248130a --- /dev/null +++ b/tests/dipoles/__snapshots__/test_event_time_series.ambr @@ -0,0 +1,2157 @@ +# serializer version: 1 +# name: test_event_actual_series + list([ + tuple( + 0.0, + -1, + ), + tuple( + 0.1, + 1, + ), + tuple( + 0.2, + 1, + ), + tuple( + 0.30000000000000004, + 1, + ), + tuple( + 0.4, + 1, + ), + tuple( + 0.5, + -1, + ), + tuple( + 0.6000000000000001, + -1, + ), + tuple( + 0.7000000000000001, + -1, + ), + tuple( + 0.8, + -1, + ), + tuple( + 0.9, + -1, + ), + tuple( + 1.0, + -1, + ), + tuple( + 1.1, + -1, + ), + tuple( + 1.2000000000000002, + -1, + ), + tuple( + 1.3, + -1, + ), + tuple( + 1.4000000000000001, + -1, + ), + tuple( + 1.5, + -1, + ), + tuple( + 1.6, + -1, + ), + tuple( + 1.7000000000000002, + -1, + ), + tuple( + 1.8, + -1, + ), + tuple( + 1.9000000000000001, + -1, + ), + tuple( + 2.0, + -1, + ), + tuple( + 2.1, + -1, + ), + tuple( + 2.2, + -1, + ), + tuple( + 2.3000000000000003, + -1, + ), + tuple( + 2.4000000000000004, + -1, + ), + tuple( + 2.5, + -1, + ), + tuple( + 2.6, + -1, + ), + tuple( + 2.7, + -1, + ), + tuple( + 2.8000000000000003, + 1, + ), + tuple( + 2.9000000000000004, + 1, + ), + tuple( + 3.0, + -1, + ), + tuple( + 3.1, + -1, + ), + tuple( + 3.2, + -1, + ), + tuple( + 3.3000000000000003, + 1, + ), + tuple( + 3.4000000000000004, + 1, + ), + tuple( + 3.5, + 1, + ), + tuple( + 3.6, + 1, + ), + tuple( + 3.7, + 1, + ), + tuple( + 3.8000000000000003, + 1, + ), + tuple( + 3.9000000000000004, + -1, + ), + tuple( + 4.0, + -1, + ), + tuple( + 4.1000000000000005, + -1, + ), + tuple( + 4.2, + -1, + ), + tuple( + 4.3, + -1, + ), + tuple( + 4.4, + -1, + ), + tuple( + 4.5, + -1, + ), + tuple( + 4.6000000000000005, + -1, + ), + tuple( + 4.7, + 1, + ), + tuple( + 4.800000000000001, + -1, + ), + tuple( + 4.9, + -1, + ), + tuple( + 5.0, + -1, + ), + tuple( + 5.1000000000000005, + -1, + ), + tuple( + 5.2, + -1, + ), + tuple( + 5.300000000000001, + -1, + ), + tuple( + 5.4, + -1, + ), + tuple( + 5.5, + -1, + ), + tuple( + 5.6000000000000005, + -1, + ), + tuple( + 5.7, + 1, + ), + tuple( + 5.800000000000001, + 1, + ), + tuple( + 5.9, + 1, + ), + tuple( + 6.0, + 1, + ), + tuple( + 6.1000000000000005, + 1, + ), + tuple( + 6.2, + 1, + ), + tuple( + 6.300000000000001, + 1, + ), + tuple( + 6.4, + 1, + ), + tuple( + 6.5, + -1, + ), + tuple( + 6.6000000000000005, + 1, + ), + tuple( + 6.7, + 1, + ), + tuple( + 6.800000000000001, + 1, + ), + tuple( + 6.9, + 1, + ), + tuple( + 7.0, + 1, + ), + tuple( + 7.1000000000000005, + 1, + ), + tuple( + 7.2, + 1, + ), + tuple( + 7.300000000000001, + 1, + ), + tuple( + 7.4, + 1, + ), + tuple( + 7.5, + 1, + ), + tuple( + 7.6000000000000005, + 1, + ), + tuple( + 7.7, + 1, + ), + tuple( + 7.800000000000001, + 1, + ), + tuple( + 7.9, + 1, + ), + tuple( + 8.0, + -1, + ), + tuple( + 8.1, + -1, + ), + tuple( + 8.200000000000001, + -1, + ), + tuple( + 8.3, + -1, + ), + tuple( + 8.4, + -1, + ), + tuple( + 8.5, + -1, + ), + tuple( + 8.6, + -1, + ), + tuple( + 8.700000000000001, + -1, + ), + tuple( + 8.8, + -1, + ), + tuple( + 8.9, + -1, + ), + tuple( + 9.0, + -1, + ), + tuple( + 9.1, + -1, + ), + tuple( + 9.200000000000001, + -1, + ), + tuple( + 9.3, + -1, + ), + tuple( + 9.4, + 1, + ), + tuple( + 9.5, + 1, + ), + tuple( + 9.600000000000001, + 1, + ), + tuple( + 9.700000000000001, + -1, + ), + tuple( + 9.8, + -1, + ), + tuple( + 9.9, + -1, + ), + tuple( + 10.0, + -1, + ), + tuple( + 10.100000000000001, + -1, + ), + tuple( + 10.200000000000001, + -1, + ), + tuple( + 10.3, + -1, + ), + tuple( + 10.4, + -1, + ), + tuple( + 10.5, + -1, + ), + tuple( + 10.600000000000001, + -1, + ), + tuple( + 10.700000000000001, + -1, + ), + tuple( + 10.8, + 1, + ), + tuple( + 10.9, + 1, + ), + tuple( + 11.0, + 1, + ), + tuple( + 11.100000000000001, + 1, + ), + tuple( + 11.200000000000001, + -1, + ), + tuple( + 11.3, + 1, + ), + tuple( + 11.4, + 1, + ), + tuple( + 11.5, + 1, + ), + tuple( + 11.600000000000001, + 1, + ), + tuple( + 11.700000000000001, + 1, + ), + tuple( + 11.8, + -1, + ), + tuple( + 11.9, + -1, + ), + tuple( + 12.0, + -1, + ), + tuple( + 12.100000000000001, + -1, + ), + tuple( + 12.200000000000001, + 1, + ), + tuple( + 12.3, + 1, + ), + tuple( + 12.4, + -1, + ), + tuple( + 12.5, + -1, + ), + tuple( + 12.600000000000001, + -1, + ), + tuple( + 12.700000000000001, + -1, + ), + tuple( + 12.8, + 1, + ), + tuple( + 12.9, + 1, + ), + tuple( + 13.0, + -1, + ), + tuple( + 13.100000000000001, + -1, + ), + tuple( + 13.200000000000001, + 1, + ), + tuple( + 13.3, + 1, + ), + tuple( + 13.4, + -1, + ), + tuple( + 13.5, + 1, + ), + tuple( + 13.600000000000001, + -1, + ), + tuple( + 13.700000000000001, + -1, + ), + tuple( + 13.8, + -1, + ), + tuple( + 13.9, + -1, + ), + tuple( + 14.0, + -1, + ), + tuple( + 14.100000000000001, + -1, + ), + tuple( + 14.200000000000001, + -1, + ), + tuple( + 14.3, + -1, + ), + tuple( + 14.4, + -1, + ), + tuple( + 14.5, + 1, + ), + tuple( + 14.600000000000001, + 1, + ), + tuple( + 14.700000000000001, + 1, + ), + tuple( + 14.8, + 1, + ), + tuple( + 14.9, + 1, + ), + tuple( + 15.0, + 1, + ), + tuple( + 15.100000000000001, + 1, + ), + tuple( + 15.200000000000001, + 1, + ), + tuple( + 15.3, + 1, + ), + tuple( + 15.4, + 1, + ), + tuple( + 15.5, + 1, + ), + tuple( + 15.600000000000001, + 1, + ), + tuple( + 15.700000000000001, + -1, + ), + tuple( + 15.8, + -1, + ), + tuple( + 15.9, + -1, + ), + tuple( + 16.0, + -1, + ), + tuple( + 16.1, + -1, + ), + tuple( + 16.2, + -1, + ), + tuple( + 16.3, + -1, + ), + tuple( + 16.400000000000002, + -1, + ), + tuple( + 16.5, + -1, + ), + tuple( + 16.6, + -1, + ), + tuple( + 16.7, + -1, + ), + tuple( + 16.8, + -1, + ), + tuple( + 16.900000000000002, + -1, + ), + tuple( + 17.0, + -1, + ), + tuple( + 17.1, + -1, + ), + tuple( + 17.2, + -1, + ), + tuple( + 17.3, + 1, + ), + tuple( + 17.400000000000002, + 1, + ), + tuple( + 17.5, + 1, + ), + tuple( + 17.6, + 1, + ), + tuple( + 17.7, + 1, + ), + tuple( + 17.8, + 1, + ), + tuple( + 17.900000000000002, + -1, + ), + tuple( + 18.0, + -1, + ), + tuple( + 18.1, + -1, + ), + tuple( + 18.2, + -1, + ), + tuple( + 18.3, + -1, + ), + tuple( + 18.400000000000002, + -1, + ), + tuple( + 18.5, + -1, + ), + tuple( + 18.6, + -1, + ), + tuple( + 18.7, + 1, + ), + tuple( + 18.8, + 1, + ), + tuple( + 18.900000000000002, + 1, + ), + tuple( + 19.0, + 1, + ), + tuple( + 19.1, + 1, + ), + tuple( + 19.200000000000003, + 1, + ), + tuple( + 19.3, + -1, + ), + tuple( + 19.400000000000002, + -1, + ), + tuple( + 19.5, + -1, + ), + tuple( + 19.6, + -1, + ), + tuple( + 19.700000000000003, + -1, + ), + tuple( + 19.8, + -1, + ), + tuple( + 19.900000000000002, + -1, + ), + ]) +# --- +# name: test_event_dipoles_collection + list([ + tuple( + 0.0, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.01, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.02, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.03, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.04, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.05, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.06, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.07, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.08, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.09, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.1, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.11, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.12, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.13, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.14, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.15, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.16, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.17, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.18, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.19, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.2, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.21, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.22, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.23, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.24, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.25, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.26, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.27, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.28, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.29, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.3, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.31, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.32, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.33, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.34, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.35000000000000003, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.36, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.37, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.38, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.39, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.4, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.41000000000000003, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.42, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.43, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.44, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.45, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.46, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.47000000000000003, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.48, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.49, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.5, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.51, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.52, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.53, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.54, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.55, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.56, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.5700000000000001, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.58, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.59, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.6, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.61, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.62, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.63, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.64, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.65, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.66, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.67, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.68, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.6900000000000001, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.7000000000000001, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.71, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.72, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.73, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.74, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.75, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.76, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.77, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.78, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.79, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.8, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.81, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.8200000000000001, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.8300000000000001, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.84, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.85, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.86, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.87, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.88, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.89, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.9, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.91, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.92, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.93, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.9400000000000001, + dict({ + 'dot1': -0.6142362214247432, + }), + ), + tuple( + 0.9500000000000001, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.96, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.97, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.98, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + tuple( + 0.99, + dict({ + 'dot1': -0.4128225535745013, + }), + ), + ]) +# --- +# name: test_event_dipoles_collection_larger + list([ + tuple( + 0.0, + dict({ + 'dot1': -0.16590897332758772, + 'dot2': 0.4823770688674135, + }), + ), + tuple( + 0.01, + dict({ + 'dot1': -0.16590897332758772, + 'dot2': 0.4823770688674135, + }), + ), + tuple( + 0.02, + dict({ + 'dot1': -0.16590897332758772, + 'dot2': 0.4823770688674135, + }), + ), + tuple( + 0.03, + dict({ + 'dot1': -0.16590897332758772, + 'dot2': 0.4823770688674135, + }), + ), + tuple( + 0.04, + dict({ + 'dot1': -0.6597361338214149, + 'dot2': -0.8784505660121303, + }), + ), + tuple( + 0.05, + dict({ + 'dot1': -0.16590897332758772, + 'dot2': 0.4823770688674135, + }), + ), + tuple( + 0.06, + dict({ + 'dot1': -0.16590897332758772, + 'dot2': 0.4823770688674135, + }), + ), + tuple( + 0.07, + dict({ + 'dot1': -0.6597361338214149, + 'dot2': -0.8784505660121303, + }), + ), + tuple( + 0.08, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.09, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.1, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.11, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.12, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.13, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.14, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.15, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.16, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.17, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.18, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.19, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.2, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.21, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.22, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.23, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.24, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.25, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.26, + dict({ + 'dot1': -0.6597361338214149, + 'dot2': -0.8784505660121303, + }), + ), + tuple( + 0.27, + dict({ + 'dot1': -0.6597361338214149, + 'dot2': -0.8784505660121303, + }), + ), + tuple( + 0.28, + dict({ + 'dot1': -0.16590897332758772, + 'dot2': 0.4823770688674135, + }), + ), + tuple( + 0.29, + dict({ + 'dot1': -0.16590897332758772, + 'dot2': 0.4823770688674135, + }), + ), + tuple( + 0.3, + dict({ + 'dot1': -0.16590897332758772, + 'dot2': 0.4823770688674135, + }), + ), + tuple( + 0.31, + dict({ + 'dot1': -0.16590897332758772, + 'dot2': 0.4823770688674135, + }), + ), + tuple( + 0.32, + dict({ + 'dot1': -0.16590897332758772, + 'dot2': 0.4823770688674135, + }), + ), + tuple( + 0.33, + dict({ + 'dot1': -0.16590897332758772, + 'dot2': 0.4823770688674135, + }), + ), + tuple( + 0.34, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.35000000000000003, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.36, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.37, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.38, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.39, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.4, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.41000000000000003, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.42, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.43, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.44, + dict({ + 'dot1': -0.16590897332758772, + 'dot2': 0.4823770688674135, + }), + ), + tuple( + 0.45, + dict({ + 'dot1': -0.16590897332758772, + 'dot2': 0.4823770688674135, + }), + ), + tuple( + 0.46, + dict({ + 'dot1': -0.6597361338214149, + 'dot2': -0.8784505660121303, + }), + ), + tuple( + 0.47000000000000003, + dict({ + 'dot1': -0.16590897332758772, + 'dot2': 0.4823770688674135, + }), + ), + tuple( + 0.48, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.49, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.5, + dict({ + 'dot1': -0.16590897332758772, + 'dot2': 0.4823770688674135, + }), + ), + tuple( + 0.51, + dict({ + 'dot1': -0.6597361338214149, + 'dot2': -0.8784505660121303, + }), + ), + tuple( + 0.52, + dict({ + 'dot1': -0.6597361338214149, + 'dot2': -0.8784505660121303, + }), + ), + tuple( + 0.53, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.54, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.55, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.56, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.5700000000000001, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.58, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.59, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.6, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.61, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.62, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.63, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.64, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.65, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.66, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.67, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.68, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.6900000000000001, + dict({ + 'dot1': -0.6597361338214149, + 'dot2': -0.8784505660121303, + }), + ), + tuple( + 0.7000000000000001, + dict({ + 'dot1': -0.16590897332758772, + 'dot2': 0.4823770688674135, + }), + ), + tuple( + 0.71, + dict({ + 'dot1': -0.16590897332758772, + 'dot2': 0.4823770688674135, + }), + ), + tuple( + 0.72, + dict({ + 'dot1': -0.16590897332758772, + 'dot2': 0.4823770688674135, + }), + ), + tuple( + 0.73, + dict({ + 'dot1': -0.16590897332758772, + 'dot2': 0.4823770688674135, + }), + ), + tuple( + 0.74, + dict({ + 'dot1': -0.6597361338214149, + 'dot2': -0.8784505660121303, + }), + ), + tuple( + 0.75, + dict({ + 'dot1': -0.16590897332758772, + 'dot2': 0.4823770688674135, + }), + ), + tuple( + 0.76, + dict({ + 'dot1': -0.16590897332758772, + 'dot2': 0.4823770688674135, + }), + ), + tuple( + 0.77, + dict({ + 'dot1': -0.6597361338214149, + 'dot2': -0.8784505660121303, + }), + ), + tuple( + 0.78, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.79, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.8, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.81, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.8200000000000001, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.8300000000000001, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.84, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.85, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.86, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.87, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.88, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.89, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.9, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.91, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.92, + dict({ + 'dot1': -0.8611498016716568, + 'dot2': -0.9635022931921018, + }), + ), + tuple( + 0.93, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.9400000000000001, + dict({ + 'dot1': -0.36732264117782965, + 'dot2': 0.397325341687442, + }), + ), + tuple( + 0.9500000000000001, + dict({ + 'dot1': -0.6597361338214149, + 'dot2': -0.8784505660121303, + }), + ), + tuple( + 0.96, + dict({ + 'dot1': -0.6597361338214149, + 'dot2': -0.8784505660121303, + }), + ), + tuple( + 0.97, + dict({ + 'dot1': -0.6597361338214149, + 'dot2': -0.8784505660121303, + }), + ), + tuple( + 0.98, + dict({ + 'dot1': -0.6597361338214149, + 'dot2': -0.8784505660121303, + }), + ), + tuple( + 0.99, + dict({ + 'dot1': -0.6597361338214149, + 'dot2': -0.8784505660121303, + }), + ), + ]) +# --- +# name: test_event_time_series + list([ + tuple( + 0, + 0, + ), + tuple( + 1, + 2, + ), + tuple( + 2, + 2, + ), + tuple( + 3, + 4, + ), + tuple( + 4, + 6, + ), + tuple( + 5, + 8, + ), + tuple( + 6, + 9, + ), + tuple( + 7, + 11, + ), + tuple( + 8, + 12, + ), + tuple( + 9, + 14, + ), + ]) +# --- diff --git a/tests/dipoles/test_event_time_series.py b/tests/dipoles/test_event_time_series.py new file mode 100644 index 0000000..76f44e3 --- /dev/null +++ b/tests/dipoles/test_event_time_series.py @@ -0,0 +1,120 @@ +import tantri.dipoles.event_time_series as ets +import numpy.random +import logging + +from tantri.dipoles.types import ( + DipoleTO, + DotPosition, + DipoleMeasurementType, +) + +_logger = logging.getLogger(__name__) + + +SEED = 12345 + + +def test_event_time_series(snapshot): + + _logger.info("testing event time series") + rng = numpy.random.default_rng(SEED) + + before_func = ets.get_num_events_before(rng=rng, scale=0.5, total_time=10) + + time_series = [(i, before_func(i)) for i in range(10)] + + _logger.warning(time_series) + + assert time_series == snapshot + + +def test_event_actual_series(snapshot): + rng = numpy.random.default_rng(SEED) + time_series = ets.create_exponential_time_series(rng, 0.1, 200, 0.5) + assert time_series == snapshot + + +def test_event_dipoles_collection(snapshot): + + rng = numpy.random.default_rng(1234) + dots = [DotPosition(numpy.array([0, 0, 0]), "dot1")] + + d1 = DipoleTO( + numpy.array([0, 0, 10]), + numpy.array([5, 3, 2]), + 15, + ) + d2 = DipoleTO( + numpy.array([0, 0, 10]), + numpy.array([-2, 3, 2]), + 0.1, + ) + d3 = DipoleTO( + numpy.array([0, 0, 10]), + numpy.array([2, 1, 2]), + 6, + ) + d4 = DipoleTO( + numpy.array([0, 0, 10]), + numpy.array([-5, -5, 2]), + 50, + ) + + ts_gen = ets.EventDipoleTimeSeries( + [d1, d2, d3, d4], + dots, + DipoleMeasurementType.X_ELECTRIC_FIELD, + 0.01, + 100, + rng_to_use=rng, + ) + time_series = ts_gen.create_time_series() + + assert time_series == snapshot + + +def test_event_dipoles_collection_larger(snapshot): + + rng = numpy.random.default_rng(1234) + dots = [ + DotPosition(numpy.array([0, 0, 0]), "dot1"), + DotPosition(numpy.array([0, -1, 0]), "dot2"), + ] + + d1 = DipoleTO( + numpy.array([0, 0, 10]), + numpy.array([5, 3, 2]), + 15, + ) + d2 = DipoleTO( + numpy.array([0, 0, 10]), + numpy.array([-2, 3, 2]), + 0.1, + ) + d3 = DipoleTO( + numpy.array([0, 0, 10]), + numpy.array([2, 1, 2]), + 6, + ) + d4 = DipoleTO( + numpy.array([0, 0, 10]), + numpy.array([-5, -5, 2]), + 50, + ) + d5 = DipoleTO( + numpy.array([0, 0, 10]), + numpy.array([-2, -2, 1]), + 0.01, + ) + + ts_gen = ets.EventDipoleTimeSeries( + [d1, d2, d3, d4, d5], + dots, + DipoleMeasurementType.X_ELECTRIC_FIELD, + 0.01, + 100, + rng_to_use=rng, + ) + time_series = ts_gen.create_time_series() + + assert time_series == snapshot