From afd4f43ad9d3269e6f2d643532f047d9a75f3073 Mon Sep 17 00:00:00 2001 From: Marco Pizzocaro Date: Fri, 6 Sep 2024 16:26:47 +0200 Subject: [PATCH 01/14] Add implementation of mathieu_b functions --- src/large_lattice_model/mathieu.py | 89 ++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/large_lattice_model/mathieu.py diff --git a/src/large_lattice_model/mathieu.py b/src/large_lattice_model/mathieu.py new file mode 100644 index 0000000..34abe80 --- /dev/null +++ b/src/large_lattice_model/mathieu.py @@ -0,0 +1,89 @@ +import ctypes +from ctypes.util import find_library + +import numpy as np +import scipy.special +from numba import float64, int64, njit, vectorize + +# scipy Mathieu special functions are currently bugged (they have some discontinuities) +# see https://github.com/scipy/scipy/pull/14577 +# in the past I moved to the Mathieu special functions implemented in pygsl +# installed by +# apt-get install libgsl-dev +# pip3 instal pygsl +# and found under testing +# this no longer works (see https://github.com/pygsl/pygsl/issues/55) and pygsl is hard to install +# this file use ctypes to load the GSL Mathieu function directly (apt-get install libgsl-dev) +# and use numba for a fast vectorization +# Finally this file fallback to scipy if GSL is not found and provide an analitycal approximation made fast using numba + + +def _load_lib(libname): + lib_path = find_library(libname) + if lib_path is None: + return None + else: + try: + lib = ctypes.CDLL(lib_path) + except OSError: + return None + + return lib + + +gsl = _load_lib("gsl") + +if gsl: + gsl.gsl_sf_mathieu_b.restype = ctypes.c_double + gsl.gsl_sf_mathieu_b.argtypes = [ctypes.c_int, ctypes.c_double] + + gsl_sf_mathieu_b = gsl.gsl_sf_mathieu_b + + @njit + def _gsl_mathieu_b(n, q): + return gsl_sf_mathieu_b(n, q) + + # this is fast! + @vectorize([float64(int64, float64)]) + def gsl_mathieu_b(n, q): + return _gsl_mathieu_b(n, q) + + mathieu_b = gsl_mathieu_b + +else: + # If the GSL library is not found, fallback to scipy + mathieu_b = scipy.special.mathieu_b + + +@njit +def _mathieu_b_asymptotic(m, q): + """Asymptotic approximation of the characteristic value of odd Mathieu functions + + See https://dlmf.nist.gov/28 + """ + + s = 2 * (m - 1) + 1 + h = q**0.5 + + # Convert each polynomial in s to Horner's form + term8 = -1.0 / (2**25) * (((527 * s + 15617) * s + 69001) * s + 41607) * s + term7 = -1.0 / (2**20) * (((63 * s + 1260) * s + 2943) * s + 486) + term6 = -1.0 / (2**17) * (((33 * s + 410) * s + 405) * s) + term5 = -1.0 / (2**12) * ((5 * s + 34) * s + 9) * s**2 + term4 = -1.0 / (2**7) * ((s + 3) * s**2) + term3 = -1.0 / 8 * (s**2 + 1) + # term2 = 2.0 * s * h + # term1 = -2.0 * h**2 + + result = ( + (2.0 * s - 2.0 * h) * h + + term3 + + (term4 + (term5 + (term6 + (term7 + term8 / h) / h) / h) / h) / h + ) + + return result + + +@vectorize([float64(int64, float64)]) +def mathieu_b_asymptotic(n, q): + return _mathieu_b_asymptotic(n, q) From 9539ad03c0a2663f4cf3bebf64a82b4909bae92d Mon Sep 17 00:00:00 2001 From: Marco Pizzocaro Date: Fri, 6 Sep 2024 18:12:56 +0200 Subject: [PATCH 02/14] Add the implementation of mathieu_b function with some tests --- README.md | 12 +- poetry.lock | 1089 +++++++++++++++++++++++ pyproject.toml | 17 + src/large_lattice_model/latticemodel.py | 28 + src/large_lattice_model/mathieu.py | 10 +- tests/plot_mathieu.py | 46 + tests/test_mathieu.py | 61 ++ 7 files changed, 1256 insertions(+), 7 deletions(-) create mode 100644 poetry.lock create mode 100644 src/large_lattice_model/latticemodel.py create mode 100644 tests/plot_mathieu.py create mode 100644 tests/test_mathieu.py diff --git a/README.md b/README.md index ae13cc1..326d4f6 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,12 @@ # large-lattice-model -A python package to model the motional spectra of atoms trapped in a one-dimensional optical lattice +A python package to model the motional spectra of atoms trapped in a one-dimensional optical lattice. + + +# Requirements +Large-lattice-model requires the calculation of Mathieu special function. +The current `scipy` implementation of Mathieu functions [is bugged.](https://github.com/scipy/scipy/pull/14577) +It is reccomended to install the [GSL Library](https://www.gnu.org/software/gsl/), for example using: + +`$ sudo apt install libgsl-dev` + +Large-lattice-model will use `ctypes` to import the GSL implementation and will fallback to `scipy` if it does not find GSL. \ No newline at end of file diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..fc0d5fb --- /dev/null +++ b/poetry.lock @@ -0,0 +1,1089 @@ +# 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 = "attrs" +version = "24.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, +] + +[package.extras] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "contourpy" +version = "1.3.0" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.9" +files = [ + {file = "contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7"}, + {file = "contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92f8557cbb07415a4d6fa191f20fd9d2d9eb9c0b61d1b2f52a8926e43c6e9af7"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36f965570cff02b874773c49bfe85562b47030805d7d8360748f3eca570f4cab"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cacd81e2d4b6f89c9f8a5b69b86490152ff39afc58a95af002a398273e5ce589"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69375194457ad0fad3a839b9e29aa0b0ed53bb54db1bfb6c3ae43d111c31ce41"}, + {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a52040312b1a858b5e31ef28c2e865376a386c60c0e248370bbea2d3f3b760d"}, + {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3faeb2998e4fcb256542e8a926d08da08977f7f5e62cf733f3c211c2a5586223"}, + {file = "contourpy-1.3.0-cp310-cp310-win32.whl", hash = "sha256:36e0cff201bcb17a0a8ecc7f454fe078437fa6bda730e695a92f2d9932bd507f"}, + {file = "contourpy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:87ddffef1dbe5e669b5c2440b643d3fdd8622a348fe1983fad7a0f0ccb1cd67b"}, + {file = "contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad"}, + {file = "contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d"}, + {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c"}, + {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb"}, + {file = "contourpy-1.3.0-cp311-cp311-win32.whl", hash = "sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c"}, + {file = "contourpy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35"}, + {file = "contourpy-1.3.0-cp312-cp312-win32.whl", hash = "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb"}, + {file = "contourpy-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b"}, + {file = "contourpy-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3"}, + {file = "contourpy-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da"}, + {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14"}, + {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8"}, + {file = "contourpy-1.3.0-cp313-cp313-win32.whl", hash = "sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294"}, + {file = "contourpy-1.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087"}, + {file = "contourpy-1.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8"}, + {file = "contourpy-1.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6"}, + {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2"}, + {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927"}, + {file = "contourpy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a11077e395f67ffc2c44ec2418cfebed032cd6da3022a94fc227b6faf8e2acb8"}, + {file = "contourpy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e8134301d7e204c88ed7ab50028ba06c683000040ede1d617298611f9dc6240c"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e12968fdfd5bb45ffdf6192a590bd8ddd3ba9e58360b29683c6bb71a7b41edca"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fd2a0fc506eccaaa7595b7e1418951f213cf8255be2600f1ea1b61e46a60c55f"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfb5c62ce023dfc410d6059c936dcf96442ba40814aefbfa575425a3a7f19dc"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68a32389b06b82c2fdd68276148d7b9275b5f5cf13e5417e4252f6d1a34f72a2"}, + {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94e848a6b83da10898cbf1311a815f770acc9b6a3f2d646f330d57eb4e87592e"}, + {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d78ab28a03c854a873787a0a42254a0ccb3cb133c672f645c9f9c8f3ae9d0800"}, + {file = "contourpy-1.3.0-cp39-cp39-win32.whl", hash = "sha256:81cb5ed4952aae6014bc9d0421dec7c5835c9c8c31cdf51910b708f548cf58e5"}, + {file = "contourpy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:14e262f67bd7e6eb6880bc564dcda30b15e351a594657e55b7eec94b6ef72843"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:00ccd0dbaad6d804ab259820fa7cb0b8036bda0686ef844d24125d8287178ce0"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca947601224119117f7c19c9cdf6b3ab54c5726ef1d906aa4a69dfb6dd58102"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6ec93afeb848a0845a18989da3beca3eec2c0f852322efe21af1931147d12cb"}, + {file = "contourpy-1.3.0.tar.gz", hash = "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4"}, +] + +[package.dependencies] +numpy = ">=1.23" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.11.1)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] + +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +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.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "executing" +version = "2.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 = "fonttools" +version = "4.53.1" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.53.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397"}, + {file = "fonttools-4.53.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3"}, + {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d"}, + {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0"}, + {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41"}, + {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f"}, + {file = "fonttools-4.53.1-cp310-cp310-win32.whl", hash = "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4"}, + {file = "fonttools-4.53.1-cp310-cp310-win_amd64.whl", hash = "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671"}, + {file = "fonttools-4.53.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1"}, + {file = "fonttools-4.53.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923"}, + {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719"}, + {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3"}, + {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb"}, + {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2"}, + {file = "fonttools-4.53.1-cp311-cp311-win32.whl", hash = "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88"}, + {file = "fonttools-4.53.1-cp311-cp311-win_amd64.whl", hash = "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02"}, + {file = "fonttools-4.53.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58"}, + {file = "fonttools-4.53.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8"}, + {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60"}, + {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f"}, + {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2"}, + {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f"}, + {file = "fonttools-4.53.1-cp312-cp312-win32.whl", hash = "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670"}, + {file = "fonttools-4.53.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab"}, + {file = "fonttools-4.53.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749"}, + {file = "fonttools-4.53.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2"}, + {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb"}, + {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f"}, + {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d"}, + {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169"}, + {file = "fonttools-4.53.1-cp38-cp38-win32.whl", hash = "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d"}, + {file = "fonttools-4.53.1-cp38-cp38-win_amd64.whl", hash = "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8"}, + {file = "fonttools-4.53.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a"}, + {file = "fonttools-4.53.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31"}, + {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c"}, + {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407"}, + {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb"}, + {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122"}, + {file = "fonttools-4.53.1-cp39-cp39-win32.whl", hash = "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb"}, + {file = "fonttools-4.53.1-cp39-cp39-win_amd64.whl", hash = "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb"}, + {file = "fonttools-4.53.1-py3-none-any.whl", hash = "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d"}, + {file = "fonttools-4.53.1.tar.gz", hash = "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "pycairo", "scipy"] +lxml = ["lxml (>=4.0)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + +[[package]] +name = "hypothesis" +version = "6.112.0" +description = "A library for property-based testing" +optional = false +python-versions = ">=3.8" +files = [ + {file = "hypothesis-6.112.0-py3-none-any.whl", hash = "sha256:1e6adbd9534c0d691690b5006904327ea37c851d4e15262a22094aa77879e84d"}, + {file = "hypothesis-6.112.0.tar.gz", hash = "sha256:06ea8857e1e711a1a6f24154a3c8c4eab04b041993206aaa267f98b859fd6ef5"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +exceptiongroup = {version = ">=1.0.0", markers = "python_version < \"3.11\""} +sortedcontainers = ">=2.1.0,<3.0.0" + +[package.extras] +all = ["backports.zoneinfo (>=0.2.1)", "black (>=19.10b0)", "click (>=7.0)", "crosshair-tool (>=0.0.70)", "django (>=3.2)", "dpcontracts (>=0.4)", "hypothesis-crosshair (>=0.0.13)", "lark (>=0.10.1)", "libcst (>=0.3.16)", "numpy (>=1.17.3)", "pandas (>=1.1)", "pytest (>=4.6)", "python-dateutil (>=1.4)", "pytz (>=2014.1)", "redis (>=3.0.0)", "rich (>=9.0.0)", "tzdata (>=2024.1)"] +cli = ["black (>=19.10b0)", "click (>=7.0)", "rich (>=9.0.0)"] +codemods = ["libcst (>=0.3.16)"] +crosshair = ["crosshair-tool (>=0.0.70)", "hypothesis-crosshair (>=0.0.13)"] +dateutil = ["python-dateutil (>=1.4)"] +django = ["django (>=3.2)"] +dpcontracts = ["dpcontracts (>=0.4)"] +ghostwriter = ["black (>=19.10b0)"] +lark = ["lark (>=0.10.1)"] +numpy = ["numpy (>=1.17.3)"] +pandas = ["pandas (>=1.1)"] +pytest = ["pytest (>=4.6)"] +pytz = ["pytz (>=2014.1)"] +redis = ["redis (>=3.0.0)"] +zoneinfo = ["backports.zoneinfo (>=0.2.1)", "tzdata (>=2024.1)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "ipython" +version = "8.26.0" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.10" +files = [ + {file = "ipython-8.26.0-py3-none-any.whl", hash = "sha256:e6b347c27bdf9c32ee9d31ae85defc525755a1869f14057e900675b9e8d6e6ff"}, + {file = "ipython-8.26.0.tar.gz", hash = "sha256:1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c"}, +] + +[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\" and sys_platform != \"emscripten\""} +prompt-toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5.13.0" +typing-extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} + +[package.extras] +all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "intersphinx-registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing-extensions"] +kernel = ["ipykernel"] +matplotlib = ["matplotlib"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["packaging", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] + +[[package]] +name = "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.7" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.8" +files = [ + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5d5abf8f8ec1f4e22882273c423e16cae834c36856cac348cfbfa68e01c40f3a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aeb3531b196ef6f11776c21674dba836aeea9d5bd1cf630f869e3d90b16cfade"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08471d4d86cbaec61f86b217dd938a83d85e03785f51121e791a6e6689a3be95"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bbfcb7165ce3d54a3dfbe731e470f65739c4c1f85bb1018ee912bae139e263b"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d34eb8494bea691a1a450141ebb5385e4b69d38bb8403b5146ad279f4b30fa3"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9242795d174daa40105c1d86aba618e8eab7bf96ba8c3ee614da8302a9f95503"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8e045731a5416357638d1700927529e2b8ab304811671f665b225f8bf8d8f933"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4322872d5772cae7369f8351da1edf255a604ea7087fe295411397d0cfd9655e"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e1631290ee9271dffe3062d2634c3ecac02c83890ada077d225e081aca8aab89"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:edcfc407e4eb17e037bca59be0e85a2031a2ac87e4fed26d3e9df88b4165f92d"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4d05d81ecb47d11e7f8932bd8b61b720bf0b41199358f3f5e36d38e28f0532c5"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win32.whl", hash = "sha256:b38ac83d5f04b15e515fd86f312479d950d05ce2368d5413d46c088dda7de90a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:d83db7cde68459fc803052a55ace60bea2bae361fc3b7a6d5da07e11954e4b09"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bfa1acfa0c54932d5607e19a2c24646fb4c1ae2694437789129cf099789a3b00"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:eee3ea935c3d227d49b4eb85660ff631556841f6e567f0f7bda972df6c2c9935"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f3160309af4396e0ed04db259c3ccbfdc3621b5559b5453075e5de555e1f3a1b"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a17f6a29cf8935e587cc8a4dbfc8368c55edc645283db0ce9801016f83526c2d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10849fb2c1ecbfae45a693c070e0320a91b35dd4bcf58172c023b994283a124d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ac542bf38a8a4be2dc6b15248d36315ccc65f0743f7b1a76688ffb6b5129a5c2"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0"}, + {file = "kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60"}, +] + +[[package]] +name = "llvmlite" +version = "0.43.0" +description = "lightweight wrapper around basic LLVM functionality" +optional = false +python-versions = ">=3.9" +files = [ + {file = "llvmlite-0.43.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a289af9a1687c6cf463478f0fa8e8aa3b6fb813317b0d70bf1ed0759eab6f761"}, + {file = "llvmlite-0.43.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d4fd101f571a31acb1559ae1af30f30b1dc4b3186669f92ad780e17c81e91bc"}, + {file = "llvmlite-0.43.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d434ec7e2ce3cc8f452d1cd9a28591745de022f931d67be688a737320dfcead"}, + {file = "llvmlite-0.43.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6912a87782acdff6eb8bf01675ed01d60ca1f2551f8176a300a886f09e836a6a"}, + {file = "llvmlite-0.43.0-cp310-cp310-win_amd64.whl", hash = "sha256:14f0e4bf2fd2d9a75a3534111e8ebeb08eda2f33e9bdd6dfa13282afacdde0ed"}, + {file = "llvmlite-0.43.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8d0618cb9bfe40ac38a9633f2493d4d4e9fcc2f438d39a4e854f39cc0f5f98"}, + {file = "llvmlite-0.43.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0a9a1a39d4bf3517f2af9d23d479b4175ead205c592ceeb8b89af48a327ea57"}, + {file = "llvmlite-0.43.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1da416ab53e4f7f3bc8d4eeba36d801cc1894b9fbfbf2022b29b6bad34a7df2"}, + {file = "llvmlite-0.43.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977525a1e5f4059316b183fb4fd34fa858c9eade31f165427a3977c95e3ee749"}, + {file = "llvmlite-0.43.0-cp311-cp311-win_amd64.whl", hash = "sha256:d5bd550001d26450bd90777736c69d68c487d17bf371438f975229b2b8241a91"}, + {file = "llvmlite-0.43.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f99b600aa7f65235a5a05d0b9a9f31150c390f31261f2a0ba678e26823ec38f7"}, + {file = "llvmlite-0.43.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:35d80d61d0cda2d767f72de99450766250560399edc309da16937b93d3b676e7"}, + {file = "llvmlite-0.43.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eccce86bba940bae0d8d48ed925f21dbb813519169246e2ab292b5092aba121f"}, + {file = "llvmlite-0.43.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df6509e1507ca0760787a199d19439cc887bfd82226f5af746d6977bd9f66844"}, + {file = "llvmlite-0.43.0-cp312-cp312-win_amd64.whl", hash = "sha256:7a2872ee80dcf6b5dbdc838763d26554c2a18aa833d31a2635bff16aafefb9c9"}, + {file = "llvmlite-0.43.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9cd2a7376f7b3367019b664c21f0c61766219faa3b03731113ead75107f3b66c"}, + {file = "llvmlite-0.43.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18e9953c748b105668487b7c81a3e97b046d8abf95c4ddc0cd3c94f4e4651ae8"}, + {file = "llvmlite-0.43.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74937acd22dc11b33946b67dca7680e6d103d6e90eeaaaf932603bec6fe7b03a"}, + {file = "llvmlite-0.43.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc9efc739cc6ed760f795806f67889923f7274276f0eb45092a1473e40d9b867"}, + {file = "llvmlite-0.43.0-cp39-cp39-win_amd64.whl", hash = "sha256:47e147cdda9037f94b399bf03bfd8a6b6b1f2f90be94a454e3386f006455a9b4"}, + {file = "llvmlite-0.43.0.tar.gz", hash = "sha256:ae2b5b5c3ef67354824fb75517c8db5fbe93bc02cd9671f3c62271626bc041d5"}, +] + +[[package]] +name = "matplotlib" +version = "3.9.2" +description = "Python plotting package" +optional = false +python-versions = ">=3.9" +files = [ + {file = "matplotlib-3.9.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9d78bbc0cbc891ad55b4f39a48c22182e9bdaea7fc0e5dbd364f49f729ca1bbb"}, + {file = "matplotlib-3.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c375cc72229614632c87355366bdf2570c2dac01ac66b8ad048d2dabadf2d0d4"}, + {file = "matplotlib-3.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d94ff717eb2bd0b58fe66380bd8b14ac35f48a98e7c6765117fe67fb7684e64"}, + {file = "matplotlib-3.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab68d50c06938ef28681073327795c5db99bb4666214d2d5f880ed11aeaded66"}, + {file = "matplotlib-3.9.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:65aacf95b62272d568044531e41de26285d54aec8cb859031f511f84bd8b495a"}, + {file = "matplotlib-3.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:3fd595f34aa8a55b7fc8bf9ebea8aa665a84c82d275190a61118d33fbc82ccae"}, + {file = "matplotlib-3.9.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d8dd059447824eec055e829258ab092b56bb0579fc3164fa09c64f3acd478772"}, + {file = "matplotlib-3.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c797dac8bb9c7a3fd3382b16fe8f215b4cf0f22adccea36f1545a6d7be310b41"}, + {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d719465db13267bcef19ea8954a971db03b9f48b4647e3860e4bc8e6ed86610f"}, + {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447"}, + {file = "matplotlib-3.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7741f26a58a240f43bee74965c4882b6c93df3e7eb3de160126d8c8f53a6ae6e"}, + {file = "matplotlib-3.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:ae82a14dab96fbfad7965403c643cafe6515e386de723e498cf3eeb1e0b70cc7"}, + {file = "matplotlib-3.9.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ac43031375a65c3196bee99f6001e7fa5bdfb00ddf43379d3c0609bdca042df9"}, + {file = "matplotlib-3.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be0fc24a5e4531ae4d8e858a1a548c1fe33b176bb13eff7f9d0d38ce5112a27d"}, + {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf81de2926c2db243c9b2cbc3917619a0fc85796c6ba4e58f541df814bbf83c7"}, + {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6ee45bc4245533111ced13f1f2cace1e7f89d1c793390392a80c139d6cf0e6c"}, + {file = "matplotlib-3.9.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:306c8dfc73239f0e72ac50e5a9cf19cc4e8e331dd0c54f5e69ca8758550f1e1e"}, + {file = "matplotlib-3.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:5413401594cfaff0052f9d8b1aafc6d305b4bd7c4331dccd18f561ff7e1d3bd3"}, + {file = "matplotlib-3.9.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:18128cc08f0d3cfff10b76baa2f296fc28c4607368a8402de61bb3f2eb33c7d9"}, + {file = "matplotlib-3.9.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4876d7d40219e8ae8bb70f9263bcbe5714415acfdf781086601211335e24f8aa"}, + {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d9f07a80deab4bb0b82858a9e9ad53d1382fd122be8cde11080f4e7dfedb38b"}, + {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7c0410f181a531ec4e93bbc27692f2c71a15c2da16766f5ba9761e7ae518413"}, + {file = "matplotlib-3.9.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:909645cce2dc28b735674ce0931a4ac94e12f5b13f6bb0b5a5e65e7cea2c192b"}, + {file = "matplotlib-3.9.2-cp313-cp313-win_amd64.whl", hash = "sha256:f32c7410c7f246838a77d6d1eff0c0f87f3cb0e7c4247aebea71a6d5a68cab49"}, + {file = "matplotlib-3.9.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:37e51dd1c2db16ede9cfd7b5cabdfc818b2c6397c83f8b10e0e797501c963a03"}, + {file = "matplotlib-3.9.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b82c5045cebcecd8496a4d694d43f9cc84aeeb49fe2133e036b207abe73f4d30"}, + {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f053c40f94bc51bc03832a41b4f153d83f2062d88c72b5e79997072594e97e51"}, + {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbe196377a8248972f5cede786d4c5508ed5f5ca4a1e09b44bda889958b33f8c"}, + {file = "matplotlib-3.9.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5816b1e1fe8c192cbc013f8f3e3368ac56fbecf02fb41b8f8559303f24c5015e"}, + {file = "matplotlib-3.9.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:cef2a73d06601437be399908cf13aee74e86932a5ccc6ccdf173408ebc5f6bb2"}, + {file = "matplotlib-3.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e0830e188029c14e891fadd99702fd90d317df294c3298aad682739c5533721a"}, + {file = "matplotlib-3.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ba9c1299c920964e8d3857ba27173b4dbb51ca4bab47ffc2c2ba0eb5e2cbc5"}, + {file = "matplotlib-3.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cd93b91ab47a3616b4d3c42b52f8363b88ca021e340804c6ab2536344fad9ca"}, + {file = "matplotlib-3.9.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6d1ce5ed2aefcdce11904fc5bbea7d9c21fff3d5f543841edf3dea84451a09ea"}, + {file = "matplotlib-3.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:b2696efdc08648536efd4e1601b5fd491fd47f4db97a5fbfd175549a7365c1b2"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d52a3b618cb1cbb769ce2ee1dcdb333c3ab6e823944e9a2d36e37253815f9556"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:039082812cacd6c6bec8e17a9c1e6baca230d4116d522e81e1f63a74d01d2e21"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6758baae2ed64f2331d4fd19be38b7b4eae3ecec210049a26b6a4f3ae1c85dcc"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:050598c2b29e0b9832cde72bcf97627bf00262adbc4a54e2b856426bb2ef0697"}, + {file = "matplotlib-3.9.2.tar.gz", hash = "sha256:96ab43906269ca64a6366934106fa01534454a69e471b7bf3d79083981aaab92"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +kiwisolver = ">=1.3.1" +numpy = ">=1.23" +packaging = ">=20.0" +pillow = ">=8" +pyparsing = ">=2.3.1" +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 = "numba" +version = "0.60.0" +description = "compiling Python code using LLVM" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numba-0.60.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d761de835cd38fb400d2c26bb103a2726f548dc30368853121d66201672e651"}, + {file = "numba-0.60.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:159e618ef213fba758837f9837fb402bbe65326e60ba0633dbe6c7f274d42c1b"}, + {file = "numba-0.60.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1527dc578b95c7c4ff248792ec33d097ba6bef9eda466c948b68dfc995c25781"}, + {file = "numba-0.60.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe0b28abb8d70f8160798f4de9d486143200f34458d34c4a214114e445d7124e"}, + {file = "numba-0.60.0-cp310-cp310-win_amd64.whl", hash = "sha256:19407ced081d7e2e4b8d8c36aa57b7452e0283871c296e12d798852bc7d7f198"}, + {file = "numba-0.60.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a17b70fc9e380ee29c42717e8cc0bfaa5556c416d94f9aa96ba13acb41bdece8"}, + {file = "numba-0.60.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3fb02b344a2a80efa6f677aa5c40cd5dd452e1b35f8d1c2af0dfd9ada9978e4b"}, + {file = "numba-0.60.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5f4fde652ea604ea3c86508a3fb31556a6157b2c76c8b51b1d45eb40c8598703"}, + {file = "numba-0.60.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4142d7ac0210cc86432b818338a2bc368dc773a2f5cf1e32ff7c5b378bd63ee8"}, + {file = "numba-0.60.0-cp311-cp311-win_amd64.whl", hash = "sha256:cac02c041e9b5bc8cf8f2034ff6f0dbafccd1ae9590dc146b3a02a45e53af4e2"}, + {file = "numba-0.60.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d7da4098db31182fc5ffe4bc42c6f24cd7d1cb8a14b59fd755bfee32e34b8404"}, + {file = "numba-0.60.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:38d6ea4c1f56417076ecf8fc327c831ae793282e0ff51080c5094cb726507b1c"}, + {file = "numba-0.60.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:62908d29fb6a3229c242e981ca27e32a6e606cc253fc9e8faeb0e48760de241e"}, + {file = "numba-0.60.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0ebaa91538e996f708f1ab30ef4d3ddc344b64b5227b67a57aa74f401bb68b9d"}, + {file = "numba-0.60.0-cp312-cp312-win_amd64.whl", hash = "sha256:f75262e8fe7fa96db1dca93d53a194a38c46da28b112b8a4aca168f0df860347"}, + {file = "numba-0.60.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:01ef4cd7d83abe087d644eaa3d95831b777aa21d441a23703d649e06b8e06b74"}, + {file = "numba-0.60.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:819a3dfd4630d95fd574036f99e47212a1af41cbcb019bf8afac63ff56834449"}, + {file = "numba-0.60.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0b983bd6ad82fe868493012487f34eae8bf7dd94654951404114f23c3466d34b"}, + {file = "numba-0.60.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c151748cd269ddeab66334bd754817ffc0cabd9433acb0f551697e5151917d25"}, + {file = "numba-0.60.0-cp39-cp39-win_amd64.whl", hash = "sha256:3031547a015710140e8c87226b4cfe927cac199835e5bf7d4fe5cb64e814e3ab"}, + {file = "numba-0.60.0.tar.gz", hash = "sha256:5df6158e5584eece5fc83294b949fd30b9f1125df7708862205217e068aabf16"}, +] + +[package.dependencies] +llvmlite = "==0.43.*" +numpy = ">=1.22,<2.1" + +[[package]] +name = "numpy" +version = "2.0.1" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fbb536eac80e27a2793ffd787895242b7f18ef792563d742c2d673bfcb75134"}, + {file = "numpy-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:69ff563d43c69b1baba77af455dd0a839df8d25e8590e79c90fcbe1499ebde42"}, + {file = "numpy-2.0.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:1b902ce0e0a5bb7704556a217c4f63a7974f8f43e090aff03fcf262e0b135e02"}, + {file = "numpy-2.0.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:f1659887361a7151f89e79b276ed8dff3d75877df906328f14d8bb40bb4f5101"}, + {file = "numpy-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4658c398d65d1b25e1760de3157011a80375da861709abd7cef3bad65d6543f9"}, + {file = "numpy-2.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4127d4303b9ac9f94ca0441138acead39928938660ca58329fe156f84b9f3015"}, + {file = "numpy-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e5eeca8067ad04bc8a2a8731183d51d7cbaac66d86085d5f4766ee6bf19c7f87"}, + {file = "numpy-2.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9adbd9bb520c866e1bfd7e10e1880a1f7749f1f6e5017686a5fbb9b72cf69f82"}, + {file = "numpy-2.0.1-cp310-cp310-win32.whl", hash = "sha256:7b9853803278db3bdcc6cd5beca37815b133e9e77ff3d4733c247414e78eb8d1"}, + {file = "numpy-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:81b0893a39bc5b865b8bf89e9ad7807e16717f19868e9d234bdaf9b1f1393868"}, + {file = "numpy-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75b4e316c5902d8163ef9d423b1c3f2f6252226d1aa5cd8a0a03a7d01ffc6268"}, + {file = "numpy-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6e4eeb6eb2fced786e32e6d8df9e755ce5be920d17f7ce00bc38fcde8ccdbf9e"}, + {file = "numpy-2.0.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a1e01dcaab205fbece13c1410253a9eea1b1c9b61d237b6fa59bcc46e8e89343"}, + {file = "numpy-2.0.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a8fc2de81ad835d999113ddf87d1ea2b0f4704cbd947c948d2f5513deafe5a7b"}, + {file = "numpy-2.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a3d94942c331dd4e0e1147f7a8699a4aa47dffc11bf8a1523c12af8b2e91bbe"}, + {file = "numpy-2.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15eb4eca47d36ec3f78cde0a3a2ee24cf05ca7396ef808dda2c0ddad7c2bde67"}, + {file = "numpy-2.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b83e16a5511d1b1f8a88cbabb1a6f6a499f82c062a4251892d9ad5d609863fb7"}, + {file = "numpy-2.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f87fec1f9bc1efd23f4227becff04bd0e979e23ca50cc92ec88b38489db3b55"}, + {file = "numpy-2.0.1-cp311-cp311-win32.whl", hash = "sha256:36d3a9405fd7c511804dc56fc32974fa5533bdeb3cd1604d6b8ff1d292b819c4"}, + {file = "numpy-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:08458fbf403bff5e2b45f08eda195d4b0c9b35682311da5a5a0a0925b11b9bd8"}, + {file = "numpy-2.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6bf4e6f4a2a2e26655717a1983ef6324f2664d7011f6ef7482e8c0b3d51e82ac"}, + {file = "numpy-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6fddc5fe258d3328cd8e3d7d3e02234c5d70e01ebe377a6ab92adb14039cb4"}, + {file = "numpy-2.0.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5daab361be6ddeb299a918a7c0864fa8618af66019138263247af405018b04e1"}, + {file = "numpy-2.0.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:ea2326a4dca88e4a274ba3a4405eb6c6467d3ffbd8c7d38632502eaae3820587"}, + {file = "numpy-2.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:529af13c5f4b7a932fb0e1911d3a75da204eff023ee5e0e79c1751564221a5c8"}, + {file = "numpy-2.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6790654cb13eab303d8402354fabd47472b24635700f631f041bd0b65e37298a"}, + {file = "numpy-2.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cbab9fc9c391700e3e1287666dfd82d8666d10e69a6c4a09ab97574c0b7ee0a7"}, + {file = "numpy-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:99d0d92a5e3613c33a5f01db206a33f8fdf3d71f2912b0de1739894668b7a93b"}, + {file = "numpy-2.0.1-cp312-cp312-win32.whl", hash = "sha256:173a00b9995f73b79eb0191129f2455f1e34c203f559dd118636858cc452a1bf"}, + {file = "numpy-2.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:bb2124fdc6e62baae159ebcfa368708867eb56806804d005860b6007388df171"}, + {file = "numpy-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bfc085b28d62ff4009364e7ca34b80a9a080cbd97c2c0630bb5f7f770dae9414"}, + {file = "numpy-2.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fae4ebbf95a179c1156fab0b142b74e4ba4204c87bde8d3d8b6f9c34c5825ef"}, + {file = "numpy-2.0.1-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:72dc22e9ec8f6eaa206deb1b1355eb2e253899d7347f5e2fae5f0af613741d06"}, + {file = "numpy-2.0.1-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:ec87f5f8aca726117a1c9b7083e7656a9d0d606eec7299cc067bb83d26f16e0c"}, + {file = "numpy-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f682ea61a88479d9498bf2091fdcd722b090724b08b31d63e022adc063bad59"}, + {file = "numpy-2.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8efc84f01c1cd7e34b3fb310183e72fcdf55293ee736d679b6d35b35d80bba26"}, + {file = "numpy-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3fdabe3e2a52bc4eff8dc7a5044342f8bd9f11ef0934fcd3289a788c0eb10018"}, + {file = "numpy-2.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:24a0e1befbfa14615b49ba9659d3d8818a0f4d8a1c5822af8696706fbda7310c"}, + {file = "numpy-2.0.1-cp39-cp39-win32.whl", hash = "sha256:f9cf5ea551aec449206954b075db819f52adc1638d46a6738253a712d553c7b4"}, + {file = "numpy-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:e9e81fa9017eaa416c056e5d9e71be93d05e2c3c2ab308d23307a8bc4443c368"}, + {file = "numpy-2.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61728fba1e464f789b11deb78a57805c70b2ed02343560456190d0501ba37b0f"}, + {file = "numpy-2.0.1-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:12f5d865d60fb9734e60a60f1d5afa6d962d8d4467c120a1c0cda6eb2964437d"}, + {file = "numpy-2.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eacf3291e263d5a67d8c1a581a8ebbcfd6447204ef58828caf69a5e3e8c75990"}, + {file = "numpy-2.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2c3a346ae20cfd80b6cfd3e60dc179963ef2ea58da5ec074fd3d9e7a1e7ba97f"}, + {file = "numpy-2.0.1.tar.gz", hash = "sha256:485b87235796410c3519a699cfe1faab097e509e90ebb05dcd098db2ae87e7b3"}, +] + +[[package]] +name = "packaging" +version = "24.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {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 = "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.4.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, + {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, + {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, + {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, + {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, + {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, + {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, + {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, + {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, + {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, + {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, + {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, + {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, + {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, + {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, + {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, + {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, + {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, + {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +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.3" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, +] + +[package.extras] +tests = ["pytest"] + +[[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.4" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, + {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pytest" +version = "8.3.2" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, + {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.5,<2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "ruff" +version = "0.5.4" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.5.4-py3-none-linux_armv6l.whl", hash = "sha256:82acef724fc639699b4d3177ed5cc14c2a5aacd92edd578a9e846d5b5ec18ddf"}, + {file = "ruff-0.5.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:da62e87637c8838b325e65beee485f71eb36202ce8e3cdbc24b9fcb8b99a37be"}, + {file = "ruff-0.5.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e98ad088edfe2f3b85a925ee96da652028f093d6b9b56b76fc242d8abb8e2059"}, + {file = "ruff-0.5.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c55efbecc3152d614cfe6c2247a3054cfe358cefbf794f8c79c8575456efe19"}, + {file = "ruff-0.5.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9b85eaa1f653abd0a70603b8b7008d9e00c9fa1bbd0bf40dad3f0c0bdd06793"}, + {file = "ruff-0.5.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0cf497a47751be8c883059c4613ba2f50dd06ec672692de2811f039432875278"}, + {file = "ruff-0.5.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:09c14ed6a72af9ccc8d2e313d7acf7037f0faff43cde4b507e66f14e812e37f7"}, + {file = "ruff-0.5.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:628f6b8f97b8bad2490240aa84f3e68f390e13fabc9af5c0d3b96b485921cd60"}, + {file = "ruff-0.5.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3520a00c0563d7a7a7c324ad7e2cde2355733dafa9592c671fb2e9e3cd8194c1"}, + {file = "ruff-0.5.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93789f14ca2244fb91ed481456f6d0bb8af1f75a330e133b67d08f06ad85b516"}, + {file = "ruff-0.5.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:029454e2824eafa25b9df46882f7f7844d36fd8ce51c1b7f6d97e2615a57bbcc"}, + {file = "ruff-0.5.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:9492320eed573a13a0bc09a2957f17aa733fff9ce5bf00e66e6d4a88ec33813f"}, + {file = "ruff-0.5.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a6e1f62a92c645e2919b65c02e79d1f61e78a58eddaebca6c23659e7c7cb4ac7"}, + {file = "ruff-0.5.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:768fa9208df2bec4b2ce61dbc7c2ddd6b1be9fb48f1f8d3b78b3332c7d71c1ff"}, + {file = "ruff-0.5.4-py3-none-win32.whl", hash = "sha256:e1e7393e9c56128e870b233c82ceb42164966f25b30f68acbb24ed69ce9c3a4e"}, + {file = "ruff-0.5.4-py3-none-win_amd64.whl", hash = "sha256:58b54459221fd3f661a7329f177f091eb35cf7a603f01d9eb3eb11cc348d38c4"}, + {file = "ruff-0.5.4-py3-none-win_arm64.whl", hash = "sha256:bd53da65f1085fb5b307c38fd3c0829e76acf7b2a912d8d79cadcdb4875c1eb7"}, + {file = "ruff-0.5.4.tar.gz", hash = "sha256:2795726d5f71c4f4e70653273d1c23a8182f07dd8e48c12de5d867bfb7557eed"}, +] + +[[package]] +name = "scipy" +version = "1.14.0" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.10" +files = [ + {file = "scipy-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7e911933d54ead4d557c02402710c2396529540b81dd554fc1ba270eb7308484"}, + {file = "scipy-1.14.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:687af0a35462402dd851726295c1a5ae5f987bd6e9026f52e9505994e2f84ef6"}, + {file = "scipy-1.14.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:07e179dc0205a50721022344fb85074f772eadbda1e1b3eecdc483f8033709b7"}, + {file = "scipy-1.14.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:6a9c9a9b226d9a21e0a208bdb024c3982932e43811b62d202aaf1bb59af264b1"}, + {file = "scipy-1.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:076c27284c768b84a45dcf2e914d4000aac537da74236a0d45d82c6fa4b7b3c0"}, + {file = "scipy-1.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42470ea0195336df319741e230626b6225a740fd9dce9642ca13e98f667047c0"}, + {file = "scipy-1.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:176c6f0d0470a32f1b2efaf40c3d37a24876cebf447498a4cefb947a79c21e9d"}, + {file = "scipy-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:ad36af9626d27a4326c8e884917b7ec321d8a1841cd6dacc67d2a9e90c2f0359"}, + {file = "scipy-1.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6d056a8709ccda6cf36cdd2eac597d13bc03dba38360f418560a93050c76a16e"}, + {file = "scipy-1.14.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:f0a50da861a7ec4573b7c716b2ebdcdf142b66b756a0d392c236ae568b3a93fb"}, + {file = "scipy-1.14.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:94c164a9e2498e68308e6e148646e486d979f7fcdb8b4cf34b5441894bdb9caf"}, + {file = "scipy-1.14.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a7d46c3e0aea5c064e734c3eac5cf9eb1f8c4ceee756262f2c7327c4c2691c86"}, + {file = "scipy-1.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9eee2989868e274aae26125345584254d97c56194c072ed96cb433f32f692ed8"}, + {file = "scipy-1.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3154691b9f7ed73778d746da2df67a19d046a6c8087c8b385bc4cdb2cfca74"}, + {file = "scipy-1.14.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c40003d880f39c11c1edbae8144e3813904b10514cd3d3d00c277ae996488cdb"}, + {file = "scipy-1.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:5b083c8940028bb7e0b4172acafda6df762da1927b9091f9611b0bcd8676f2bc"}, + {file = "scipy-1.14.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff2438ea1330e06e53c424893ec0072640dac00f29c6a43a575cbae4c99b2b9"}, + {file = "scipy-1.14.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:bbc0471b5f22c11c389075d091d3885693fd3f5e9a54ce051b46308bc787e5d4"}, + {file = "scipy-1.14.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:64b2ff514a98cf2bb734a9f90d32dc89dc6ad4a4a36a312cd0d6327170339eb0"}, + {file = "scipy-1.14.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:7d3da42fbbbb860211a811782504f38ae7aaec9de8764a9bef6b262de7a2b50f"}, + {file = "scipy-1.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d91db2c41dd6c20646af280355d41dfa1ec7eead235642178bd57635a3f82209"}, + {file = "scipy-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a01cc03bcdc777c9da3cfdcc74b5a75caffb48a6c39c8450a9a05f82c4250a14"}, + {file = "scipy-1.14.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:65df4da3c12a2bb9ad52b86b4dcf46813e869afb006e58be0f516bc370165159"}, + {file = "scipy-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:4c4161597c75043f7154238ef419c29a64ac4a7c889d588ea77690ac4d0d9b20"}, + {file = "scipy-1.14.0.tar.gz", hash = "sha256:b5923f48cb840380f9854339176ef21763118a7300a88203ccd0bdd26e58527b"}, +] + +[package.dependencies] +numpy = ">=1.23.5,<2.3" + +[package.extras] +dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] +doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.13.1)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"] +test = ["Cython", "array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +optional = false +python-versions = "*" +files = [ + {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, + {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, +] + +[[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 = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {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.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {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"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "e0a9613df29a641fb23c8eff1ffcc169892269b033f56d10073fa9c7f7d62cb9" diff --git a/pyproject.toml b/pyproject.toml index 989a891..47bd934 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,8 +8,25 @@ packages = [{include = "large_lattice_model", from = "src"}] [tool.poetry.dependencies] python = "^3.10" +numpy = "^2.0.1" +scipy = "^1.14.0" +#https://stackoverflow.com/questions/77316505/im-having-a-bad-time-installing-some-modules-with-poetry +#pygsl = "^2.3.3" # poetry can't install this, so I used pip instead +numba = "^0.60.0" +matplotlib = "^3.9.2" +[tool.poetry.group.dev.dependencies] +ruff = "^0.5.4" +ipython = "^8.26.0" + + +[tool.poetry.group.test.dependencies] +pytest = "^8.3.2" +hypothesis = "^6.112.0" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" + +[tool.ruff] +line-length = 120 \ No newline at end of file diff --git a/src/large_lattice_model/latticemodel.py b/src/large_lattice_model/latticemodel.py new file mode 100644 index 0000000..c208955 --- /dev/null +++ b/src/large_lattice_model/latticemodel.py @@ -0,0 +1,28 @@ +import numpy as np +from scipy.constants import c, h, k + + +class LatticeModel: + """A class tha model the motional spectra of atoms trapped in a one-dimensional optical lattice.""" + + def __init__(self, w=60e-6): + # Yb + self.m = 2.83846417e-25 # atomic mass + self.fL = 394798e9 # lattice frequency + self.wc = 518295836590863.0 # clock frequency + + self.w = w # lattice waist + + self._set_scale() + + def _set_scale(self): + self.lL = c / self.fL # lattice wavelength + self.Er = h**2 / (2 * self.m * self.lL**2) # recoil energy + self.vrec = h / (2 * self.m * self.lL**2) # recoil frequency + + # problem scale + self.k = 2 * np.pi / self.lL + self.kappa = np.sqrt(2) / self.w + + self.lc = c / self.wc + self.kc = 2 * np.pi / self.lc diff --git a/src/large_lattice_model/mathieu.py b/src/large_lattice_model/mathieu.py index 34abe80..99ac750 100644 --- a/src/large_lattice_model/mathieu.py +++ b/src/large_lattice_model/mathieu.py @@ -17,6 +17,8 @@ # and use numba for a fast vectorization # Finally this file fallback to scipy if GSL is not found and provide an analitycal approximation made fast using numba +scipy_mathieu_b = scipy.special.mathieu_b + def _load_lib(libname): lib_path = find_library(libname) @@ -52,7 +54,7 @@ def gsl_mathieu_b(n, q): else: # If the GSL library is not found, fallback to scipy - mathieu_b = scipy.special.mathieu_b + mathieu_b = scipy_mathieu_b @njit @@ -75,11 +77,7 @@ def _mathieu_b_asymptotic(m, q): # term2 = 2.0 * s * h # term1 = -2.0 * h**2 - result = ( - (2.0 * s - 2.0 * h) * h - + term3 - + (term4 + (term5 + (term6 + (term7 + term8 / h) / h) / h) / h) / h - ) + result = (2.0 * s - 2.0 * h) * h + term3 + (term4 + (term5 + (term6 + (term7 + term8 / h) / h) / h) / h) / h return result diff --git a/tests/plot_mathieu.py b/tests/plot_mathieu.py new file mode 100644 index 0000000..bbdc384 --- /dev/null +++ b/tests/plot_mathieu.py @@ -0,0 +1,46 @@ +import numpy as np +import scipy as sp +from matplotlib import pyplot as plt +from matplotlib.lines import Line2D + +plt.close("all") +plt.ion() + +from large_lattice_model.mathieu import gsl_mathieu_b, mathieu_b_asymptotic, scipy_mathieu_b + +N = 1000 +n = np.arange(1, 25) +D = np.linspace(1, 1500, N) +q = D / 4 + + +legend_lines = custom_lines = [Line2D([0], [0], color="C0", lw=1), Line2D([0], [0], color="C1", lw=1)] + +plt.figure() +plt.title("GSL vs Scipy") +for i in n: + a = scipy_mathieu_b(i, q) + b = gsl_mathieu_b(i, q) + + plt.plot(D, a, ":", color="C0") + plt.plot(D, b, "-", color="C1") + +plt.legend(legend_lines, ["Scipy", "GSL"]) +plt.xlabel("D") +plt.ylabel("Mathieu_b") + + +plt.figure() +plt.title("GSL vs Asymptotic") +for i in n: + a = mathieu_b_asymptotic(i, q) + b = gsl_mathieu_b(i, q) + + plt.plot(D, a, ":", color="C0") + plt.plot(D, b, "-", color="C1") + +plt.ylim(-500, 1000) +plt.legend(legend_lines, ["Asymptotic", "GSL"]) +plt.xlabel("D") +plt.ylabel("Mathieu_b") +plt.show() diff --git a/tests/test_mathieu.py b/tests/test_mathieu.py new file mode 100644 index 0000000..23acd25 --- /dev/null +++ b/tests/test_mathieu.py @@ -0,0 +1,61 @@ +import numpy as np +import pytest +from hypothesis import given +from hypothesis import strategies as st +from hypothesis.extra.numpy import arrays +from scipy.special import mathieu_b as scipy_mathieu_b + +from large_lattice_model.mathieu import gsl, gsl_mathieu_b, mathieu_b_asymptotic + +gsl_available = gsl is not None + + +@pytest.mark.skipif(not gsl_available, reason="GSL library is not available, skipping gsl_mathieu_b tests.") +def test_gsl_mathieu_b(): + n, x = 5, 2.0 + gsl_result = gsl_mathieu_b(n, x) + assert np.isfinite(gsl_result) + + +# scipy is taken as a benchmark only for q<30 +# as this region is bug-free in its implementation + + +@pytest.mark.skipif(not gsl_available, reason="GSL library is not available, skipping gsl_mathieu_b tests.") +@given( + n=st.integers(min_value=1, max_value=25), + x=st.floats(min_value=0.001, max_value=30), +) +def test_gsl_mathieu_b_vs_scipy(n, x): + gsl_result = gsl_mathieu_b(n, x) + scipy_result = scipy_mathieu_b(n, x) + + assert gsl_result == pytest.approx(scipy_result) + + +@pytest.mark.skipif(not gsl_available, reason="GSL library is not available, skipping gsl_mathieu_b tests.") +@given( + n=arrays(np.int32, 10, elements=st.integers(min_value=1, max_value=35)), + x=arrays(np.float32, 10, elements=st.floats(min_value=0.001, max_value=30, allow_nan=False, allow_infinity=False)), +) +def test_gsl_mathieu_b_vs_scipy_numpy(n, x): + gsl_result = gsl_mathieu_b(n, x) + scipy_result = scipy_mathieu_b(n, x) + + assert gsl_result == pytest.approx(scipy_result) + + +# the asymptotic function is only valid for high depth and low n (the higher the depth the higher the acceptable n) +# here is only an easy test + + +@pytest.mark.skipif(not gsl_available, reason="GSL library is not available, skipping mathieu_b_asymptotic tests.") +@given( + n=st.integers(min_value=1, max_value=8), + x=st.floats(min_value=150, max_value=500, allow_nan=False, allow_infinity=False), +) +def test_mathieu_b_asymptotic_vs_gsl(n, x): + asymptotic_result = mathieu_b_asymptotic(n, x) + gsl_result = gsl_mathieu_b(n, x) + + assert asymptotic_result == pytest.approx(gsl_result, rel=1e-1) From ca7e62fc4be186a3b88cece38cae9dc5904e632e Mon Sep 17 00:00:00 2001 From: Marco Pizzocaro Date: Wed, 11 Sep 2024 12:33:02 +0200 Subject: [PATCH 03/14] Add settings for atomic scale paramters (recoil energy, lattice wavevector and clock wavevector) --- src/large_lattice_model/latticemodel.py | 46 +++++++++++++++---------- src/large_lattice_model/settings.py | 34 ++++++++++++++++++ 2 files changed, 62 insertions(+), 18 deletions(-) create mode 100644 src/large_lattice_model/settings.py diff --git a/src/large_lattice_model/latticemodel.py b/src/large_lattice_model/latticemodel.py index c208955..208ac0f 100644 --- a/src/large_lattice_model/latticemodel.py +++ b/src/large_lattice_model/latticemodel.py @@ -1,28 +1,38 @@ import numpy as np from scipy.constants import c, h, k +import large_lattice_model.settings as settings -class LatticeModel: - """A class tha model the motional spectra of atoms trapped in a one-dimensional optical lattice.""" - def __init__(self, w=60e-6): - # Yb - self.m = 2.83846417e-25 # atomic mass - self.fL = 394798e9 # lattice frequency - self.wc = 518295836590863.0 # clock frequency +def set_atom(atom): + """Set the scale parameters of the lattice model (recoil energy, lattice wavevector, clock wavevector). + By default the settings are for 171Yb. - self.w = w # lattice waist + Parameters + ---------- + atom : str, + One of '171Yb', '87Sr', '88Sr' - self._set_scale() + Notes: + ------ + If your atom is not in the list use [](set_atomic_properties) instead. - def _set_scale(self): - self.lL = c / self.fL # lattice wavelength - self.Er = h**2 / (2 * self.m * self.lL**2) # recoil energy - self.vrec = h / (2 * self.m * self.lL**2) # recoil frequency + """ + settings.Er, settings.k, settings.kc = settings.scale_parameters_from_atom(atom) + return settings.Er, settings.k, settings.kc - # problem scale - self.k = 2 * np.pi / self.lL - self.kappa = np.sqrt(2) / self.w - self.lc = c / self.wc - self.kc = 2 * np.pi / self.lc +def set_atomic_properties(lattice_frequency, clock_frequency, atomic_mass): + """Set custom scale parameters of the lattice model (recoil energy, lattice wavevector, clock wavevector). + + Parameters + ---------- + lattice_frequency : float + lattice frequency in Hz + clock_frequency : float + clock frequency in Hz + atomic_mass : float + atomic mass in atomic mass constants + """ + settings.Er, settings.k, settings.kc = settings.scale_parameters(lattice_frequency, clock_frequency, atomic_mass) + return settings.Er, settings.k, settings.kc diff --git a/src/large_lattice_model/settings.py b/src/large_lattice_model/settings.py new file mode 100644 index 0000000..d76fef5 --- /dev/null +++ b/src/large_lattice_model/settings.py @@ -0,0 +1,34 @@ +import numpy as np +from scipy.constants import c, h, physical_constants +from scipy.constants import k as kB + +amu = physical_constants["atomic mass constant"][0] + + +def scale_parameters(lattice_frequency, clock_frequency, atomic_mass): + lattice_wavelength = c / lattice_frequency + recoil_energy = h**2 / (2 * atomic_mass * amu * lattice_wavelength**2) + lattice_k = 2 * np.pi / lattice_wavelength + clock_wavelength = c / clock_frequency + clock_k = 2 * np.pi / clock_wavelength + + return recoil_energy, lattice_k, clock_k + + +_atomic_parameters = { + "171Yb": scale_parameters(394798.267e9, 518295836590863.0, 170.936323), + "88Sr": scale_parameters(368554e9, 429228066418007.0, 87.9056121), + "87Sr": scale_parameters(368554e9, 429228004229873.0, 86.90887750), +} + + +def scale_parameters_from_atom(atom=None): + if (atom is None) or (atom == "Yb"): + return _atomic_parameters["171Yb"] + if atom in _atomic_parameters.keys(): + return _atomic_parameters[atom] + else: + raise ValueError(f"Please specify an atom in {_atomic_parameters.keys}") + + +Er, k, kc = scale_parameters_from_atom("171Yb") From 5f91935dccf0ea0668d6456140b266d8498c3a66 Mon Sep 17 00:00:00 2001 From: Marco Pizzocaro Date: Wed, 11 Sep 2024 15:06:54 +0200 Subject: [PATCH 04/14] Add most functions from previous implementation --- src/large_lattice_model/latticemodel.py | 271 +++++++++++++++++++++++- 1 file changed, 270 insertions(+), 1 deletion(-) diff --git a/src/large_lattice_model/latticemodel.py b/src/large_lattice_model/latticemodel.py index 208ac0f..78c536a 100644 --- a/src/large_lattice_model/latticemodel.py +++ b/src/large_lattice_model/latticemodel.py @@ -1,7 +1,17 @@ +from functools import lru_cache # with maxsize > ~16k reduces computation time from 70 s to 10 s + import numpy as np -from scipy.constants import c, h, k +import scipy.integrate as integ +import scipy.optimize as opt +from numba import float64, int64, njit, vectorize +from scipy.constants import c, h, hbar +from scipy.constants import k as kB +from scipy.special import eval_genlaguerre, factorial import large_lattice_model.settings as settings +from large_lattice_model.mathieu import mathieu_b + +lru_maxsize = 65536 def set_atom(atom): @@ -36,3 +46,262 @@ def set_atomic_properties(lattice_frequency, clock_frequency, atomic_mass): """ settings.Er, settings.k, settings.kc = settings.scale_parameters(lattice_frequency, clock_frequency, atomic_mass) return settings.Er, settings.k, settings.kc + + +def U(rho, D, nz): + """Return the lattice potential surfaces (Beloy2020 Eq. D2). + + Inputs + ------ + rho : radial coordinates in units of kappa**-1 + D : depth of the lattice in Er + nz : longitudinal quantum number + + Returns + ------- + U : lattice potential surface in Er + """ + Drho = D * np.exp(-(rho**2)) + return mathieu_b(nz + 1, Drho / 4) - Drho / 2 + + +@vectorize([float64(float64, float64, int64)]) +@lru_cache(maxsize=lru_maxsize) +def R(E, D, nz): + """Inverse of the lattice potential surface U(rho) (Beloy2020 pag. 4) + + Inputs + ------ + E : potential energy in Er + D : depth of the lattice in Er + nz : longitudinal quantum number + + Returns + ------- + r : radial coordinates in units of kappa**-1 + """ + min_eps = 0.0 + max_eps = 2.7 # max radius for nz = 0 and D=1500 + try: + res = opt.root_scalar( + lambda x, *args: U(x, *args) - E, args=(D, nz), bracket=[min_eps, max_eps], method="brentq" + ) + except ValueError: + return 0.0 + + return res.root + + +def DeltaU(rho, D, nz, dn=1): + """Return the difference between lattice potential surfaces U(rho, D, nz+dn) - U(rho, D, nz). + + Inputs + ------ + rho : radial coordinates in units of kappa**-1 + D : depth of the lattice in Er + nz : longitudinal quantum number of the starting level + dn : longitudinal quantum number jump (default: 1) + + Returns + ------- + DeltaU : difference U(rho, nz+dn) - U(rho, nz) + """ + + return U(rho, D, nz + dn) - U(rho, D, nz) + + +# Harmonic Oscillator +def Omega(rho, D, nz, dn=1): + """Normalized Rabi frequency for the harmonic oscillator (Wineland1979 eq. 31) + + Inputs + ------ + rho : radial coordinates in units of kappa**-1 + D : depth of the lattice in Er + nz : longitudinal quantum number of the starting level + dn : longitudinal quantum number jump (default: 1) + + Returns + ------- + Omega : Normalized Rabi frequency (between 0 and 1) + """ + + Drho = D * np.exp(-(rho**2)) + eta = settings.kc / settings.k / np.sqrt(2) / Drho**0.25 + + return ( + np.exp(-(eta**2) / 2) + * np.sqrt(factorial(nz) / factorial(nz + dn)) + * eta ** (dn) + * eval_genlaguerre(nz, dn, eta**2) + ) + + +# TODO: add mathieu_se to mathieu +# # Using Mathieu Functions +# @vectorize([float64(float64, float64, int64, int64)]) +# def OmegaMat(rho, D, nz, dn=1): +# """Normalized Rabi frequency for Mathieu wavefunctions (Beloy2020 appendix) + +# Inputs +# ------ +# rho : radial coordinates in units of kappa**-1 +# D : depth of the lattice in Er +# nz : longitudinal quantum number of the starting level +# dn : longitudinal quantum number jump (default: 1) + +# Returns +# ------- +# Omega : Normalized Rabi frequency (between 0 and 1) +# """ + +# Drho = D*np.exp(-rho**2) +# k = settings.k +# kc = settings.kc + +# lim = np.pi/(2*k) +# if dn % 2: +# res2 = integ.quad(lambda z: 2*k/np.pi * sf.mathieu_se(nz+1, Drho/4, (k*z + np.pi/2)) * np.sin(kc*z) * sf.mathieu_se(nz+1+dn, Drho/4, (k*z + np.pi/2)), 0,lim) # pygsl -- slower but no bugs! +# else: +# res2 = integ.quad(lambda z: 2*k/np.pi * sf.mathieu_se(nz+1, Drho/4, (k*z + np.pi/2)) * np.cos(kc*z) * sf.mathieu_se(nz+1+dn, Drho/4, (k*z + np.pi/2)), 0,lim) # pygsl -- slower but no bugs! + +# # integral is even +# return 2*abs(res2[0]) + + +def Gn(E, D, nz): + """Density of states for the lattic trap (Beloy2020 eq. 11) + + Inputs + ------ + E : potential energy in Er + D : depth of the lattice in Er + nz : longitudinal quantum number of the starting level + + Returns + ------- + G : density of states at energy E (same units of Beloy2020 fig. 3) + + """ + + return R(E, D, nz) ** 2 * np.pi / (2 * settings.k) + + +def Gr(rc, D, nz): + """Density of states for the lattic trap at a given radius (Beloy2020 eq. 11) + + Inputs + ------ + rc : Condon point at energy E + D : depth of the lattice in Er + nz : longitudinal quantum number of the starting level + + Returns + ------- + G : density of states at energy E (same units of Beloy2020 fig. 3) + + """ + + return rc**2 * np.pi / (2 * settings.k) + + +@lru_cache(maxsize=lru_maxsize) +def max_nz(D): + """Return the maximum nz for a given depth""" + # ansatz twice the harmonic oscillators levels + max_n = int(-U(0, D, 0) / np.sqrt(D)) + test = np.arange(max_n) + return np.amax(np.where(U(0, D, test) < 0)) + + +# lorentzian +def lor(x, x0, w): + """Simple lorentzian with center x0 and HWHM w peak 0.5""" + den = 1 + 1 / w**2 * (x - x0) ** 2 + return 0.5 / den + + +# both sideband +# it is faster to calculate sidebands at the same time +def sidebands(x, D, Tz, Tr, b, r, wc, dn=1, E_max=0.0, fac=10): + """Lattice sidebands as a sum of lorentzian. + + Inputs + ------ + x : frequency in Hz + D : depth of the lattice in Er + Tz : longitudinal temperature in K + Tr : radial temperature in K + b : blue sidebands scaling + r : red sidebands scaling + wc : carrier half width half maximum + dn : order of the sideband (default: 1) + E_max : max energy levels populated (default: 0) + fac : control the number of lorentzian to be used in the sum + higher number will give smoother sidebands but take more computational time + (default: 10) + + Returns + ------- + Both sidebands as excitation. + + """ + Nz = int(max_nz(D) * 1.0 + 0.5) + beta_r = settings.Er / (kB * Tr) + beta_z = settings.Er / (kB * Tz) + + # simple exp factor for a given Tz + # will be just used computationally to reduce the number of lorentzian used at high nz + # r = exp(-betaz) + + tot = np.zeros(x.shape) + total_norm = 0 + + for nz in np.arange(Nz + 1): + E_min = U(0, D, nz) + + # this just save computational time + # use less samples for high levels + # formula with r is normalized exponential distribution (from geometric series) + # high dn use higher number because it has sharper lorentzian + # N = int(Natoms*r**nz/(1-r**Nz)*(1-r)+2.)*dn + + # method to calculate number of lorentzian function to sum + N = int(DeltaU(0, D, nz, dn) * fac * (nz + 1) ** -0.5) + + # Uniform sampling in E + EE = np.linspace(E_min, E_max, N)[:, np.newaxis] + rc = R(EE, D, nz) + # dE = (E_max - E_min)/N + + # calc normalization + pp = Gr(rc, D, nz) * np.exp(-(EE - E_min) * beta_r) * np.exp(-E_min * beta_z) + total_norm += np.trapz( + pp, EE, axis=0 + ) # sum(pp, axis=0) *dE #trapz(pp, EE, axis=0) #trapz is a bit slower, but handles better different Ns + + # blue + x0 = DeltaU(rc, D, nz, dn) * settings.Er / h + ff = Omega(rc, D, nz, dn) * wc + + # sum lorentzian for blue sideband - note cutoff on energy + blue = pp * lor(x, x0, ff) * (U(rc, D, nz + dn) < E_max) + + res = b * np.trapz(blue, EE, axis=0) # sum(yy, axis=0)*dE #trapz(yy, EE, axis=0) # speed sum > trapz > simps + + tot += res + + # red + if nz >= dn: + # rc = R(EE, D, nz) # same as blue + x0 = DeltaU(rc, D, nz, -dn) * settings.Er / h + ff = Omega(rc, D, nz - dn, dn) * wc + + # sum lorentzian on red sideband + red = pp * lor(x, x0, ff) + + res = r * np.trapz(red, EE, axis=0) # trapz(yy, EE, axis=0) # sum(yy, axis=0)*median(diff(EE, axis=0)) # + + tot += res + + return tot / total_norm From 4247e6a001f3201060eab37b281ce5f12d3b472c Mon Sep 17 00:00:00 2001 From: Marco Pizzocaro Date: Wed, 11 Sep 2024 15:07:29 +0200 Subject: [PATCH 05/14] Add first implementation of XYZ effective depths --- src/large_lattice_model/xyz.py | 131 +++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 src/large_lattice_model/xyz.py diff --git a/src/large_lattice_model/xyz.py b/src/large_lattice_model/xyz.py new file mode 100644 index 0000000..f5381da --- /dev/null +++ b/src/large_lattice_model/xyz.py @@ -0,0 +1,131 @@ +from functools import lru_cache + +import numpy as np +import scipy.integrate as integ +from numba import float64, vectorize +from scipy.constants import k as kB + +import large_lattice_model.settings as settings +from large_lattice_model.latticemodel import R, U, max_nz + +lru_maxsize = 65536 + + +@lru_cache(maxsize=lru_maxsize) +def Zf(rho, z, D, nz): + """Return the longitudinal wavefunction in the lattice (Beloy 2020 Eq. D2) + + Inputs + ------ + rho : radial coordinates in units of kappa**-1 + z : longitudinal coordinate (normal units) + D : depth of the lattice in Er + nz : longitudinal quantum number + + Returns + ------- + Z : longitudinal wavefunction + """ + + Drho = D * np.exp(-(rho**2)) + return np.sqrt(2 * settings.k / np.pi) * sf.mathieu_se(nz + 1, Drho / 4, (settings.k * z + np.pi / 2)) + + +@lru_cache(maxsize=lru_maxsize) +def beloy_x(rho, D, nz): + """Beloy2020 z_nz(rho) function (page 6) + + Inputs + ------ + rho : radial coordinates in units of kappa**-1 + D : depth of the lattice in Er + nz : longitudinal quantum number + + Returns + ------- + z_nz : + """ + + lim = np.pi / (2 * settings.k) + + res2 = integ.quad(lambda z: Zf(rho, z, D, nz) ** 2 * np.cos(settings.k * z) ** 2, 0, lim) + # integral is even + return 2 * abs(res2[0]) * np.exp(-(rho**2)) + + +@lru_cache(maxsize=lru_maxsize) +def beloy_y(rho, D, nz): + """Beloy2020 z_nz(rho) function (page 6) + + Inputs + ------ + rho : radial coordinates in units of kappa**-1 + D : depth of the lattice in Er + nz : longitudinal quantum number + + Returns + ------- + z_nz : + """ + + lim = np.pi / (2 * settings.k) + + res2 = integ.quad(lambda z: Zf(rho, z, D, nz) ** 2 * np.sin(settings.k * z) ** 2, 0, lim) + # integral is even + return 2 * abs(res2[0]) * np.exp(-(rho**2)) + + +@lru_cache(maxsize=lru_maxsize) +def beloy_z(rho, D, nz): + """Beloy2020 z_nz(rho) function (page 6) + + Inputs + ------ + rho : radial coordinates in units of kappa**-1 + D : depth of the lattice in Er + nz : longitudinal quantum number + + Returns + ------- + z_nz : + """ + + lim = np.pi / (2 * settings.k) + + res2 = integ.quad(lambda z: Zf(rho, z, D, nz) ** 2 * np.cos(settings.k * z) ** 4, 0, lim) + # integral is even + return 2 * abs(res2[0]) * np.exp(-2 * rho**2) + + +@vectorize([(float64, float64, float64)(float64, float64, float64)]) +def beloy_XYZ(D, Tz, Tr): + beta_r = settings.Er / (kB * Tr) + beta_z = settings.Er / (kB * Tz) + + Nz = max_nz(D) + nnz = np.arange(0, Nz + 1) + Qnz = np.exp(U(0, D, nnz) * (beta_r - beta_z)) + + numx = 0.0 + numy = 0.0 + numz = 0.0 + den = 0.0 + + for nz in nnz: + R0 = R(0, D, nz) + # x + resx = integ.quad(lambda rho: beloy_x(rho, D, nz) * rho * (np.exp(-U(rho, D, nz) * beta_r) - 1), 0, R0) + numx += resx[0] * Qnz[nz] + + # y = exp(-rho^2) - x + resy = integ.quad(lambda rho: np.exp(-(rho**2)) * rho * (np.exp(-U(rho, D, nz) * beta_r) - 1), 0, R0) + numy += (resy[0] - resx[0]) * Qnz[nz] + + # z + res = integ.quad(lambda rho: beloy_z(rho, D, nz) * rho * (np.exp(-U(rho, D, nz) * beta_r) - 1), 0, R0) + numz += res[0] * Qnz[nz] + + res = integ.quad(lambda rho: rho * (np.exp(-U(rho, D, nz) * beta_r) - 1), 0, R0) + den += res[0] * Qnz[nz] + + return numx / den, numy / den, numz / den From 048660bb0d5ad1247bf36bc072bf78346b773836 Mon Sep 17 00:00:00 2001 From: Marco Pizzocaro Date: Wed, 11 Sep 2024 17:36:21 +0200 Subject: [PATCH 06/14] Add first implementation of mathieu_se function --- src/large_lattice_model/latticemodel.py | 84 ++++++++++++++----------- src/large_lattice_model/mathieu.py | 28 +++++++++ src/large_lattice_model/xyz.py | 25 ++++---- tests/plot_omega.py | 32 ++++++++++ 4 files changed, 122 insertions(+), 47 deletions(-) create mode 100644 tests/plot_omega.py diff --git a/src/large_lattice_model/latticemodel.py b/src/large_lattice_model/latticemodel.py index 78c536a..759e8a0 100644 --- a/src/large_lattice_model/latticemodel.py +++ b/src/large_lattice_model/latticemodel.py @@ -1,7 +1,7 @@ from functools import lru_cache # with maxsize > ~16k reduces computation time from 70 s to 10 s import numpy as np -import scipy.integrate as integ +import scipy.integrate as integrate import scipy.optimize as opt from numba import float64, int64, njit, vectorize from scipy.constants import c, h, hbar @@ -9,7 +9,7 @@ from scipy.special import eval_genlaguerre, factorial import large_lattice_model.settings as settings -from large_lattice_model.mathieu import mathieu_b +from large_lattice_model.mathieu import mathieu_b, mathieu_se lru_maxsize = 65536 @@ -65,7 +65,7 @@ def U(rho, D, nz): return mathieu_b(nz + 1, Drho / 4) - Drho / 2 -@vectorize([float64(float64, float64, int64)]) +# @vectorize([float64(float64, float64, int64)]) @lru_cache(maxsize=lru_maxsize) def R(E, D, nz): """Inverse of the lattice potential surface U(rho) (Beloy2020 pag. 4) @@ -92,6 +92,9 @@ def R(E, D, nz): return res.root +R = np.vectorize(R) + + def DeltaU(rho, D, nz, dn=1): """Return the difference between lattice potential surfaces U(rho, D, nz+dn) - U(rho, D, nz). @@ -137,36 +140,55 @@ def Omega(rho, D, nz, dn=1): ) -# TODO: add mathieu_se to mathieu -# # Using Mathieu Functions +# Using Mathieu Functions # @vectorize([float64(float64, float64, int64, int64)]) -# def OmegaMat(rho, D, nz, dn=1): -# """Normalized Rabi frequency for Mathieu wavefunctions (Beloy2020 appendix) +def OmegaMat(rho, D, nz, dn=1): + """Normalized Rabi frequency for Mathieu wavefunctions (Beloy2020 appendix) -# Inputs -# ------ -# rho : radial coordinates in units of kappa**-1 -# D : depth of the lattice in Er -# nz : longitudinal quantum number of the starting level -# dn : longitudinal quantum number jump (default: 1) + Inputs + ------ + rho : radial coordinates in units of kappa**-1 + D : depth of the lattice in Er + nz : longitudinal quantum number of the starting level + dn : longitudinal quantum number jump (default: 1) -# Returns -# ------- -# Omega : Normalized Rabi frequency (between 0 and 1) -# """ + Returns + ------- + Omega : Normalized Rabi frequency (between 0 and 1) + """ -# Drho = D*np.exp(-rho**2) -# k = settings.k -# kc = settings.kc + Drho = D * np.exp(-(rho**2)) + k = settings.k + kc = settings.kc + + lim = np.pi / (2 * k) + if dn % 2: + res2 = integrate.quad( + lambda z: 2 + * k + / np.pi + * mathieu_se(nz + 1, Drho / 4, (k * z + np.pi / 2)) + * np.sin(kc * z) + * mathieu_se(nz + 1 + dn, Drho / 4, (k * z + np.pi / 2)), + 0, + lim, + ) + else: + res2 = integrate.quad( + lambda z: 2 + * k + / np.pi + * mathieu_se(nz + 1, Drho / 4, (k * z + np.pi / 2)) + * np.cos(kc * z) + * mathieu_se(nz + 1 + dn, Drho / 4, (k * z + np.pi / 2)), + 0, + lim, + ) + # integral is even + return 2 * abs(res2[0]) -# lim = np.pi/(2*k) -# if dn % 2: -# res2 = integ.quad(lambda z: 2*k/np.pi * sf.mathieu_se(nz+1, Drho/4, (k*z + np.pi/2)) * np.sin(kc*z) * sf.mathieu_se(nz+1+dn, Drho/4, (k*z + np.pi/2)), 0,lim) # pygsl -- slower but no bugs! -# else: -# res2 = integ.quad(lambda z: 2*k/np.pi * sf.mathieu_se(nz+1, Drho/4, (k*z + np.pi/2)) * np.cos(kc*z) * sf.mathieu_se(nz+1+dn, Drho/4, (k*z + np.pi/2)), 0,lim) # pygsl -- slower but no bugs! -# # integral is even -# return 2*abs(res2[0]) +OmegaMat = np.vectorize(OmegaMat) def Gn(E, D, nz): @@ -250,10 +272,6 @@ def sidebands(x, D, Tz, Tr, b, r, wc, dn=1, E_max=0.0, fac=10): beta_r = settings.Er / (kB * Tr) beta_z = settings.Er / (kB * Tz) - # simple exp factor for a given Tz - # will be just used computationally to reduce the number of lorentzian used at high nz - # r = exp(-betaz) - tot = np.zeros(x.shape) total_norm = 0 @@ -262,10 +280,6 @@ def sidebands(x, D, Tz, Tr, b, r, wc, dn=1, E_max=0.0, fac=10): # this just save computational time # use less samples for high levels - # formula with r is normalized exponential distribution (from geometric series) - # high dn use higher number because it has sharper lorentzian - # N = int(Natoms*r**nz/(1-r**Nz)*(1-r)+2.)*dn - # method to calculate number of lorentzian function to sum N = int(DeltaU(0, D, nz, dn) * fac * (nz + 1) ** -0.5) diff --git a/src/large_lattice_model/mathieu.py b/src/large_lattice_model/mathieu.py index 99ac750..38748ea 100644 --- a/src/large_lattice_model/mathieu.py +++ b/src/large_lattice_model/mathieu.py @@ -57,6 +57,34 @@ def gsl_mathieu_b(n, q): mathieu_b = scipy_mathieu_b +def scipy_mathieu_se(m, q, x): + """Odd Mathieu function from scipy implementation, with input in radians and dropping the derivative""" + func, deriv = scipy.special.mathieu_sem(m, q, x * 180.0 / np.pi) + return func + + +if gsl: + gsl.gsl_sf_mathieu_se.restype = ctypes.c_double + gsl.gsl_sf_mathieu_se.argtypes = [ctypes.c_int, ctypes.c_double, ctypes.c_double] + + gsl_sf_mathieu_se = gsl.gsl_sf_mathieu_se + + @njit + def _gsl_mathieu_se(n, q, x): + return gsl_sf_mathieu_se(n, q, x) + + # this is fast! + @vectorize([float64(int64, float64, float64)]) + def gsl_mathieu_se(n, q, x): + return _gsl_mathieu_se(n, q, x) + + mathieu_se = gsl_mathieu_se + +else: + # If the GSL library is not found, fallback to scipy + mathieu_se = scipy_mathieu_se + + @njit def _mathieu_b_asymptotic(m, q): """Asymptotic approximation of the characteristic value of odd Mathieu functions diff --git a/src/large_lattice_model/xyz.py b/src/large_lattice_model/xyz.py index f5381da..59b0509 100644 --- a/src/large_lattice_model/xyz.py +++ b/src/large_lattice_model/xyz.py @@ -1,12 +1,13 @@ from functools import lru_cache import numpy as np -import scipy.integrate as integ +import scipy.integrate as integrate from numba import float64, vectorize from scipy.constants import k as kB import large_lattice_model.settings as settings from large_lattice_model.latticemodel import R, U, max_nz +from large_lattice_model.mathieu import mathieu_se lru_maxsize = 65536 @@ -28,7 +29,7 @@ def Zf(rho, z, D, nz): """ Drho = D * np.exp(-(rho**2)) - return np.sqrt(2 * settings.k / np.pi) * sf.mathieu_se(nz + 1, Drho / 4, (settings.k * z + np.pi / 2)) + return np.sqrt(2 * settings.k / np.pi) * mathieu_se(nz + 1, Drho / 4, (settings.k * z + np.pi / 2)) @lru_cache(maxsize=lru_maxsize) @@ -48,8 +49,8 @@ def beloy_x(rho, D, nz): lim = np.pi / (2 * settings.k) - res2 = integ.quad(lambda z: Zf(rho, z, D, nz) ** 2 * np.cos(settings.k * z) ** 2, 0, lim) - # integral is even + res2 = integrate.quad(lambda z: Zf(rho, z, D, nz) ** 2 * np.cos(settings.k * z) ** 2, 0, lim) + # integrateral is even return 2 * abs(res2[0]) * np.exp(-(rho**2)) @@ -70,8 +71,8 @@ def beloy_y(rho, D, nz): lim = np.pi / (2 * settings.k) - res2 = integ.quad(lambda z: Zf(rho, z, D, nz) ** 2 * np.sin(settings.k * z) ** 2, 0, lim) - # integral is even + res2 = integrate.quad(lambda z: Zf(rho, z, D, nz) ** 2 * np.sin(settings.k * z) ** 2, 0, lim) + # integrateral is even return 2 * abs(res2[0]) * np.exp(-(rho**2)) @@ -92,8 +93,8 @@ def beloy_z(rho, D, nz): lim = np.pi / (2 * settings.k) - res2 = integ.quad(lambda z: Zf(rho, z, D, nz) ** 2 * np.cos(settings.k * z) ** 4, 0, lim) - # integral is even + res2 = integrate.quad(lambda z: Zf(rho, z, D, nz) ** 2 * np.cos(settings.k * z) ** 4, 0, lim) + # integrateral is even return 2 * abs(res2[0]) * np.exp(-2 * rho**2) @@ -114,18 +115,18 @@ def beloy_XYZ(D, Tz, Tr): for nz in nnz: R0 = R(0, D, nz) # x - resx = integ.quad(lambda rho: beloy_x(rho, D, nz) * rho * (np.exp(-U(rho, D, nz) * beta_r) - 1), 0, R0) + resx = integrate.quad(lambda rho: beloy_x(rho, D, nz) * rho * (np.exp(-U(rho, D, nz) * beta_r) - 1), 0, R0) numx += resx[0] * Qnz[nz] # y = exp(-rho^2) - x - resy = integ.quad(lambda rho: np.exp(-(rho**2)) * rho * (np.exp(-U(rho, D, nz) * beta_r) - 1), 0, R0) + resy = integrate.quad(lambda rho: np.exp(-(rho**2)) * rho * (np.exp(-U(rho, D, nz) * beta_r) - 1), 0, R0) numy += (resy[0] - resx[0]) * Qnz[nz] # z - res = integ.quad(lambda rho: beloy_z(rho, D, nz) * rho * (np.exp(-U(rho, D, nz) * beta_r) - 1), 0, R0) + res = integrate.quad(lambda rho: beloy_z(rho, D, nz) * rho * (np.exp(-U(rho, D, nz) * beta_r) - 1), 0, R0) numz += res[0] * Qnz[nz] - res = integ.quad(lambda rho: rho * (np.exp(-U(rho, D, nz) * beta_r) - 1), 0, R0) + res = integrate.quad(lambda rho: rho * (np.exp(-U(rho, D, nz) * beta_r) - 1), 0, R0) den += res[0] * Qnz[nz] return numx / den, numy / den, numz / den diff --git a/tests/plot_omega.py b/tests/plot_omega.py new file mode 100644 index 0000000..83675d5 --- /dev/null +++ b/tests/plot_omega.py @@ -0,0 +1,32 @@ +import numpy as np +import scipy as sp +from matplotlib import pyplot as plt + +from large_lattice_model.latticemodel import Omega, OmegaMat, OmegaMat2, R, max_nz + +plt.close("all") +plt.ion() + +D = 200 +Nz = max_nz(D) +rr = np.linspace(1e-5, 4, 100) + + +plt.figure() +plt.title("n -> n+1") +for nz in np.arange(Nz): + # rr = arange(0, maxr[n], 0.1/kappa) # cut plot at trap edge + max_r = R(0, D, nz) + max_n = np.amax(np.where(rr < max_r)) + + rr_down = rr[:max_n] + rr_up = rr[max_n:] + + plt.plot(rr_down, Omega(rr_down, D, nz) ** 2, color="C0") + plt.plot(rr_down, OmegaMat(rr_down, D, nz) ** 2, color="C1") + + +plt.ylim(0, 0.4) + +plt.xlabel("r*kappa") +plt.ylabel("Omega2") From bbab9f772135d8d56a6d98707ff6ee9cb300b3d8 Mon Sep 17 00:00:00 2001 From: Marco Pizzocaro Date: Thu, 12 Sep 2024 17:25:43 +0200 Subject: [PATCH 07/14] Clean up some code related to mathieu functions --- src/large_lattice_model/latticemodel.py | 85 +++++++++++-------------- src/large_lattice_model/mathieu.py | 27 +++----- tests/plot_omega.py | 6 +- tests/test_mathieu.py | 34 ++++++++-- 4 files changed, 76 insertions(+), 76 deletions(-) diff --git a/src/large_lattice_model/latticemodel.py b/src/large_lattice_model/latticemodel.py index 759e8a0..bd3a6cd 100644 --- a/src/large_lattice_model/latticemodel.py +++ b/src/large_lattice_model/latticemodel.py @@ -114,7 +114,7 @@ def DeltaU(rho, D, nz, dn=1): # Harmonic Oscillator -def Omega(rho, D, nz, dn=1): +def rabi_ho(rho, D, nz, dn=1): """Normalized Rabi frequency for the harmonic oscillator (Wineland1979 eq. 31) Inputs @@ -142,8 +142,8 @@ def Omega(rho, D, nz, dn=1): # Using Mathieu Functions # @vectorize([float64(float64, float64, int64, int64)]) -def OmegaMat(rho, D, nz, dn=1): - """Normalized Rabi frequency for Mathieu wavefunctions (Beloy2020 appendix) +def rabi_bo(rho, D, nz, dn=1): + """Normalized Rabi frequency for Born-Oppenheimer wavefunctions calculated using Mathieu functions (Beloy2020 appendix) Inputs ------ @@ -163,32 +163,21 @@ def OmegaMat(rho, D, nz, dn=1): lim = np.pi / (2 * k) if dn % 2: - res2 = integrate.quad( - lambda z: 2 - * k - / np.pi - * mathieu_se(nz + 1, Drho / 4, (k * z + np.pi / 2)) - * np.sin(kc * z) - * mathieu_se(nz + 1 + dn, Drho / 4, (k * z + np.pi / 2)), - 0, - lim, - ) + # fmt: off + integrand = lambda z: 2 * k / np.pi * mathieu_se(nz + 1, Drho / 4, (k * z + np.pi / 2)) * np.sin(kc * z) * mathieu_se(nz + 1 + dn, Drho / 4, (k * z + np.pi / 2)) + # fmt: on + else: - res2 = integrate.quad( - lambda z: 2 - * k - / np.pi - * mathieu_se(nz + 1, Drho / 4, (k * z + np.pi / 2)) - * np.cos(kc * z) - * mathieu_se(nz + 1 + dn, Drho / 4, (k * z + np.pi / 2)), - 0, - lim, - ) + # fmt: off + integrand = lambda z: 2 * k / np.pi * mathieu_se(nz + 1, Drho / 4, (k * z + np.pi / 2)) * np.cos(kc * z) * mathieu_se(nz + 1 + dn, Drho / 4, (k * z + np.pi / 2)) + # fmt: on + # integral is even + res2 = integrate.quad(integrand, 0, lim) return 2 * abs(res2[0]) -OmegaMat = np.vectorize(OmegaMat) +rabi_bo = np.vectorize(rabi_bo) def Gn(E, D, nz): @@ -246,28 +235,28 @@ def lor(x, x0, w): # both sideband # it is faster to calculate sidebands at the same time def sidebands(x, D, Tz, Tr, b, r, wc, dn=1, E_max=0.0, fac=10): - """Lattice sidebands as a sum of lorentzian. - - Inputs - ------ - x : frequency in Hz - D : depth of the lattice in Er - Tz : longitudinal temperature in K - Tr : radial temperature in K - b : blue sidebands scaling - r : red sidebands scaling - wc : carrier half width half maximum - dn : order of the sideband (default: 1) - E_max : max energy levels populated (default: 0) - fac : control the number of lorentzian to be used in the sum - higher number will give smoother sidebands but take more computational time - (default: 10) - - Returns - ------- - Both sidebands as excitation. - - """ + # """Lattice sidebands as a sum of lorentzian. + + # Inputs + # ------ + # x : frequency in Hz + # D : depth of the lattice in Er + # Tz : longitudinal temperature in K + # Tr : radial temperature in K + # b : blue sidebands scaling + # r : red sidebands scaling + # wc : carrier half width half maximum + # dn : order of the sideband (default: 1) + # E_max : max energy levels populated (default: 0) + # fac : control the number of lorentzian to be used in the sum + # higher number will give smoother sidebands but take more computational time + # (default: 10) + + # Returns + # ------- + # Both sidebands as excitation. + + # """ Nz = int(max_nz(D) * 1.0 + 0.5) beta_r = settings.Er / (kB * Tr) beta_z = settings.Er / (kB * Tz) @@ -296,7 +285,7 @@ def sidebands(x, D, Tz, Tr, b, r, wc, dn=1, E_max=0.0, fac=10): # blue x0 = DeltaU(rc, D, nz, dn) * settings.Er / h - ff = Omega(rc, D, nz, dn) * wc + ff = rabi_ho(rc, D, nz, dn) * wc # sum lorentzian for blue sideband - note cutoff on energy blue = pp * lor(x, x0, ff) * (U(rc, D, nz + dn) < E_max) @@ -309,7 +298,7 @@ def sidebands(x, D, Tz, Tr, b, r, wc, dn=1, E_max=0.0, fac=10): if nz >= dn: # rc = R(EE, D, nz) # same as blue x0 = DeltaU(rc, D, nz, -dn) * settings.Er / h - ff = Omega(rc, D, nz - dn, dn) * wc + ff = rabi_ho(rc, D, nz - dn, dn) * wc # sum lorentzian on red sideband red = pp * lor(x, x0, ff) diff --git a/src/large_lattice_model/mathieu.py b/src/large_lattice_model/mathieu.py index 38748ea..d8c876f 100644 --- a/src/large_lattice_model/mathieu.py +++ b/src/large_lattice_model/mathieu.py @@ -41,14 +41,12 @@ def _load_lib(libname): gsl_sf_mathieu_b = gsl.gsl_sf_mathieu_b - @njit - def _gsl_mathieu_b(n, q): - return gsl_sf_mathieu_b(n, q) - # this is fast! - @vectorize([float64(int64, float64)]) + @vectorize([float64(int64, float64)], nopython=True) def gsl_mathieu_b(n, q): - return _gsl_mathieu_b(n, q) + if n < 1: + return np.nan + return gsl_sf_mathieu_b(n, q) mathieu_b = gsl_mathieu_b @@ -69,14 +67,10 @@ def scipy_mathieu_se(m, q, x): gsl_sf_mathieu_se = gsl.gsl_sf_mathieu_se - @njit - def _gsl_mathieu_se(n, q, x): - return gsl_sf_mathieu_se(n, q, x) - # this is fast! - @vectorize([float64(int64, float64, float64)]) + @vectorize([float64(int64, float64, float64)], nopython=True) def gsl_mathieu_se(n, q, x): - return _gsl_mathieu_se(n, q, x) + return gsl_sf_mathieu_se(n, q, x) mathieu_se = gsl_mathieu_se @@ -85,8 +79,8 @@ def gsl_mathieu_se(n, q, x): mathieu_se = scipy_mathieu_se -@njit -def _mathieu_b_asymptotic(m, q): +@vectorize([float64(int64, float64)], nopython=True) +def mathieu_b_asymptotic(m, q): """Asymptotic approximation of the characteristic value of odd Mathieu functions See https://dlmf.nist.gov/28 @@ -108,8 +102,3 @@ def _mathieu_b_asymptotic(m, q): result = (2.0 * s - 2.0 * h) * h + term3 + (term4 + (term5 + (term6 + (term7 + term8 / h) / h) / h) / h) / h return result - - -@vectorize([float64(int64, float64)]) -def mathieu_b_asymptotic(n, q): - return _mathieu_b_asymptotic(n, q) diff --git a/tests/plot_omega.py b/tests/plot_omega.py index 83675d5..1e09912 100644 --- a/tests/plot_omega.py +++ b/tests/plot_omega.py @@ -2,7 +2,7 @@ import scipy as sp from matplotlib import pyplot as plt -from large_lattice_model.latticemodel import Omega, OmegaMat, OmegaMat2, R, max_nz +from large_lattice_model.latticemodel import OmegaMat2, R, max_nz, rabi_bo, rabi_ho plt.close("all") plt.ion() @@ -22,8 +22,8 @@ rr_down = rr[:max_n] rr_up = rr[max_n:] - plt.plot(rr_down, Omega(rr_down, D, nz) ** 2, color="C0") - plt.plot(rr_down, OmegaMat(rr_down, D, nz) ** 2, color="C1") + plt.plot(rr_down, rabi_ho(rr_down, D, nz) ** 2, color="C0") + plt.plot(rr_down, rabi_bo(rr_down, D, nz) ** 2, color="C1") plt.ylim(0, 0.4) diff --git a/tests/test_mathieu.py b/tests/test_mathieu.py index 23acd25..d81e4e1 100644 --- a/tests/test_mathieu.py +++ b/tests/test_mathieu.py @@ -1,11 +1,11 @@ import numpy as np import pytest -from hypothesis import given +import scipy.special +from hypothesis import given, settings from hypothesis import strategies as st from hypothesis.extra.numpy import arrays -from scipy.special import mathieu_b as scipy_mathieu_b -from large_lattice_model.mathieu import gsl, gsl_mathieu_b, mathieu_b_asymptotic +from large_lattice_model.mathieu import gsl, gsl_mathieu_b, gsl_mathieu_se, mathieu_b_asymptotic, scipy_mathieu_se gsl_available = gsl is not None @@ -28,7 +28,7 @@ def test_gsl_mathieu_b(): ) def test_gsl_mathieu_b_vs_scipy(n, x): gsl_result = gsl_mathieu_b(n, x) - scipy_result = scipy_mathieu_b(n, x) + scipy_result = scipy.special.mathieu_b(n, x) assert gsl_result == pytest.approx(scipy_result) @@ -40,7 +40,7 @@ def test_gsl_mathieu_b_vs_scipy(n, x): ) def test_gsl_mathieu_b_vs_scipy_numpy(n, x): gsl_result = gsl_mathieu_b(n, x) - scipy_result = scipy_mathieu_b(n, x) + scipy_result = scipy.special.mathieu_b(n, x) assert gsl_result == pytest.approx(scipy_result) @@ -51,7 +51,7 @@ def test_gsl_mathieu_b_vs_scipy_numpy(n, x): @pytest.mark.skipif(not gsl_available, reason="GSL library is not available, skipping mathieu_b_asymptotic tests.") @given( - n=st.integers(min_value=1, max_value=8), + n=st.integers(min_value=1, max_value=7), x=st.floats(min_value=150, max_value=500, allow_nan=False, allow_infinity=False), ) def test_mathieu_b_asymptotic_vs_gsl(n, x): @@ -59,3 +59,25 @@ def test_mathieu_b_asymptotic_vs_gsl(n, x): gsl_result = gsl_mathieu_b(n, x) assert asymptotic_result == pytest.approx(gsl_result, rel=1e-1) + + +@pytest.mark.skipif(not gsl_available, reason="GSL library is not available, skipping gsl_mathieu_b tests.") +@given( + n=st.integers(min_value=1, max_value=25), + q=st.floats(min_value=0.001, max_value=30), +) +def test_gsl_mathieu_se(n, q): + gsl_result = gsl_mathieu_se(n, q, 0) + assert gsl_result == 0 + + +@given( + n=st.integers(min_value=1, max_value=25), + q=st.floats(min_value=0.001, max_value=30), + x=st.floats(min_value=0.0, max_value=np.pi), +) +@settings(max_examples=5) +def test_scipy_mathieu_se(n, q, x): + large_result = scipy_mathieu_se(n, q, x) + scipy_result = scipy.special.mathieu_sem(n, q, x * 180 / np.pi)[0] + assert large_result == scipy_result From afc419e5458e820f7c9109f655a3afe2038dfb9c Mon Sep 17 00:00:00 2001 From: Marco Pizzocaro Date: Fri, 13 Sep 2024 18:23:40 +0200 Subject: [PATCH 08/14] Document or improve docs of most of the code --- README.md | 35 +- docs/Makefile | 20 + docs/make.bat | 35 + docs/source/Acknowledgement badge.png | Bin 0 -> 67632 bytes docs/source/conf.py | 40 + docs/source/index.md | 11 + poetry.lock | 1188 +++++++++++++++++++++-- pyproject.toml | 11 +- src/large_lattice_model/latticemodel.py | 270 +++--- src/large_lattice_model/mathieu.py | 52 +- src/large_lattice_model/settings.py | 34 +- src/large_lattice_model/sidebands.py | 102 ++ src/large_lattice_model/xyz.py | 91 +- 13 files changed, 1599 insertions(+), 290 deletions(-) create mode 100644 docs/Makefile create mode 100644 docs/make.bat create mode 100644 docs/source/Acknowledgement badge.png create mode 100644 docs/source/conf.py create mode 100644 docs/source/index.md create mode 100644 src/large_lattice_model/sidebands.py diff --git a/README.md b/README.md index 326d4f6..41c3589 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,38 @@ A python package to model the motional spectra of atoms trapped in a one-dimensional optical lattice. -# Requirements +## Requirements Large-lattice-model requires the calculation of Mathieu special function. -The current `scipy` implementation of Mathieu functions [is bugged.](https://github.com/scipy/scipy/pull/14577) +The current `scipy` implementation of Mathieu functions [is not continuous.](https://github.com/scipy/scipy/pull/14577) It is reccomended to install the [GSL Library](https://www.gnu.org/software/gsl/), for example using: -`$ sudo apt install libgsl-dev` + sudo apt install libgsl-dev -Large-lattice-model will use `ctypes` to import the GSL implementation and will fallback to `scipy` if it does not find GSL. \ No newline at end of file +Large-lattice-model will use `ctypes` to import the GSL implementation and will fallback to `scipy` if it does not find GSL. +Previous versions of the package used [`pygsl`](https://github.com/pygsl/pygsl), but the current version of `pygsl` does not implement [special functions](https://github.com/pygsl/pygsl/issues/55). + + + +## License + +[MIT](https://opensource.org/licenses/MIT) + +## References + +This package implements many ideas from the work of NIST Yb optical lattice clock group: + +[Beloy et al., Phys. Rev. A, 101, 053416 (2020).](https://doi.org/10.1103/PhysRevA.101.053416) + +It is developed for use in the INRIM Yb optical lattice clock IT-Yb1, see for example: + + +[Goti et al., Metrologia, 60, 035002 (2023).](https://dx.doi.org/10.1088/1681-7575/accbc5) + +## Acknowledgments +This work has received funding from the European Partnership on Metrology, co-financed by the European Union’s Horizon Europe Research and Innovation Programme and by the Participating States, under grant number 22IEM01 TOCK. + +![badge](./docs/source/Acknowledgement%20badge.png) + +## Authors + +(c) 2021-2024 Marco Pizzocaro - Istituto Nazionale di Ricerca Metrologica (INRIM) \ No newline at end of file diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d0c3cbf --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..747ffb7 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/source/Acknowledgement badge.png b/docs/source/Acknowledgement badge.png new file mode 100644 index 0000000000000000000000000000000000000000..e056fb0095cec9f4178fdbc9d8530c3a4e31bba0 GIT binary patch literal 67632 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.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] + +[[package]] +name = "astroid" +version = "3.3.2" +description = "An abstract syntax tree for Python with inference support." +optional = false +python-versions = ">=3.9.0" +files = [ + {file = "astroid-3.3.2-py3-none-any.whl", hash = "sha256:9f8136ce9770e0f912401b25a0f15d5c2ec20b50e99b1b413ac0778fe53ff6f1"}, + {file = "astroid-3.3.2.tar.gz", hash = "sha256:99e9b5b602cbb005434084309213d6af32bf7a9b743c836749168b8e2b330cbd"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} + [[package]] name = "asttokens" version = "2.4.1" @@ -37,6 +84,144 @@ docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphi tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] +[[package]] +name = "babel" +version = "2.16.0" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.8" +files = [ + {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, + {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, +] + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + +[[package]] +name = "certifi" +version = "2024.8.30" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + [[package]] name = "colorama" version = "0.4.6" @@ -158,6 +343,17 @@ files = [ {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, ] +[[package]] +name = "docutils" +version = "0.20.1" +description = "Docutils -- Python Documentation Utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, + {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, +] + [[package]] name = "exceptiongroup" version = "1.2.2" @@ -174,13 +370,13 @@ test = ["pytest (>=6)"] [[package]] name = "executing" -version = "2.0.1" +version = "2.1.0" description = "Get the currently executing AST node of a frame, and other information" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, - {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, + {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, + {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, ] [package.extras] @@ -251,6 +447,17 @@ ufo = ["fs (>=2.2.0,<3)"] unicode = ["unicodedata2 (>=15.1.0)"] woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + [[package]] name = "hypothesis" version = "6.112.0" @@ -284,6 +491,28 @@ pytz = ["pytz (>=2014.1)"] redis = ["redis (>=3.0.0)"] zoneinfo = ["backports.zoneinfo (>=0.2.1)", "tzdata (>=2024.1)"] +[[package]] +name = "idna" +version = "3.8" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, + {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, +] + +[[package]] +name = "imagesize" +version = "1.4.1" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] + [[package]] name = "iniconfig" version = "2.0.0" @@ -297,13 +526,13 @@ files = [ [[package]] name = "ipython" -version = "8.26.0" +version = "8.27.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" files = [ - {file = "ipython-8.26.0-py3-none-any.whl", hash = "sha256:e6b347c27bdf9c32ee9d31ae85defc525755a1869f14057e900675b9e8d6e6ff"}, - {file = "ipython-8.26.0.tar.gz", hash = "sha256:1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c"}, + {file = "ipython-8.27.0-py3-none-any.whl", hash = "sha256:f68b3cb8bde357a5d7adc9598d57e22a45dfbea19eb6b98286fa3b288c9cd55c"}, + {file = "ipython-8.27.0.tar.gz", hash = "sha256:0b99a2dc9f15fd68692e898e5568725c6d49c527d36a9fb5960ffbdeaa82ff7e"}, ] [package.dependencies] @@ -352,6 +581,23 @@ docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alab 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 = "jinja2" +version = "3.1.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + [[package]] name = "kiwisolver" version = "1.4.7" @@ -505,6 +751,99 @@ files = [ {file = "llvmlite-0.43.0.tar.gz", hash = "sha256:ae2b5b5c3ef67354824fb75517c8db5fbe93bc02cd9671f3c62271626bc041d5"}, ] +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + [[package]] name = "matplotlib" version = "3.9.2" @@ -582,6 +921,62 @@ files = [ [package.dependencies] traitlets = "*" +[[package]] +name = "mdit-py-plugins" +version = "0.4.2" +description = "Collection of plugins for markdown-it-py" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636"}, + {file = "mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5"}, +] + +[package.dependencies] +markdown-it-py = ">=1.0.0,<4.0.0" + +[package.extras] +code-style = ["pre-commit"] +rtd = ["myst-parser", "sphinx-book-theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "myst-parser" +version = "3.0.1" +description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser," +optional = false +python-versions = ">=3.8" +files = [ + {file = "myst_parser-3.0.1-py3-none-any.whl", hash = "sha256:6457aaa33a5d474aca678b8ead9b3dc298e89c68e67012e73146ea6fd54babf1"}, + {file = "myst_parser-3.0.1.tar.gz", hash = "sha256:88f0cb406cb363b077d176b51c476f62d60604d68a8dcdf4832e080441301a87"}, +] + +[package.dependencies] +docutils = ">=0.18,<0.22" +jinja2 = "*" +markdown-it-py = ">=3.0,<4.0" +mdit-py-plugins = ">=0.4,<1.0" +pyyaml = "*" +sphinx = ">=6,<8" + +[package.extras] +code-style = ["pre-commit (>=3.0,<4.0)"] +linkify = ["linkify-it-py (>=2.0,<3.0)"] +rtd = ["ipython", "sphinx (>=7)", "sphinx-autodoc2 (>=0.5.0,<0.6.0)", "sphinx-book-theme (>=1.1,<2.0)", "sphinx-copybutton", "sphinx-design", "sphinx-pyscript", "sphinx-tippy (>=0.4.3)", "sphinx-togglebutton", "sphinxext-opengraph (>=0.9.0,<0.10.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"] +testing = ["beautifulsoup4", "coverage[toml]", "defusedxml", "pytest (>=8,<9)", "pytest-cov", "pytest-param-files (>=0.6.0,<0.7.0)", "pytest-regressions", "sphinx-pytest"] +testing-docutils = ["pygments", "pytest (>=8,<9)", "pytest-param-files (>=0.6.0,<0.7.0)"] + [[package]] name = "numba" version = "0.60.0" @@ -618,56 +1013,56 @@ numpy = ">=1.22,<2.1" [[package]] name = "numpy" -version = "2.0.1" +version = "2.0.2" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fbb536eac80e27a2793ffd787895242b7f18ef792563d742c2d673bfcb75134"}, - {file = "numpy-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:69ff563d43c69b1baba77af455dd0a839df8d25e8590e79c90fcbe1499ebde42"}, - {file = "numpy-2.0.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:1b902ce0e0a5bb7704556a217c4f63a7974f8f43e090aff03fcf262e0b135e02"}, - {file = "numpy-2.0.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:f1659887361a7151f89e79b276ed8dff3d75877df906328f14d8bb40bb4f5101"}, - {file = "numpy-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4658c398d65d1b25e1760de3157011a80375da861709abd7cef3bad65d6543f9"}, - {file = "numpy-2.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4127d4303b9ac9f94ca0441138acead39928938660ca58329fe156f84b9f3015"}, - {file = "numpy-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e5eeca8067ad04bc8a2a8731183d51d7cbaac66d86085d5f4766ee6bf19c7f87"}, - {file = "numpy-2.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9adbd9bb520c866e1bfd7e10e1880a1f7749f1f6e5017686a5fbb9b72cf69f82"}, - {file = "numpy-2.0.1-cp310-cp310-win32.whl", hash = "sha256:7b9853803278db3bdcc6cd5beca37815b133e9e77ff3d4733c247414e78eb8d1"}, - {file = "numpy-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:81b0893a39bc5b865b8bf89e9ad7807e16717f19868e9d234bdaf9b1f1393868"}, - {file = "numpy-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75b4e316c5902d8163ef9d423b1c3f2f6252226d1aa5cd8a0a03a7d01ffc6268"}, - {file = "numpy-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6e4eeb6eb2fced786e32e6d8df9e755ce5be920d17f7ce00bc38fcde8ccdbf9e"}, - {file = "numpy-2.0.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a1e01dcaab205fbece13c1410253a9eea1b1c9b61d237b6fa59bcc46e8e89343"}, - {file = "numpy-2.0.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a8fc2de81ad835d999113ddf87d1ea2b0f4704cbd947c948d2f5513deafe5a7b"}, - {file = "numpy-2.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a3d94942c331dd4e0e1147f7a8699a4aa47dffc11bf8a1523c12af8b2e91bbe"}, - {file = "numpy-2.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15eb4eca47d36ec3f78cde0a3a2ee24cf05ca7396ef808dda2c0ddad7c2bde67"}, - {file = "numpy-2.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b83e16a5511d1b1f8a88cbabb1a6f6a499f82c062a4251892d9ad5d609863fb7"}, - {file = "numpy-2.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f87fec1f9bc1efd23f4227becff04bd0e979e23ca50cc92ec88b38489db3b55"}, - {file = "numpy-2.0.1-cp311-cp311-win32.whl", hash = "sha256:36d3a9405fd7c511804dc56fc32974fa5533bdeb3cd1604d6b8ff1d292b819c4"}, - {file = "numpy-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:08458fbf403bff5e2b45f08eda195d4b0c9b35682311da5a5a0a0925b11b9bd8"}, - {file = "numpy-2.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6bf4e6f4a2a2e26655717a1983ef6324f2664d7011f6ef7482e8c0b3d51e82ac"}, - {file = "numpy-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6fddc5fe258d3328cd8e3d7d3e02234c5d70e01ebe377a6ab92adb14039cb4"}, - {file = "numpy-2.0.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5daab361be6ddeb299a918a7c0864fa8618af66019138263247af405018b04e1"}, - {file = "numpy-2.0.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:ea2326a4dca88e4a274ba3a4405eb6c6467d3ffbd8c7d38632502eaae3820587"}, - {file = "numpy-2.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:529af13c5f4b7a932fb0e1911d3a75da204eff023ee5e0e79c1751564221a5c8"}, - {file = "numpy-2.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6790654cb13eab303d8402354fabd47472b24635700f631f041bd0b65e37298a"}, - {file = "numpy-2.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cbab9fc9c391700e3e1287666dfd82d8666d10e69a6c4a09ab97574c0b7ee0a7"}, - {file = "numpy-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:99d0d92a5e3613c33a5f01db206a33f8fdf3d71f2912b0de1739894668b7a93b"}, - {file = "numpy-2.0.1-cp312-cp312-win32.whl", hash = "sha256:173a00b9995f73b79eb0191129f2455f1e34c203f559dd118636858cc452a1bf"}, - {file = "numpy-2.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:bb2124fdc6e62baae159ebcfa368708867eb56806804d005860b6007388df171"}, - {file = "numpy-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bfc085b28d62ff4009364e7ca34b80a9a080cbd97c2c0630bb5f7f770dae9414"}, - {file = "numpy-2.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fae4ebbf95a179c1156fab0b142b74e4ba4204c87bde8d3d8b6f9c34c5825ef"}, - {file = "numpy-2.0.1-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:72dc22e9ec8f6eaa206deb1b1355eb2e253899d7347f5e2fae5f0af613741d06"}, - {file = "numpy-2.0.1-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:ec87f5f8aca726117a1c9b7083e7656a9d0d606eec7299cc067bb83d26f16e0c"}, - {file = "numpy-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f682ea61a88479d9498bf2091fdcd722b090724b08b31d63e022adc063bad59"}, - {file = "numpy-2.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8efc84f01c1cd7e34b3fb310183e72fcdf55293ee736d679b6d35b35d80bba26"}, - {file = "numpy-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3fdabe3e2a52bc4eff8dc7a5044342f8bd9f11ef0934fcd3289a788c0eb10018"}, - {file = "numpy-2.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:24a0e1befbfa14615b49ba9659d3d8818a0f4d8a1c5822af8696706fbda7310c"}, - {file = "numpy-2.0.1-cp39-cp39-win32.whl", hash = "sha256:f9cf5ea551aec449206954b075db819f52adc1638d46a6738253a712d553c7b4"}, - {file = "numpy-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:e9e81fa9017eaa416c056e5d9e71be93d05e2c3c2ab308d23307a8bc4443c368"}, - {file = "numpy-2.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61728fba1e464f789b11deb78a57805c70b2ed02343560456190d0501ba37b0f"}, - {file = "numpy-2.0.1-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:12f5d865d60fb9734e60a60f1d5afa6d962d8d4467c120a1c0cda6eb2964437d"}, - {file = "numpy-2.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eacf3291e263d5a67d8c1a581a8ebbcfd6447204ef58828caf69a5e3e8c75990"}, - {file = "numpy-2.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2c3a346ae20cfd80b6cfd3e60dc179963ef2ea58da5ec074fd3d9e7a1e7ba97f"}, - {file = "numpy-2.0.1.tar.gz", hash = "sha256:485b87235796410c3519a699cfe1faab097e509e90ebb05dcd098db2ae87e7b3"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326"}, + {file = "numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97"}, + {file = "numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15"}, + {file = "numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4"}, + {file = "numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded"}, + {file = "numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5"}, + {file = "numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d"}, + {file = "numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa"}, + {file = "numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385"}, + {file = "numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78"}, ] [[package]] @@ -891,13 +1286,13 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "8.3.2" +version = "8.3.3" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, - {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, + {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, + {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, ] [package.dependencies] @@ -925,65 +1320,156 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + [[package]] name = "ruff" -version = "0.5.4" +version = "0.5.7" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.5.4-py3-none-linux_armv6l.whl", hash = "sha256:82acef724fc639699b4d3177ed5cc14c2a5aacd92edd578a9e846d5b5ec18ddf"}, - {file = "ruff-0.5.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:da62e87637c8838b325e65beee485f71eb36202ce8e3cdbc24b9fcb8b99a37be"}, - {file = "ruff-0.5.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e98ad088edfe2f3b85a925ee96da652028f093d6b9b56b76fc242d8abb8e2059"}, - {file = "ruff-0.5.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c55efbecc3152d614cfe6c2247a3054cfe358cefbf794f8c79c8575456efe19"}, - {file = "ruff-0.5.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9b85eaa1f653abd0a70603b8b7008d9e00c9fa1bbd0bf40dad3f0c0bdd06793"}, - {file = "ruff-0.5.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0cf497a47751be8c883059c4613ba2f50dd06ec672692de2811f039432875278"}, - {file = "ruff-0.5.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:09c14ed6a72af9ccc8d2e313d7acf7037f0faff43cde4b507e66f14e812e37f7"}, - {file = "ruff-0.5.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:628f6b8f97b8bad2490240aa84f3e68f390e13fabc9af5c0d3b96b485921cd60"}, - {file = "ruff-0.5.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3520a00c0563d7a7a7c324ad7e2cde2355733dafa9592c671fb2e9e3cd8194c1"}, - {file = "ruff-0.5.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93789f14ca2244fb91ed481456f6d0bb8af1f75a330e133b67d08f06ad85b516"}, - {file = "ruff-0.5.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:029454e2824eafa25b9df46882f7f7844d36fd8ce51c1b7f6d97e2615a57bbcc"}, - {file = "ruff-0.5.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:9492320eed573a13a0bc09a2957f17aa733fff9ce5bf00e66e6d4a88ec33813f"}, - {file = "ruff-0.5.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a6e1f62a92c645e2919b65c02e79d1f61e78a58eddaebca6c23659e7c7cb4ac7"}, - {file = "ruff-0.5.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:768fa9208df2bec4b2ce61dbc7c2ddd6b1be9fb48f1f8d3b78b3332c7d71c1ff"}, - {file = "ruff-0.5.4-py3-none-win32.whl", hash = "sha256:e1e7393e9c56128e870b233c82ceb42164966f25b30f68acbb24ed69ce9c3a4e"}, - {file = "ruff-0.5.4-py3-none-win_amd64.whl", hash = "sha256:58b54459221fd3f661a7329f177f091eb35cf7a603f01d9eb3eb11cc348d38c4"}, - {file = "ruff-0.5.4-py3-none-win_arm64.whl", hash = "sha256:bd53da65f1085fb5b307c38fd3c0829e76acf7b2a912d8d79cadcdb4875c1eb7"}, - {file = "ruff-0.5.4.tar.gz", hash = "sha256:2795726d5f71c4f4e70653273d1c23a8182f07dd8e48c12de5d867bfb7557eed"}, + {file = "ruff-0.5.7-py3-none-linux_armv6l.whl", hash = "sha256:548992d342fc404ee2e15a242cdbea4f8e39a52f2e7752d0e4cbe88d2d2f416a"}, + {file = "ruff-0.5.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:00cc8872331055ee017c4f1071a8a31ca0809ccc0657da1d154a1d2abac5c0be"}, + {file = "ruff-0.5.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:eaf3d86a1fdac1aec8a3417a63587d93f906c678bb9ed0b796da7b59c1114a1e"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a01c34400097b06cf8a6e61b35d6d456d5bd1ae6961542de18ec81eaf33b4cb8"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcc8054f1a717e2213500edaddcf1dbb0abad40d98e1bd9d0ad364f75c763eea"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f70284e73f36558ef51602254451e50dd6cc479f8b6f8413a95fcb5db4a55fc"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:a78ad870ae3c460394fc95437d43deb5c04b5c29297815a2a1de028903f19692"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ccd078c66a8e419475174bfe60a69adb36ce04f8d4e91b006f1329d5cd44bcf"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e31c9bad4ebf8fdb77b59cae75814440731060a09a0e0077d559a556453acbb"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d796327eed8e168164346b769dd9a27a70e0298d667b4ecee6877ce8095ec8e"}, + {file = "ruff-0.5.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4a09ea2c3f7778cc635e7f6edf57d566a8ee8f485f3c4454db7771efb692c499"}, + {file = "ruff-0.5.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a36d8dcf55b3a3bc353270d544fb170d75d2dff41eba5df57b4e0b67a95bb64e"}, + {file = "ruff-0.5.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9369c218f789eefbd1b8d82a8cf25017b523ac47d96b2f531eba73770971c9e5"}, + {file = "ruff-0.5.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b88ca3db7eb377eb24fb7c82840546fb7acef75af4a74bd36e9ceb37a890257e"}, + {file = "ruff-0.5.7-py3-none-win32.whl", hash = "sha256:33d61fc0e902198a3e55719f4be6b375b28f860b09c281e4bdbf783c0566576a"}, + {file = "ruff-0.5.7-py3-none-win_amd64.whl", hash = "sha256:083bbcbe6fadb93cd86709037acc510f86eed5a314203079df174c40bbbca6b3"}, + {file = "ruff-0.5.7-py3-none-win_arm64.whl", hash = "sha256:2dca26154ff9571995107221d0aeaad0e75a77b5a682d6236cf89a58c70b76f4"}, + {file = "ruff-0.5.7.tar.gz", hash = "sha256:8dfc0a458797f5d9fb622dd0efc52d796f23f0a1493a9527f4e49a550ae9a7e5"}, ] [[package]] name = "scipy" -version = "1.14.0" +version = "1.14.1" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.10" files = [ - {file = "scipy-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7e911933d54ead4d557c02402710c2396529540b81dd554fc1ba270eb7308484"}, - {file = "scipy-1.14.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:687af0a35462402dd851726295c1a5ae5f987bd6e9026f52e9505994e2f84ef6"}, - {file = "scipy-1.14.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:07e179dc0205a50721022344fb85074f772eadbda1e1b3eecdc483f8033709b7"}, - {file = "scipy-1.14.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:6a9c9a9b226d9a21e0a208bdb024c3982932e43811b62d202aaf1bb59af264b1"}, - {file = "scipy-1.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:076c27284c768b84a45dcf2e914d4000aac537da74236a0d45d82c6fa4b7b3c0"}, - {file = "scipy-1.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42470ea0195336df319741e230626b6225a740fd9dce9642ca13e98f667047c0"}, - {file = "scipy-1.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:176c6f0d0470a32f1b2efaf40c3d37a24876cebf447498a4cefb947a79c21e9d"}, - {file = "scipy-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:ad36af9626d27a4326c8e884917b7ec321d8a1841cd6dacc67d2a9e90c2f0359"}, - {file = "scipy-1.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6d056a8709ccda6cf36cdd2eac597d13bc03dba38360f418560a93050c76a16e"}, - {file = "scipy-1.14.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:f0a50da861a7ec4573b7c716b2ebdcdf142b66b756a0d392c236ae568b3a93fb"}, - {file = "scipy-1.14.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:94c164a9e2498e68308e6e148646e486d979f7fcdb8b4cf34b5441894bdb9caf"}, - {file = "scipy-1.14.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a7d46c3e0aea5c064e734c3eac5cf9eb1f8c4ceee756262f2c7327c4c2691c86"}, - {file = "scipy-1.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9eee2989868e274aae26125345584254d97c56194c072ed96cb433f32f692ed8"}, - {file = "scipy-1.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3154691b9f7ed73778d746da2df67a19d046a6c8087c8b385bc4cdb2cfca74"}, - {file = "scipy-1.14.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c40003d880f39c11c1edbae8144e3813904b10514cd3d3d00c277ae996488cdb"}, - {file = "scipy-1.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:5b083c8940028bb7e0b4172acafda6df762da1927b9091f9611b0bcd8676f2bc"}, - {file = "scipy-1.14.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff2438ea1330e06e53c424893ec0072640dac00f29c6a43a575cbae4c99b2b9"}, - {file = "scipy-1.14.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:bbc0471b5f22c11c389075d091d3885693fd3f5e9a54ce051b46308bc787e5d4"}, - {file = "scipy-1.14.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:64b2ff514a98cf2bb734a9f90d32dc89dc6ad4a4a36a312cd0d6327170339eb0"}, - {file = "scipy-1.14.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:7d3da42fbbbb860211a811782504f38ae7aaec9de8764a9bef6b262de7a2b50f"}, - {file = "scipy-1.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d91db2c41dd6c20646af280355d41dfa1ec7eead235642178bd57635a3f82209"}, - {file = "scipy-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a01cc03bcdc777c9da3cfdcc74b5a75caffb48a6c39c8450a9a05f82c4250a14"}, - {file = "scipy-1.14.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:65df4da3c12a2bb9ad52b86b4dcf46813e869afb006e58be0f516bc370165159"}, - {file = "scipy-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:4c4161597c75043f7154238ef419c29a64ac4a7c889d588ea77690ac4d0d9b20"}, - {file = "scipy-1.14.0.tar.gz", hash = "sha256:b5923f48cb840380f9854339176ef21763118a7300a88203ccd0bdd26e58527b"}, + {file = "scipy-1.14.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:b28d2ca4add7ac16ae8bb6632a3c86e4b9e4d52d3e34267f6e1b0c1f8d87e389"}, + {file = "scipy-1.14.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d0d2821003174de06b69e58cef2316a6622b60ee613121199cb2852a873f8cf3"}, + {file = "scipy-1.14.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8bddf15838ba768bb5f5083c1ea012d64c9a444e16192762bd858f1e126196d0"}, + {file = "scipy-1.14.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:97c5dddd5932bd2a1a31c927ba5e1463a53b87ca96b5c9bdf5dfd6096e27efc3"}, + {file = "scipy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ff0a7e01e422c15739ecd64432743cf7aae2b03f3084288f399affcefe5222d"}, + {file = "scipy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e32dced201274bf96899e6491d9ba3e9a5f6b336708656466ad0522d8528f69"}, + {file = "scipy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8426251ad1e4ad903a4514712d2fa8fdd5382c978010d1c6f5f37ef286a713ad"}, + {file = "scipy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:a49f6ed96f83966f576b33a44257d869756df6cf1ef4934f59dd58b25e0327e5"}, + {file = "scipy-1.14.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:2da0469a4ef0ecd3693761acbdc20f2fdeafb69e6819cc081308cc978153c675"}, + {file = "scipy-1.14.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:c0ee987efa6737242745f347835da2cc5bb9f1b42996a4d97d5c7ff7928cb6f2"}, + {file = "scipy-1.14.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3a1b111fac6baec1c1d92f27e76511c9e7218f1695d61b59e05e0fe04dc59617"}, + {file = "scipy-1.14.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8475230e55549ab3f207bff11ebfc91c805dc3463ef62eda3ccf593254524ce8"}, + {file = "scipy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:278266012eb69f4a720827bdd2dc54b2271c97d84255b2faaa8f161a158c3b37"}, + {file = "scipy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fef8c87f8abfb884dac04e97824b61299880c43f4ce675dd2cbeadd3c9b466d2"}, + {file = "scipy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b05d43735bb2f07d689f56f7b474788a13ed8adc484a85aa65c0fd931cf9ccd2"}, + {file = "scipy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:716e389b694c4bb564b4fc0c51bc84d381735e0d39d3f26ec1af2556ec6aad94"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:631f07b3734d34aced009aaf6fedfd0eb3498a97e581c3b1e5f14a04164a456d"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:af29a935803cc707ab2ed7791c44288a682f9c8107bc00f0eccc4f92c08d6e07"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2843f2d527d9eebec9a43e6b406fb7266f3af25a751aa91d62ff416f54170bc5"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:eb58ca0abd96911932f688528977858681a59d61a7ce908ffd355957f7025cfc"}, + {file = "scipy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30ac8812c1d2aab7131a79ba62933a2a76f582d5dbbc695192453dae67ad6310"}, + {file = "scipy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f9ea80f2e65bdaa0b7627fb00cbeb2daf163caa015e59b7516395fe3bd1e066"}, + {file = "scipy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:edaf02b82cd7639db00dbff629995ef185c8df4c3ffa71a5562a595765a06ce1"}, + {file = "scipy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:2ff38e22128e6c03ff73b6bb0f85f897d2362f8c052e3b8ad00532198fbdae3f"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1729560c906963fc8389f6aac023739ff3983e727b1a4d87696b7bf108316a79"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:4079b90df244709e675cdc8b93bfd8a395d59af40b72e339c2287c91860deb8e"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e0cf28db0f24a38b2a0ca33a85a54852586e43cf6fd876365c86e0657cfe7d73"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0c2f95de3b04e26f5f3ad5bb05e74ba7f68b837133a4492414b3afd79dfe540e"}, + {file = "scipy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b99722ea48b7ea25e8e015e8341ae74624f72e5f21fc2abd45f3a93266de4c5d"}, + {file = "scipy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5149e3fd2d686e42144a093b206aef01932a0059c2a33ddfa67f5f035bdfe13e"}, + {file = "scipy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4f5a7c49323533f9103d4dacf4e4f07078f360743dec7f7596949149efeec06"}, + {file = "scipy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:baff393942b550823bfce952bb62270ee17504d02a1801d7fd0719534dfb9c84"}, + {file = "scipy-1.14.1.tar.gz", hash = "sha256:5a275584e726026a5699459aa72f828a610821006228e841b94275c4a7c08417"}, ] [package.dependencies] @@ -991,8 +1477,8 @@ numpy = ">=1.23.5,<2.3" [package.extras] dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] -doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.13.1)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"] -test = ["Cython", "array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.13.1)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<=7.3.7)", "sphinx-design (>=0.4.0)"] +test = ["Cython", "array-api-strict (>=2.0)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "six" @@ -1005,6 +1491,28 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +optional = false +python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] + [[package]] name = "sortedcontainers" version = "2.4.0" @@ -1016,6 +1524,235 @@ files = [ {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, ] +[[package]] +name = "sphinx" +version = "7.4.7" +description = "Python documentation generator" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239"}, + {file = "sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe"}, +] + +[package.dependencies] +alabaster = ">=0.7.14,<0.8.0" +babel = ">=2.13" +colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""} +docutils = ">=0.20,<0.22" +imagesize = ">=1.3" +Jinja2 = ">=3.1" +packaging = ">=23.0" +Pygments = ">=2.17" +requests = ">=2.30.0" +snowballstemmer = ">=2.2" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = ">=2.0.0" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = ">=1.1.9" +tomli = {version = ">=2", markers = "python_version < \"3.11\""} + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["flake8 (>=6.0)", "importlib-metadata (>=6.0)", "mypy (==1.10.1)", "pytest (>=6.0)", "ruff (==0.5.2)", "sphinx-lint (>=0.9)", "tomli (>=2)", "types-docutils (==0.21.0.20240711)", "types-requests (>=2.30.0)"] +test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "setuptools (>=70.0)", "typing_extensions (>=4.9)"] + +[[package]] +name = "sphinx-autoapi" +version = "3.3.1" +description = "Sphinx API documentation generator" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sphinx_autoapi-3.3.1-py2.py3-none-any.whl", hash = "sha256:c31a5f41eabc9705d277b75f98e983d653e9af24e294dd576b2afa1719f72c1f"}, + {file = "sphinx_autoapi-3.3.1.tar.gz", hash = "sha256:e44a225827d0ef7178748225a66f30c95454dfd00ee3c22afbdfb8056f7dffb5"}, +] + +[package.dependencies] +astroid = [ + {version = ">=2.7", markers = "python_version < \"3.12\""}, + {version = ">=3.0.0a1", markers = "python_version >= \"3.12\""}, +] +Jinja2 = "*" +PyYAML = "*" +sphinx = ">=6.1.0" + +[package.extras] +docs = ["furo", "sphinx", "sphinx-design"] + +[[package]] +name = "sphinx-autobuild" +version = "2024.9.3" +description = "Rebuild Sphinx documentation on changes, with hot reloading in the browser." +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinx_autobuild-2024.9.3-py3-none-any.whl", hash = "sha256:55fe9bcc05dab659650d79bed0e6beb8b6032234edbf23f028f2cac3471f0c2d"}, + {file = "sphinx_autobuild-2024.9.3.tar.gz", hash = "sha256:75929a5a92b932da8d29837406d6d973a927c456f30986a27f1f20b067897892"}, +] + +[package.dependencies] +colorama = ">=0.4.6" +sphinx = "*" +starlette = ">=0.35" +uvicorn = ">=0.25" +watchfiles = ">=0.20" +websockets = ">=11" + +[package.extras] +test = ["httpx", "pytest (>=6)"] + +[[package]] +name = "sphinx-autodoc2" +version = "0.5.0" +description = "Analyse a python project and create documentation for it." +optional = false +python-versions = ">=3.8" +files = [ + {file = "sphinx_autodoc2-0.5.0-py3-none-any.whl", hash = "sha256:e867013b1512f9d6d7e6f6799f8b537d6884462acd118ef361f3f619a60b5c9e"}, + {file = "sphinx_autodoc2-0.5.0.tar.gz", hash = "sha256:7d76044aa81d6af74447080182b6868c7eb066874edc835e8ddf810735b6565a"}, +] + +[package.dependencies] +astroid = ">=2.7,<4" +tomli = {version = "*", markers = "python_version < \"3.11\""} +typing-extensions = "*" + +[package.extras] +cli = ["typer[all]"] +docs = ["furo", "myst-parser", "sphinx (>=4.0.0)"] +sphinx = ["sphinx (>=4.0.0)"] +testing = ["pytest", "pytest-cov", "pytest-regressions", "sphinx (>=4.0.0,<7)"] + +[[package]] +name = "sphinx-rtd-theme" +version = "2.0.0" +description = "Read the Docs theme for Sphinx" +optional = false +python-versions = ">=3.6" +files = [ + {file = "sphinx_rtd_theme-2.0.0-py2.py3-none-any.whl", hash = "sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586"}, + {file = "sphinx_rtd_theme-2.0.0.tar.gz", hash = "sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b"}, +] + +[package.dependencies] +docutils = "<0.21" +sphinx = ">=5,<8" +sphinxcontrib-jquery = ">=4,<5" + +[package.extras] +dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "2.0.0" +description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"}, + {file = "sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1"}, +] + +[package.extras] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "2.0.0" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"}, + {file = "sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad"}, +] + +[package.extras] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.1.0" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8"}, + {file = "sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"}, +] + +[package.extras] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] +test = ["html5lib", "pytest"] + +[[package]] +name = "sphinxcontrib-jquery" +version = "4.1" +description = "Extension to include jQuery on newer Sphinx releases" +optional = false +python-versions = ">=2.7" +files = [ + {file = "sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a"}, + {file = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae"}, +] + +[package.dependencies] +Sphinx = ">=1.8" + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] + +[package.extras] +test = ["flake8", "mypy", "pytest"] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "2.0.0" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"}, + {file = "sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab"}, +] + +[package.extras] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] +test = ["defusedxml (>=0.7.1)", "pytest"] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "2.0.0" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331"}, + {file = "sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"}, +] + +[package.extras] +lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] +standalone = ["Sphinx (>=5)"] +test = ["pytest"] + [[package]] name = "stack-data" version = "0.6.3" @@ -1035,6 +1772,23 @@ pure-eval = "*" [package.extras] tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] +[[package]] +name = "starlette" +version = "0.38.5" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.8" +files = [ + {file = "starlette-0.38.5-py3-none-any.whl", hash = "sha256:632f420a9d13e3ee2a6f18f437b0a9f1faecb0bc42e1942aa2ea0e379a4c4206"}, + {file = "starlette-0.38.5.tar.gz", hash = "sha256:04a92830a9b6eb1442c766199d62260c3d4dc9c4f9188360626b1e0273cb7077"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] + [[package]] name = "tomli" version = "2.0.1" @@ -1072,6 +1826,137 @@ files = [ {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] +[[package]] +name = "urllib3" +version = "2.2.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "uvicorn" +version = "0.30.6" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.8" +files = [ + {file = "uvicorn-0.30.6-py3-none-any.whl", hash = "sha256:65fd46fe3fda5bdc1b03b94eb634923ff18cd35b2f084813ea79d1f103f711b5"}, + {file = "uvicorn-0.30.6.tar.gz", hash = "sha256:4b15decdda1e72be08209e860a1e10e92439ad5b97cf44cc945fcbee66fc5788"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" +typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "watchfiles" +version = "0.24.0" +description = "Simple, modern and high performance file watching and code reload in python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "watchfiles-0.24.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:083dc77dbdeef09fa44bb0f4d1df571d2e12d8a8f985dccde71ac3ac9ac067a0"}, + {file = "watchfiles-0.24.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e94e98c7cb94cfa6e071d401ea3342767f28eb5a06a58fafdc0d2a4974f4f35c"}, + {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82ae557a8c037c42a6ef26c494d0631cacca040934b101d001100ed93d43f361"}, + {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:acbfa31e315a8f14fe33e3542cbcafc55703b8f5dcbb7c1eecd30f141df50db3"}, + {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b74fdffce9dfcf2dc296dec8743e5b0332d15df19ae464f0e249aa871fc1c571"}, + {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:449f43f49c8ddca87c6b3980c9284cab6bd1f5c9d9a2b00012adaaccd5e7decd"}, + {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4abf4ad269856618f82dee296ac66b0cd1d71450fc3c98532d93798e73399b7a"}, + {file = "watchfiles-0.24.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f895d785eb6164678ff4bb5cc60c5996b3ee6df3edb28dcdeba86a13ea0465e"}, + {file = "watchfiles-0.24.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ae3e208b31be8ce7f4c2c0034f33406dd24fbce3467f77223d10cd86778471c"}, + {file = "watchfiles-0.24.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2efec17819b0046dde35d13fb8ac7a3ad877af41ae4640f4109d9154ed30a188"}, + {file = "watchfiles-0.24.0-cp310-none-win32.whl", hash = "sha256:6bdcfa3cd6fdbdd1a068a52820f46a815401cbc2cb187dd006cb076675e7b735"}, + {file = "watchfiles-0.24.0-cp310-none-win_amd64.whl", hash = "sha256:54ca90a9ae6597ae6dc00e7ed0a040ef723f84ec517d3e7ce13e63e4bc82fa04"}, + {file = "watchfiles-0.24.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:bdcd5538e27f188dd3c804b4a8d5f52a7fc7f87e7fd6b374b8e36a4ca03db428"}, + {file = "watchfiles-0.24.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2dadf8a8014fde6addfd3c379e6ed1a981c8f0a48292d662e27cabfe4239c83c"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6509ed3f467b79d95fc62a98229f79b1a60d1b93f101e1c61d10c95a46a84f43"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8360f7314a070c30e4c976b183d1d8d1585a4a50c5cb603f431cebcbb4f66327"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:316449aefacf40147a9efaf3bd7c9bdd35aaba9ac5d708bd1eb5763c9a02bef5"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73bde715f940bea845a95247ea3e5eb17769ba1010efdc938ffcb967c634fa61"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3770e260b18e7f4e576edca4c0a639f704088602e0bc921c5c2e721e3acb8d15"}, + {file = "watchfiles-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa0fd7248cf533c259e59dc593a60973a73e881162b1a2f73360547132742823"}, + {file = "watchfiles-0.24.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d7a2e3b7f5703ffbd500dabdefcbc9eafeff4b9444bbdd5d83d79eedf8428fab"}, + {file = "watchfiles-0.24.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d831ee0a50946d24a53821819b2327d5751b0c938b12c0653ea5be7dea9c82ec"}, + {file = "watchfiles-0.24.0-cp311-none-win32.whl", hash = "sha256:49d617df841a63b4445790a254013aea2120357ccacbed00253f9c2b5dc24e2d"}, + {file = "watchfiles-0.24.0-cp311-none-win_amd64.whl", hash = "sha256:d3dcb774e3568477275cc76554b5a565024b8ba3a0322f77c246bc7111c5bb9c"}, + {file = "watchfiles-0.24.0-cp311-none-win_arm64.whl", hash = "sha256:9301c689051a4857d5b10777da23fafb8e8e921bcf3abe6448a058d27fb67633"}, + {file = "watchfiles-0.24.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7211b463695d1e995ca3feb38b69227e46dbd03947172585ecb0588f19b0d87a"}, + {file = "watchfiles-0.24.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4b8693502d1967b00f2fb82fc1e744df128ba22f530e15b763c8d82baee15370"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdab9555053399318b953a1fe1f586e945bc8d635ce9d05e617fd9fe3a4687d6"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:34e19e56d68b0dad5cff62273107cf5d9fbaf9d75c46277aa5d803b3ef8a9e9b"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:41face41f036fee09eba33a5b53a73e9a43d5cb2c53dad8e61fa6c9f91b5a51e"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5148c2f1ea043db13ce9b0c28456e18ecc8f14f41325aa624314095b6aa2e9ea"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e4bd963a935aaf40b625c2499f3f4f6bbd0c3776f6d3bc7c853d04824ff1c9f"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c79d7719d027b7a42817c5d96461a99b6a49979c143839fc37aa5748c322f234"}, + {file = "watchfiles-0.24.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:32aa53a9a63b7f01ed32e316e354e81e9da0e6267435c7243bf8ae0f10b428ef"}, + {file = "watchfiles-0.24.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce72dba6a20e39a0c628258b5c308779b8697f7676c254a845715e2a1039b968"}, + {file = "watchfiles-0.24.0-cp312-none-win32.whl", hash = "sha256:d9018153cf57fc302a2a34cb7564870b859ed9a732d16b41a9b5cb2ebed2d444"}, + {file = "watchfiles-0.24.0-cp312-none-win_amd64.whl", hash = "sha256:551ec3ee2a3ac9cbcf48a4ec76e42c2ef938a7e905a35b42a1267fa4b1645896"}, + {file = "watchfiles-0.24.0-cp312-none-win_arm64.whl", hash = "sha256:b52a65e4ea43c6d149c5f8ddb0bef8d4a1e779b77591a458a893eb416624a418"}, + {file = "watchfiles-0.24.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3d2e3ab79a1771c530233cadfd277fcc762656d50836c77abb2e5e72b88e3a48"}, + {file = "watchfiles-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:327763da824817b38ad125dcd97595f942d720d32d879f6c4ddf843e3da3fe90"}, + {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd82010f8ab451dabe36054a1622870166a67cf3fce894f68895db6f74bbdc94"}, + {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d64ba08db72e5dfd5c33be1e1e687d5e4fcce09219e8aee893a4862034081d4e"}, + {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1cf1f6dd7825053f3d98f6d33f6464ebdd9ee95acd74ba2c34e183086900a827"}, + {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43e3e37c15a8b6fe00c1bce2473cfa8eb3484bbeecf3aefbf259227e487a03df"}, + {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88bcd4d0fe1d8ff43675360a72def210ebad3f3f72cabfeac08d825d2639b4ab"}, + {file = "watchfiles-0.24.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:999928c6434372fde16c8f27143d3e97201160b48a614071261701615a2a156f"}, + {file = "watchfiles-0.24.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:30bbd525c3262fd9f4b1865cb8d88e21161366561cd7c9e1194819e0a33ea86b"}, + {file = "watchfiles-0.24.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:edf71b01dec9f766fb285b73930f95f730bb0943500ba0566ae234b5c1618c18"}, + {file = "watchfiles-0.24.0-cp313-none-win32.whl", hash = "sha256:f4c96283fca3ee09fb044f02156d9570d156698bc3734252175a38f0e8975f07"}, + {file = "watchfiles-0.24.0-cp313-none-win_amd64.whl", hash = "sha256:a974231b4fdd1bb7f62064a0565a6b107d27d21d9acb50c484d2cdba515b9366"}, + {file = "watchfiles-0.24.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ee82c98bed9d97cd2f53bdb035e619309a098ea53ce525833e26b93f673bc318"}, + {file = "watchfiles-0.24.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fd92bbaa2ecdb7864b7600dcdb6f2f1db6e0346ed425fbd01085be04c63f0b05"}, + {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f83df90191d67af5a831da3a33dd7628b02a95450e168785586ed51e6d28943c"}, + {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fca9433a45f18b7c779d2bae7beeec4f740d28b788b117a48368d95a3233ed83"}, + {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b995bfa6bf01a9e09b884077a6d37070464b529d8682d7691c2d3b540d357a0c"}, + {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed9aba6e01ff6f2e8285e5aa4154e2970068fe0fc0998c4380d0e6278222269b"}, + {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5171ef898299c657685306d8e1478a45e9303ddcd8ac5fed5bd52ad4ae0b69b"}, + {file = "watchfiles-0.24.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4933a508d2f78099162da473841c652ad0de892719043d3f07cc83b33dfd9d91"}, + {file = "watchfiles-0.24.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95cf3b95ea665ab03f5a54765fa41abf0529dbaf372c3b83d91ad2cfa695779b"}, + {file = "watchfiles-0.24.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:01def80eb62bd5db99a798d5e1f5f940ca0a05986dcfae21d833af7a46f7ee22"}, + {file = "watchfiles-0.24.0-cp38-none-win32.whl", hash = "sha256:4d28cea3c976499475f5b7a2fec6b3a36208656963c1a856d328aeae056fc5c1"}, + {file = "watchfiles-0.24.0-cp38-none-win_amd64.whl", hash = "sha256:21ab23fdc1208086d99ad3f69c231ba265628014d4aed31d4e8746bd59e88cd1"}, + {file = "watchfiles-0.24.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b665caeeda58625c3946ad7308fbd88a086ee51ccb706307e5b1fa91556ac886"}, + {file = "watchfiles-0.24.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5c51749f3e4e269231510da426ce4a44beb98db2dce9097225c338f815b05d4f"}, + {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82b2509f08761f29a0fdad35f7e1638b8ab1adfa2666d41b794090361fb8b855"}, + {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a60e2bf9dc6afe7f743e7c9b149d1fdd6dbf35153c78fe3a14ae1a9aee3d98b"}, + {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7d9b87c4c55e3ea8881dfcbf6d61ea6775fffed1fedffaa60bd047d3c08c430"}, + {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:78470906a6be5199524641f538bd2c56bb809cd4bf29a566a75051610bc982c3"}, + {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07cdef0c84c03375f4e24642ef8d8178e533596b229d32d2bbd69e5128ede02a"}, + {file = "watchfiles-0.24.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d337193bbf3e45171c8025e291530fb7548a93c45253897cd764a6a71c937ed9"}, + {file = "watchfiles-0.24.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ec39698c45b11d9694a1b635a70946a5bad066b593af863460a8e600f0dff1ca"}, + {file = "watchfiles-0.24.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e28d91ef48eab0afb939fa446d8ebe77e2f7593f5f463fd2bb2b14132f95b6e"}, + {file = "watchfiles-0.24.0-cp39-none-win32.whl", hash = "sha256:7138eff8baa883aeaa074359daabb8b6c1e73ffe69d5accdc907d62e50b1c0da"}, + {file = "watchfiles-0.24.0-cp39-none-win_amd64.whl", hash = "sha256:b3ef2c69c655db63deb96b3c3e587084612f9b1fa983df5e0c3379d41307467f"}, + {file = "watchfiles-0.24.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:632676574429bee8c26be8af52af20e0c718cc7f5f67f3fb658c71928ccd4f7f"}, + {file = "watchfiles-0.24.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a2a9891723a735d3e2540651184be6fd5b96880c08ffe1a98bae5017e65b544b"}, + {file = "watchfiles-0.24.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7fa2bc0efef3e209a8199fd111b8969fe9db9c711acc46636686331eda7dd4"}, + {file = "watchfiles-0.24.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01550ccf1d0aed6ea375ef259706af76ad009ef5b0203a3a4cce0f6024f9b68a"}, + {file = "watchfiles-0.24.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:96619302d4374de5e2345b2b622dc481257a99431277662c30f606f3e22f42be"}, + {file = "watchfiles-0.24.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:85d5f0c7771dcc7a26c7a27145059b6bb0ce06e4e751ed76cdf123d7039b60b5"}, + {file = "watchfiles-0.24.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:951088d12d339690a92cef2ec5d3cfd957692834c72ffd570ea76a6790222777"}, + {file = "watchfiles-0.24.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49fb58bcaa343fedc6a9e91f90195b20ccb3135447dc9e4e2570c3a39565853e"}, + {file = "watchfiles-0.24.0.tar.gz", hash = "sha256:afb72325b74fa7a428c009c1b8be4b4d7c2afedafb2982827ef2156646df2fe1"}, +] + +[package.dependencies] +anyio = ">=3.0.0" + [[package]] name = "wcwidth" version = "0.2.13" @@ -1083,7 +1968,102 @@ files = [ {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] +[[package]] +name = "websockets" +version = "13.0.1" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websockets-13.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1841c9082a3ba4a05ea824cf6d99570a6a2d8849ef0db16e9c826acb28089e8f"}, + {file = "websockets-13.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c5870b4a11b77e4caa3937142b650fbbc0914a3e07a0cf3131f35c0587489c1c"}, + {file = "websockets-13.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f1d3d1f2eb79fe7b0fb02e599b2bf76a7619c79300fc55f0b5e2d382881d4f7f"}, + {file = "websockets-13.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15c7d62ee071fa94a2fc52c2b472fed4af258d43f9030479d9c4a2de885fd543"}, + {file = "websockets-13.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6724b554b70d6195ba19650fef5759ef11346f946c07dbbe390e039bcaa7cc3d"}, + {file = "websockets-13.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56a952fa2ae57a42ba7951e6b2605e08a24801a4931b5644dfc68939e041bc7f"}, + {file = "websockets-13.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:17118647c0ea14796364299e942c330d72acc4b248e07e639d34b75067b3cdd8"}, + {file = "websockets-13.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64a11aae1de4c178fa653b07d90f2fb1a2ed31919a5ea2361a38760192e1858b"}, + {file = "websockets-13.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0617fd0b1d14309c7eab6ba5deae8a7179959861846cbc5cb528a7531c249448"}, + {file = "websockets-13.0.1-cp310-cp310-win32.whl", hash = "sha256:11f9976ecbc530248cf162e359a92f37b7b282de88d1d194f2167b5e7ad80ce3"}, + {file = "websockets-13.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:c3c493d0e5141ec055a7d6809a28ac2b88d5b878bb22df8c621ebe79a61123d0"}, + {file = "websockets-13.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:699ba9dd6a926f82a277063603fc8d586b89f4cb128efc353b749b641fcddda7"}, + {file = "websockets-13.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cf2fae6d85e5dc384bf846f8243ddaa9197f3a1a70044f59399af001fd1f51d4"}, + {file = "websockets-13.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:52aed6ef21a0f1a2a5e310fb5c42d7555e9c5855476bbd7173c3aa3d8a0302f2"}, + {file = "websockets-13.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8eb2b9a318542153674c6e377eb8cb9ca0fc011c04475110d3477862f15d29f0"}, + {file = "websockets-13.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5df891c86fe68b2c38da55b7aea7095beca105933c697d719f3f45f4220a5e0e"}, + {file = "websockets-13.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fac2d146ff30d9dd2fcf917e5d147db037a5c573f0446c564f16f1f94cf87462"}, + {file = "websockets-13.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b8ac5b46fd798bbbf2ac6620e0437c36a202b08e1f827832c4bf050da081b501"}, + {file = "websockets-13.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:46af561eba6f9b0848b2c9d2427086cabadf14e0abdd9fde9d72d447df268418"}, + {file = "websockets-13.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b5a06d7f60bc2fc378a333978470dfc4e1415ee52f5f0fce4f7853eb10c1e9df"}, + {file = "websockets-13.0.1-cp311-cp311-win32.whl", hash = "sha256:556e70e4f69be1082e6ef26dcb70efcd08d1850f5d6c5f4f2bcb4e397e68f01f"}, + {file = "websockets-13.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:67494e95d6565bf395476e9d040037ff69c8b3fa356a886b21d8422ad86ae075"}, + {file = "websockets-13.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f9c9e258e3d5efe199ec23903f5da0eeaad58cf6fccb3547b74fd4750e5ac47a"}, + {file = "websockets-13.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6b41a1b3b561f1cba8321fb32987552a024a8f67f0d05f06fcf29f0090a1b956"}, + {file = "websockets-13.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f73e676a46b0fe9426612ce8caeca54c9073191a77c3e9d5c94697aef99296af"}, + {file = "websockets-13.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f613289f4a94142f914aafad6c6c87903de78eae1e140fa769a7385fb232fdf"}, + {file = "websockets-13.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f52504023b1480d458adf496dc1c9e9811df4ba4752f0bc1f89ae92f4f07d0c"}, + {file = "websockets-13.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:139add0f98206cb74109faf3611b7783ceafc928529c62b389917a037d4cfdf4"}, + {file = "websockets-13.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:47236c13be337ef36546004ce8c5580f4b1150d9538b27bf8a5ad8edf23ccfab"}, + {file = "websockets-13.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c44ca9ade59b2e376612df34e837013e2b273e6c92d7ed6636d0556b6f4db93d"}, + {file = "websockets-13.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9bbc525f4be3e51b89b2a700f5746c2a6907d2e2ef4513a8daafc98198b92237"}, + {file = "websockets-13.0.1-cp312-cp312-win32.whl", hash = "sha256:3624fd8664f2577cf8de996db3250662e259bfbc870dd8ebdcf5d7c6ac0b5185"}, + {file = "websockets-13.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0513c727fb8adffa6d9bf4a4463b2bade0186cbd8c3604ae5540fae18a90cb99"}, + {file = "websockets-13.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1ee4cc030a4bdab482a37462dbf3ffb7e09334d01dd37d1063be1136a0d825fa"}, + {file = "websockets-13.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dbb0b697cc0655719522406c059eae233abaa3243821cfdfab1215d02ac10231"}, + {file = "websockets-13.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:acbebec8cb3d4df6e2488fbf34702cbc37fc39ac7abf9449392cefb3305562e9"}, + {file = "websockets-13.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63848cdb6fcc0bf09d4a155464c46c64ffdb5807ede4fb251da2c2692559ce75"}, + {file = "websockets-13.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:872afa52a9f4c414d6955c365b6588bc4401272c629ff8321a55f44e3f62b553"}, + {file = "websockets-13.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05e70fec7c54aad4d71eae8e8cab50525e899791fc389ec6f77b95312e4e9920"}, + {file = "websockets-13.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e82db3756ccb66266504f5a3de05ac6b32f287faacff72462612120074103329"}, + {file = "websockets-13.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4e85f46ce287f5c52438bb3703d86162263afccf034a5ef13dbe4318e98d86e7"}, + {file = "websockets-13.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f3fea72e4e6edb983908f0db373ae0732b275628901d909c382aae3b592589f2"}, + {file = "websockets-13.0.1-cp313-cp313-win32.whl", hash = "sha256:254ecf35572fca01a9f789a1d0f543898e222f7b69ecd7d5381d8d8047627bdb"}, + {file = "websockets-13.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:ca48914cdd9f2ccd94deab5bcb5ac98025a5ddce98881e5cce762854a5de330b"}, + {file = "websockets-13.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b74593e9acf18ea5469c3edaa6b27fa7ecf97b30e9dabd5a94c4c940637ab96e"}, + {file = "websockets-13.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:132511bfd42e77d152c919147078460c88a795af16b50e42a0bd14f0ad71ddd2"}, + {file = "websockets-13.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:165bedf13556f985a2aa064309baa01462aa79bf6112fbd068ae38993a0e1f1b"}, + {file = "websockets-13.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e801ca2f448850685417d723ec70298feff3ce4ff687c6f20922c7474b4746ae"}, + {file = "websockets-13.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30d3a1f041360f029765d8704eae606781e673e8918e6b2c792e0775de51352f"}, + {file = "websockets-13.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67648f5e50231b5a7f6d83b32f9c525e319f0ddc841be0de64f24928cd75a603"}, + {file = "websockets-13.0.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:4f0426d51c8f0926a4879390f53c7f5a855e42d68df95fff6032c82c888b5f36"}, + {file = "websockets-13.0.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ef48e4137e8799998a343706531e656fdec6797b80efd029117edacb74b0a10a"}, + {file = "websockets-13.0.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:249aab278810bee585cd0d4de2f08cfd67eed4fc75bde623be163798ed4db2eb"}, + {file = "websockets-13.0.1-cp38-cp38-win32.whl", hash = "sha256:06c0a667e466fcb56a0886d924b5f29a7f0886199102f0a0e1c60a02a3751cb4"}, + {file = "websockets-13.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1f3cf6d6ec1142412d4535adabc6bd72a63f5f148c43fe559f06298bc21953c9"}, + {file = "websockets-13.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1fa082ea38d5de51dd409434edc27c0dcbd5fed2b09b9be982deb6f0508d25bc"}, + {file = "websockets-13.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4a365bcb7be554e6e1f9f3ed64016e67e2fa03d7b027a33e436aecf194febb63"}, + {file = "websockets-13.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:10a0dc7242215d794fb1918f69c6bb235f1f627aaf19e77f05336d147fce7c37"}, + {file = "websockets-13.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59197afd478545b1f73367620407b0083303569c5f2d043afe5363676f2697c9"}, + {file = "websockets-13.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d20516990d8ad557b5abeb48127b8b779b0b7e6771a265fa3e91767596d7d97"}, + {file = "websockets-13.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1a2e272d067030048e1fe41aa1ec8cfbbaabce733b3d634304fa2b19e5c897f"}, + {file = "websockets-13.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ad327ac80ba7ee61da85383ca8822ff808ab5ada0e4a030d66703cc025b021c4"}, + {file = "websockets-13.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:518f90e6dd089d34eaade01101fd8a990921c3ba18ebbe9b0165b46ebff947f0"}, + {file = "websockets-13.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:68264802399aed6fe9652e89761031acc734fc4c653137a5911c2bfa995d6d6d"}, + {file = "websockets-13.0.1-cp39-cp39-win32.whl", hash = "sha256:a5dc0c42ded1557cc7c3f0240b24129aefbad88af4f09346164349391dea8e58"}, + {file = "websockets-13.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:b448a0690ef43db5ef31b3a0d9aea79043882b4632cfc3eaab20105edecf6097"}, + {file = "websockets-13.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:faef9ec6354fe4f9a2c0bbb52fb1ff852effc897e2a4501e25eb3a47cb0a4f89"}, + {file = "websockets-13.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:03d3f9ba172e0a53e37fa4e636b86cc60c3ab2cfee4935e66ed1d7acaa4625ad"}, + {file = "websockets-13.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d450f5a7a35662a9b91a64aefa852f0c0308ee256122f5218a42f1d13577d71e"}, + {file = "websockets-13.0.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f55b36d17ac50aa8a171b771e15fbe1561217510c8768af3d546f56c7576cdc"}, + {file = "websockets-13.0.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14b9c006cac63772b31abbcd3e3abb6228233eec966bf062e89e7fa7ae0b7333"}, + {file = "websockets-13.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b79915a1179a91f6c5f04ece1e592e2e8a6bd245a0e45d12fd56b2b59e559a32"}, + {file = "websockets-13.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f40de079779acbcdbb6ed4c65af9f018f8b77c5ec4e17a4b737c05c2db554491"}, + {file = "websockets-13.0.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:80e4ba642fc87fa532bac07e5ed7e19d56940b6af6a8c61d4429be48718a380f"}, + {file = "websockets-13.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a02b0161c43cc9e0232711eff846569fad6ec836a7acab16b3cf97b2344c060"}, + {file = "websockets-13.0.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6aa74a45d4cdc028561a7d6ab3272c8b3018e23723100b12e58be9dfa5a24491"}, + {file = "websockets-13.0.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00fd961943b6c10ee6f0b1130753e50ac5dcd906130dcd77b0003c3ab797d026"}, + {file = "websockets-13.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d93572720d781331fb10d3da9ca1067817d84ad1e7c31466e9f5e59965618096"}, + {file = "websockets-13.0.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:71e6e5a3a3728886caee9ab8752e8113670936a193284be9d6ad2176a137f376"}, + {file = "websockets-13.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c4a6343e3b0714e80da0b0893543bf9a5b5fa71b846ae640e56e9abc6fbc4c83"}, + {file = "websockets-13.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a678532018e435396e37422a95e3ab87f75028ac79570ad11f5bf23cd2a7d8c"}, + {file = "websockets-13.0.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6716c087e4aa0b9260c4e579bb82e068f84faddb9bfba9906cb87726fa2e870"}, + {file = "websockets-13.0.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e33505534f3f673270dd67f81e73550b11de5b538c56fe04435d63c02c3f26b5"}, + {file = "websockets-13.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:acab3539a027a85d568c2573291e864333ec9d912675107d6efceb7e2be5d980"}, + {file = "websockets-13.0.1-py3-none-any.whl", hash = "sha256:b80f0c51681c517604152eb6a572f5a9378f877763231fddb883ba2f968e8817"}, + {file = "websockets-13.0.1.tar.gz", hash = "sha256:4d6ece65099411cfd9a48d13701d7438d9c34f479046b34c50ff60bb8834e43e"}, +] + [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "e0a9613df29a641fb23c8eff1ffcc169892269b033f56d10073fa9c7f7d62cb9" +content-hash = "7c7ba7a5c15f9ca2509abb41835945818101e24e89630e40af47adacddef30e7" diff --git a/pyproject.toml b/pyproject.toml index 47bd934..804a5d2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,8 +10,6 @@ packages = [{include = "large_lattice_model", from = "src"}] python = "^3.10" numpy = "^2.0.1" scipy = "^1.14.0" -#https://stackoverflow.com/questions/77316505/im-having-a-bad-time-installing-some-modules-with-poetry -#pygsl = "^2.3.3" # poetry can't install this, so I used pip instead numba = "^0.60.0" matplotlib = "^3.9.2" @@ -24,6 +22,15 @@ ipython = "^8.26.0" pytest = "^8.3.2" hypothesis = "^6.112.0" + + +[tool.poetry.group.doc.dependencies] +sphinx = "^7.4.7" +myst-parser = "^3.0.1" +sphinx-rtd-theme = "^2.0.0" +sphinx-autobuild = "^2024.9.3" +sphinx-autoapi = "^3.3.1" + [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" diff --git a/src/large_lattice_model/latticemodel.py b/src/large_lattice_model/latticemodel.py index bd3a6cd..c088527 100644 --- a/src/large_lattice_model/latticemodel.py +++ b/src/large_lattice_model/latticemodel.py @@ -3,9 +3,6 @@ import numpy as np import scipy.integrate as integrate import scipy.optimize as opt -from numba import float64, int64, njit, vectorize -from scipy.constants import c, h, hbar -from scipy.constants import k as kB from scipy.special import eval_genlaguerre, factorial import large_lattice_model.settings as settings @@ -23,9 +20,9 @@ def set_atom(atom): atom : str, One of '171Yb', '87Sr', '88Sr' - Notes: - ------ - If your atom is not in the list use [](set_atomic_properties) instead. + Notes + ----- + If your atom is not in the list use :func:`set_atomic_properties` instead. """ settings.Er, settings.k, settings.kc = settings.scale_parameters_from_atom(atom) @@ -51,11 +48,14 @@ def set_atomic_properties(lattice_frequency, clock_frequency, atomic_mass): def U(rho, D, nz): """Return the lattice potential surfaces (Beloy2020 Eq. D2). - Inputs - ------ - rho : radial coordinates in units of kappa**-1 - D : depth of the lattice in Er - nz : longitudinal quantum number + Parameters + ---------- + rho : array_like + radial coordinates in units of kappa**-1 + D : array_like + depth of the lattice in Er + nz : array_like + longitudinal quantum number Returns ------- @@ -65,21 +65,31 @@ def U(rho, D, nz): return mathieu_b(nz + 1, Drho / 4) - Drho / 2 -# @vectorize([float64(float64, float64, int64)]) +@np.vectorize @lru_cache(maxsize=lru_maxsize) def R(E, D, nz): """Inverse of the lattice potential surface U(rho) (Beloy2020 pag. 4) - Inputs - ------ - E : potential energy in Er - D : depth of the lattice in Er - nz : longitudinal quantum number + Parameters + ---------- + E : array_like + potential energy in Er + D : array_like + depth of the lattice in Er + nz : array_like + longitudinal quantum number Returns ------- - r : radial coordinates in units of kappa**-1 + array_like + radial coordinates in units of kappa**-1 + + Notes + ----- + This is calculated numerically using Brent’s method (`brentq` option in `scipy.optimize.root_scalar`). + """ + min_eps = 0.0 max_eps = 2.7 # max radius for nz = 0 and D=1500 try: @@ -92,22 +102,24 @@ def R(E, D, nz): return res.root -R = np.vectorize(R) - - def DeltaU(rho, D, nz, dn=1): - """Return the difference between lattice potential surfaces U(rho, D, nz+dn) - U(rho, D, nz). + """Return the difference between lattice potential surfaces :math:`U(rho, D, nz+dn) - U(rho, D, nz)`. - Inputs - ------ - rho : radial coordinates in units of kappa**-1 - D : depth of the lattice in Er - nz : longitudinal quantum number of the starting level - dn : longitudinal quantum number jump (default: 1) + Parameters + ---------- + rho : array_like + radial coordinates in units of kappa**-1 + D : array_like + depth of the lattice in Er + nz : array_like + longitudinal quantum number + dn : array_like, optional + longitudinal quantum number jump (default: 1), by default 1 Returns ------- - DeltaU : difference U(rho, nz+dn) - U(rho, nz) + _type_ + _description_ """ return U(rho, D, nz + dn) - U(rho, D, nz) @@ -117,16 +129,22 @@ def DeltaU(rho, D, nz, dn=1): def rabi_ho(rho, D, nz, dn=1): """Normalized Rabi frequency for the harmonic oscillator (Wineland1979 eq. 31) - Inputs - ------ - rho : radial coordinates in units of kappa**-1 - D : depth of the lattice in Er - nz : longitudinal quantum number of the starting level - dn : longitudinal quantum number jump (default: 1) + Parameters + ---------- + rho : array_like + radial coordinates in units of kappa**-1 + D : array_like + depth of the lattice in Er + nz : array_like + longitudinal quantum number + dn : array_like, optional + longitudinal quantum number jump (default: 1), by default 1 Returns ------- - Omega : Normalized Rabi frequency (between 0 and 1) + array_like + normalized Rabi frequency (between 0 and 1) + """ Drho = D * np.exp(-(rho**2)) @@ -141,22 +159,27 @@ def rabi_ho(rho, D, nz, dn=1): # Using Mathieu Functions -# @vectorize([float64(float64, float64, int64, int64)]) +@np.vectorize def rabi_bo(rho, D, nz, dn=1): - """Normalized Rabi frequency for Born-Oppenheimer wavefunctions calculated using Mathieu functions (Beloy2020 appendix) + """Normalized Rabi frequency for the Born-Oppenheimer wavefunctions calculated using Mathieu functions (Beloy2020 appendix) - Inputs - ------ - rho : radial coordinates in units of kappa**-1 - D : depth of the lattice in Er - nz : longitudinal quantum number of the starting level - dn : longitudinal quantum number jump (default: 1) + Parameters + ---------- + rho : array_like + radial coordinates in units of kappa**-1 + D : array_like + depth of the lattice in Er + nz : array_like + longitudinal quantum number + dn : array_like, optional + longitudinal quantum number jump (default: 1), by default 1 Returns ------- - Omega : Normalized Rabi frequency (between 0 and 1) - """ + array_like + normalized Rabi frequency (between 0 and 1) + """ Drho = D * np.exp(-(rho**2)) k = settings.k kc = settings.kc @@ -164,12 +187,14 @@ def rabi_bo(rho, D, nz, dn=1): lim = np.pi / (2 * k) if dn % 2: # fmt: off - integrand = lambda z: 2 * k / np.pi * mathieu_se(nz + 1, Drho / 4, (k * z + np.pi / 2)) * np.sin(kc * z) * mathieu_se(nz + 1 + dn, Drho / 4, (k * z + np.pi / 2)) + def integrand(z): + return 2 * k / np.pi * mathieu_se(nz + 1, Drho / 4, k * z + np.pi / 2) * np.sin(kc * z) * mathieu_se(nz + 1 + dn, Drho / 4, k * z + np.pi / 2) # fmt: on else: # fmt: off - integrand = lambda z: 2 * k / np.pi * mathieu_se(nz + 1, Drho / 4, (k * z + np.pi / 2)) * np.cos(kc * z) * mathieu_se(nz + 1 + dn, Drho / 4, (k * z + np.pi / 2)) + def integrand(z): + return 2 * k / np.pi * mathieu_se(nz + 1, Drho / 4, k * z + np.pi / 2) * np.cos(kc * z) * mathieu_se(nz + 1 + dn, Drho / 4, k * z + np.pi / 2) # fmt: on # integral is even @@ -177,40 +202,42 @@ def rabi_bo(rho, D, nz, dn=1): return 2 * abs(res2[0]) -rabi_bo = np.vectorize(rabi_bo) - - def Gn(E, D, nz): """Density of states for the lattic trap (Beloy2020 eq. 11) - Inputs - ------ - E : potential energy in Er - D : depth of the lattice in Er - nz : longitudinal quantum number of the starting level + Parameters + ---------- + E : array_like + potential energy in Er + D : array_like + depth of the lattice in Er + nz : array_like + longitudinal quantum number of the starting level Returns ------- - G : density of states at energy E (same units of Beloy2020 fig. 3) - + array_like + density of states at energy E (same units of Beloy2020 fig. 3) """ - return R(E, D, nz) ** 2 * np.pi / (2 * settings.k) def Gr(rc, D, nz): """Density of states for the lattic trap at a given radius (Beloy2020 eq. 11) - Inputs - ------ - rc : Condon point at energy E - D : depth of the lattice in Er - nz : longitudinal quantum number of the starting level + Parameters + ---------- + rc : array_like + Condon point at energy E + D : array_like + depth of the lattice in Er + nz : array_like + longitudinal quantum number of the starting level Returns ------- - G : density of states at energy E (same units of Beloy2020 fig. 3) - + array_like + density of states at energy E (same units of Beloy2020 fig. 3) """ return rc**2 * np.pi / (2 * settings.k) @@ -218,93 +245,40 @@ def Gr(rc, D, nz): @lru_cache(maxsize=lru_maxsize) def max_nz(D): - """Return the maximum nz for a given depth""" + """Return the maximum nz for a given depth + + Parameters + ---------- + D : float + depth of the lattice in Er + + Returns + ------- + int + maximum nz for a lattice trap with depth D + """ # ansatz twice the harmonic oscillators levels max_n = int(-U(0, D, 0) / np.sqrt(D)) test = np.arange(max_n) return np.amax(np.where(U(0, D, test) < 0)) -# lorentzian -def lor(x, x0, w): - """Simple lorentzian with center x0 and HWHM w peak 0.5""" - den = 1 + 1 / w**2 * (x - x0) ** 2 - return 0.5 / den - - -# both sideband -# it is faster to calculate sidebands at the same time -def sidebands(x, D, Tz, Tr, b, r, wc, dn=1, E_max=0.0, fac=10): - # """Lattice sidebands as a sum of lorentzian. - - # Inputs - # ------ - # x : frequency in Hz - # D : depth of the lattice in Er - # Tz : longitudinal temperature in K - # Tr : radial temperature in K - # b : blue sidebands scaling - # r : red sidebands scaling - # wc : carrier half width half maximum - # dn : order of the sideband (default: 1) - # E_max : max energy levels populated (default: 0) - # fac : control the number of lorentzian to be used in the sum - # higher number will give smoother sidebands but take more computational time - # (default: 10) - - # Returns - # ------- - # Both sidebands as excitation. - - # """ - Nz = int(max_nz(D) * 1.0 + 0.5) - beta_r = settings.Er / (kB * Tr) - beta_z = settings.Er / (kB * Tz) - - tot = np.zeros(x.shape) - total_norm = 0 - - for nz in np.arange(Nz + 1): - E_min = U(0, D, nz) - - # this just save computational time - # use less samples for high levels - # method to calculate number of lorentzian function to sum - N = int(DeltaU(0, D, nz, dn) * fac * (nz + 1) ** -0.5) - - # Uniform sampling in E - EE = np.linspace(E_min, E_max, N)[:, np.newaxis] - rc = R(EE, D, nz) - # dE = (E_max - E_min)/N +def lorentzian(x, x0, w): + """Simple lorentzian with center x0 , half-width at half-maximum w, and peak 0.5. - # calc normalization - pp = Gr(rc, D, nz) * np.exp(-(EE - E_min) * beta_r) * np.exp(-E_min * beta_z) - total_norm += np.trapz( - pp, EE, axis=0 - ) # sum(pp, axis=0) *dE #trapz(pp, EE, axis=0) #trapz is a bit slower, but handles better different Ns - - # blue - x0 = DeltaU(rc, D, nz, dn) * settings.Er / h - ff = rabi_ho(rc, D, nz, dn) * wc - - # sum lorentzian for blue sideband - note cutoff on energy - blue = pp * lor(x, x0, ff) * (U(rc, D, nz + dn) < E_max) - - res = b * np.trapz(blue, EE, axis=0) # sum(yy, axis=0)*dE #trapz(yy, EE, axis=0) # speed sum > trapz > simps - - tot += res - - # red - if nz >= dn: - # rc = R(EE, D, nz) # same as blue - x0 = DeltaU(rc, D, nz, -dn) * settings.Er / h - ff = rabi_ho(rc, D, nz - dn, dn) * wc - - # sum lorentzian on red sideband - red = pp * lor(x, x0, ff) - - res = r * np.trapz(red, EE, axis=0) # trapz(yy, EE, axis=0) # sum(yy, axis=0)*median(diff(EE, axis=0)) # - - tot += res + Parameters + ---------- + x : array_like + points where to calculate the function + x0 : array_like + center of the curve + w : array_like + half-width at half-maximum of the curve - return tot / total_norm + Returns + ------- + array_like + value of the function + """ + den = 1 + 1 / w**2 * (x - x0) ** 2 + return 0.5 / den diff --git a/src/large_lattice_model/mathieu.py b/src/large_lattice_model/mathieu.py index d8c876f..acb5a3d 100644 --- a/src/large_lattice_model/mathieu.py +++ b/src/large_lattice_model/mathieu.py @@ -3,7 +3,7 @@ import numpy as np import scipy.special -from numba import float64, int64, njit, vectorize +from numba import float64, int64, vectorize # scipy Mathieu special functions are currently bugged (they have some discontinuities) # see https://github.com/scipy/scipy/pull/14577 @@ -44,6 +44,20 @@ def _load_lib(libname): # this is fast! @vectorize([float64(int64, float64)], nopython=True) def gsl_mathieu_b(n, q): + """GSL implementation of the characteristic value of odd Mathieu functions :math:`b_n(q)` + + Parameters + ---------- + n : array_like + order of the function + q : array_like + parameter of the function + + Returns + ------- + array_like + characteristic value of odd Mathieu functions + """ if n < 1: return np.nan return gsl_sf_mathieu_b(n, q) @@ -55,8 +69,26 @@ def gsl_mathieu_b(n, q): mathieu_b = scipy_mathieu_b +"""Odd Mathieu function from scipy implementation, with input in radians and dropping the derivative""" + + def scipy_mathieu_se(m, q, x): - """Odd Mathieu function from scipy implementation, with input in radians and dropping the derivative""" + """Scipy implementation of the odd Mathieu function :math:`se_m(x, q)`. + + Parameters + ---------- + m : array_like + order of the function + q : array_like + parameter of the function + x : array_like + argument of the function in radians + + Returns + ------- + array_like + value of the function + """ func, deriv = scipy.special.mathieu_sem(m, q, x * 180.0 / np.pi) return func @@ -70,6 +102,22 @@ def scipy_mathieu_se(m, q, x): # this is fast! @vectorize([float64(int64, float64, float64)], nopython=True) def gsl_mathieu_se(n, q, x): + """GSL implementation of the odd Mathieu function :math:`se_m(x, q)`. + + Parameters + ---------- + m : array_like + order of the function + q : array_like + parameter of the function + x : array_like + argument of the function in radians + + Returns + ------- + array_like + value of the function + """ return gsl_sf_mathieu_se(n, q, x) mathieu_se = gsl_mathieu_se diff --git a/src/large_lattice_model/settings.py b/src/large_lattice_model/settings.py index d76fef5..6fe4d23 100644 --- a/src/large_lattice_model/settings.py +++ b/src/large_lattice_model/settings.py @@ -1,11 +1,30 @@ +"""This submodule store the scale parameters of the lattice model to be used by other functions. +It define Er, k and kc (recoil energy, lattice wavevector and clock wavevector). +""" + import numpy as np from scipy.constants import c, h, physical_constants -from scipy.constants import k as kB amu = physical_constants["atomic mass constant"][0] def scale_parameters(lattice_frequency, clock_frequency, atomic_mass): + """Return recoil energy, lattice wavevector and clock wavevector from lattice frequency, clock frequency and atomic mass. + + Parameters + ---------- + lattice_frequency : float + lattice frequency in Hz + clock_frequency : float + clock frequency in Hz + atomic_mass : float + atomic mass in atomic mass constants + + Returns + ------- + (float, float, float) + recoil energy, lattice wavevector and clock wavevector in SI units + """ lattice_wavelength = c / lattice_frequency recoil_energy = h**2 / (2 * atomic_mass * amu * lattice_wavelength**2) lattice_k = 2 * np.pi / lattice_wavelength @@ -23,6 +42,19 @@ def scale_parameters(lattice_frequency, clock_frequency, atomic_mass): def scale_parameters_from_atom(atom=None): + """Return recoil energy, lattice wavevector and clock wavevector for commonly used atoms in optical lattice clocks. + + Parameters + ---------- + atom : str, optional + one of 171Yb, 88Sr, 87Sr, by default None + + Returns + ------- + (float, float, float) + recoil energy, lattice wavevector and clock wavevector in SI units + + """ if (atom is None) or (atom == "Yb"): return _atomic_parameters["171Yb"] if atom in _atomic_parameters.keys(): diff --git a/src/large_lattice_model/sidebands.py b/src/large_lattice_model/sidebands.py new file mode 100644 index 0000000..43460c3 --- /dev/null +++ b/src/large_lattice_model/sidebands.py @@ -0,0 +1,102 @@ +import numpy as np +from scipy.constants import h +from scipy.constants import k as kB + +from large_lattice_model import settings +from large_lattice_model.latticemodel import DeltaU, Gr, R, U, lorentzian, max_nz, rabi_ho + + +def sidebands(x, D, Tz, Tr, b, r, wc, dn=1, E_max=0.0, fac=10): + """Return lattice sidebands in the Born-Oppenheimer model as a finite sum of lorentzian functions. + + Parameters + ---------- + x : 1D array, float + frequency in Hz + D : float + depth of the lattice in Er + Tz : float + longitudinal temperature in K + Tr : float + radial temperature in K + b : float + amplitude scaling of the blue sideband + r : float + amplitude scaling of the red sideband + wc : float + carrier half-width half-maximum in Hz + dn : int, optional + order of the sideband, by default 1 + E_max : float, optional + max energy level in Er, by default 0.0 + fac : float, optional + parameter controlling the number of lorentzian functions used to calculate the sideband shape, higher number will give smoother sidebands at the expense of more computational time, by default 10 + + Returns + ------- + array_like + Value of the sidebands, both red and blue, calculated for frequency x + + + Notes + ----- + The sideband shape is calculated numerically as the finite sum of lorentzian functions. + The number of functions used in the calculation is proportional to the energy gap :math:`U_{n_z'}(0) - U_{n_z}(0)` (equivalent to summing a uniform distribution of Lorentzian functions in energy) + and it is suppressed by a scaling :math:`\propto 1/\sqrt{n_z}`, to save computational time on the scarcely populated high longitudinal states. + + Notes + ----- + It is numerically faster to calculate both red and blue sideband at the same time. + + """ + Nz = int(max_nz(D) * 1.0 + 0.5) + beta_r = settings.Er / (kB * Tr) + beta_z = settings.Er / (kB * Tz) + + tot = np.zeros(x.shape) + total_norm = 0 + + for nz in np.arange(Nz + 1): + E_min = U(0, D, nz) + + # this just save computational time + # use less samples for high levels + # method to calculate number of lorentzian function to sum + N = int(DeltaU(0, D, nz, dn) * fac * (nz + 1) ** -0.5) + + # Uniform sampling in E, as a *vertical* array + EE = np.linspace(E_min, E_max, N)[:, np.newaxis] + rc = R(EE, D, nz) + # dE = (E_max - E_min)/N + + # calc normalization + pp = Gr(rc, D, nz) * np.exp(-(EE - E_min) * beta_r) * np.exp(-E_min * beta_z) + total_norm += np.trapz( + pp, EE, axis=0 + ) # sum(pp, axis=0) *dE #trapz(pp, EE, axis=0) #trapz is a bit slower, but handles better different Ns + + # blue + x0 = DeltaU(rc, D, nz, dn) * settings.Er / h + ff = rabi_ho(rc, D, nz, dn) * wc + + # sum lorentzian for blue sideband - note cutoff on energy + blue = pp * lorentzian(x, x0, ff) * (U(rc, D, nz + dn) < E_max) + + res = b * np.trapz(blue, EE, axis=0) # sum(yy, axis=0)*dE #trapz(yy, EE, axis=0) # speed sum > trapz > simps + + tot += res + + # red + if nz >= dn: + # rc = R(EE, D, nz) # same as blue + x0 = DeltaU(rc, D, nz, -dn) * settings.Er / h + ff = rabi_ho(rc, D, nz - dn, dn) * wc + + # sum lorentzian on red sideband + red = pp * lorentzian(x, x0, ff) + + res = r * np.trapz(red, EE, axis=0) # trapz(yy, EE, axis=0) # sum(yy, axis=0)*median(diff(EE, axis=0)) # + + tot += res + + return tot / total_norm diff --git a/src/large_lattice_model/xyz.py b/src/large_lattice_model/xyz.py index 59b0509..80f0a37 100644 --- a/src/large_lattice_model/xyz.py +++ b/src/large_lattice_model/xyz.py @@ -18,14 +18,19 @@ def Zf(rho, z, D, nz): Inputs ------ - rho : radial coordinates in units of kappa**-1 - z : longitudinal coordinate (normal units) - D : depth of the lattice in Er - nz : longitudinal quantum number + rho : float + radial coordinates in units of kappa**-1 + z : float + longitudinal coordinate in m + D : float + depth of the lattice in Er + nz : int + longitudinal quantum number Returns ------- - Z : longitudinal wavefunction + float + longitudinal wavefunction """ Drho = D * np.exp(-(rho**2)) @@ -34,72 +39,100 @@ def Zf(rho, z, D, nz): @lru_cache(maxsize=lru_maxsize) def beloy_x(rho, D, nz): - """Beloy2020 z_nz(rho) function (page 6) + """Beloy2020 :math:`x_{nz}(\rho)` function (page 6) - Inputs - ------ - rho : radial coordinates in units of kappa**-1 - D : depth of the lattice in Er - nz : longitudinal quantum number + Parameters + ---------- + rho : float + radial coordinates in units of kappa**-1 + D : float + depth of the lattice in Er + nz : int + longitudinal quantum number Returns ------- - z_nz : + float + :math:`x_{nz}(\rho)` """ lim = np.pi / (2 * settings.k) res2 = integrate.quad(lambda z: Zf(rho, z, D, nz) ** 2 * np.cos(settings.k * z) ** 2, 0, lim) - # integrateral is even + # integral is even return 2 * abs(res2[0]) * np.exp(-(rho**2)) @lru_cache(maxsize=lru_maxsize) def beloy_y(rho, D, nz): - """Beloy2020 z_nz(rho) function (page 6) + """Beloy2020 :math:`y_{nz}(\rho)` function (page 6) - Inputs - ------ - rho : radial coordinates in units of kappa**-1 - D : depth of the lattice in Er - nz : longitudinal quantum number + Parameters + ---------- + rho : float + radial coordinates in units of kappa**-1 + D : float + depth of the lattice in Er + nz : int + longitudinal quantum number Returns ------- - z_nz : + float + :math:`y_{nz}(\rho)` """ lim = np.pi / (2 * settings.k) res2 = integrate.quad(lambda z: Zf(rho, z, D, nz) ** 2 * np.sin(settings.k * z) ** 2, 0, lim) - # integrateral is even + # integral is even return 2 * abs(res2[0]) * np.exp(-(rho**2)) @lru_cache(maxsize=lru_maxsize) def beloy_z(rho, D, nz): - """Beloy2020 z_nz(rho) function (page 6) + """Beloy2020 :math:`z_{nz}(\rho)` function (page 6) - Inputs - ------ - rho : radial coordinates in units of kappa**-1 - D : depth of the lattice in Er - nz : longitudinal quantum number + Parameters + ---------- + rho : float + radial coordinates in units of kappa**-1 + D : float + depth of the lattice in Er + nz : int + longitudinal quantum number Returns ------- - z_nz : + float + :math:`z_{nz}(\rho)` """ lim = np.pi / (2 * settings.k) res2 = integrate.quad(lambda z: Zf(rho, z, D, nz) ** 2 * np.cos(settings.k * z) ** 4, 0, lim) - # integrateral is even + # integral is even return 2 * abs(res2[0]) * np.exp(-2 * rho**2) @vectorize([(float64, float64, float64)(float64, float64, float64)]) def beloy_XYZ(D, Tz, Tr): + """Return the effective trap depths X, Y and Z from the Born-Oppenheimer model (Beloy2020 eq. 19) + + Parameters + ---------- + D : array_like + depth of the lattice in Er + Tz : array_like + longitudinal temperature in K + Tz : array_like + radial temperature in K + + Returns + ------- + (array_like, array_like, array_like) + effective trap depths X, Y and Z + """ beta_r = settings.Er / (kB * Tr) beta_z = settings.Er / (kB * Tz) From d63c8a8ba33de27e2e9903d3c90a5ddc56a71925 Mon Sep 17 00:00:00 2001 From: Marco Pizzocaro Date: Fri, 13 Sep 2024 18:48:20 +0200 Subject: [PATCH 09/14] Add a few more tests/plot and fix some functions not working --- src/large_lattice_model/xyz.py | 2 +- tests/plot_omega.py | 2 +- tests/plot_sidebands.py | 23 +++++++++++++++++++++++ tests/plot_xyz.py | 23 +++++++++++++++++++++++ 4 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 tests/plot_sidebands.py create mode 100644 tests/plot_xyz.py diff --git a/src/large_lattice_model/xyz.py b/src/large_lattice_model/xyz.py index 80f0a37..6c4c071 100644 --- a/src/large_lattice_model/xyz.py +++ b/src/large_lattice_model/xyz.py @@ -115,7 +115,7 @@ def beloy_z(rho, D, nz): return 2 * abs(res2[0]) * np.exp(-2 * rho**2) -@vectorize([(float64, float64, float64)(float64, float64, float64)]) +@np.vectorize def beloy_XYZ(D, Tz, Tr): """Return the effective trap depths X, Y and Z from the Born-Oppenheimer model (Beloy2020 eq. 19) diff --git a/tests/plot_omega.py b/tests/plot_omega.py index 1e09912..156114e 100644 --- a/tests/plot_omega.py +++ b/tests/plot_omega.py @@ -2,7 +2,7 @@ import scipy as sp from matplotlib import pyplot as plt -from large_lattice_model.latticemodel import OmegaMat2, R, max_nz, rabi_bo, rabi_ho +from large_lattice_model.latticemodel import R, max_nz, rabi_bo, rabi_ho plt.close("all") plt.ion() diff --git a/tests/plot_sidebands.py b/tests/plot_sidebands.py new file mode 100644 index 0000000..b7ba2fc --- /dev/null +++ b/tests/plot_sidebands.py @@ -0,0 +1,23 @@ +import numpy as np +from matplotlib import pyplot as plt + +from large_lattice_model.latticemodel import lorentzian +from large_lattice_model.sidebands import sidebands + +plt.close("all") +plt.ion() + +D = 100 +Tz = 2e-6 +Tr = 1e-6 +wc = 2e3 + + +nu = np.linspace(-50e3, 50e3, 200) +out = sidebands(nu, D, Tz, Tr, 3, 3, wc) + lorentzian(nu, 0, wc) + + +plt.figure() +plt.plot(nu / 1e3, out, "-") +plt.xlabel("Detuning /kHz") +plt.ylabel("Signal") diff --git a/tests/plot_xyz.py b/tests/plot_xyz.py new file mode 100644 index 0000000..cd5274a --- /dev/null +++ b/tests/plot_xyz.py @@ -0,0 +1,23 @@ +import numpy as np +from matplotlib import pyplot as plt + +from large_lattice_model.xyz import beloy_XYZ + +plt.close("all") +plt.ion() + +D = np.linspace(50, 500, 20) +Tz = D * 1e-6 / 50 +Tr = D * 1e-6 / 50 + + +X, Y, Z = beloy_XYZ(D, Tz, Tr) + + +plt.figure() +plt.plot(D, X, label="X") +plt.plot(D, Y, label="Y") +plt.plot(D, Z, label="Z") +plt.xlabel("Trap depth /Er") +plt.ylabel("X, Y, Z") +plt.legend(loc=0) From 95ffcb5fe6965fd97952fbf9d178e68436089047 Mon Sep 17 00:00:00 2001 From: Marco Pizzocaro Date: Tue, 17 Sep 2024 17:38:21 +0200 Subject: [PATCH 10/14] Fix minor formatting issues --- src/large_lattice_model/sidebands.py | 8 +++--- src/large_lattice_model/xyz.py | 39 +++++++++++++++++++++++----- tests/plot_omega.py | 1 - 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/large_lattice_model/sidebands.py b/src/large_lattice_model/sidebands.py index 43460c3..cd8451d 100644 --- a/src/large_lattice_model/sidebands.py +++ b/src/large_lattice_model/sidebands.py @@ -30,7 +30,8 @@ def sidebands(x, D, Tz, Tr, b, r, wc, dn=1, E_max=0.0, fac=10): E_max : float, optional max energy level in Er, by default 0.0 fac : float, optional - parameter controlling the number of lorentzian functions used to calculate the sideband shape, higher number will give smoother sidebands at the expense of more computational time, by default 10 + parameter controlling the number of lorentzian functions used to calculate the sideband shape, higher number + will give smoother sidebands at the expense of more computational time, by default 10 Returns ------- @@ -41,8 +42,9 @@ def sidebands(x, D, Tz, Tr, b, r, wc, dn=1, E_max=0.0, fac=10): Notes ----- The sideband shape is calculated numerically as the finite sum of lorentzian functions. - The number of functions used in the calculation is proportional to the energy gap :math:`U_{n_z'}(0) - U_{n_z}(0)` (equivalent to summing a uniform distribution of Lorentzian functions in energy) - and it is suppressed by a scaling :math:`\propto 1/\sqrt{n_z}`, to save computational time on the scarcely populated high longitudinal states. + The number of functions used in the calculation is proportional to the energy gap :math:`U_{n_z'}(0) - U_{n_z}(0)` + (equivalent to summing a uniform distribution of Lorentzian functions in energy) and it is suppressed by + a scaling :math:`\propto 1/\sqrt{n_z}`, to save computational time on the scarcely populated high longitudinal states. Notes ----- diff --git a/src/large_lattice_model/xyz.py b/src/large_lattice_model/xyz.py index 6c4c071..98668f1 100644 --- a/src/large_lattice_model/xyz.py +++ b/src/large_lattice_model/xyz.py @@ -2,7 +2,6 @@ import numpy as np import scipy.integrate as integrate -from numba import float64, vectorize from scipy.constants import k as kB import large_lattice_model.settings as settings @@ -38,7 +37,7 @@ def Zf(rho, z, D, nz): @lru_cache(maxsize=lru_maxsize) -def beloy_x(rho, D, nz): +def beloy_xn(rho, D, nz): """Beloy2020 :math:`x_{nz}(\rho)` function (page 6) Parameters @@ -64,7 +63,7 @@ def beloy_x(rho, D, nz): @lru_cache(maxsize=lru_maxsize) -def beloy_y(rho, D, nz): +def beloy_yn(rho, D, nz): """Beloy2020 :math:`y_{nz}(\rho)` function (page 6) Parameters @@ -90,7 +89,7 @@ def beloy_y(rho, D, nz): @lru_cache(maxsize=lru_maxsize) -def beloy_z(rho, D, nz): +def beloy_zn(rho, D, nz): """Beloy2020 :math:`z_{nz}(\rho)` function (page 6) Parameters @@ -148,7 +147,7 @@ def beloy_XYZ(D, Tz, Tr): for nz in nnz: R0 = R(0, D, nz) # x - resx = integrate.quad(lambda rho: beloy_x(rho, D, nz) * rho * (np.exp(-U(rho, D, nz) * beta_r) - 1), 0, R0) + resx = integrate.quad(lambda rho: beloy_xn(rho, D, nz) * rho * (np.exp(-U(rho, D, nz) * beta_r) - 1), 0, R0) numx += resx[0] * Qnz[nz] # y = exp(-rho^2) - x @@ -156,10 +155,38 @@ def beloy_XYZ(D, Tz, Tr): numy += (resy[0] - resx[0]) * Qnz[nz] # z - res = integrate.quad(lambda rho: beloy_z(rho, D, nz) * rho * (np.exp(-U(rho, D, nz) * beta_r) - 1), 0, R0) + res = integrate.quad(lambda rho: beloy_zn(rho, D, nz) * rho * (np.exp(-U(rho, D, nz) * beta_r) - 1), 0, R0) numz += res[0] * Qnz[nz] res = integrate.quad(lambda rho: rho * (np.exp(-U(rho, D, nz) * beta_r) - 1), 0, R0) den += res[0] * Qnz[nz] return numx / den, numy / den, numz / den + + +# def modified_ushijima_zeta(D, Tr, j): +# return (1 + j*(kB*Tr)/(D*settings.Er))**-1 + + +# @np.vectorize +# def modified_ushijima_XYZ(D, Tr, nz): +# """Return the effective trap depths Xn, Yn and Zn from the modified Ushijima model (Beloy2020 eq. 23) + +# Parameters +# ---------- +# D : array_like +# depth of the lattice in Er +# Tz : array_like +# longitudinal temperature in K +# Tz : array_like +# radial temperature in K + +# Returns +# ------- +# (array_like, array_like, array_like) +# effective trap depths X, Y and Z +# """ + +# Xn = modified_ushijima_zeta(D, Tr, 1) - (nz+0.5)*modified_ushijima_zeta(D, Tr, 0.5)*D**-0.5 +# Yn = (nz+0.5)*modified_ushijima_zeta(D, Tr, 0.5)*D**-0.5 +# Zn = modified_ushijima_zeta(D, Tr, 2) - 2*(nz+0.5)*modified_ushijima_zeta(D, Tr, 1.5)*D**-0.5 + 1.5*(nz**2 + nz + 0.5)* modified_ushijima_zeta(D, Tr, 1)*D**-1 diff --git a/tests/plot_omega.py b/tests/plot_omega.py index 156114e..2b51c1a 100644 --- a/tests/plot_omega.py +++ b/tests/plot_omega.py @@ -1,5 +1,4 @@ import numpy as np -import scipy as sp from matplotlib import pyplot as plt from large_lattice_model.latticemodel import R, max_nz, rabi_bo, rabi_ho From 2516968d72c05be65395dd12354cc0f246b5cf2e Mon Sep 17 00:00:00 2001 From: Marco Pizzocaro Date: Tue, 17 Sep 2024 17:55:49 +0200 Subject: [PATCH 11/14] Add a separate two_temperature_distribution function --- src/large_lattice_model/latticemodel.py | 26 +++++++++++++++++++++++++ src/large_lattice_model/sidebands.py | 12 ++++-------- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/large_lattice_model/latticemodel.py b/src/large_lattice_model/latticemodel.py index c088527..d97637d 100644 --- a/src/large_lattice_model/latticemodel.py +++ b/src/large_lattice_model/latticemodel.py @@ -3,6 +3,7 @@ import numpy as np import scipy.integrate as integrate import scipy.optimize as opt +from scipy.constants import k as kB from scipy.special import eval_genlaguerre, factorial import large_lattice_model.settings as settings @@ -263,6 +264,31 @@ def max_nz(D): return np.amax(np.where(U(0, D, test) < 0)) +def two_temperature_distribution(E, E_min, Tz, Tr): + """Two temperature distribution of atoms in the lattice based on Beloy2020 eq. 24. + Not normalized. + + Parameters + ---------- + E : array_like + atom energy level in Er + E_min : float + bottom of the trap in Er + Tz : float + longitudinal temperature in K + Tr : float + radial temperature in K + + Returns + ------- + float or ndarray + not normalized temperature distribution as :math:`e^{-(E-E_min)/(k T_r)} e^{-E_min/(k T_z)}` + """ + beta_r = settings.Er / (kB * Tr) + beta_z = settings.Er / (kB * Tz) + return np.exp(-(E - E_min) * beta_r) * np.exp(-E_min * beta_z) + + def lorentzian(x, x0, w): """Simple lorentzian with center x0 , half-width at half-maximum w, and peak 0.5. diff --git a/src/large_lattice_model/sidebands.py b/src/large_lattice_model/sidebands.py index cd8451d..b664b62 100644 --- a/src/large_lattice_model/sidebands.py +++ b/src/large_lattice_model/sidebands.py @@ -3,7 +3,7 @@ from scipy.constants import k as kB from large_lattice_model import settings -from large_lattice_model.latticemodel import DeltaU, Gr, R, U, lorentzian, max_nz, rabi_ho +from large_lattice_model.latticemodel import DeltaU, Gr, R, U, lorentzian, max_nz, rabi_ho, two_temperature_distribution def sidebands(x, D, Tz, Tr, b, r, wc, dn=1, E_max=0.0, fac=10): @@ -52,8 +52,6 @@ def sidebands(x, D, Tz, Tr, b, r, wc, dn=1, E_max=0.0, fac=10): """ Nz = int(max_nz(D) * 1.0 + 0.5) - beta_r = settings.Er / (kB * Tr) - beta_z = settings.Er / (kB * Tz) tot = np.zeros(x.shape) total_norm = 0 @@ -61,9 +59,9 @@ def sidebands(x, D, Tz, Tr, b, r, wc, dn=1, E_max=0.0, fac=10): for nz in np.arange(Nz + 1): E_min = U(0, D, nz) + # method to calculate number of lorentzian function to sum # this just save computational time # use less samples for high levels - # method to calculate number of lorentzian function to sum N = int(DeltaU(0, D, nz, dn) * fac * (nz + 1) ** -0.5) # Uniform sampling in E, as a *vertical* array @@ -72,10 +70,8 @@ def sidebands(x, D, Tz, Tr, b, r, wc, dn=1, E_max=0.0, fac=10): # dE = (E_max - E_min)/N # calc normalization - pp = Gr(rc, D, nz) * np.exp(-(EE - E_min) * beta_r) * np.exp(-E_min * beta_z) - total_norm += np.trapz( - pp, EE, axis=0 - ) # sum(pp, axis=0) *dE #trapz(pp, EE, axis=0) #trapz is a bit slower, but handles better different Ns + pp = Gr(rc, D, nz) * two_temperature_distribution(EE, E_min, Tz, Tr) + total_norm += np.trapz(pp, EE, axis=0) # blue x0 = DeltaU(rc, D, nz, dn) * settings.Er / h From 74473a6f6c00e88ea690be9a1ebf36ee04592160 Mon Sep 17 00:00:00 2001 From: Marco Pizzocaro Date: Tue, 17 Sep 2024 18:30:35 +0200 Subject: [PATCH 12/14] Fix more docstring --- docs/source/conf.py | 3 ++- src/large_lattice_model/__init__.py | 7 +++++++ src/large_lattice_model/latticemodel.py | 11 ++++++++--- src/large_lattice_model/mathieu.py | 8 ++++++++ src/large_lattice_model/sidebands.py | 8 ++++++-- 5 files changed, 31 insertions(+), 6 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index bdf943a..8e5c8fb 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -6,12 +6,13 @@ # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information +import importlib.metadata from pathlib import Path project = "Large-lattice-model" copyright = "2021-2024 Marco Pizzocaro - Istituto Nazionale di Ricerca Metrologica (INRIM)" author = "Marco Pizzocaro" -release = "0.1.0" +release = importlib.metadata.version("large_lattice_model") # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration diff --git a/src/large_lattice_model/__init__.py b/src/large_lattice_model/__init__.py index e69de29..eeadc5d 100644 --- a/src/large_lattice_model/__init__.py +++ b/src/large_lattice_model/__init__.py @@ -0,0 +1,7 @@ +""" +A python package to model the motional spectra of atoms trapped in a one-dimensional optical lattice. +""" + +from .latticemodel import * +from .sidebands import * +from .xyz import * diff --git a/src/large_lattice_model/latticemodel.py b/src/large_lattice_model/latticemodel.py index d97637d..8ae93a0 100644 --- a/src/large_lattice_model/latticemodel.py +++ b/src/large_lattice_model/latticemodel.py @@ -1,3 +1,8 @@ +""" +This submodule implements the main lattice model functions in the Born-Oppenheimer approximation from Beloy 2020. +When possible, functions are cached with `lru_cache` from `functools` to improve performances over repeated calls. +""" + from functools import lru_cache # with maxsize > ~16k reduces computation time from 70 s to 10 s import numpy as np @@ -30,7 +35,7 @@ def set_atom(atom): return settings.Er, settings.k, settings.kc -def set_atomic_properties(lattice_frequency, clock_frequency, atomic_mass): +def set_properties(lattice_frequency, clock_frequency, atomic_mass): """Set custom scale parameters of the lattice model (recoil energy, lattice wavevector, clock wavevector). Parameters @@ -264,7 +269,7 @@ def max_nz(D): return np.amax(np.where(U(0, D, test) < 0)) -def two_temperature_distribution(E, E_min, Tz, Tr): +def two_temp_dist(E, E_min, Tz, Tr): """Two temperature distribution of atoms in the lattice based on Beloy2020 eq. 24. Not normalized. @@ -282,7 +287,7 @@ def two_temperature_distribution(E, E_min, Tz, Tr): Returns ------- float or ndarray - not normalized temperature distribution as :math:`e^{-(E-E_min)/(k T_r)} e^{-E_min/(k T_z)}` + not normalized temperature distribution as :math:`e^{-(E-E_{min})/(k T_r)} e^{-E_{min}/(k T_z)}` """ beta_r = settings.Er / (kB * Tr) beta_z = settings.Er / (kB * Tz) diff --git a/src/large_lattice_model/mathieu.py b/src/large_lattice_model/mathieu.py index acb5a3d..5e488ec 100644 --- a/src/large_lattice_model/mathieu.py +++ b/src/large_lattice_model/mathieu.py @@ -1,3 +1,11 @@ +""" +This submodules implements teh special functions `mathieu_b` and `mathieu_se`. + +It uses `ctypes` to import the GSL implementation sof these functions. +If GSL is not found, it will fallback to `scipy` special functions, whose current implementation +is not continuous for some high trap depths. +""" + import ctypes from ctypes.util import find_library diff --git a/src/large_lattice_model/sidebands.py b/src/large_lattice_model/sidebands.py index b664b62..4672ffe 100644 --- a/src/large_lattice_model/sidebands.py +++ b/src/large_lattice_model/sidebands.py @@ -1,9 +1,13 @@ +""" +This submodule implements the main sideband function in the Born-Oppenheimer approximation. +""" + import numpy as np from scipy.constants import h from scipy.constants import k as kB from large_lattice_model import settings -from large_lattice_model.latticemodel import DeltaU, Gr, R, U, lorentzian, max_nz, rabi_ho, two_temperature_distribution +from large_lattice_model.latticemodel import DeltaU, Gr, R, U, lorentzian, max_nz, rabi_ho, two_temp_dist def sidebands(x, D, Tz, Tr, b, r, wc, dn=1, E_max=0.0, fac=10): @@ -70,7 +74,7 @@ def sidebands(x, D, Tz, Tr, b, r, wc, dn=1, E_max=0.0, fac=10): # dE = (E_max - E_min)/N # calc normalization - pp = Gr(rc, D, nz) * two_temperature_distribution(EE, E_min, Tz, Tr) + pp = Gr(rc, D, nz) * two_temp_dist(EE, E_min, Tz, Tr) total_norm += np.trapz(pp, EE, axis=0) # blue From b57b5dae84e908c4797753f41f75f2e281e4dc80 Mon Sep 17 00:00:00 2001 From: Marco Pizzocaro Date: Tue, 17 Sep 2024 18:53:58 +0200 Subject: [PATCH 13/14] Add fitting functions --- src/large_lattice_model/__init__.py | 1 + src/large_lattice_model/fit.py | 77 +++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 src/large_lattice_model/fit.py diff --git a/src/large_lattice_model/__init__.py b/src/large_lattice_model/__init__.py index eeadc5d..5fd4fc5 100644 --- a/src/large_lattice_model/__init__.py +++ b/src/large_lattice_model/__init__.py @@ -2,6 +2,7 @@ A python package to model the motional spectra of atoms trapped in a one-dimensional optical lattice. """ +from .fit import * from .latticemodel import * from .sidebands import * from .xyz import * diff --git a/src/large_lattice_model/fit.py b/src/large_lattice_model/fit.py new file mode 100644 index 0000000..8dad6e6 --- /dev/null +++ b/src/large_lattice_model/fit.py @@ -0,0 +1,77 @@ +""" +This submodule implements functions useful for fitting sidebands. +""" + +from large_lattice_model.latticemodel import lorentzian +from large_lattice_model.sidebands import sidebands + + +def fit_lorentzian(x, A, x0, w): + """Lorentzian with center x0 , half-width at half-maximum w, and peak A. + Used to fit the carrier. + + Parameters + ---------- + x : array_like + points where to calculate the function + A : array_like + amplitude of the function + x0 : array_like + center of the curve + w : array_like + half-width at half-maximum of the curve + + Returns + ------- + array_like + value of the function + """ + return A * lorentzian(x, x0, w) + + +def get_fit_sidebands(w0, dn=1, E_max=0, fac=10): + """Return a simplified sideband function that depends on only 4 parameters for easy fittings. + + Parameters + ---------- + w0 : float + linewidth of the carrier in Hz + dn : int, optional + order of the sideband, by default 1 + E_max : float, optional + max energy level in Er, by default 0.0 + fac : float, optional + parameter controlling the number of lorentzian functions used to calculate the sideband shape, higher number + will give smoother sidebands at the expense of more computational time, by default 10 + + Returns + ------- + callable + sideband function that depends only on A, D, Tz and Tr + + """ + + def fit_sidebands(x, A, D, Tz, Tr): + """Simplified sideband function for fitting w that depends on only 4 parameters. + + Parameters + ---------- + x : array_like + frequency value in Hz + A : float + scaling factor of the sidebands amplitude + D : float + trap depth in Er + Tz : float + longitudinal temperature in K + Tr : float + radial temperature in K + + Returns + ------- + float or ndarray + value of the sidebands calculated at frequency x, with fixed carrier width. + """ + return sidebands(x, D, Tz, Tr, A, A, w0, dn=dn, E_max=E_max, fac=fac) + + return fit_sidebands From dcd0789fad7e2cb76a3cdd96ef9b80b5c59fde6f Mon Sep 17 00:00:00 2001 From: Marco Pizzocaro Date: Tue, 17 Sep 2024 18:54:41 +0200 Subject: [PATCH 14/14] Add ReadTheDocs files --- .readthedocs.yaml | 12 + docs/rtd_requirements.txt | 973 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 985 insertions(+) create mode 100644 .readthedocs.yaml create mode 100644 docs/rtd_requirements.txt diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 0000000..9661454 --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,12 @@ +version: 2 + +build: + os: "ubuntu-latest" + tools: + python: "3.10" +sphinx: + configuration: docs/source/conf.py + +python: + install: + - requirements: docs/rtd_requirements.txt \ No newline at end of file diff --git a/docs/rtd_requirements.txt b/docs/rtd_requirements.txt new file mode 100644 index 0000000..a71cc65 --- /dev/null +++ b/docs/rtd_requirements.txt @@ -0,0 +1,973 @@ +alabaster==0.7.16 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65 \ + --hash=sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92 +anyio==4.4.0 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94 \ + --hash=sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7 +astroid==3.3.2 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:99e9b5b602cbb005434084309213d6af32bf7a9b743c836749168b8e2b330cbd \ + --hash=sha256:9f8136ce9770e0f912401b25a0f15d5c2ec20b50e99b1b413ac0778fe53ff6f1 +babel==2.16.0 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b \ + --hash=sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316 +certifi==2024.8.30 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8 \ + --hash=sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9 +charset-normalizer==3.3.2 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ + --hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \ + --hash=sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786 \ + --hash=sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8 \ + --hash=sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09 \ + --hash=sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185 \ + --hash=sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574 \ + --hash=sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e \ + --hash=sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519 \ + --hash=sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898 \ + --hash=sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269 \ + --hash=sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3 \ + --hash=sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f \ + --hash=sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6 \ + --hash=sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8 \ + --hash=sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a \ + --hash=sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73 \ + --hash=sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc \ + --hash=sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714 \ + --hash=sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2 \ + --hash=sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc \ + --hash=sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce \ + --hash=sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d \ + --hash=sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e \ + --hash=sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6 \ + --hash=sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269 \ + --hash=sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96 \ + --hash=sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d \ + --hash=sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a \ + --hash=sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4 \ + --hash=sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77 \ + --hash=sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d \ + --hash=sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0 \ + --hash=sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed \ + --hash=sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068 \ + --hash=sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac \ + --hash=sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25 \ + --hash=sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8 \ + --hash=sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab \ + --hash=sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26 \ + --hash=sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2 \ + --hash=sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db \ + --hash=sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f \ + --hash=sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5 \ + --hash=sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99 \ + --hash=sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c \ + --hash=sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d \ + --hash=sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811 \ + --hash=sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa \ + --hash=sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a \ + --hash=sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03 \ + --hash=sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b \ + --hash=sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04 \ + --hash=sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c \ + --hash=sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001 \ + --hash=sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458 \ + --hash=sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389 \ + --hash=sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99 \ + --hash=sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985 \ + --hash=sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537 \ + --hash=sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238 \ + --hash=sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f \ + --hash=sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d \ + --hash=sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796 \ + --hash=sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a \ + --hash=sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143 \ + --hash=sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8 \ + --hash=sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c \ + --hash=sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5 \ + --hash=sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5 \ + --hash=sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711 \ + --hash=sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4 \ + --hash=sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6 \ + --hash=sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c \ + --hash=sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7 \ + --hash=sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4 \ + --hash=sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b \ + --hash=sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae \ + --hash=sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12 \ + --hash=sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c \ + --hash=sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae \ + --hash=sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8 \ + --hash=sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887 \ + --hash=sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b \ + --hash=sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4 \ + --hash=sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f \ + --hash=sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5 \ + --hash=sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33 \ + --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ + --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 +click==8.1.7 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ + --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de +colorama==0.4.6 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 +contourpy==1.3.0 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:00ccd0dbaad6d804ab259820fa7cb0b8036bda0686ef844d24125d8287178ce0 \ + --hash=sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639 \ + --hash=sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd \ + --hash=sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad \ + --hash=sha256:14e262f67bd7e6eb6880bc564dcda30b15e351a594657e55b7eec94b6ef72843 \ + --hash=sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8 \ + --hash=sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4 \ + --hash=sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1 \ + --hash=sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294 \ + --hash=sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84 \ + --hash=sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927 \ + --hash=sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8 \ + --hash=sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09 \ + --hash=sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7 \ + --hash=sha256:36e0cff201bcb17a0a8ecc7f454fe078437fa6bda730e695a92f2d9932bd507f \ + --hash=sha256:36f965570cff02b874773c49bfe85562b47030805d7d8360748f3eca570f4cab \ + --hash=sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b \ + --hash=sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3 \ + --hash=sha256:3faeb2998e4fcb256542e8a926d08da08977f7f5e62cf733f3c211c2a5586223 \ + --hash=sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973 \ + --hash=sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087 \ + --hash=sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081 \ + --hash=sha256:4cfb5c62ce023dfc410d6059c936dcf96442ba40814aefbfa575425a3a7f19dc \ + --hash=sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18 \ + --hash=sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f \ + --hash=sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d \ + --hash=sha256:68a32389b06b82c2fdd68276148d7b9275b5f5cf13e5417e4252f6d1a34f72a2 \ + --hash=sha256:69375194457ad0fad3a839b9e29aa0b0ed53bb54db1bfb6c3ae43d111c31ce41 \ + --hash=sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67 \ + --hash=sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6 \ + --hash=sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b \ + --hash=sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2 \ + --hash=sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c \ + --hash=sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42 \ + --hash=sha256:7a52040312b1a858b5e31ef28c2e865376a386c60c0e248370bbea2d3f3b760d \ + --hash=sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4 \ + --hash=sha256:81cb5ed4952aae6014bc9d0421dec7c5835c9c8c31cdf51910b708f548cf58e5 \ + --hash=sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49 \ + --hash=sha256:87ddffef1dbe5e669b5c2440b643d3fdd8622a348fe1983fad7a0f0ccb1cd67b \ + --hash=sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7 \ + --hash=sha256:8ca947601224119117f7c19c9cdf6b3ab54c5726ef1d906aa4a69dfb6dd58102 \ + --hash=sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb \ + --hash=sha256:92f8557cbb07415a4d6fa191f20fd9d2d9eb9c0b61d1b2f52a8926e43c6e9af7 \ + --hash=sha256:94e848a6b83da10898cbf1311a815f770acc9b6a3f2d646f330d57eb4e87592e \ + --hash=sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c \ + --hash=sha256:a11077e395f67ffc2c44ec2418cfebed032cd6da3022a94fc227b6faf8e2acb8 \ + --hash=sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35 \ + --hash=sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b \ + --hash=sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14 \ + --hash=sha256:c6ec93afeb848a0845a18989da3beca3eec2c0f852322efe21af1931147d12cb \ + --hash=sha256:cacd81e2d4b6f89c9f8a5b69b86490152ff39afc58a95af002a398273e5ce589 \ + --hash=sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c \ + --hash=sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0 \ + --hash=sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da \ + --hash=sha256:d78ab28a03c854a873787a0a42254a0ccb3cb133c672f645c9f9c8f3ae9d0800 \ + --hash=sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6 \ + --hash=sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66 \ + --hash=sha256:e12968fdfd5bb45ffdf6192a590bd8ddd3ba9e58360b29683c6bb71a7b41edca \ + --hash=sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb \ + --hash=sha256:e8134301d7e204c88ed7ab50028ba06c683000040ede1d617298611f9dc6240c \ + --hash=sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06 \ + --hash=sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779 \ + --hash=sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8 \ + --hash=sha256:fd2a0fc506eccaaa7595b7e1418951f213cf8255be2600f1ea1b61e46a60c55f \ + --hash=sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c +cycler==0.12.1 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 \ + --hash=sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c +docutils==0.20.1 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6 \ + --hash=sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b +exceptiongroup==1.2.2 ; python_version >= "3.10" and python_version < "3.11" \ + --hash=sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b \ + --hash=sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc +fonttools==4.53.1 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122 \ + --hash=sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397 \ + --hash=sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f \ + --hash=sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d \ + --hash=sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60 \ + --hash=sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169 \ + --hash=sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8 \ + --hash=sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31 \ + --hash=sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923 \ + --hash=sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2 \ + --hash=sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb \ + --hash=sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab \ + --hash=sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb \ + --hash=sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a \ + --hash=sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670 \ + --hash=sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8 \ + --hash=sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407 \ + --hash=sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671 \ + --hash=sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88 \ + --hash=sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f \ + --hash=sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f \ + --hash=sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0 \ + --hash=sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb \ + --hash=sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2 \ + --hash=sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d \ + --hash=sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c \ + --hash=sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3 \ + --hash=sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719 \ + --hash=sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749 \ + --hash=sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4 \ + --hash=sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f \ + --hash=sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02 \ + --hash=sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58 \ + --hash=sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1 \ + --hash=sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41 \ + --hash=sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4 \ + --hash=sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb \ + --hash=sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb \ + --hash=sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3 \ + --hash=sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d \ + --hash=sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d \ + --hash=sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2 +h11==0.14.0 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ + --hash=sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 +idna==3.8 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac \ + --hash=sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603 +imagesize==1.4.1 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b \ + --hash=sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a +jinja2==3.1.4 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ + --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d +kiwisolver==1.4.7 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a \ + --hash=sha256:08471d4d86cbaec61f86b217dd938a83d85e03785f51121e791a6e6689a3be95 \ + --hash=sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5 \ + --hash=sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0 \ + --hash=sha256:10849fb2c1ecbfae45a693c070e0320a91b35dd4bcf58172c023b994283a124d \ + --hash=sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18 \ + --hash=sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b \ + --hash=sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258 \ + --hash=sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95 \ + --hash=sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e \ + --hash=sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383 \ + --hash=sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02 \ + --hash=sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b \ + --hash=sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523 \ + --hash=sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee \ + --hash=sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88 \ + --hash=sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd \ + --hash=sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb \ + --hash=sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4 \ + --hash=sha256:4322872d5772cae7369f8351da1edf255a604ea7087fe295411397d0cfd9655e \ + --hash=sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c \ + --hash=sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935 \ + --hash=sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee \ + --hash=sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e \ + --hash=sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038 \ + --hash=sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d \ + --hash=sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b \ + --hash=sha256:4d05d81ecb47d11e7f8932bd8b61b720bf0b41199358f3f5e36d38e28f0532c5 \ + --hash=sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107 \ + --hash=sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f \ + --hash=sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2 \ + --hash=sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17 \ + --hash=sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb \ + --hash=sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674 \ + --hash=sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706 \ + --hash=sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327 \ + --hash=sha256:5d34eb8494bea691a1a450141ebb5385e4b69d38bb8403b5146ad279f4b30fa3 \ + --hash=sha256:5d5abf8f8ec1f4e22882273c423e16cae834c36856cac348cfbfa68e01c40f3a \ + --hash=sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2 \ + --hash=sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f \ + --hash=sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948 \ + --hash=sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3 \ + --hash=sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e \ + --hash=sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545 \ + --hash=sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc \ + --hash=sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f \ + --hash=sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650 \ + --hash=sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a \ + --hash=sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8 \ + --hash=sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750 \ + --hash=sha256:7bbfcb7165ce3d54a3dfbe731e470f65739c4c1f85bb1018ee912bae139e263b \ + --hash=sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34 \ + --hash=sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225 \ + --hash=sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51 \ + --hash=sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c \ + --hash=sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3 \ + --hash=sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde \ + --hash=sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599 \ + --hash=sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c \ + --hash=sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76 \ + --hash=sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6 \ + --hash=sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39 \ + --hash=sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9 \ + --hash=sha256:8e045731a5416357638d1700927529e2b8ab304811671f665b225f8bf8d8f933 \ + --hash=sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad \ + --hash=sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520 \ + --hash=sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1 \ + --hash=sha256:9242795d174daa40105c1d86aba618e8eab7bf96ba8c3ee614da8302a9f95503 \ + --hash=sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b \ + --hash=sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36 \ + --hash=sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a \ + --hash=sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643 \ + --hash=sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60 \ + --hash=sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483 \ + --hash=sha256:a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf \ + --hash=sha256:a17f6a29cf8935e587cc8a4dbfc8368c55edc645283db0ce9801016f83526c2d \ + --hash=sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6 \ + --hash=sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644 \ + --hash=sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2 \ + --hash=sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9 \ + --hash=sha256:ac542bf38a8a4be2dc6b15248d36315ccc65f0743f7b1a76688ffb6b5129a5c2 \ + --hash=sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640 \ + --hash=sha256:aeb3531b196ef6f11776c21674dba836aeea9d5bd1cf630f869e3d90b16cfade \ + --hash=sha256:b38ac83d5f04b15e515fd86f312479d950d05ce2368d5413d46c088dda7de90a \ + --hash=sha256:b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c \ + --hash=sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6 \ + --hash=sha256:bfa1acfa0c54932d5607e19a2c24646fb4c1ae2694437789129cf099789a3b00 \ + --hash=sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27 \ + --hash=sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2 \ + --hash=sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4 \ + --hash=sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379 \ + --hash=sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54 \ + --hash=sha256:d83db7cde68459fc803052a55ace60bea2bae361fc3b7a6d5da07e11954e4b09 \ + --hash=sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a \ + --hash=sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c \ + --hash=sha256:e1631290ee9271dffe3062d2634c3ecac02c83890ada077d225e081aca8aab89 \ + --hash=sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407 \ + --hash=sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904 \ + --hash=sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376 \ + --hash=sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583 \ + --hash=sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278 \ + --hash=sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a \ + --hash=sha256:edcfc407e4eb17e037bca59be0e85a2031a2ac87e4fed26d3e9df88b4165f92d \ + --hash=sha256:eee3ea935c3d227d49b4eb85660ff631556841f6e567f0f7bda972df6c2c9935 \ + --hash=sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb \ + --hash=sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895 \ + --hash=sha256:f3160309af4396e0ed04db259c3ccbfdc3621b5559b5453075e5de555e1f3a1b \ + --hash=sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417 \ + --hash=sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608 \ + --hash=sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07 \ + --hash=sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05 \ + --hash=sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a \ + --hash=sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d \ + --hash=sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052 +llvmlite==0.43.0 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:14f0e4bf2fd2d9a75a3534111e8ebeb08eda2f33e9bdd6dfa13282afacdde0ed \ + --hash=sha256:18e9953c748b105668487b7c81a3e97b046d8abf95c4ddc0cd3c94f4e4651ae8 \ + --hash=sha256:35d80d61d0cda2d767f72de99450766250560399edc309da16937b93d3b676e7 \ + --hash=sha256:3e8d0618cb9bfe40ac38a9633f2493d4d4e9fcc2f438d39a4e854f39cc0f5f98 \ + --hash=sha256:47e147cdda9037f94b399bf03bfd8a6b6b1f2f90be94a454e3386f006455a9b4 \ + --hash=sha256:6912a87782acdff6eb8bf01675ed01d60ca1f2551f8176a300a886f09e836a6a \ + --hash=sha256:6d4fd101f571a31acb1559ae1af30f30b1dc4b3186669f92ad780e17c81e91bc \ + --hash=sha256:74937acd22dc11b33946b67dca7680e6d103d6e90eeaaaf932603bec6fe7b03a \ + --hash=sha256:7a2872ee80dcf6b5dbdc838763d26554c2a18aa833d31a2635bff16aafefb9c9 \ + --hash=sha256:7d434ec7e2ce3cc8f452d1cd9a28591745de022f931d67be688a737320dfcead \ + --hash=sha256:977525a1e5f4059316b183fb4fd34fa858c9eade31f165427a3977c95e3ee749 \ + --hash=sha256:9cd2a7376f7b3367019b664c21f0c61766219faa3b03731113ead75107f3b66c \ + --hash=sha256:a289af9a1687c6cf463478f0fa8e8aa3b6fb813317b0d70bf1ed0759eab6f761 \ + --hash=sha256:ae2b5b5c3ef67354824fb75517c8db5fbe93bc02cd9671f3c62271626bc041d5 \ + --hash=sha256:bc9efc739cc6ed760f795806f67889923f7274276f0eb45092a1473e40d9b867 \ + --hash=sha256:c1da416ab53e4f7f3bc8d4eeba36d801cc1894b9fbfbf2022b29b6bad34a7df2 \ + --hash=sha256:d5bd550001d26450bd90777736c69d68c487d17bf371438f975229b2b8241a91 \ + --hash=sha256:df6509e1507ca0760787a199d19439cc887bfd82226f5af746d6977bd9f66844 \ + --hash=sha256:e0a9a1a39d4bf3517f2af9d23d479b4175ead205c592ceeb8b89af48a327ea57 \ + --hash=sha256:eccce86bba940bae0d8d48ed925f21dbb813519169246e2ab292b5092aba121f \ + --hash=sha256:f99b600aa7f65235a5a05d0b9a9f31150c390f31261f2a0ba678e26823ec38f7 +markdown-it-py==3.0.0 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \ + --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb +markupsafe==2.1.5 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf \ + --hash=sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff \ + --hash=sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f \ + --hash=sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 \ + --hash=sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532 \ + --hash=sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f \ + --hash=sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 \ + --hash=sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df \ + --hash=sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4 \ + --hash=sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906 \ + --hash=sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f \ + --hash=sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4 \ + --hash=sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8 \ + --hash=sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371 \ + --hash=sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2 \ + --hash=sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465 \ + --hash=sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52 \ + --hash=sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6 \ + --hash=sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169 \ + --hash=sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad \ + --hash=sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2 \ + --hash=sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0 \ + --hash=sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029 \ + --hash=sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f \ + --hash=sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a \ + --hash=sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced \ + --hash=sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5 \ + --hash=sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c \ + --hash=sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf \ + --hash=sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9 \ + --hash=sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb \ + --hash=sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad \ + --hash=sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3 \ + --hash=sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1 \ + --hash=sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46 \ + --hash=sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc \ + --hash=sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a \ + --hash=sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee \ + --hash=sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900 \ + --hash=sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 \ + --hash=sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea \ + --hash=sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f \ + --hash=sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5 \ + --hash=sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e \ + --hash=sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a \ + --hash=sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f \ + --hash=sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50 \ + --hash=sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a \ + --hash=sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b \ + --hash=sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4 \ + --hash=sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff \ + --hash=sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2 \ + --hash=sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46 \ + --hash=sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b \ + --hash=sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf \ + --hash=sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5 \ + --hash=sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5 \ + --hash=sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab \ + --hash=sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd \ + --hash=sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68 +matplotlib==3.9.2 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:039082812cacd6c6bec8e17a9c1e6baca230d4116d522e81e1f63a74d01d2e21 \ + --hash=sha256:03ba9c1299c920964e8d3857ba27173b4dbb51ca4bab47ffc2c2ba0eb5e2cbc5 \ + --hash=sha256:050598c2b29e0b9832cde72bcf97627bf00262adbc4a54e2b856426bb2ef0697 \ + --hash=sha256:18128cc08f0d3cfff10b76baa2f296fc28c4607368a8402de61bb3f2eb33c7d9 \ + --hash=sha256:1cd93b91ab47a3616b4d3c42b52f8363b88ca021e340804c6ab2536344fad9ca \ + --hash=sha256:1d94ff717eb2bd0b58fe66380bd8b14ac35f48a98e7c6765117fe67fb7684e64 \ + --hash=sha256:306c8dfc73239f0e72ac50e5a9cf19cc4e8e331dd0c54f5e69ca8758550f1e1e \ + --hash=sha256:37e51dd1c2db16ede9cfd7b5cabdfc818b2c6397c83f8b10e0e797501c963a03 \ + --hash=sha256:3fd595f34aa8a55b7fc8bf9ebea8aa665a84c82d275190a61118d33fbc82ccae \ + --hash=sha256:4876d7d40219e8ae8bb70f9263bcbe5714415acfdf781086601211335e24f8aa \ + --hash=sha256:5413401594cfaff0052f9d8b1aafc6d305b4bd7c4331dccd18f561ff7e1d3bd3 \ + --hash=sha256:5816b1e1fe8c192cbc013f8f3e3368ac56fbecf02fb41b8f8559303f24c5015e \ + --hash=sha256:65aacf95b62272d568044531e41de26285d54aec8cb859031f511f84bd8b495a \ + --hash=sha256:6758baae2ed64f2331d4fd19be38b7b4eae3ecec210049a26b6a4f3ae1c85dcc \ + --hash=sha256:6d1ce5ed2aefcdce11904fc5bbea7d9c21fff3d5f543841edf3dea84451a09ea \ + --hash=sha256:6d9f07a80deab4bb0b82858a9e9ad53d1382fd122be8cde11080f4e7dfedb38b \ + --hash=sha256:7741f26a58a240f43bee74965c4882b6c93df3e7eb3de160126d8c8f53a6ae6e \ + --hash=sha256:8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447 \ + --hash=sha256:909645cce2dc28b735674ce0931a4ac94e12f5b13f6bb0b5a5e65e7cea2c192b \ + --hash=sha256:96ab43906269ca64a6366934106fa01534454a69e471b7bf3d79083981aaab92 \ + --hash=sha256:9d78bbc0cbc891ad55b4f39a48c22182e9bdaea7fc0e5dbd364f49f729ca1bbb \ + --hash=sha256:ab68d50c06938ef28681073327795c5db99bb4666214d2d5f880ed11aeaded66 \ + --hash=sha256:ac43031375a65c3196bee99f6001e7fa5bdfb00ddf43379d3c0609bdca042df9 \ + --hash=sha256:ae82a14dab96fbfad7965403c643cafe6515e386de723e498cf3eeb1e0b70cc7 \ + --hash=sha256:b2696efdc08648536efd4e1601b5fd491fd47f4db97a5fbfd175549a7365c1b2 \ + --hash=sha256:b82c5045cebcecd8496a4d694d43f9cc84aeeb49fe2133e036b207abe73f4d30 \ + --hash=sha256:be0fc24a5e4531ae4d8e858a1a548c1fe33b176bb13eff7f9d0d38ce5112a27d \ + --hash=sha256:bf81de2926c2db243c9b2cbc3917619a0fc85796c6ba4e58f541df814bbf83c7 \ + --hash=sha256:c375cc72229614632c87355366bdf2570c2dac01ac66b8ad048d2dabadf2d0d4 \ + --hash=sha256:c797dac8bb9c7a3fd3382b16fe8f215b4cf0f22adccea36f1545a6d7be310b41 \ + --hash=sha256:cef2a73d06601437be399908cf13aee74e86932a5ccc6ccdf173408ebc5f6bb2 \ + --hash=sha256:d52a3b618cb1cbb769ce2ee1dcdb333c3ab6e823944e9a2d36e37253815f9556 \ + --hash=sha256:d719465db13267bcef19ea8954a971db03b9f48b4647e3860e4bc8e6ed86610f \ + --hash=sha256:d8dd059447824eec055e829258ab092b56bb0579fc3164fa09c64f3acd478772 \ + --hash=sha256:dbe196377a8248972f5cede786d4c5508ed5f5ca4a1e09b44bda889958b33f8c \ + --hash=sha256:e0830e188029c14e891fadd99702fd90d317df294c3298aad682739c5533721a \ + --hash=sha256:f053c40f94bc51bc03832a41b4f153d83f2062d88c72b5e79997072594e97e51 \ + --hash=sha256:f32c7410c7f246838a77d6d1eff0c0f87f3cb0e7c4247aebea71a6d5a68cab49 \ + --hash=sha256:f6ee45bc4245533111ced13f1f2cace1e7f89d1c793390392a80c139d6cf0e6c \ + --hash=sha256:f7c0410f181a531ec4e93bbc27692f2c71a15c2da16766f5ba9761e7ae518413 +mdit-py-plugins==0.4.2 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636 \ + --hash=sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5 +mdurl==0.1.2 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ + --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba +myst-parser==3.0.1 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:6457aaa33a5d474aca678b8ead9b3dc298e89c68e67012e73146ea6fd54babf1 \ + --hash=sha256:88f0cb406cb363b077d176b51c476f62d60604d68a8dcdf4832e080441301a87 +numba==0.60.0 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:01ef4cd7d83abe087d644eaa3d95831b777aa21d441a23703d649e06b8e06b74 \ + --hash=sha256:0b983bd6ad82fe868493012487f34eae8bf7dd94654951404114f23c3466d34b \ + --hash=sha256:0ebaa91538e996f708f1ab30ef4d3ddc344b64b5227b67a57aa74f401bb68b9d \ + --hash=sha256:1527dc578b95c7c4ff248792ec33d097ba6bef9eda466c948b68dfc995c25781 \ + --hash=sha256:159e618ef213fba758837f9837fb402bbe65326e60ba0633dbe6c7f274d42c1b \ + --hash=sha256:19407ced081d7e2e4b8d8c36aa57b7452e0283871c296e12d798852bc7d7f198 \ + --hash=sha256:3031547a015710140e8c87226b4cfe927cac199835e5bf7d4fe5cb64e814e3ab \ + --hash=sha256:38d6ea4c1f56417076ecf8fc327c831ae793282e0ff51080c5094cb726507b1c \ + --hash=sha256:3fb02b344a2a80efa6f677aa5c40cd5dd452e1b35f8d1c2af0dfd9ada9978e4b \ + --hash=sha256:4142d7ac0210cc86432b818338a2bc368dc773a2f5cf1e32ff7c5b378bd63ee8 \ + --hash=sha256:5d761de835cd38fb400d2c26bb103a2726f548dc30368853121d66201672e651 \ + --hash=sha256:5df6158e5584eece5fc83294b949fd30b9f1125df7708862205217e068aabf16 \ + --hash=sha256:5f4fde652ea604ea3c86508a3fb31556a6157b2c76c8b51b1d45eb40c8598703 \ + --hash=sha256:62908d29fb6a3229c242e981ca27e32a6e606cc253fc9e8faeb0e48760de241e \ + --hash=sha256:819a3dfd4630d95fd574036f99e47212a1af41cbcb019bf8afac63ff56834449 \ + --hash=sha256:a17b70fc9e380ee29c42717e8cc0bfaa5556c416d94f9aa96ba13acb41bdece8 \ + --hash=sha256:c151748cd269ddeab66334bd754817ffc0cabd9433acb0f551697e5151917d25 \ + --hash=sha256:cac02c041e9b5bc8cf8f2034ff6f0dbafccd1ae9590dc146b3a02a45e53af4e2 \ + --hash=sha256:d7da4098db31182fc5ffe4bc42c6f24cd7d1cb8a14b59fd755bfee32e34b8404 \ + --hash=sha256:f75262e8fe7fa96db1dca93d53a194a38c46da28b112b8a4aca168f0df860347 \ + --hash=sha256:fe0b28abb8d70f8160798f4de9d486143200f34458d34c4a214114e445d7124e +numpy==2.0.2 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a \ + --hash=sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195 \ + --hash=sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951 \ + --hash=sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1 \ + --hash=sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c \ + --hash=sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc \ + --hash=sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b \ + --hash=sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd \ + --hash=sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4 \ + --hash=sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd \ + --hash=sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318 \ + --hash=sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448 \ + --hash=sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece \ + --hash=sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d \ + --hash=sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5 \ + --hash=sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8 \ + --hash=sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57 \ + --hash=sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78 \ + --hash=sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66 \ + --hash=sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a \ + --hash=sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e \ + --hash=sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c \ + --hash=sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa \ + --hash=sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d \ + --hash=sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c \ + --hash=sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729 \ + --hash=sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97 \ + --hash=sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c \ + --hash=sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9 \ + --hash=sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669 \ + --hash=sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4 \ + --hash=sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73 \ + --hash=sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385 \ + --hash=sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8 \ + --hash=sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c \ + --hash=sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b \ + --hash=sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692 \ + --hash=sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15 \ + --hash=sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131 \ + --hash=sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a \ + --hash=sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326 \ + --hash=sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b \ + --hash=sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded \ + --hash=sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04 \ + --hash=sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd +packaging==24.1 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ + --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 +pillow==10.4.0 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885 \ + --hash=sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea \ + --hash=sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df \ + --hash=sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5 \ + --hash=sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c \ + --hash=sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d \ + --hash=sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd \ + --hash=sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06 \ + --hash=sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908 \ + --hash=sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a \ + --hash=sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be \ + --hash=sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0 \ + --hash=sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b \ + --hash=sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80 \ + --hash=sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a \ + --hash=sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e \ + --hash=sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9 \ + --hash=sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696 \ + --hash=sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b \ + --hash=sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309 \ + --hash=sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e \ + --hash=sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab \ + --hash=sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d \ + --hash=sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060 \ + --hash=sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d \ + --hash=sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d \ + --hash=sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4 \ + --hash=sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3 \ + --hash=sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6 \ + --hash=sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb \ + --hash=sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94 \ + --hash=sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b \ + --hash=sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496 \ + --hash=sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0 \ + --hash=sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319 \ + --hash=sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b \ + --hash=sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856 \ + --hash=sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef \ + --hash=sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680 \ + --hash=sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b \ + --hash=sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42 \ + --hash=sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e \ + --hash=sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597 \ + --hash=sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a \ + --hash=sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8 \ + --hash=sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3 \ + --hash=sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736 \ + --hash=sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da \ + --hash=sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126 \ + --hash=sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd \ + --hash=sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5 \ + --hash=sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b \ + --hash=sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026 \ + --hash=sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b \ + --hash=sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc \ + --hash=sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46 \ + --hash=sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2 \ + --hash=sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c \ + --hash=sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe \ + --hash=sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984 \ + --hash=sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a \ + --hash=sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70 \ + --hash=sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca \ + --hash=sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b \ + --hash=sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91 \ + --hash=sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3 \ + --hash=sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84 \ + --hash=sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1 \ + --hash=sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5 \ + --hash=sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be \ + --hash=sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f \ + --hash=sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc \ + --hash=sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9 \ + --hash=sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e \ + --hash=sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141 \ + --hash=sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef \ + --hash=sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22 \ + --hash=sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27 \ + --hash=sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e \ + --hash=sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1 +pygments==2.18.0 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \ + --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a +pyparsing==3.1.4 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c \ + --hash=sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032 +python-dateutil==2.9.0.post0 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ + --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 +pyyaml==6.0.2 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff \ + --hash=sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48 \ + --hash=sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086 \ + --hash=sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e \ + --hash=sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133 \ + --hash=sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5 \ + --hash=sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484 \ + --hash=sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee \ + --hash=sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5 \ + --hash=sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68 \ + --hash=sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a \ + --hash=sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf \ + --hash=sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99 \ + --hash=sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8 \ + --hash=sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85 \ + --hash=sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19 \ + --hash=sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc \ + --hash=sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a \ + --hash=sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1 \ + --hash=sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317 \ + --hash=sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c \ + --hash=sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631 \ + --hash=sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d \ + --hash=sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652 \ + --hash=sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5 \ + --hash=sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e \ + --hash=sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b \ + --hash=sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8 \ + --hash=sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476 \ + --hash=sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706 \ + --hash=sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563 \ + --hash=sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237 \ + --hash=sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b \ + --hash=sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083 \ + --hash=sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180 \ + --hash=sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425 \ + --hash=sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e \ + --hash=sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f \ + --hash=sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725 \ + --hash=sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183 \ + --hash=sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab \ + --hash=sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774 \ + --hash=sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725 \ + --hash=sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e \ + --hash=sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5 \ + --hash=sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d \ + --hash=sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290 \ + --hash=sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44 \ + --hash=sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed \ + --hash=sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4 \ + --hash=sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba \ + --hash=sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12 \ + --hash=sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4 +requests==2.32.3 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ + --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 +scipy==1.14.1 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:0c2f95de3b04e26f5f3ad5bb05e74ba7f68b837133a4492414b3afd79dfe540e \ + --hash=sha256:1729560c906963fc8389f6aac023739ff3983e727b1a4d87696b7bf108316a79 \ + --hash=sha256:278266012eb69f4a720827bdd2dc54b2271c97d84255b2faaa8f161a158c3b37 \ + --hash=sha256:2843f2d527d9eebec9a43e6b406fb7266f3af25a751aa91d62ff416f54170bc5 \ + --hash=sha256:2da0469a4ef0ecd3693761acbdc20f2fdeafb69e6819cc081308cc978153c675 \ + --hash=sha256:2ff0a7e01e422c15739ecd64432743cf7aae2b03f3084288f399affcefe5222d \ + --hash=sha256:2ff38e22128e6c03ff73b6bb0f85f897d2362f8c052e3b8ad00532198fbdae3f \ + --hash=sha256:30ac8812c1d2aab7131a79ba62933a2a76f582d5dbbc695192453dae67ad6310 \ + --hash=sha256:3a1b111fac6baec1c1d92f27e76511c9e7218f1695d61b59e05e0fe04dc59617 \ + --hash=sha256:4079b90df244709e675cdc8b93bfd8a395d59af40b72e339c2287c91860deb8e \ + --hash=sha256:5149e3fd2d686e42144a093b206aef01932a0059c2a33ddfa67f5f035bdfe13e \ + --hash=sha256:5a275584e726026a5699459aa72f828a610821006228e841b94275c4a7c08417 \ + --hash=sha256:631f07b3734d34aced009aaf6fedfd0eb3498a97e581c3b1e5f14a04164a456d \ + --hash=sha256:716e389b694c4bb564b4fc0c51bc84d381735e0d39d3f26ec1af2556ec6aad94 \ + --hash=sha256:8426251ad1e4ad903a4514712d2fa8fdd5382c978010d1c6f5f37ef286a713ad \ + --hash=sha256:8475230e55549ab3f207bff11ebfc91c805dc3463ef62eda3ccf593254524ce8 \ + --hash=sha256:8bddf15838ba768bb5f5083c1ea012d64c9a444e16192762bd858f1e126196d0 \ + --hash=sha256:8e32dced201274bf96899e6491d9ba3e9a5f6b336708656466ad0522d8528f69 \ + --hash=sha256:8f9ea80f2e65bdaa0b7627fb00cbeb2daf163caa015e59b7516395fe3bd1e066 \ + --hash=sha256:97c5dddd5932bd2a1a31c927ba5e1463a53b87ca96b5c9bdf5dfd6096e27efc3 \ + --hash=sha256:a49f6ed96f83966f576b33a44257d869756df6cf1ef4934f59dd58b25e0327e5 \ + --hash=sha256:af29a935803cc707ab2ed7791c44288a682f9c8107bc00f0eccc4f92c08d6e07 \ + --hash=sha256:b05d43735bb2f07d689f56f7b474788a13ed8adc484a85aa65c0fd931cf9ccd2 \ + --hash=sha256:b28d2ca4add7ac16ae8bb6632a3c86e4b9e4d52d3e34267f6e1b0c1f8d87e389 \ + --hash=sha256:b99722ea48b7ea25e8e015e8341ae74624f72e5f21fc2abd45f3a93266de4c5d \ + --hash=sha256:baff393942b550823bfce952bb62270ee17504d02a1801d7fd0719534dfb9c84 \ + --hash=sha256:c0ee987efa6737242745f347835da2cc5bb9f1b42996a4d97d5c7ff7928cb6f2 \ + --hash=sha256:d0d2821003174de06b69e58cef2316a6622b60ee613121199cb2852a873f8cf3 \ + --hash=sha256:e0cf28db0f24a38b2a0ca33a85a54852586e43cf6fd876365c86e0657cfe7d73 \ + --hash=sha256:e4f5a7c49323533f9103d4dacf4e4f07078f360743dec7f7596949149efeec06 \ + --hash=sha256:eb58ca0abd96911932f688528977858681a59d61a7ce908ffd355957f7025cfc \ + --hash=sha256:edaf02b82cd7639db00dbff629995ef185c8df4c3ffa71a5562a595765a06ce1 \ + --hash=sha256:fef8c87f8abfb884dac04e97824b61299880c43f4ce675dd2cbeadd3c9b466d2 +six==1.16.0 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ + --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 +sniffio==1.3.1 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \ + --hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc +snowballstemmer==2.2.0 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1 \ + --hash=sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a +sphinx-autoapi==3.3.1 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:c31a5f41eabc9705d277b75f98e983d653e9af24e294dd576b2afa1719f72c1f \ + --hash=sha256:e44a225827d0ef7178748225a66f30c95454dfd00ee3c22afbdfb8056f7dffb5 +sphinx-autobuild==2024.9.3 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:55fe9bcc05dab659650d79bed0e6beb8b6032234edbf23f028f2cac3471f0c2d \ + --hash=sha256:75929a5a92b932da8d29837406d6d973a927c456f30986a27f1f20b067897892 +sphinx-rtd-theme==2.0.0 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b \ + --hash=sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586 +sphinx==7.4.7 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe \ + --hash=sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239 +sphinxcontrib-applehelp==2.0.0 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1 \ + --hash=sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5 +sphinxcontrib-devhelp==2.0.0 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad \ + --hash=sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2 +sphinxcontrib-htmlhelp==2.1.0 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8 \ + --hash=sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9 +sphinxcontrib-jquery==4.1 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a \ + --hash=sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae +sphinxcontrib-jsmath==1.0.1 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 \ + --hash=sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8 +sphinxcontrib-qthelp==2.0.0 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab \ + --hash=sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb +sphinxcontrib-serializinghtml==2.0.0 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331 \ + --hash=sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d +starlette==0.38.5 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:04a92830a9b6eb1442c766199d62260c3d4dc9c4f9188360626b1e0273cb7077 \ + --hash=sha256:632f420a9d13e3ee2a6f18f437b0a9f1faecb0bc42e1942aa2ea0e379a4c4206 +tomli==2.0.1 ; python_version >= "3.10" and python_version < "3.11" \ + --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ + --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f +typing-extensions==4.12.2 ; python_version >= "3.10" and python_version < "3.11" \ + --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ + --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 +urllib3==2.2.3 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac \ + --hash=sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9 +uvicorn==0.30.6 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:4b15decdda1e72be08209e860a1e10e92439ad5b97cf44cc945fcbee66fc5788 \ + --hash=sha256:65fd46fe3fda5bdc1b03b94eb634923ff18cd35b2f084813ea79d1f103f711b5 +watchfiles==0.24.0 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:01550ccf1d0aed6ea375ef259706af76ad009ef5b0203a3a4cce0f6024f9b68a \ + --hash=sha256:01def80eb62bd5db99a798d5e1f5f940ca0a05986dcfae21d833af7a46f7ee22 \ + --hash=sha256:07cdef0c84c03375f4e24642ef8d8178e533596b229d32d2bbd69e5128ede02a \ + --hash=sha256:083dc77dbdeef09fa44bb0f4d1df571d2e12d8a8f985dccde71ac3ac9ac067a0 \ + --hash=sha256:1cf1f6dd7825053f3d98f6d33f6464ebdd9ee95acd74ba2c34e183086900a827 \ + --hash=sha256:21ab23fdc1208086d99ad3f69c231ba265628014d4aed31d4e8746bd59e88cd1 \ + --hash=sha256:2dadf8a8014fde6addfd3c379e6ed1a981c8f0a48292d662e27cabfe4239c83c \ + --hash=sha256:2e28d91ef48eab0afb939fa446d8ebe77e2f7593f5f463fd2bb2b14132f95b6e \ + --hash=sha256:2efec17819b0046dde35d13fb8ac7a3ad877af41ae4640f4109d9154ed30a188 \ + --hash=sha256:30bbd525c3262fd9f4b1865cb8d88e21161366561cd7c9e1194819e0a33ea86b \ + --hash=sha256:316449aefacf40147a9efaf3bd7c9bdd35aaba9ac5d708bd1eb5763c9a02bef5 \ + --hash=sha256:327763da824817b38ad125dcd97595f942d720d32d879f6c4ddf843e3da3fe90 \ + --hash=sha256:32aa53a9a63b7f01ed32e316e354e81e9da0e6267435c7243bf8ae0f10b428ef \ + --hash=sha256:34e19e56d68b0dad5cff62273107cf5d9fbaf9d75c46277aa5d803b3ef8a9e9b \ + --hash=sha256:3770e260b18e7f4e576edca4c0a639f704088602e0bc921c5c2e721e3acb8d15 \ + --hash=sha256:3d2e3ab79a1771c530233cadfd277fcc762656d50836c77abb2e5e72b88e3a48 \ + --hash=sha256:41face41f036fee09eba33a5b53a73e9a43d5cb2c53dad8e61fa6c9f91b5a51e \ + --hash=sha256:43e3e37c15a8b6fe00c1bce2473cfa8eb3484bbeecf3aefbf259227e487a03df \ + --hash=sha256:449f43f49c8ddca87c6b3980c9284cab6bd1f5c9d9a2b00012adaaccd5e7decd \ + --hash=sha256:4933a508d2f78099162da473841c652ad0de892719043d3f07cc83b33dfd9d91 \ + --hash=sha256:49d617df841a63b4445790a254013aea2120357ccacbed00253f9c2b5dc24e2d \ + --hash=sha256:49fb58bcaa343fedc6a9e91f90195b20ccb3135447dc9e4e2570c3a39565853e \ + --hash=sha256:4a7fa2bc0efef3e209a8199fd111b8969fe9db9c711acc46636686331eda7dd4 \ + --hash=sha256:4abf4ad269856618f82dee296ac66b0cd1d71450fc3c98532d93798e73399b7a \ + --hash=sha256:4b8693502d1967b00f2fb82fc1e744df128ba22f530e15b763c8d82baee15370 \ + --hash=sha256:4d28cea3c976499475f5b7a2fec6b3a36208656963c1a856d328aeae056fc5c1 \ + --hash=sha256:5148c2f1ea043db13ce9b0c28456e18ecc8f14f41325aa624314095b6aa2e9ea \ + --hash=sha256:54ca90a9ae6597ae6dc00e7ed0a040ef723f84ec517d3e7ce13e63e4bc82fa04 \ + --hash=sha256:551ec3ee2a3ac9cbcf48a4ec76e42c2ef938a7e905a35b42a1267fa4b1645896 \ + --hash=sha256:5c51749f3e4e269231510da426ce4a44beb98db2dce9097225c338f815b05d4f \ + --hash=sha256:632676574429bee8c26be8af52af20e0c718cc7f5f67f3fb658c71928ccd4f7f \ + --hash=sha256:6509ed3f467b79d95fc62a98229f79b1a60d1b93f101e1c61d10c95a46a84f43 \ + --hash=sha256:6bdcfa3cd6fdbdd1a068a52820f46a815401cbc2cb187dd006cb076675e7b735 \ + --hash=sha256:7138eff8baa883aeaa074359daabb8b6c1e73ffe69d5accdc907d62e50b1c0da \ + --hash=sha256:7211b463695d1e995ca3feb38b69227e46dbd03947172585ecb0588f19b0d87a \ + --hash=sha256:73bde715f940bea845a95247ea3e5eb17769ba1010efdc938ffcb967c634fa61 \ + --hash=sha256:78470906a6be5199524641f538bd2c56bb809cd4bf29a566a75051610bc982c3 \ + --hash=sha256:7ae3e208b31be8ce7f4c2c0034f33406dd24fbce3467f77223d10cd86778471c \ + --hash=sha256:7e4bd963a935aaf40b625c2499f3f4f6bbd0c3776f6d3bc7c853d04824ff1c9f \ + --hash=sha256:82ae557a8c037c42a6ef26c494d0631cacca040934b101d001100ed93d43f361 \ + --hash=sha256:82b2509f08761f29a0fdad35f7e1638b8ab1adfa2666d41b794090361fb8b855 \ + --hash=sha256:8360f7314a070c30e4c976b183d1d8d1585a4a50c5cb603f431cebcbb4f66327 \ + --hash=sha256:85d5f0c7771dcc7a26c7a27145059b6bb0ce06e4e751ed76cdf123d7039b60b5 \ + --hash=sha256:88bcd4d0fe1d8ff43675360a72def210ebad3f3f72cabfeac08d825d2639b4ab \ + --hash=sha256:9301c689051a4857d5b10777da23fafb8e8e921bcf3abe6448a058d27fb67633 \ + --hash=sha256:951088d12d339690a92cef2ec5d3cfd957692834c72ffd570ea76a6790222777 \ + --hash=sha256:95cf3b95ea665ab03f5a54765fa41abf0529dbaf372c3b83d91ad2cfa695779b \ + --hash=sha256:96619302d4374de5e2345b2b622dc481257a99431277662c30f606f3e22f42be \ + --hash=sha256:999928c6434372fde16c8f27143d3e97201160b48a614071261701615a2a156f \ + --hash=sha256:9a60e2bf9dc6afe7f743e7c9b149d1fdd6dbf35153c78fe3a14ae1a9aee3d98b \ + --hash=sha256:9f895d785eb6164678ff4bb5cc60c5996b3ee6df3edb28dcdeba86a13ea0465e \ + --hash=sha256:a2a9891723a735d3e2540651184be6fd5b96880c08ffe1a98bae5017e65b544b \ + --hash=sha256:a974231b4fdd1bb7f62064a0565a6b107d27d21d9acb50c484d2cdba515b9366 \ + --hash=sha256:aa0fd7248cf533c259e59dc593a60973a73e881162b1a2f73360547132742823 \ + --hash=sha256:acbfa31e315a8f14fe33e3542cbcafc55703b8f5dcbb7c1eecd30f141df50db3 \ + --hash=sha256:afb72325b74fa7a428c009c1b8be4b4d7c2afedafb2982827ef2156646df2fe1 \ + --hash=sha256:b3ef2c69c655db63deb96b3c3e587084612f9b1fa983df5e0c3379d41307467f \ + --hash=sha256:b52a65e4ea43c6d149c5f8ddb0bef8d4a1e779b77591a458a893eb416624a418 \ + --hash=sha256:b665caeeda58625c3946ad7308fbd88a086ee51ccb706307e5b1fa91556ac886 \ + --hash=sha256:b74fdffce9dfcf2dc296dec8743e5b0332d15df19ae464f0e249aa871fc1c571 \ + --hash=sha256:b995bfa6bf01a9e09b884077a6d37070464b529d8682d7691c2d3b540d357a0c \ + --hash=sha256:bd82010f8ab451dabe36054a1622870166a67cf3fce894f68895db6f74bbdc94 \ + --hash=sha256:bdcd5538e27f188dd3c804b4a8d5f52a7fc7f87e7fd6b374b8e36a4ca03db428 \ + --hash=sha256:c79d7719d027b7a42817c5d96461a99b6a49979c143839fc37aa5748c322f234 \ + --hash=sha256:cdab9555053399318b953a1fe1f586e945bc8d635ce9d05e617fd9fe3a4687d6 \ + --hash=sha256:ce72dba6a20e39a0c628258b5c308779b8697f7676c254a845715e2a1039b968 \ + --hash=sha256:d337193bbf3e45171c8025e291530fb7548a93c45253897cd764a6a71c937ed9 \ + --hash=sha256:d3dcb774e3568477275cc76554b5a565024b8ba3a0322f77c246bc7111c5bb9c \ + --hash=sha256:d64ba08db72e5dfd5c33be1e1e687d5e4fcce09219e8aee893a4862034081d4e \ + --hash=sha256:d7a2e3b7f5703ffbd500dabdefcbc9eafeff4b9444bbdd5d83d79eedf8428fab \ + --hash=sha256:d831ee0a50946d24a53821819b2327d5751b0c938b12c0653ea5be7dea9c82ec \ + --hash=sha256:d9018153cf57fc302a2a34cb7564870b859ed9a732d16b41a9b5cb2ebed2d444 \ + --hash=sha256:e5171ef898299c657685306d8e1478a45e9303ddcd8ac5fed5bd52ad4ae0b69b \ + --hash=sha256:e94e98c7cb94cfa6e071d401ea3342767f28eb5a06a58fafdc0d2a4974f4f35c \ + --hash=sha256:ec39698c45b11d9694a1b635a70946a5bad066b593af863460a8e600f0dff1ca \ + --hash=sha256:ed9aba6e01ff6f2e8285e5aa4154e2970068fe0fc0998c4380d0e6278222269b \ + --hash=sha256:edf71b01dec9f766fb285b73930f95f730bb0943500ba0566ae234b5c1618c18 \ + --hash=sha256:ee82c98bed9d97cd2f53bdb035e619309a098ea53ce525833e26b93f673bc318 \ + --hash=sha256:f4c96283fca3ee09fb044f02156d9570d156698bc3734252175a38f0e8975f07 \ + --hash=sha256:f7d9b87c4c55e3ea8881dfcbf6d61ea6775fffed1fedffaa60bd047d3c08c430 \ + --hash=sha256:f83df90191d67af5a831da3a33dd7628b02a95450e168785586ed51e6d28943c \ + --hash=sha256:fca9433a45f18b7c779d2bae7beeec4f740d28b788b117a48368d95a3233ed83 \ + --hash=sha256:fd92bbaa2ecdb7864b7600dcdb6f2f1db6e0346ed425fbd01085be04c63f0b05 +websockets==13.0.1 ; python_version >= "3.10" and python_version < "4.0" \ + --hash=sha256:00fd961943b6c10ee6f0b1130753e50ac5dcd906130dcd77b0003c3ab797d026 \ + --hash=sha256:03d3f9ba172e0a53e37fa4e636b86cc60c3ab2cfee4935e66ed1d7acaa4625ad \ + --hash=sha256:0513c727fb8adffa6d9bf4a4463b2bade0186cbd8c3604ae5540fae18a90cb99 \ + --hash=sha256:05e70fec7c54aad4d71eae8e8cab50525e899791fc389ec6f77b95312e4e9920 \ + --hash=sha256:0617fd0b1d14309c7eab6ba5deae8a7179959861846cbc5cb528a7531c249448 \ + --hash=sha256:06c0a667e466fcb56a0886d924b5f29a7f0886199102f0a0e1c60a02a3751cb4 \ + --hash=sha256:0f52504023b1480d458adf496dc1c9e9811df4ba4752f0bc1f89ae92f4f07d0c \ + --hash=sha256:10a0dc7242215d794fb1918f69c6bb235f1f627aaf19e77f05336d147fce7c37 \ + --hash=sha256:11f9976ecbc530248cf162e359a92f37b7b282de88d1d194f2167b5e7ad80ce3 \ + --hash=sha256:132511bfd42e77d152c919147078460c88a795af16b50e42a0bd14f0ad71ddd2 \ + --hash=sha256:139add0f98206cb74109faf3611b7783ceafc928529c62b389917a037d4cfdf4 \ + --hash=sha256:14b9c006cac63772b31abbcd3e3abb6228233eec966bf062e89e7fa7ae0b7333 \ + --hash=sha256:15c7d62ee071fa94a2fc52c2b472fed4af258d43f9030479d9c4a2de885fd543 \ + --hash=sha256:165bedf13556f985a2aa064309baa01462aa79bf6112fbd068ae38993a0e1f1b \ + --hash=sha256:17118647c0ea14796364299e942c330d72acc4b248e07e639d34b75067b3cdd8 \ + --hash=sha256:1841c9082a3ba4a05ea824cf6d99570a6a2d8849ef0db16e9c826acb28089e8f \ + --hash=sha256:1a678532018e435396e37422a95e3ab87f75028ac79570ad11f5bf23cd2a7d8c \ + --hash=sha256:1ee4cc030a4bdab482a37462dbf3ffb7e09334d01dd37d1063be1136a0d825fa \ + --hash=sha256:1f3cf6d6ec1142412d4535adabc6bd72a63f5f148c43fe559f06298bc21953c9 \ + --hash=sha256:1f613289f4a94142f914aafad6c6c87903de78eae1e140fa769a7385fb232fdf \ + --hash=sha256:1fa082ea38d5de51dd409434edc27c0dcbd5fed2b09b9be982deb6f0508d25bc \ + --hash=sha256:249aab278810bee585cd0d4de2f08cfd67eed4fc75bde623be163798ed4db2eb \ + --hash=sha256:254ecf35572fca01a9f789a1d0f543898e222f7b69ecd7d5381d8d8047627bdb \ + --hash=sha256:2a02b0161c43cc9e0232711eff846569fad6ec836a7acab16b3cf97b2344c060 \ + --hash=sha256:30d3a1f041360f029765d8704eae606781e673e8918e6b2c792e0775de51352f \ + --hash=sha256:3624fd8664f2577cf8de996db3250662e259bfbc870dd8ebdcf5d7c6ac0b5185 \ + --hash=sha256:3f55b36d17ac50aa8a171b771e15fbe1561217510c8768af3d546f56c7576cdc \ + --hash=sha256:46af561eba6f9b0848b2c9d2427086cabadf14e0abdd9fde9d72d447df268418 \ + --hash=sha256:47236c13be337ef36546004ce8c5580f4b1150d9538b27bf8a5ad8edf23ccfab \ + --hash=sha256:4a365bcb7be554e6e1f9f3ed64016e67e2fa03d7b027a33e436aecf194febb63 \ + --hash=sha256:4d6ece65099411cfd9a48d13701d7438d9c34f479046b34c50ff60bb8834e43e \ + --hash=sha256:4e85f46ce287f5c52438bb3703d86162263afccf034a5ef13dbe4318e98d86e7 \ + --hash=sha256:4f0426d51c8f0926a4879390f53c7f5a855e42d68df95fff6032c82c888b5f36 \ + --hash=sha256:518f90e6dd089d34eaade01101fd8a990921c3ba18ebbe9b0165b46ebff947f0 \ + --hash=sha256:52aed6ef21a0f1a2a5e310fb5c42d7555e9c5855476bbd7173c3aa3d8a0302f2 \ + --hash=sha256:556e70e4f69be1082e6ef26dcb70efcd08d1850f5d6c5f4f2bcb4e397e68f01f \ + --hash=sha256:56a952fa2ae57a42ba7951e6b2605e08a24801a4931b5644dfc68939e041bc7f \ + --hash=sha256:59197afd478545b1f73367620407b0083303569c5f2d043afe5363676f2697c9 \ + --hash=sha256:5df891c86fe68b2c38da55b7aea7095beca105933c697d719f3f45f4220a5e0e \ + --hash=sha256:63848cdb6fcc0bf09d4a155464c46c64ffdb5807ede4fb251da2c2692559ce75 \ + --hash=sha256:64a11aae1de4c178fa653b07d90f2fb1a2ed31919a5ea2361a38760192e1858b \ + --hash=sha256:6724b554b70d6195ba19650fef5759ef11346f946c07dbbe390e039bcaa7cc3d \ + --hash=sha256:67494e95d6565bf395476e9d040037ff69c8b3fa356a886b21d8422ad86ae075 \ + --hash=sha256:67648f5e50231b5a7f6d83b32f9c525e319f0ddc841be0de64f24928cd75a603 \ + --hash=sha256:68264802399aed6fe9652e89761031acc734fc4c653137a5911c2bfa995d6d6d \ + --hash=sha256:699ba9dd6a926f82a277063603fc8d586b89f4cb128efc353b749b641fcddda7 \ + --hash=sha256:6aa74a45d4cdc028561a7d6ab3272c8b3018e23723100b12e58be9dfa5a24491 \ + --hash=sha256:6b41a1b3b561f1cba8321fb32987552a024a8f67f0d05f06fcf29f0090a1b956 \ + --hash=sha256:71e6e5a3a3728886caee9ab8752e8113670936a193284be9d6ad2176a137f376 \ + --hash=sha256:7d20516990d8ad557b5abeb48127b8b779b0b7e6771a265fa3e91767596d7d97 \ + --hash=sha256:80e4ba642fc87fa532bac07e5ed7e19d56940b6af6a8c61d4429be48718a380f \ + --hash=sha256:872afa52a9f4c414d6955c365b6588bc4401272c629ff8321a55f44e3f62b553 \ + --hash=sha256:8eb2b9a318542153674c6e377eb8cb9ca0fc011c04475110d3477862f15d29f0 \ + --hash=sha256:9bbc525f4be3e51b89b2a700f5746c2a6907d2e2ef4513a8daafc98198b92237 \ + --hash=sha256:a1a2e272d067030048e1fe41aa1ec8cfbbaabce733b3d634304fa2b19e5c897f \ + --hash=sha256:a5dc0c42ded1557cc7c3f0240b24129aefbad88af4f09346164349391dea8e58 \ + --hash=sha256:acab3539a027a85d568c2573291e864333ec9d912675107d6efceb7e2be5d980 \ + --hash=sha256:acbebec8cb3d4df6e2488fbf34702cbc37fc39ac7abf9449392cefb3305562e9 \ + --hash=sha256:ad327ac80ba7ee61da85383ca8822ff808ab5ada0e4a030d66703cc025b021c4 \ + --hash=sha256:b448a0690ef43db5ef31b3a0d9aea79043882b4632cfc3eaab20105edecf6097 \ + --hash=sha256:b5a06d7f60bc2fc378a333978470dfc4e1415ee52f5f0fce4f7853eb10c1e9df \ + --hash=sha256:b74593e9acf18ea5469c3edaa6b27fa7ecf97b30e9dabd5a94c4c940637ab96e \ + --hash=sha256:b79915a1179a91f6c5f04ece1e592e2e8a6bd245a0e45d12fd56b2b59e559a32 \ + --hash=sha256:b80f0c51681c517604152eb6a572f5a9378f877763231fddb883ba2f968e8817 \ + --hash=sha256:b8ac5b46fd798bbbf2ac6620e0437c36a202b08e1f827832c4bf050da081b501 \ + --hash=sha256:c3c493d0e5141ec055a7d6809a28ac2b88d5b878bb22df8c621ebe79a61123d0 \ + --hash=sha256:c44ca9ade59b2e376612df34e837013e2b273e6c92d7ed6636d0556b6f4db93d \ + --hash=sha256:c4a6343e3b0714e80da0b0893543bf9a5b5fa71b846ae640e56e9abc6fbc4c83 \ + --hash=sha256:c5870b4a11b77e4caa3937142b650fbbc0914a3e07a0cf3131f35c0587489c1c \ + --hash=sha256:ca48914cdd9f2ccd94deab5bcb5ac98025a5ddce98881e5cce762854a5de330b \ + --hash=sha256:cf2fae6d85e5dc384bf846f8243ddaa9197f3a1a70044f59399af001fd1f51d4 \ + --hash=sha256:d450f5a7a35662a9b91a64aefa852f0c0308ee256122f5218a42f1d13577d71e \ + --hash=sha256:d6716c087e4aa0b9260c4e579bb82e068f84faddb9bfba9906cb87726fa2e870 \ + --hash=sha256:d93572720d781331fb10d3da9ca1067817d84ad1e7c31466e9f5e59965618096 \ + --hash=sha256:dbb0b697cc0655719522406c059eae233abaa3243821cfdfab1215d02ac10231 \ + --hash=sha256:e33505534f3f673270dd67f81e73550b11de5b538c56fe04435d63c02c3f26b5 \ + --hash=sha256:e801ca2f448850685417d723ec70298feff3ce4ff687c6f20922c7474b4746ae \ + --hash=sha256:e82db3756ccb66266504f5a3de05ac6b32f287faacff72462612120074103329 \ + --hash=sha256:ef48e4137e8799998a343706531e656fdec6797b80efd029117edacb74b0a10a \ + --hash=sha256:f1d3d1f2eb79fe7b0fb02e599b2bf76a7619c79300fc55f0b5e2d382881d4f7f \ + --hash=sha256:f3fea72e4e6edb983908f0db373ae0732b275628901d909c382aae3b592589f2 \ + --hash=sha256:f40de079779acbcdbb6ed4c65af9f018f8b77c5ec4e17a4b737c05c2db554491 \ + --hash=sha256:f73e676a46b0fe9426612ce8caeca54c9073191a77c3e9d5c94697aef99296af \ + --hash=sha256:f9c9e258e3d5efe199ec23903f5da0eeaad58cf6fccb3547b74fd4750e5ac47a \ + --hash=sha256:fac2d146ff30d9dd2fcf917e5d147db037a5c573f0446c564f16f1f94cf87462 \ + --hash=sha256:faef9ec6354fe4f9a2c0bbb52fb1ff852effc897e2a4501e25eb3a47cb0a4f89