diff --git a/doc/source/code-examples/advancedexamples.rst b/doc/source/code-examples/advancedexamples.rst index c1ee4b61d8..2adbae6128 100644 --- a/doc/source/code-examples/advancedexamples.rst +++ b/doc/source/code-examples/advancedexamples.rst @@ -1956,3 +1956,111 @@ This can also be invoked directly from the ``result`` object: The expectation from samples currently works only for Hamiltonians that are diagonal in the computational basis. + + +.. _tutorials_transpiler: + +How to modify the transpiler? +----------------------------- + +Logical quantum circuits for quantum algorithms are hardware agnostic. Usually an all-to-all qubit connectivity +is assumed while most current hardware only allows the execution of two-qubit gates on a restricted subset of qubit +pairs. Moreover, quantum devices are restricted to executing a subset of gates, referred to as native. +This means that, in order to execute circuits on a real quantum chip, they must be transformed into an equivalent, +hardware specific, circuit. The transformation of the circuit is carried out by the transpiler through the resolution +of two key steps: connectivity matching and native gates decomposition. +In order to execute a gate between two qubits that are not directly connected SWAP gates are required. This procedure is called routing. +As on NISQ devices two-qubit gates are a large source of noise, this procedure generates an overall noisier circuit. +Therefore, the goal of an efficient routing algorithm is to minimize the number of SWAP gates introduced. +An important step to ease the connectivity problem, is finding anoptimal initial mapping between logical and physical qubits. +This step is called placement. +The native gates decomposition in the transpiling procedure is performed by the unroller. An optimal decomposition uses the least amount +of two-qubit native gates. It is also possible to reduce the number of gates of the resulting circuit by exploiting +commutation relations, KAK decomposition or machine learning techniques. +Qibo implements a built-in transpiler with customizable options for each step. The main algorithms that can +be used at each transpiler step are reported below with a short description. + +The initial placement can be found with one of the following procedures: +- Trivial: logical-physical qubit mapping is an identity. +- Custom: custom logical-physical qubit mapping. +- Random greedy: the best mapping is found within a set of random layouts based on a greedy policy. +- Subgraph isomorphism: the initial mapping is the one that guarantees the execution of most gates at +the beginning of the circuit without introducing any SWAP. +- Reverse traversal: this technique uses one or more reverse routing passes to find an optimal mapping by +starting from a trivial layout. + +The routing problem can be solved with the following algorithms: +- Shortest paths: when unconnected logical qubits have to interact, they are moved on the chip on +the shortest path connecting them. When multiple shortest paths are present, the one that also matches +the largest number of the following two-qubit gates is chosen. +- Sabre: this heuristic routing technique uses a customizable cost function to add SWAP gates +that reduce the distance between unconnected qubits involved in two-qubit gates. + +Qibolab unroller applies recursively a set of hard-coded gates decompositions in order to translate any gate into +single and two-qubit native gates. Single qubit gates are translated into U3, RX, RZ, X and Z gates. It is possible to +fuse multiple single qubit gates acting on the same qubit into a single U3 gate. For the two-qubit native gates it +is possible to use CZ and/or iSWAP. When both CZ and iSWAP gates are available the chosen decomposition is the +one that minimizes the use of two-qubit gates. + +Multiple transpilation steps can be implemented using the :class:`qibo.transpiler.pipeline.Pipeline`: + +.. testcode:: python + + import networkx as nx + + from qibo import gates + from qibo.models import Circuit + from qibo.transpiler.pipeline import Passes, assert_transpiling + from qibo.transpiler.abstract import NativeType + from qibo.transpiler.optimizer import Preprocessing + from qibo.transpiler.router import ShortestPaths + from qibo.transpiler.unroller import NativeGates + from qibo.transpiler.placer import Random + + # Define connectivity as nx.Graph + def star_connectivity(): + Q = [i for i in range(5)] + chip = nx.Graph() + chip.add_nodes_from(Q) + graph_list = [(Q[i], Q[2]) for i in range(5) if i != 2] + chip.add_edges_from(graph_list) + return chip + + # Define the circuit + circuit = Circuit(2) + circuit.add(gates.H(0)) + circuit.add(gates.CZ(0, 1)) + + # Define custom passes as a list + custom_passes = [] + # Preprocessing adds qubits in the original circuit to match the number of qubits in the chip + custom_passes.append(Preprocessing(connectivity=star_connectivity())) + # Placement step + custom_passes.append(Random(connectivity=star_connectivity())) + # Routing step + custom_passes.append(ShortestPaths(connectivity=star_connectivity())) + # Gate decomposition step + custom_passes.append(NativeGates(two_qubit_natives=NativeType.iSWAP)) + + # Define the general pipeline + custom_pipeline = Passes(custom_passes, connectivity=star_connectivity(), native_gates=NativeType.iSWAP) + + # Call the transpiler pipeline on the circuit + transpiled_circ, final_layout = custom_pipeline(circuit) + + # Optinally call assert_transpiling to check that the final circuit can be executed on hardware + # For this test it is necessary to get the initial layout + initial_layout = custom_pipeline.get_initial_layout() + assert_transpiling( + original_circuit=circuit, + transpiled_circuit=transpiled_circ, + connectivity=star_connectivity(), + initial_layout=initial_layout, + final_layout=final_layout, + native_gates=NativeType.iSWAP + ) + +In this case circuits will first be transpiled to respect the 5-qubit star connectivity, with qubit 2 as the middle qubit. This will potentially add some SWAP gates. +Then all gates will be converted to native. The :class:`qibo.transpiler.unroller.NativeGates` transpiler used in this example assumes Z, RZ, GPI2 or U3 as +the single-qubit native gates, and supports CZ and iSWAP as two-qubit natives. In this case we restricted the two-qubit gate set to CZ only. +The final_layout contains the final logical-physical qubit mapping. diff --git a/poetry.lock b/poetry.lock index cb7294b89f..4d36a70fcf 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,9 +1,10 @@ -# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.4.0 and should not be changed by hand. [[package]] name = "absl-py" version = "2.0.0" description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." + optional = false python-versions = ">=3.7" files = [ @@ -15,6 +16,7 @@ files = [ name = "alabaster" version = "0.7.13" description = "A configurable sidebar-enabled Sphinx theme" + optional = false python-versions = ">=3.6" files = [ @@ -22,31 +24,11 @@ files = [ {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, ] -[[package]] -name = "anyio" -version = "4.0.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false -python-versions = ">=3.8" -files = [ - {file = "anyio-4.0.0-py3-none-any.whl", hash = "sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f"}, - {file = "anyio-4.0.0.tar.gz", hash = "sha256:f7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a"}, -] - -[package.dependencies] -exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} -idna = ">=2.8" -sniffio = ">=1.1" - -[package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.22)"] - [[package]] name = "appnope" version = "0.1.3" description = "Disable App Nap on macOS >= 10.9" + optional = false python-versions = "*" files = [ @@ -58,6 +40,7 @@ files = [ name = "astroid" version = "2.15.8" description = "An abstract syntax tree for Python with inference support." + optional = false python-versions = ">=3.7.2" files = [ @@ -77,6 +60,7 @@ wrapt = [ name = "asttokens" version = "2.4.1" description = "Annotate AST trees with source code positions" + optional = false python-versions = "*" files = [ @@ -95,6 +79,7 @@ test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] name = "astunparse" version = "1.6.3" description = "An AST unparser for Python" + optional = false python-versions = "*" files = [ @@ -108,25 +93,28 @@ wheel = ">=0.23.0,<1.0" [[package]] name = "attrs" -version = "21.4.0" +version = "23.1.0" description = "Classes Without Boilerplate" + optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" files = [ - {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, - {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, ] [package.extras] -dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "sphinx", "sphinx-notfound-page", "zope.interface"] -docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] -tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "zope.interface"] -tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] [[package]] name = "babel" version = "2.13.1" description = "Internationalization utilities" + optional = false python-versions = ">=3.7" files = [ @@ -134,13 +122,29 @@ files = [ {file = "Babel-2.13.1.tar.gz", hash = "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900"}, ] +[package.dependencies] +pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} + [package.extras] dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] +[[package]] +name = "backcall" +version = "0.2.0" +description = "Specifications for callback functions passed in to an API" + +optional = false +python-versions = "*" +files = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] + [[package]] name = "beautifulsoup4" version = "4.12.2" description = "Screen-scraping library" + optional = false python-versions = ">=3.6.0" files = [ @@ -159,6 +163,7 @@ lxml = ["lxml"] name = "bleach" version = "6.1.0" description = "An easy safelist-based HTML-sanitizing tool." + optional = false python-versions = ">=3.8" files = [ @@ -177,6 +182,7 @@ css = ["tinycss2 (>=1.1.0,<1.3)"] name = "cachetools" version = "5.3.2" description = "Extensible memoizing collections and decorators" + optional = false python-versions = ">=3.7" files = [ @@ -188,6 +194,7 @@ files = [ name = "certifi" version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." + optional = false python-versions = ">=3.6" files = [ @@ -199,6 +206,7 @@ files = [ name = "cffi" version = "1.16.0" description = "Foreign Function Interface for Python calling C code." + optional = false python-versions = ">=3.8" files = [ @@ -261,258 +269,249 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.3.1" 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"}, + {file = "charset-normalizer-3.3.1.tar.gz", hash = "sha256:d9137a876020661972ca6eec0766d81aef8a5627df628b664b234b73396e727e"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8aee051c89e13565c6bd366813c386939f8e928af93c29fda4af86d25b73d8f8"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:352a88c3df0d1fa886562384b86f9a9e27563d4704ee0e9d56ec6fcd270ea690"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:223b4d54561c01048f657fa6ce41461d5ad8ff128b9678cfe8b2ecd951e3f8a2"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f861d94c2a450b974b86093c6c027888627b8082f1299dfd5a4bae8e2292821"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1171ef1fc5ab4693c5d151ae0fdad7f7349920eabbaca6271f95969fa0756c2d"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28f512b9a33235545fbbdac6a330a510b63be278a50071a336afc1b78781b147"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0e842112fe3f1a4ffcf64b06dc4c61a88441c2f02f373367f7b4c1aa9be2ad5"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f9bc2ce123637a60ebe819f9fccc614da1bcc05798bbbaf2dd4ec91f3e08846"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f194cce575e59ffe442c10a360182a986535fd90b57f7debfaa5c845c409ecc3"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9a74041ba0bfa9bc9b9bb2cd3238a6ab3b7618e759b41bd15b5f6ad958d17605"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b578cbe580e3b41ad17b1c428f382c814b32a6ce90f2d8e39e2e635d49e498d1"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6db3cfb9b4fcecb4390db154e75b49578c87a3b9979b40cdf90d7e4b945656e1"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:debb633f3f7856f95ad957d9b9c781f8e2c6303ef21724ec94bea2ce2fcbd056"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-win32.whl", hash = "sha256:87071618d3d8ec8b186d53cb6e66955ef2a0e4fa63ccd3709c0c90ac5a43520f"}, + {file = "charset_normalizer-3.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:e372d7dfd154009142631de2d316adad3cc1c36c32a38b16a4751ba78da2a397"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae4070f741f8d809075ef697877fd350ecf0b7c5837ed68738607ee0a2c572cf"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58e875eb7016fd014c0eea46c6fa92b87b62c0cb31b9feae25cbbe62c919f54d"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dbd95e300367aa0827496fe75a1766d198d34385a58f97683fe6e07f89ca3e3c"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de0b4caa1c8a21394e8ce971997614a17648f94e1cd0640fbd6b4d14cab13a72"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:985c7965f62f6f32bf432e2681173db41336a9c2611693247069288bcb0c7f8b"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a15c1fe6d26e83fd2e5972425a772cca158eae58b05d4a25a4e474c221053e2d"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae55d592b02c4349525b6ed8f74c692509e5adffa842e582c0f861751701a673"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be4d9c2770044a59715eb57c1144dedea7c5d5ae80c68fb9959515037cde2008"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:851cf693fb3aaef71031237cd68699dded198657ec1e76a76eb8be58c03a5d1f"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:31bbaba7218904d2eabecf4feec0d07469284e952a27400f23b6628439439fa7"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:871d045d6ccc181fd863a3cd66ee8e395523ebfbc57f85f91f035f50cee8e3d4"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:501adc5eb6cd5f40a6f77fbd90e5ab915c8fd6e8c614af2db5561e16c600d6f3"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f5fb672c396d826ca16a022ac04c9dce74e00a1c344f6ad1a0fdc1ba1f332213"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-win32.whl", hash = "sha256:bb06098d019766ca16fc915ecaa455c1f1cd594204e7f840cd6258237b5079a8"}, + {file = "charset_normalizer-3.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:8af5a8917b8af42295e86b64903156b4f110a30dca5f3b5aedea123fbd638bff"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7ae8e5142dcc7a49168f4055255dbcced01dc1714a90a21f87448dc8d90617d1"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5b70bab78accbc672f50e878a5b73ca692f45f5b5e25c8066d748c09405e6a55"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ceca5876032362ae73b83347be8b5dbd2d1faf3358deb38c9c88776779b2e2f"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34d95638ff3613849f473afc33f65c401a89f3b9528d0d213c7037c398a51296"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9edbe6a5bf8b56a4a84533ba2b2f489d0046e755c29616ef8830f9e7d9cf5728"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6a02a3c7950cafaadcd46a226ad9e12fc9744652cc69f9e5534f98b47f3bbcf"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10b8dd31e10f32410751b3430996f9807fc4d1587ca69772e2aa940a82ab571a"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edc0202099ea1d82844316604e17d2b175044f9bcb6b398aab781eba957224bd"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b891a2f68e09c5ef989007fac11476ed33c5c9994449a4e2c3386529d703dc8b"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:71ef3b9be10070360f289aea4838c784f8b851be3ba58cf796262b57775c2f14"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:55602981b2dbf8184c098bc10287e8c245e351cd4fdcad050bd7199d5a8bf514"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:46fb9970aa5eeca547d7aa0de5d4b124a288b42eaefac677bde805013c95725c"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:520b7a142d2524f999447b3a0cf95115df81c4f33003c51a6ab637cbda9d0bf4"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-win32.whl", hash = "sha256:8ec8ef42c6cd5856a7613dcd1eaf21e5573b2185263d87d27c8edcae33b62a61"}, + {file = "charset_normalizer-3.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:baec8148d6b8bd5cee1ae138ba658c71f5b03e0d69d5907703e3e1df96db5e41"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63a6f59e2d01310f754c270e4a257426fe5a591dc487f1983b3bbe793cf6bac6"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d6bfc32a68bc0933819cfdfe45f9abc3cae3877e1d90aac7259d57e6e0f85b1"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f3100d86dcd03c03f7e9c3fdb23d92e32abbca07e7c13ebd7ddfbcb06f5991f"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39b70a6f88eebe239fa775190796d55a33cfb6d36b9ffdd37843f7c4c1b5dc67"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e12f8ee80aa35e746230a2af83e81bd6b52daa92a8afaef4fea4a2ce9b9f4fa"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b6cefa579e1237ce198619b76eaa148b71894fb0d6bcf9024460f9bf30fd228"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:61f1e3fb621f5420523abb71f5771a204b33c21d31e7d9d86881b2cffe92c47c"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4f6e2a839f83a6a76854d12dbebde50e4b1afa63e27761549d006fa53e9aa80e"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:1ec937546cad86d0dce5396748bf392bb7b62a9eeb8c66efac60e947697f0e58"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:82ca51ff0fc5b641a2d4e1cc8c5ff108699b7a56d7f3ad6f6da9dbb6f0145b48"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:633968254f8d421e70f91c6ebe71ed0ab140220469cf87a9857e21c16687c034"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-win32.whl", hash = "sha256:c0c72d34e7de5604df0fde3644cc079feee5e55464967d10b24b1de268deceb9"}, + {file = "charset_normalizer-3.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:63accd11149c0f9a99e3bc095bbdb5a464862d77a7e309ad5938fbc8721235ae"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5a3580a4fdc4ac05f9e53c57f965e3594b2f99796231380adb2baaab96e22761"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2465aa50c9299d615d757c1c888bc6fef384b7c4aec81c05a0172b4400f98557"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb7cd68814308aade9d0c93c5bd2ade9f9441666f8ba5aa9c2d4b389cb5e2a45"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91e43805ccafa0a91831f9cd5443aa34528c0c3f2cc48c4cb3d9a7721053874b"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:854cc74367180beb327ab9d00f964f6d91da06450b0855cbbb09187bcdb02de5"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c15070ebf11b8b7fd1bfff7217e9324963c82dbdf6182ff7050519e350e7ad9f"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4c99f98fc3a1835af8179dcc9013f93594d0670e2fa80c83aa36346ee763d2"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fb765362688821404ad6cf86772fc54993ec11577cd5a92ac44b4c2ba52155b"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dced27917823df984fe0c80a5c4ad75cf58df0fbfae890bc08004cd3888922a2"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a66bcdf19c1a523e41b8e9d53d0cedbfbac2e93c649a2e9502cb26c014d0980c"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ecd26be9f112c4f96718290c10f4caea6cc798459a3a76636b817a0ed7874e42"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f70fd716855cd3b855316b226a1ac8bdb3caf4f7ea96edcccc6f484217c9597"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:17a866d61259c7de1bdadef418a37755050ddb4b922df8b356503234fff7932c"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-win32.whl", hash = "sha256:548eefad783ed787b38cb6f9a574bd8664468cc76d1538215d510a3cd41406cb"}, + {file = "charset_normalizer-3.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:45f053a0ece92c734d874861ffe6e3cc92150e32136dd59ab1fb070575189c97"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bc791ec3fd0c4309a753f95bb6c749ef0d8ea3aea91f07ee1cf06b7b02118f2f"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0c8c61fb505c7dad1d251c284e712d4e0372cef3b067f7ddf82a7fa82e1e9a93"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2c092be3885a1b7899cd85ce24acedc1034199d6fca1483fa2c3a35c86e43041"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2000c54c395d9e5e44c99dc7c20a64dc371f777faf8bae4919ad3e99ce5253e"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4cb50a0335382aac15c31b61d8531bc9bb657cfd848b1d7158009472189f3d62"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c30187840d36d0ba2893bc3271a36a517a717f9fd383a98e2697ee890a37c273"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe81b35c33772e56f4b6cf62cf4aedc1762ef7162a31e6ac7fe5e40d0149eb67"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0bf89afcbcf4d1bb2652f6580e5e55a840fdf87384f6063c4a4f0c95e378656"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:06cf46bdff72f58645434d467bf5228080801298fbba19fe268a01b4534467f5"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3c66df3f41abee950d6638adc7eac4730a306b022570f71dd0bd6ba53503ab57"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd805513198304026bd379d1d516afbf6c3c13f4382134a2c526b8b854da1c2e"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:9505dc359edb6a330efcd2be825fdb73ee3e628d9010597aa1aee5aa63442e97"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:31445f38053476a0c4e6d12b047b08ced81e2c7c712e5a1ad97bc913256f91b2"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-win32.whl", hash = "sha256:bd28b31730f0e982ace8663d108e01199098432a30a4c410d06fe08fdb9e93f4"}, + {file = "charset_normalizer-3.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:555fe186da0068d3354cdf4bbcbc609b0ecae4d04c921cc13e209eece7720727"}, + {file = "charset_normalizer-3.3.1-py3-none-any.whl", hash = "sha256:800561453acdecedaac137bf09cd719c7a440b6800ec182f077bb8e7025fb708"}, ] [[package]] name = "cirq" -version = "1.2.0" +version = "1.1.0" description = "A framework for creating, editing, and invoking Noisy Intermediate Scale Quantum (NISQ) circuits." + optional = false -python-versions = ">=3.9.0" +python-versions = ">=3.7.0" files = [ - {file = "cirq-1.2.0-py3-none-any.whl", hash = "sha256:7717ecfc218024f8d25cbca9c0439edb2437226177754960b8f5ad15e5f5b814"}, + {file = "cirq-1.1.0-py3-none-any.whl", hash = "sha256:bc3fdcb04fa440ca259bef765d6f2bcb2e58533ac4ff34f6c53b34748048d29f"}, ] [package.dependencies] -cirq-aqt = "1.2.0" -cirq-core = "1.2.0" -cirq-ft = "1.2.0" -cirq-google = "1.2.0" -cirq-ionq = "1.2.0" -cirq-pasqal = "1.2.0" -cirq-rigetti = "1.2.0" -cirq-web = "1.2.0" +cirq-aqt = "1.1.0" +cirq-core = "1.1.0" +cirq-google = "1.1.0" +cirq-ionq = "1.1.0" +cirq-pasqal = "1.1.0" +cirq-rigetti = "1.1.0" +cirq-web = "1.1.0" [package.extras] -dev-env = ["asv", "black (==23.3.0)", "codeowners", "coverage (<=6.2)", "filelock (>=3.0.12,<3.1.0)", "freezegun (>=0.3.15,<0.4.0)", "grpcio-tools (>=1.56.0,<1.57.0)", "importlib-metadata", "ipykernel (==5.3.4)", "ipython (>=7.34.0)", "mypy (==1.2.0)", "mypy-protobuf", "notebook (>=6.4.1,<=6.4.7)", "papermill (>=2.3.2,<2.4.0)", "pylint (>=2.13.0,<2.14.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-randomly", "pytest-xdist (>=2.2.0,<2.3.0)", "qiskit-aer (>=0.12.2,<0.13.0)", "rstcheck (>=3.3.1,<3.4.0)", "seaborn (>=0.11.1,<0.12.0)", "setuptools", "twine", "types-backports (==0.1.3)", "types-cachetools", "types-protobuf (==3.19.22)", "types-requests (==2.28.1)", "types-setuptools (==62.6.1)", "virtualenv", "virtualenv-clone", "wheel"] +dev-env = ["asv", "black (==22.3.0)", "codeowners", "coverage (<=6.2)", "dill (==0.3.4)", "filelock (>=3.0.12,<3.1.0)", "flynt (>=0.60,<1.0)", "freezegun (>=0.3.15,<0.4.0)", "grpcio-tools (>=1.37.0,<1.38.0)", "importlib-metadata", "ipykernel (==5.3.4)", "ipython", "ipython (==7.31.1)", "mypy (==0.961.0)", "mypy-protobuf (==1.10)", "notebook (>=6.4.1,<=6.4.7)", "papermill (>=2.3.2,<2.4.0)", "pylint (>=2.13.0,<2.14.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-randomly", "pytest-xdist (>=2.2.0,<2.3.0)", "qiskit-aer (>=0.10.4,<0.11.0)", "rstcheck (>=3.3.1,<3.4.0)", "seaborn (>=0.11.1,<0.12.0)", "setuptools", "twine", "types-backports (==0.1.3)", "types-protobuf (==3.19.22)", "types-requests (==2.28.1)", "types-setuptools (==62.6.1)", "virtualenv", "virtualenv-clone", "wheel"] [[package]] name = "cirq-aqt" -version = "1.2.0" +version = "1.1.0" description = "A Cirq package to simulate and connect to Alpine Quantum Technologies quantum computers" + optional = false -python-versions = ">=3.9.0" +python-versions = ">=3.7.0" files = [ - {file = "cirq_aqt-1.2.0-py3-none-any.whl", hash = "sha256:9d441d07bdba62033116151c3302197ad0aa859d93111a3f0f81aae915bf25d3"}, + {file = "cirq_aqt-1.1.0-py3-none-any.whl", hash = "sha256:e08b213c23755e35707024768bf9167dc067f4dbb29b20f6a03098de5d991117"}, ] [package.dependencies] -cirq-core = "1.2.0" +cirq-core = "1.1.0" requests = ">=2.18,<3.0" [[package]] name = "cirq-core" -version = "1.2.0" +version = "1.1.0" description = "A framework for creating, editing, and invoking Noisy Intermediate Scale Quantum (NISQ) circuits." + optional = false -python-versions = ">=3.9.0" +python-versions = ">=3.7.0" files = [ - {file = "cirq_core-1.2.0-py3-none-any.whl", hash = "sha256:35b1179a6a9b3833174d4b5ae07369980d06d429d8003d69071082135f7d4ef3"}, + {file = "cirq_core-1.1.0-py3-none-any.whl", hash = "sha256:921c7e334d7b07ee84d2bbd259f46c0495661947314b517e57e81ffc3efd6119"}, ] [package.dependencies] -duet = ">=0.2.8,<0.3.0" +duet = ">=0.2.7,<0.3.0" matplotlib = ">=3.0,<4.0" -networkx = ">=2.4" -numpy = ">=1.16,<2.0" +networkx = ">=2.4,<3.0" +numpy = ">=1.16,<1.24" pandas = "*" scipy = "*" sortedcontainers = ">=2.0,<3.0" sympy = "*" tqdm = "*" -typing-extensions = ">=4.2" +typing-extensions = "*" [package.extras] contrib = ["autoray", "numba (>=0.53.0)", "opt-einsum", "ply (>=3.6)", "pylatex (>=1.3.0,<1.4.0)", "quimb"] -[[package]] -name = "cirq-ft" -version = "1.2.0" -description = "A Cirq package for fault-tolerant algorithms" -optional = false -python-versions = ">=3.9.0" -files = [ - {file = "cirq_ft-1.2.0-py3-none-any.whl", hash = "sha256:76511fdd7fd8e15ec3e13ba42f4d149d56f7ca0a09797a7bf23f0fa8b76bc85c"}, -] - -[package.dependencies] -attrs = "*" -cachetools = ">=5.3" -cirq-core = "1.2.0" -ipywidgets = "*" -nbconvert = "*" -nbformat = "*" - [[package]] name = "cirq-google" -version = "1.2.0" +version = "1.1.0" description = "The Cirq module that provides tools and access to the Google Quantum Computing Service" + optional = false -python-versions = ">=3.9.0" +python-versions = ">=3.7.0" files = [ - {file = "cirq_google-1.2.0-py3-none-any.whl", hash = "sha256:5c432b32577802e638d14e3dbc1f098691e5dcc0549ab756a50d27eea1e3f3e3"}, + {file = "cirq_google-1.1.0-py3-none-any.whl", hash = "sha256:4ddab3e274df78a5c816d1aebbd96248c187ef04a44d3499799d51fb3a85981f"}, ] [package.dependencies] -cirq-core = "1.2.0" -google-api-core = {version = ">=1.14.0", extras = ["grpc"]} +cirq-core = "1.1.0" +google-api-core = {version = ">=1.14.0,<2.0.0dev", extras = ["grpc"]} proto-plus = ">=1.20.0" -protobuf = ">=3.15.0" +protobuf = ">=3.15.0,<4" [[package]] name = "cirq-ionq" -version = "1.2.0" +version = "1.1.0" description = "A Cirq package to simulate and connect to IonQ quantum computers" + optional = false -python-versions = ">=3.9.0" +python-versions = ">=3.7.0" files = [ - {file = "cirq_ionq-1.2.0-py3-none-any.whl", hash = "sha256:72d10cd57c9d194287d4b46e5c45c588bef607b4b5f6a35f2e0bd6ebf8f8297b"}, + {file = "cirq_ionq-1.1.0-py3-none-any.whl", hash = "sha256:251ac875f523c3ccc6e31bd6160cac7f77d6fcf33c54c8bc8fcef7142f459f2e"}, ] [package.dependencies] -cirq-core = "1.2.0" +cirq-core = "1.1.0" requests = ">=2.18,<3.0" [[package]] name = "cirq-pasqal" -version = "1.2.0" +version = "1.1.0" description = "A Cirq package to simulate and connect to Pasqal quantum computers" + optional = false -python-versions = ">=3.9.0" +python-versions = ">=3.7.0" files = [ - {file = "cirq_pasqal-1.2.0-py3-none-any.whl", hash = "sha256:03aac24577e0c3970e932b80d2d122f3faf769d5e3d74b5a35c55bfc30673c9f"}, + {file = "cirq_pasqal-1.1.0-py3-none-any.whl", hash = "sha256:3769141b856b256a8bd4c1459cf08ee414612395b2ea0e13821e5eea5a2b6f34"}, ] [package.dependencies] -cirq-core = "1.2.0" +cirq-core = "1.1.0" requests = ">=2.18,<3.0" [[package]] name = "cirq-rigetti" -version = "1.2.0" +version = "1.1.0" description = "A Cirq package to simulate and connect to Rigetti quantum computers and Quil QVM" + optional = false -python-versions = ">=3.9.0" +python-versions = ">=3.7.0" files = [ - {file = "cirq_rigetti-1.2.0-py3-none-any.whl", hash = "sha256:f20791bfea68cd3d838e1be259991aca5144eae9294f9d960461f3ef41563354"}, + {file = "cirq_rigetti-1.1.0-py3-none-any.whl", hash = "sha256:436433aecce27915d206e2b674e9fb754afe91a94c3c01fb13fa7cdea2745220"}, ] [package.dependencies] -cirq-core = "1.2.0" -pyquil = ">=3.2.0,<3.3.0" +cirq-core = "1.1.0" +pyquil = ">=3.2.0" [[package]] name = "cirq-web" -version = "1.2.0" +version = "1.1.0" description = "Web-based 3D visualization tools for Cirq." + optional = false -python-versions = ">=3.9.0" +python-versions = ">=3.7.0" files = [ - {file = "cirq_web-1.2.0-py3-none-any.whl", hash = "sha256:45b5c91812f2a0e6e83b08b019276c04d643b418af430d992acce563efa458a4"}, + {file = "cirq_web-1.1.0-py3-none-any.whl", hash = "sha256:e304695ecb8bdbb545e3c1c4f35611b783ef9046d863cc36b5190b255f9d3887"}, ] [package.dependencies] -cirq-core = "1.2.0" +cirq-core = "1.1.0" [[package]] name = "clarabel" version = "0.6.0" description = "Clarabel Conic Interior Point Solver for Rust / Python" + optional = false python-versions = ">=3.7" files = [ @@ -534,6 +533,7 @@ scipy = "*" name = "cma" version = "3.3.0" description = "CMA-ES, Covariance Matrix Adaptation Evolution Strategy for non-linear numerical optimization in Python" +category = "main" optional = false python-versions = "*" files = [ @@ -552,6 +552,7 @@ plotting = ["matplotlib"] 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 = [ @@ -559,27 +560,11 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -[[package]] -name = "comm" -version = "0.2.0" -description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." -optional = false -python-versions = ">=3.8" -files = [ - {file = "comm-0.2.0-py3-none-any.whl", hash = "sha256:2da8d9ebb8dd7bfc247adaff99f24dce705638a8042b85cb995066793e391001"}, - {file = "comm-0.2.0.tar.gz", hash = "sha256:a517ea2ca28931c7007a7a99c562a0fa5883cfb48963140cf642c41c948498be"}, -] - -[package.dependencies] -traitlets = ">=4" - -[package.extras] -test = ["pytest"] - [[package]] name = "commonmark" version = "0.9.1" description = "Python parser for the CommonMark Markdown spec" + optional = false python-versions = "*" files = [ @@ -592,71 +577,81 @@ test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] [[package]] name = "contourpy" -version = "1.2.0" +version = "1.1.1" description = "Python library for calculating contours of 2D quadrilateral grids" +category = "main" optional = false -python-versions = ">=3.9" -files = [ - {file = "contourpy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8"}, - {file = "contourpy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa"}, - {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9"}, - {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab"}, - {file = "contourpy-1.2.0-cp310-cp310-win32.whl", hash = "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488"}, - {file = "contourpy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41"}, - {file = "contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727"}, - {file = "contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686"}, - {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286"}, - {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95"}, - {file = "contourpy-1.2.0-cp311-cp311-win32.whl", hash = "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6"}, - {file = "contourpy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de"}, - {file = "contourpy-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0"}, - {file = "contourpy-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0"}, - {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0"}, - {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431"}, - {file = "contourpy-1.2.0-cp312-cp312-win32.whl", hash = "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f"}, - {file = "contourpy-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9"}, - {file = "contourpy-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc"}, - {file = "contourpy-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5"}, - {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e"}, - {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808"}, - {file = "contourpy-1.2.0-cp39-cp39-win32.whl", hash = "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4"}, - {file = "contourpy-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843"}, - {file = "contourpy-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108"}, - {file = "contourpy-1.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776"}, - {file = "contourpy-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956"}, - {file = "contourpy-1.2.0.tar.gz", hash = "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a"}, +python-versions = ">=3.8" +files = [ + {file = "contourpy-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b"}, + {file = "contourpy-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1"}, + {file = "contourpy-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d"}, + {file = "contourpy-1.1.1-cp310-cp310-win32.whl", hash = "sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431"}, + {file = "contourpy-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5"}, + {file = "contourpy-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62"}, + {file = "contourpy-1.1.1-cp311-cp311-win32.whl", hash = "sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33"}, + {file = "contourpy-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf"}, + {file = "contourpy-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d"}, + {file = "contourpy-1.1.1-cp312-cp312-win32.whl", hash = "sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6"}, + {file = "contourpy-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8"}, + {file = "contourpy-1.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251"}, + {file = "contourpy-1.1.1-cp38-cp38-win32.whl", hash = "sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7"}, + {file = "contourpy-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85"}, + {file = "contourpy-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e"}, + {file = "contourpy-1.1.1-cp39-cp39-win32.whl", hash = "sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0"}, + {file = "contourpy-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c"}, + {file = "contourpy-1.1.1.tar.gz", hash = "sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab"}, ] [package.dependencies] -numpy = ">=1.20,<2.0" +numpy = {version = ">=1.16,<2.0", markers = "python_version <= \"3.11\""} [package.extras] bokeh = ["bokeh", "selenium"] docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] -mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.6.1)", "types-Pillow"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.4.1)", "types-Pillow"] test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] -test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] +test-no-images = ["pytest", "pytest-cov", "wurlitzer"] [[package]] name = "coverage" version = "7.3.2" description = "Code coverage measurement for Python" + optional = false python-versions = ">=3.8" files = [ @@ -724,6 +719,7 @@ toml = ["tomli"] name = "cupy-cuda11x" version = "12.2.0" description = "CuPy: NumPy & SciPy for GPU" + optional = false python-versions = ">=3.8" files = [ @@ -754,6 +750,7 @@ test = ["hypothesis (>=6.37.2,<6.55.0)", "pytest (>=7.2)"] name = "cupy-cuda12x" version = "12.2.0" description = "CuPy: NumPy & SciPy for GPU" + optional = false python-versions = ">=3.8" files = [ @@ -782,71 +779,79 @@ test = ["hypothesis (>=6.37.2,<6.55.0)", "pytest (>=7.2)"] [[package]] name = "cuquantum-python-cu11" -version = "23.10.0" +version = "23.3.0" description = "NVIDIA cuQuantum Python" + optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" files = [ - {file = "cuquantum_python_cu11-23.10.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a0f0dfcb6239ec5fce836fa2f641820d3235ac7d83f391eac90952cf481da03f"}, - {file = "cuquantum_python_cu11-23.10.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:ad5e38501cb53d50ba19fc48790f2c79fbc14c22e101d51a0b338f6c6971e6a0"}, - {file = "cuquantum_python_cu11-23.10.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:f5bd44f0a50b38fa778836577e11515fb820c98217d2958fdedfc861a701f604"}, - {file = "cuquantum_python_cu11-23.10.0-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:01e6b210ed66a1fda172884f1eca68b4763f676f81949af8f0d6b16d798f1881"}, - {file = "cuquantum_python_cu11-23.10.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:0f658d3c83a8f05b81749a1fecc232ca23650147f53d82fe61dae987e544fb9c"}, - {file = "cuquantum_python_cu11-23.10.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:997e47861bab2c5e183a3b7439ba7fe4dd777cbf4d24f2234ac4ad7936cbc699"}, + {file = "cuquantum_python_cu11-23.3.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:7d7e216dd9fa9d156b3ba0e67ebeb52112481246f803ca21534fae33f370f104"}, + {file = "cuquantum_python_cu11-23.3.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:2948bd84db62ded56789217ca1509b87d1fff9dfa78561658b310b176cde0791"}, + {file = "cuquantum_python_cu11-23.3.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:3ee853a67487df325b716ec8709d17515480a17f33d9db94f13159100b18d68e"}, + {file = "cuquantum_python_cu11-23.3.0-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:543495c1827f271278851db7ba1f256188838451a8e9c1ba7e462fad89a9df19"}, + {file = "cuquantum_python_cu11-23.3.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:5ffb6ad9519efbfe1f85b50c90add7b73219fa77dc362ee9e072864a05400f0e"}, + {file = "cuquantum_python_cu11-23.3.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:aa11b50619b218cd69857eda2fb45cfee59459117193b14bae3b7ce45b968c15"}, + {file = "cuquantum_python_cu11-23.3.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5908c2274dab8e17624046a6d8b48e1281dec3111ed6f3fb0f57c0e6bcc4c422"}, + {file = "cuquantum_python_cu11-23.3.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:7c6355ea394712fd1e33f5a73767968bd4abc136faa7ce810f35fe5f101c591b"}, ] [package.dependencies] -custatevec-cu11 = ">=1.5,<2.0" -cutensornet-cu11 = ">=2.3,<3.0" -numpy = ">=1.21,<2.0" +custatevec-cu11 = ">=1.3,<2.0" +cutensornet-cu11 = ">=2.1,<3.0" +numpy = "*" [[package]] name = "cuquantum-python-cu12" -version = "23.10.0" +version = "23.3.0" description = "NVIDIA cuQuantum Python" + optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" files = [ - {file = "cuquantum_python_cu12-23.10.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:56a043951348a868957405103d8a0fb24da496c330876480958d371c040c371a"}, - {file = "cuquantum_python_cu12-23.10.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:171f5cb136c9db0e3520c99a9c4a55c8f8c84440b725e3e5511e7d9b6373ba1e"}, - {file = "cuquantum_python_cu12-23.10.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:a5a747885a164b4ccc41d3a5d225e4a8cc3076595b1b6169a82c8bf63ff1a801"}, - {file = "cuquantum_python_cu12-23.10.0-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:719cfa4c53ec40465c425ae8482cc8272686a29026c0bcbff23248c0418f8c95"}, - {file = "cuquantum_python_cu12-23.10.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f97601858323f85caedbf4192fafc406512a56c07ebfcf122503012978a21929"}, - {file = "cuquantum_python_cu12-23.10.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:24a48bd0763362d709afadbc7f09e4977d0f2dff6a7200c42415f7fc39216652"}, + {file = "cuquantum_python_cu12-23.3.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:ed02c9b0dd1bf1941e2ebeec96b5a7fafaf70035034cc4acc44490edf56aa4bd"}, + {file = "cuquantum_python_cu12-23.3.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:2863a0e2e8f379f4d23460178b3b6f4b24eea420123d9870870ed36db0146002"}, + {file = "cuquantum_python_cu12-23.3.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:281f2f5b5b49d352dc2d7f792fc1570fa702b9dd27c00c7d20df201b661bae18"}, + {file = "cuquantum_python_cu12-23.3.0-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:d29fbd9eb47a833440725ebb9cd9a3c54ef8b49c129f28e238c55e88150fb22b"}, + {file = "cuquantum_python_cu12-23.3.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a91f2b4c827478d50f96fee4a406cdbc4127b95cbcf255250a4fb77f53f99590"}, + {file = "cuquantum_python_cu12-23.3.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:d562c58a2265093da009c5c1aa7c414e52b421692c830d872b727bb47b9f8851"}, + {file = "cuquantum_python_cu12-23.3.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:e47141fd6434f2eb5ef5c9b677f51ce30ce1084b749cfd8479bfedf7e2160bf4"}, + {file = "cuquantum_python_cu12-23.3.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:27f3e919f94f6ccce80ddf140e64e7a6c8f7509a8e0d17f8f99de2d4fea53360"}, ] [package.dependencies] -cupy-cuda12x = ">=10.0" -custatevec-cu12 = ">=1.5,<2.0" -cutensornet-cu12 = ">=2.3,<3.0" -numpy = ">=1.21,<2.0" +custatevec-cu12 = ">=1.3,<2.0" +cutensornet-cu12 = ">=2.1,<3.0" +numpy = "*" [[package]] name = "custatevec-cu11" -version = "1.5.0" +version = "1.4.1" description = "cuStateVec - a component of NVIDIA cuQuantum SDK" + optional = false python-versions = "*" files = [ - {file = "custatevec_cu11-1.5.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:3e0cbbc487a0590d9f889ad70b9ac21d88c1f555f6fe01b18ba687a0d98d902f"}, - {file = "custatevec_cu11-1.5.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:be289f600e7361cac4acdeb8d12d443117d43ce745c9322f6b828292341b9f30"}, + {file = "custatevec_cu11-1.4.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0255a6a1001550b9b4d576f24f925f592fa52384e5533303657ca14d002e5b97"}, + {file = "custatevec_cu11-1.4.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:56a689c0caec1eaa46af657bfa7481fc60c4e5da2b585dc1599870fb6d932119"}, ] [[package]] name = "custatevec-cu12" -version = "1.5.0" +version = "1.4.1" description = "cuStateVec - a component of NVIDIA cuQuantum SDK" + optional = false python-versions = "*" files = [ - {file = "custatevec_cu12-1.5.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:e040c92e7ff8dacca74c7f122a1641f15e15a59f2b44c861517cd3515fa32986"}, - {file = "custatevec_cu12-1.5.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:b6202cf0ed3538956f15cffbbe5ec12e75ff5708846cba27c6ad5eb0323df8e6"}, + {file = "custatevec_cu12-1.4.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:3be3c8989a8d2b75678517f19d935bc30889478a2668020d1029f433fb5e9de0"}, + {file = "custatevec_cu12-1.4.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:421ae6d15f4e2ac2e9514fe274dfae181e1ac039e79bafe2f30b448641ee8d42"}, ] [[package]] name = "cutensor-cu11" version = "1.7.0" description = "NVIDIA cuTENSOR" + optional = false python-versions = "*" files = [ @@ -858,6 +863,7 @@ files = [ name = "cutensor-cu12" version = "1.7.0" description = "NVIDIA cuTENSOR" + optional = false python-versions = "*" files = [ @@ -867,13 +873,14 @@ files = [ [[package]] name = "cutensornet-cu11" -version = "2.3.0" +version = "2.2.1" description = "cuTensorNet - a component of NVIDIA cuQuantum SDK" + optional = false python-versions = "*" files = [ - {file = "cutensornet_cu11-2.3.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:fd15b199b189f0501b3fdaa576ee70eedbdfec37b557f7fd56b97aaa5e618667"}, - {file = "cutensornet_cu11-2.3.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:dcb9ab26c3d6b51dfd1146c9ec28fe6768bfe539dca931d4ef462eea15205bf7"}, + {file = "cutensornet_cu11-2.2.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:79ab49bce2ba2b549332ff2a000bb0c4cc62466f2d5f7e8129f2eddd938abb63"}, + {file = "cutensornet_cu11-2.2.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:343fe02f81129c1ccc2414a72e6ff418a88027296d8bbc44819031674deb1563"}, ] [package.dependencies] @@ -881,13 +888,14 @@ cutensor-cu11 = ">=1.6.1,<2" [[package]] name = "cutensornet-cu12" -version = "2.3.0" +version = "2.2.1" description = "cuTensorNet - a component of NVIDIA cuQuantum SDK" + optional = false python-versions = "*" files = [ - {file = "cutensornet_cu12-2.3.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:3c9d5938ab42d96de9ddf2585a0f2348172e8ef12efd082f515a2298bd35ba7a"}, - {file = "cutensornet_cu12-2.3.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:70c45762e9b5aa79be5e106ed8c2912d4fceb573eca9c918e9f7abae91eaa895"}, + {file = "cutensornet_cu12-2.2.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9983a01bee49ef96d265ecdfba71cd0b0ca7ea1ded000e125fa688a7917b98dc"}, + {file = "cutensornet_cu12-2.2.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:652f7449905ddf79de5b370269e90e0b4a73bb94bfd282231e235deac187df7e"}, ] [package.dependencies] @@ -897,6 +905,7 @@ cutensor-cu12 = ">=1.6.1,<2" name = "cvxpy" version = "1.4.1" description = "A domain-specific language for modeling convex optimization problems in Python." + optional = false python-versions = ">=3.8" files = [ @@ -955,6 +964,7 @@ xpress = ["xpress"] name = "cycler" version = "0.12.1" description = "Composable style cycles" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -970,6 +980,7 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] name = "decorator" version = "5.1.1" description = "Decorators for Humans" + optional = false python-versions = ">=3.5" files = [ @@ -981,6 +992,7 @@ files = [ name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" + optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -988,10 +1000,29 @@ files = [ {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, ] +[[package]] +name = "deprecated" +version = "1.2.14" +description = "Python @deprecated decorator to deprecate old python classes, functions or methods." + +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, + {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, +] + +[package.dependencies] +wrapt = ">=1.10,<2" + +[package.extras] +dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] + [[package]] name = "dill" version = "0.3.7" description = "serialize all of Python" + optional = false python-versions = ">=3.7" files = [ @@ -1006,6 +1037,7 @@ graph = ["objgraph (>=1.7.2)"] name = "docutils" version = "0.19" description = "Docutils -- Python Documentation Utilities" + optional = false python-versions = ">=3.7" files = [ @@ -1015,22 +1047,24 @@ files = [ [[package]] name = "duet" -version = "0.2.9" +version = "0.2.8" description = "A simple future-based async library for python." + optional = false -python-versions = ">=3.9.0" +python-versions = ">=3.7.0" files = [ - {file = "duet-0.2.9-py3-none-any.whl", hash = "sha256:a16088b68b0faee8aee12cdf4d0a8af060ed958badb44f3e32f123f13f64119a"}, - {file = "duet-0.2.9.tar.gz", hash = "sha256:d6fa39582e6a3dce1096c47e5fbcbda648a633eed94a38943e68662afa2587f3"}, + {file = "duet-0.2.8-py3-none-any.whl", hash = "sha256:db3193de2218ffd53a137f2ba5cdd3af988558613891fe5280c52708133d5ed6"}, + {file = "duet-0.2.8.tar.gz", hash = "sha256:b60ac9e11e885e2a7c4366857cc6036dbe001fc9b6bddb027e2dbd7dedf40906"}, ] [package.extras] -dev-env = ["black (==22.3.0)", "isort (==5.7.*)", "mypy (==0.931.*)", "pylint (==2.10.*)", "pytest (==6.2.*)", "twine (==3.3.*)", "wheel"] +dev-env = ["black (==22.3.0)", "isort (>=5.7.0,<5.8.0)", "mypy (>=0.931.0,<0.932.0)", "pylint (>=2.10.0,<2.11.0)", "pytest (>=6.2.0,<6.3.0)", "twine (>=3.3.0,<3.4.0)"] [[package]] name = "ecos" version = "2.0.12" description = "This is the Python package for ECOS: Embedded Cone Solver. See Github page for more information." + optional = false python-versions = "*" files = [ @@ -1060,6 +1094,7 @@ scipy = ">=0.9" name = "exceptiongroup" version = "1.1.3" description = "Backport of PEP 654 (exception groups)" + optional = false python-versions = ">=3.7" files = [ @@ -1074,6 +1109,7 @@ test = ["pytest (>=6)"] 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 = [ @@ -1103,6 +1139,7 @@ pyrepl = ">=0.8.2" name = "fastjsonschema" version = "2.18.1" description = "Fastest Python implementation of JSON schema" + optional = false python-versions = "*" files = [ @@ -1117,6 +1154,7 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc name = "fastrlock" version = "0.8.2" description = "Fast, re-entrant optimistic lock implemented in Cython" + optional = false python-versions = "*" files = [ @@ -1201,6 +1239,7 @@ files = [ name = "flatbuffers" version = "23.5.26" description = "The FlatBuffers serialization format for Python" + optional = false python-versions = "*" files = [ @@ -1210,57 +1249,58 @@ files = [ [[package]] name = "fonttools" -version = "4.44.0" +version = "4.43.1" description = "Tools to manipulate font files" +category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.44.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1cd1c6bb097e774d68402499ff66185190baaa2629ae2f18515a2c50b93db0c"}, - {file = "fonttools-4.44.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b9eab7f9837fdaa2a10a524fbcc2ec24bf60637c044b6e4a59c3f835b90f0fae"}, - {file = "fonttools-4.44.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f412954275e594f7a51c16f3b3edd850acb0d842fefc33856b63a17e18499a5"}, - {file = "fonttools-4.44.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50d25893885e80a5955186791eed5579f1e75921751539cc1dc3ffd1160b48cf"}, - {file = "fonttools-4.44.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:22ea8aa7b3712450b42b044702bd3a64fd118006bad09a6f94bd1b227088492e"}, - {file = "fonttools-4.44.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df40daa6c03b98652ffe8110ae014fe695437f6e1cb5a07e16ea37f40e73ac86"}, - {file = "fonttools-4.44.0-cp310-cp310-win32.whl", hash = "sha256:bca49da868e8bde569ef36f0cc1b6de21d56bf9c3be185c503b629c19a185287"}, - {file = "fonttools-4.44.0-cp310-cp310-win_amd64.whl", hash = "sha256:dbac86d83d96099890e731cc2af97976ff2c98f4ba432fccde657c5653a32f1c"}, - {file = "fonttools-4.44.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e8ff7d19a6804bfd561cfcec9b4200dd1788e28f7de4be70189801530c47c1b3"}, - {file = "fonttools-4.44.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8a1fa9a718de0bc026979c93e1e9b55c5efde60d76f91561fd713387573817d"}, - {file = "fonttools-4.44.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05064f95aacdfc06f21e55096c964b2228d942b8675fa26995a2551f6329d2d"}, - {file = "fonttools-4.44.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31b38528f25bc662401e6ffae14b3eb7f1e820892fd80369a37155e3b636a2f4"}, - {file = "fonttools-4.44.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:05d7c4d2c95b9490e669f3cb83918799bf1c838619ac6d3bad9ea017cfc63f2e"}, - {file = "fonttools-4.44.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6999e80a125b0cd8e068d0210b63323f17338038c2ecd2e11b9209ec430fe7f2"}, - {file = "fonttools-4.44.0-cp311-cp311-win32.whl", hash = "sha256:a7aec7f5d14dfcd71fb3ebc299b3f000c21fdc4043079101777ed2042ba5b7c5"}, - {file = "fonttools-4.44.0-cp311-cp311-win_amd64.whl", hash = "sha256:518a945dbfe337744bfff31423c1430303b8813c5275dffb0f2577f0734a1189"}, - {file = "fonttools-4.44.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:59b6ad83cce067d10f4790c037a5904424f45bebb5e7be2eb2db90402f288267"}, - {file = "fonttools-4.44.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c2de1fb18198acd400c45ffe2aef5420c8d55fde903e91cba705596099550f3b"}, - {file = "fonttools-4.44.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84f308b7a8d28208d54315d11d35f9888d6d607673dd4d42d60b463682ee0400"}, - {file = "fonttools-4.44.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66bc6efd829382f7a7e6cf33c2fb32b13edc8a239eb15f32acbf197dce7a0165"}, - {file = "fonttools-4.44.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a8b99713d3a0d0e876b6aecfaada5e7dc9fe979fcd90ef9fa0ba1d9b9aed03f2"}, - {file = "fonttools-4.44.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b63da598d9cbc52e2381f922da0e94d60c0429f92207bd3fb04d112fc82ea7cb"}, - {file = "fonttools-4.44.0-cp312-cp312-win32.whl", hash = "sha256:f611c97678604e302b725f71626edea113a5745a7fb557c958b39edb6add87d5"}, - {file = "fonttools-4.44.0-cp312-cp312-win_amd64.whl", hash = "sha256:58af428746fa73a2edcbf26aff33ac4ef3c11c8d75bb200eaea2f7e888d2de4e"}, - {file = "fonttools-4.44.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9ee8692e23028564c13d924004495f284df8ac016a19f17a87251210e1f1f928"}, - {file = "fonttools-4.44.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dab3d00d27b1a79ae4d4a240e8ceea8af0ff049fd45f05adb4f860d93744110d"}, - {file = "fonttools-4.44.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f53526668beccdb3409c6055a4ffe50987a7f05af6436fa55d61f5e7bd450219"}, - {file = "fonttools-4.44.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3da036b016c975c2d8c69005bdc4d5d16266f948a7fab950244e0f58301996a"}, - {file = "fonttools-4.44.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b99fe8ef4093f672d00841569d2d05691e50334d79f4d9c15c1265d76d5580d2"}, - {file = "fonttools-4.44.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d16d9634ff1e5cea2cf4a8cbda9026f766e4b5f30b48f8180f0e99133d3abfc"}, - {file = "fonttools-4.44.0-cp38-cp38-win32.whl", hash = "sha256:3d29509f6e05e8d725db59c2d8c076223d793e4e35773040be6632a0349f2f97"}, - {file = "fonttools-4.44.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4fa4f4bc8fd86579b8cdbe5e948f35d82c0eda0091c399d009b2a5a6b61c040"}, - {file = "fonttools-4.44.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c794de4086f06ae609b71ac944ec7deb09f34ecf73316fddc041087dd24bba39"}, - {file = "fonttools-4.44.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2db63941fee3122e31a21dd0f5b2138ce9906b661a85b63622421d3654a74ae2"}, - {file = "fonttools-4.44.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb01c49c8aa035d5346f46630209923d4927ed15c2493db38d31da9f811eb70d"}, - {file = "fonttools-4.44.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46c79af80a835410874683b5779b6c1ec1d5a285e11c45b5193e79dd691eb111"}, - {file = "fonttools-4.44.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b6e6aa2d066f8dafd06d8d0799b4944b5d5a1f015dd52ac01bdf2895ebe169a0"}, - {file = "fonttools-4.44.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:63a3112f753baef8c6ac2f5f574bb9ac8001b86c8c0c0380039db47a7f512d20"}, - {file = "fonttools-4.44.0-cp39-cp39-win32.whl", hash = "sha256:54efed22b2799a85475e6840e907c402ba49892c614565dc770aa97a53621b2b"}, - {file = "fonttools-4.44.0-cp39-cp39-win_amd64.whl", hash = "sha256:2e91e19b583961979e2e5a701269d3cfc07418963bee717f8160b0a24332826b"}, - {file = "fonttools-4.44.0-py3-none-any.whl", hash = "sha256:b9beb0fa6ff3ea808ad4a6962d68ac0f140ddab080957b20d9e268e4d67fb335"}, - {file = "fonttools-4.44.0.tar.gz", hash = "sha256:4e90dd81b6e0d97ebfe52c0d12a17a9ef7f305d6bfbb93081265057d6092f252"}, + {file = "fonttools-4.43.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bf11e2cca121df35e295bd34b309046c29476ee739753bc6bc9d5050de319273"}, + {file = "fonttools-4.43.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10b3922875ffcba636674f406f9ab9a559564fdbaa253d66222019d569db869c"}, + {file = "fonttools-4.43.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f727c3e3d08fd25352ed76cc3cb61486f8ed3f46109edf39e5a60fc9fecf6ca"}, + {file = "fonttools-4.43.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad0b3f6342cfa14be996971ea2b28b125ad681c6277c4cd0fbdb50340220dfb6"}, + {file = "fonttools-4.43.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3b7ad05b2beeebafb86aa01982e9768d61c2232f16470f9d0d8e385798e37184"}, + {file = "fonttools-4.43.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c54466f642d2116686268c3e5f35ebb10e49b0d48d41a847f0e171c785f7ac7"}, + {file = "fonttools-4.43.1-cp310-cp310-win32.whl", hash = "sha256:1e09da7e8519e336239fbd375156488a4c4945f11c4c5792ee086dd84f784d02"}, + {file = "fonttools-4.43.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cf9e974f63b1080b1d2686180fc1fbfd3bfcfa3e1128695b5de337eb9075cef"}, + {file = "fonttools-4.43.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5db46659cfe4e321158de74c6f71617e65dc92e54980086823a207f1c1c0e24b"}, + {file = "fonttools-4.43.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1952c89a45caceedf2ab2506d9a95756e12b235c7182a7a0fff4f5e52227204f"}, + {file = "fonttools-4.43.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c36da88422e0270fbc7fd959dc9749d31a958506c1d000e16703c2fce43e3d0"}, + {file = "fonttools-4.43.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bbbf8174501285049e64d174e29f9578495e1b3b16c07c31910d55ad57683d8"}, + {file = "fonttools-4.43.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d4071bd1c183b8d0b368cc9ed3c07a0f6eb1bdfc4941c4c024c49a35429ac7cd"}, + {file = "fonttools-4.43.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d21099b411e2006d3c3e1f9aaf339e12037dbf7bf9337faf0e93ec915991f43b"}, + {file = "fonttools-4.43.1-cp311-cp311-win32.whl", hash = "sha256:b84a1c00f832feb9d0585ca8432fba104c819e42ff685fcce83537e2e7e91204"}, + {file = "fonttools-4.43.1-cp311-cp311-win_amd64.whl", hash = "sha256:9a2f0aa6ca7c9bc1058a9d0b35483d4216e0c1bbe3962bc62ce112749954c7b8"}, + {file = "fonttools-4.43.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4d9740e3783c748521e77d3c397dc0662062c88fd93600a3c2087d3d627cd5e5"}, + {file = "fonttools-4.43.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:884ef38a5a2fd47b0c1291647b15f4e88b9de5338ffa24ee52c77d52b4dfd09c"}, + {file = "fonttools-4.43.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9648518ef687ba818db3fcc5d9aae27a369253ac09a81ed25c3867e8657a0680"}, + {file = "fonttools-4.43.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95e974d70238fc2be5f444fa91f6347191d0e914d5d8ae002c9aa189572cc215"}, + {file = "fonttools-4.43.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:34f713dad41aa21c637b4e04fe507c36b986a40f7179dcc86402237e2d39dcd3"}, + {file = "fonttools-4.43.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:360201d46165fc0753229afe785900bc9596ee6974833124f4e5e9f98d0f592b"}, + {file = "fonttools-4.43.1-cp312-cp312-win32.whl", hash = "sha256:bb6d2f8ef81ea076877d76acfb6f9534a9c5f31dc94ba70ad001267ac3a8e56f"}, + {file = "fonttools-4.43.1-cp312-cp312-win_amd64.whl", hash = "sha256:25d3da8a01442cbc1106490eddb6d31d7dffb38c1edbfabbcc8db371b3386d72"}, + {file = "fonttools-4.43.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8da417431bfc9885a505e86ba706f03f598c85f5a9c54f67d63e84b9948ce590"}, + {file = "fonttools-4.43.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:51669b60ee2a4ad6c7fc17539a43ffffc8ef69fd5dbed186a38a79c0ac1f5db7"}, + {file = "fonttools-4.43.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748015d6f28f704e7d95cd3c808b483c5fb87fd3eefe172a9da54746ad56bfb6"}, + {file = "fonttools-4.43.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7a58eb5e736d7cf198eee94844b81c9573102ae5989ebcaa1d1a37acd04b33d"}, + {file = "fonttools-4.43.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6bb5ea9076e0e39defa2c325fc086593ae582088e91c0746bee7a5a197be3da0"}, + {file = "fonttools-4.43.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5f37e31291bf99a63328668bb83b0669f2688f329c4c0d80643acee6e63cd933"}, + {file = "fonttools-4.43.1-cp38-cp38-win32.whl", hash = "sha256:9c60ecfa62839f7184f741d0509b5c039d391c3aff71dc5bc57b87cc305cff3b"}, + {file = "fonttools-4.43.1-cp38-cp38-win_amd64.whl", hash = "sha256:fe9b1ec799b6086460a7480e0f55c447b1aca0a4eecc53e444f639e967348896"}, + {file = "fonttools-4.43.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13a9a185259ed144def3682f74fdcf6596f2294e56fe62dfd2be736674500dba"}, + {file = "fonttools-4.43.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2adca1b46d69dce4a37eecc096fe01a65d81a2f5c13b25ad54d5430ae430b13"}, + {file = "fonttools-4.43.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18eefac1b247049a3a44bcd6e8c8fd8b97f3cad6f728173b5d81dced12d6c477"}, + {file = "fonttools-4.43.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2062542a7565091cea4cc14dd99feff473268b5b8afdee564f7067dd9fff5860"}, + {file = "fonttools-4.43.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18a2477c62a728f4d6e88c45ee9ee0229405e7267d7d79ce1f5ce0f3e9f8ab86"}, + {file = "fonttools-4.43.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a7a06f8d95b7496e53af80d974d63516ffb263a468e614978f3899a6df52d4b3"}, + {file = "fonttools-4.43.1-cp39-cp39-win32.whl", hash = "sha256:10003ebd81fec0192c889e63a9c8c63f88c7d72ae0460b7ba0cd2a1db246e5ad"}, + {file = "fonttools-4.43.1-cp39-cp39-win_amd64.whl", hash = "sha256:e117a92b07407a061cde48158c03587ab97e74e7d73cb65e6aadb17af191162a"}, + {file = "fonttools-4.43.1-py3-none-any.whl", hash = "sha256:4f88cae635bfe4bbbdc29d479a297bb525a94889184bb69fa9560c2d4834ddb9"}, + {file = "fonttools-4.43.1.tar.gz", hash = "sha256:17dbc2eeafb38d5d0e865dcce16e313c58265a6d2d20081c435f84dc5a9d8212"}, ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["munkres", "scipy"] lxml = ["lxml (>=4.0,<5)"] @@ -1270,13 +1310,14 @@ repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] type1 = ["xattr"] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.1.0)"] +unicode = ["unicodedata2 (>=15.0.0)"] woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "furo" version = "2022.12.7" description = "A clean customisable Sphinx documentation theme." + optional = false python-versions = ">=3.7" files = [ @@ -1292,54 +1333,51 @@ sphinx-basic-ng = "*" [[package]] name = "gast" -version = "0.5.4" +version = "0.4.0" description = "Python AST that abstracts the underlying Python version" + optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "gast-0.5.4-py3-none-any.whl", hash = "sha256:6fc4fa5fa10b72fb8aab4ae58bcb023058386e67b6fa2e3e34cec5c769360316"}, - {file = "gast-0.5.4.tar.gz", hash = "sha256:9c270fe5f4b130969b54174de7db4e764b09b4f7f67ccfc32480e29f78348d97"}, + {file = "gast-0.4.0-py3-none-any.whl", hash = "sha256:b7adcdd5adbebf1adf17378da5ba3f543684dbec47b1cda1f3997e573cd542c4"}, + {file = "gast-0.4.0.tar.gz", hash = "sha256:40feb7b8b8434785585ab224d1568b857edb18297e5a3047f1ba012bc83b42c1"}, ] [[package]] name = "google-api-core" -version = "2.12.0" +version = "1.34.0" description = "Google API client core library" + optional = false python-versions = ">=3.7" files = [ - {file = "google-api-core-2.12.0.tar.gz", hash = "sha256:c22e01b1e3c4dcd90998494879612c38d0a3411d1f7b679eb89e2abe3ce1f553"}, - {file = "google_api_core-2.12.0-py3-none-any.whl", hash = "sha256:ec6054f7d64ad13b41e43d96f735acbd763b0f3b695dabaa2d579673f6a6e160"}, + {file = "google-api-core-1.34.0.tar.gz", hash = "sha256:6fb380f49d19ee1d09a9722d0379042b7edb06c0112e4796c7a395078a043e71"}, + {file = "google_api_core-1.34.0-py3-none-any.whl", hash = "sha256:7421474c39d396a74dfa317dddbc69188f2336835f526087c7648f91105e32ff"}, ] [package.dependencies] -google-auth = ">=2.14.1,<3.0.dev0" -googleapis-common-protos = ">=1.56.2,<2.0.dev0" -grpcio = [ - {version = ">=1.33.2,<2.0dev", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, - {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, -] -grpcio-status = [ - {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, - {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, -] -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" -requests = ">=2.18.0,<3.0.0.dev0" +google-auth = ">=1.25.0,<3.0dev" +googleapis-common-protos = ">=1.56.2,<2.0dev" +grpcio = {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""} +grpcio-status = {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""} +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.0.0dev" +requests = ">=2.18.0,<3.0.0dev" [package.extras] -grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] -grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] -grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] +grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio-status (>=1.33.2,<2.0dev)"] +grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0dev)"] +grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0dev)"] [[package]] name = "google-auth" -version = "2.23.4" +version = "2.23.3" description = "Google Authentication Library" + optional = false python-versions = ">=3.7" files = [ - {file = "google-auth-2.23.4.tar.gz", hash = "sha256:79905d6b1652187def79d491d6e23d0cbb3a21d3c7ba0dbaa9c8a01906b13ff3"}, - {file = "google_auth-2.23.4-py2.py3-none-any.whl", hash = "sha256:d4bbc92fe4b8bfd2f3e8d88e5ba7085935da208ee38a134fc280e7ce682a05f2"}, + {file = "google-auth-2.23.3.tar.gz", hash = "sha256:6864247895eea5d13b9c57c9e03abb49cb94ce2dc7c58e91cba3248c7477c9e3"}, + {file = "google_auth-2.23.3-py2.py3-none-any.whl", hash = "sha256:a8f4608e65c244ead9e0538f181a96c6e11199ec114d41f1d7b1bffa96937bda"}, ] [package.dependencies] @@ -1358,6 +1396,7 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] name = "google-auth-oauthlib" version = "1.0.0" description = "Google Authentication Library" + optional = false python-versions = ">=3.6" files = [ @@ -1376,6 +1415,7 @@ tool = ["click (>=6.0.0)"] name = "google-pasta" version = "0.2.0" description = "pasta is an AST-based Python refactoring library" + optional = false python-versions = "*" files = [ @@ -1391,6 +1431,7 @@ six = "*" name = "googleapis-common-protos" version = "1.61.0" description = "Common protobufs used in Google APIs" + optional = false python-versions = ">=3.7" files = [ @@ -1406,101 +1447,93 @@ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] [[package]] name = "grpcio" -version = "1.59.2" +version = "1.59.0" description = "HTTP/2-based RPC framework" + optional = false python-versions = ">=3.7" files = [ - {file = "grpcio-1.59.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:d2fa68a96a30dd240be80bbad838a0ac81a61770611ff7952b889485970c4c71"}, - {file = "grpcio-1.59.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:cf0dead5a2c5a3347af2cfec7131d4f2a2e03c934af28989c9078f8241a491fa"}, - {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:e420ced29b5904cdf9ee5545e23f9406189d8acb6750916c2db4793dada065c6"}, - {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b230028a008ae1d0f430acb227d323ff8a619017415cf334c38b457f814119f"}, - {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a4a3833c0e067f3558538727235cd8a49709bff1003200bbdefa2f09334e4b1"}, - {file = "grpcio-1.59.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6b25ed37c27e652db01be341af93fbcea03d296c024d8a0e680017a268eb85dd"}, - {file = "grpcio-1.59.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73abb8584b0cf74d37f5ef61c10722adc7275502ab71789a8fe3cb7ef04cf6e2"}, - {file = "grpcio-1.59.2-cp310-cp310-win32.whl", hash = "sha256:d6f70406695e3220f09cd7a2f879333279d91aa4a8a1d34303b56d61a8180137"}, - {file = "grpcio-1.59.2-cp310-cp310-win_amd64.whl", hash = "sha256:3c61d641d4f409c5ae46bfdd89ea42ce5ea233dcf69e74ce9ba32b503c727e29"}, - {file = "grpcio-1.59.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:3059668df17627f0e0fa680e9ef8c995c946c792612e9518f5cc1503be14e90b"}, - {file = "grpcio-1.59.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:72ca2399097c0b758198f2ff30f7178d680de8a5cfcf3d9b73a63cf87455532e"}, - {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:c978f864b35f2261e0819f5cd88b9830b04dc51bcf055aac3c601e525a10d2ba"}, - {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9411e24328a2302e279e70cae6e479f1fddde79629fcb14e03e6d94b3956eabf"}, - {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb7e0fe6ad73b7f06d7e2b689c19a71cf5cc48f0c2bf8608469e51ffe0bd2867"}, - {file = "grpcio-1.59.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c2504eed520958a5b77cc99458297cb7906308cb92327f35fb7fbbad4e9b2188"}, - {file = "grpcio-1.59.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2171c39f355ba5b551c5d5928d65aa6c69807fae195b86ef4a7d125bcdb860a9"}, - {file = "grpcio-1.59.2-cp311-cp311-win32.whl", hash = "sha256:d2794f0e68b3085d99b4f6ff9c089f6fdd02b32b9d3efdfbb55beac1bf22d516"}, - {file = "grpcio-1.59.2-cp311-cp311-win_amd64.whl", hash = "sha256:2067274c88bc6de89c278a672a652b4247d088811ece781a4858b09bdf8448e3"}, - {file = "grpcio-1.59.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:535561990e075fa6bd4b16c4c3c1096b9581b7bb35d96fac4650f1181e428268"}, - {file = "grpcio-1.59.2-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:a213acfbf186b9f35803b52e4ca9addb153fc0b67f82a48f961be7000ecf6721"}, - {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:6959fb07e8351e20501ffb8cc4074c39a0b7ef123e1c850a7f8f3afdc3a3da01"}, - {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e82c5cf1495244adf5252f925ac5932e5fd288b3e5ab6b70bec5593074b7236c"}, - {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:023088764012411affe7db183d1ada3ad9daf2e23ddc719ff46d7061de661340"}, - {file = "grpcio-1.59.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:da2d94c15f88cd40d7e67f7919d4f60110d2b9d5b1e08cf354c2be773ab13479"}, - {file = "grpcio-1.59.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6009386a2df66159f64ac9f20425ae25229b29b9dd0e1d3dd60043f037e2ad7e"}, - {file = "grpcio-1.59.2-cp312-cp312-win32.whl", hash = "sha256:75c6ecb70e809cf1504465174343113f51f24bc61e22a80ae1c859f3f7034c6d"}, - {file = "grpcio-1.59.2-cp312-cp312-win_amd64.whl", hash = "sha256:cbe946b3e6e60a7b4618f091e62a029cb082b109a9d6b53962dd305087c6e4fd"}, - {file = "grpcio-1.59.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:f8753a6c88d1d0ba64302309eecf20f70d2770f65ca02d83c2452279085bfcd3"}, - {file = "grpcio-1.59.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:f1ef0d39bc1feb420caf549b3c657c871cad4ebbcf0580c4d03816b0590de0cf"}, - {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:4c93f4abbb54321ee6471e04a00139c80c754eda51064187963ddf98f5cf36a4"}, - {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:08d77e682f2bf730a4961eea330e56d2f423c6a9b91ca222e5b1eb24a357b19f"}, - {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff16d68bf453275466a9a46739061a63584d92f18a0f5b33d19fc97eb69867c"}, - {file = "grpcio-1.59.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4abb717e320e74959517dc8e84a9f48fbe90e9abe19c248541e9418b1ce60acd"}, - {file = "grpcio-1.59.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:36f53c2b3449c015880e7d55a89c992c357f176327b0d2873cdaaf9628a37c69"}, - {file = "grpcio-1.59.2-cp37-cp37m-win_amd64.whl", hash = "sha256:cc3e4cd087f07758b16bef8f31d88dbb1b5da5671d2f03685ab52dece3d7a16e"}, - {file = "grpcio-1.59.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:27f879ae604a7fcf371e59fba6f3ff4635a4c2a64768bd83ff0cac503142fef4"}, - {file = "grpcio-1.59.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:7cf05053242f61ba94014dd3a986e11a083400a32664058f80bf4cf817c0b3a1"}, - {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:e1727c1c0e394096bb9af185c6923e8ea55a5095b8af44f06903bcc0e06800a2"}, - {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d573e70a6fe77555fb6143c12d3a7d3fa306632a3034b4e7c59ca09721546f8"}, - {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31176aa88f36020055ace9adff2405a33c8bdbfa72a9c4980e25d91b2f196873"}, - {file = "grpcio-1.59.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:11168ef43e4a43ff1b1a65859f3e0ef1a173e277349e7fb16923ff108160a8cd"}, - {file = "grpcio-1.59.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:53c9aa5ddd6857c0a1cd0287225a2a25873a8e09727c2e95c4aebb1be83a766a"}, - {file = "grpcio-1.59.2-cp38-cp38-win32.whl", hash = "sha256:3b4368b33908f683a363f376dfb747d40af3463a6e5044afee07cf9436addf96"}, - {file = "grpcio-1.59.2-cp38-cp38-win_amd64.whl", hash = "sha256:0a754aff9e3af63bdc4c75c234b86b9d14e14a28a30c4e324aed1a9b873d755f"}, - {file = "grpcio-1.59.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:1f9524d1d701e399462d2c90ba7c193e49d1711cf429c0d3d97c966856e03d00"}, - {file = "grpcio-1.59.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:f93dbf58f03146164048be5426ffde298b237a5e059144847e4940f5b80172c3"}, - {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:6da6dea3a1bacf99b3c2187e296db9a83029ed9c38fd4c52b7c9b7326d13c828"}, - {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5f09cffa619adfb44799fa4a81c2a1ad77c887187613fb0a8f201ab38d89ba1"}, - {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c35aa9657f5d5116d23b934568e0956bd50c615127810fffe3ac356a914c176a"}, - {file = "grpcio-1.59.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:74100fecaec8a535e380cf5f2fb556ff84957d481c13e54051c52e5baac70541"}, - {file = "grpcio-1.59.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:128e20f57c5f27cb0157e73756d1586b83c1b513ebecc83ea0ac37e4b0e4e758"}, - {file = "grpcio-1.59.2-cp39-cp39-win32.whl", hash = "sha256:686e975a5d16602dc0982c7c703948d17184bd1397e16c8ee03511ecb8c4cdda"}, - {file = "grpcio-1.59.2-cp39-cp39-win_amd64.whl", hash = "sha256:242adc47725b9a499ee77c6a2e36688fa6c96484611f33b1be4c57ab075a92dd"}, - {file = "grpcio-1.59.2.tar.gz", hash = "sha256:d8f9cd4ad1be90b0cf350a2f04a38a36e44a026cac1e036ac593dc48efe91d52"}, + {file = "grpcio-1.59.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:225e5fa61c35eeaebb4e7491cd2d768cd8eb6ed00f2664fa83a58f29418b39fd"}, + {file = "grpcio-1.59.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:b95ec8ecc4f703f5caaa8d96e93e40c7f589bad299a2617bdb8becbcce525539"}, + {file = "grpcio-1.59.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:1a839ba86764cc48226f50b924216000c79779c563a301586a107bda9cbe9dcf"}, + {file = "grpcio-1.59.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6cfe44a5d7c7d5f1017a7da1c8160304091ca5dc64a0f85bca0d63008c3137a"}, + {file = "grpcio-1.59.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0fcf53df684fcc0154b1e61f6b4a8c4cf5f49d98a63511e3f30966feff39cd0"}, + {file = "grpcio-1.59.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa66cac32861500f280bb60fe7d5b3e22d68c51e18e65367e38f8669b78cea3b"}, + {file = "grpcio-1.59.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8cd2d38c2d52f607d75a74143113174c36d8a416d9472415eab834f837580cf7"}, + {file = "grpcio-1.59.0-cp310-cp310-win32.whl", hash = "sha256:228b91ce454876d7eed74041aff24a8f04c0306b7250a2da99d35dd25e2a1211"}, + {file = "grpcio-1.59.0-cp310-cp310-win_amd64.whl", hash = "sha256:ca87ee6183421b7cea3544190061f6c1c3dfc959e0b57a5286b108511fd34ff4"}, + {file = "grpcio-1.59.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:c173a87d622ea074ce79be33b952f0b424fa92182063c3bda8625c11d3585d09"}, + {file = "grpcio-1.59.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:ec78aebb9b6771d6a1de7b6ca2f779a2f6113b9108d486e904bde323d51f5589"}, + {file = "grpcio-1.59.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:0b84445fa94d59e6806c10266b977f92fa997db3585f125d6b751af02ff8b9fe"}, + {file = "grpcio-1.59.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c251d22de8f9f5cca9ee47e4bade7c5c853e6e40743f47f5cc02288ee7a87252"}, + {file = "grpcio-1.59.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:956f0b7cb465a65de1bd90d5a7475b4dc55089b25042fe0f6c870707e9aabb1d"}, + {file = "grpcio-1.59.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:38da5310ef84e16d638ad89550b5b9424df508fd5c7b968b90eb9629ca9be4b9"}, + {file = "grpcio-1.59.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:63982150a7d598281fa1d7ffead6096e543ff8be189d3235dd2b5604f2c553e5"}, + {file = "grpcio-1.59.0-cp311-cp311-win32.whl", hash = "sha256:50eff97397e29eeee5df106ea1afce3ee134d567aa2c8e04fabab05c79d791a7"}, + {file = "grpcio-1.59.0-cp311-cp311-win_amd64.whl", hash = "sha256:15f03bd714f987d48ae57fe092cf81960ae36da4e520e729392a59a75cda4f29"}, + {file = "grpcio-1.59.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:f1feb034321ae2f718172d86b8276c03599846dc7bb1792ae370af02718f91c5"}, + {file = "grpcio-1.59.0-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:d09bd2a4e9f5a44d36bb8684f284835c14d30c22d8ec92ce796655af12163588"}, + {file = "grpcio-1.59.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:2f120d27051e4c59db2f267b71b833796770d3ea36ca712befa8c5fff5da6ebd"}, + {file = "grpcio-1.59.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba0ca727a173ee093f49ead932c051af463258b4b493b956a2c099696f38aa66"}, + {file = "grpcio-1.59.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5711c51e204dc52065f4a3327dca46e69636a0b76d3e98c2c28c4ccef9b04c52"}, + {file = "grpcio-1.59.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d74f7d2d7c242a6af9d4d069552ec3669965b74fed6b92946e0e13b4168374f9"}, + {file = "grpcio-1.59.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3859917de234a0a2a52132489c4425a73669de9c458b01c9a83687f1f31b5b10"}, + {file = "grpcio-1.59.0-cp312-cp312-win32.whl", hash = "sha256:de2599985b7c1b4ce7526e15c969d66b93687571aa008ca749d6235d056b7205"}, + {file = "grpcio-1.59.0-cp312-cp312-win_amd64.whl", hash = "sha256:598f3530231cf10ae03f4ab92d48c3be1fee0c52213a1d5958df1a90957e6a88"}, + {file = "grpcio-1.59.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:b34c7a4c31841a2ea27246a05eed8a80c319bfc0d3e644412ec9ce437105ff6c"}, + {file = "grpcio-1.59.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:c4dfdb49f4997dc664f30116af2d34751b91aa031f8c8ee251ce4dcfc11277b0"}, + {file = "grpcio-1.59.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:61bc72a00ecc2b79d9695220b4d02e8ba53b702b42411397e831c9b0589f08a3"}, + {file = "grpcio-1.59.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f367e4b524cb319e50acbdea57bb63c3b717c5d561974ace0b065a648bb3bad3"}, + {file = "grpcio-1.59.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:849c47ef42424c86af069a9c5e691a765e304079755d5c29eff511263fad9c2a"}, + {file = "grpcio-1.59.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c0488c2b0528e6072010182075615620071371701733c63ab5be49140ed8f7f0"}, + {file = "grpcio-1.59.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:611d9aa0017fa386809bddcb76653a5ab18c264faf4d9ff35cb904d44745f575"}, + {file = "grpcio-1.59.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e5378785dce2b91eb2e5b857ec7602305a3b5cf78311767146464bfa365fc897"}, + {file = "grpcio-1.59.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:fe976910de34d21057bcb53b2c5e667843588b48bf11339da2a75f5c4c5b4055"}, + {file = "grpcio-1.59.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:c041a91712bf23b2a910f61e16565a05869e505dc5a5c025d429ca6de5de842c"}, + {file = "grpcio-1.59.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:0ae444221b2c16d8211b55326f8ba173ba8f8c76349bfc1768198ba592b58f74"}, + {file = "grpcio-1.59.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ceb1e68135788c3fce2211de86a7597591f0b9a0d2bb80e8401fd1d915991bac"}, + {file = "grpcio-1.59.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c4b1cc3a9dc1924d2eb26eec8792fedd4b3fcd10111e26c1d551f2e4eda79ce"}, + {file = "grpcio-1.59.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:871371ce0c0055d3db2a86fdebd1e1d647cf21a8912acc30052660297a5a6901"}, + {file = "grpcio-1.59.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:93e9cb546e610829e462147ce724a9cb108e61647a3454500438a6deef610be1"}, + {file = "grpcio-1.59.0-cp38-cp38-win32.whl", hash = "sha256:f21917aa50b40842b51aff2de6ebf9e2f6af3fe0971c31960ad6a3a2b24988f4"}, + {file = "grpcio-1.59.0-cp38-cp38-win_amd64.whl", hash = "sha256:14890da86a0c0e9dc1ea8e90101d7a3e0e7b1e71f4487fab36e2bfd2ecadd13c"}, + {file = "grpcio-1.59.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:34341d9e81a4b669a5f5dca3b2a760b6798e95cdda2b173e65d29d0b16692857"}, + {file = "grpcio-1.59.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:986de4aa75646e963466b386a8c5055c8b23a26a36a6c99052385d6fe8aaf180"}, + {file = "grpcio-1.59.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:aca8a24fef80bef73f83eb8153f5f5a0134d9539b4c436a716256b311dda90a6"}, + {file = "grpcio-1.59.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:936b2e04663660c600d5173bc2cc84e15adbad9c8f71946eb833b0afc205b996"}, + {file = "grpcio-1.59.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc8bf2e7bc725e76c0c11e474634a08c8f24bcf7426c0c6d60c8f9c6e70e4d4a"}, + {file = "grpcio-1.59.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81d86a096ccd24a57fa5772a544c9e566218bc4de49e8c909882dae9d73392df"}, + {file = "grpcio-1.59.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2ea95cd6abbe20138b8df965b4a8674ec312aaef3147c0f46a0bac661f09e8d0"}, + {file = "grpcio-1.59.0-cp39-cp39-win32.whl", hash = "sha256:3b8ff795d35a93d1df6531f31c1502673d1cebeeba93d0f9bd74617381507e3f"}, + {file = "grpcio-1.59.0-cp39-cp39-win_amd64.whl", hash = "sha256:38823bd088c69f59966f594d087d3a929d1ef310506bee9e3648317660d65b81"}, + {file = "grpcio-1.59.0.tar.gz", hash = "sha256:acf70a63cf09dd494000007b798aff88a436e1c03b394995ce450be437b8e54f"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.59.2)"] +protobuf = ["grpcio-tools (>=1.59.0)"] [[package]] name = "grpcio-status" -version = "1.59.2" +version = "1.48.2" description = "Status proto mapping for gRPC" + optional = false python-versions = ">=3.6" files = [ - {file = "grpcio-status-1.59.2.tar.gz", hash = "sha256:a2c2b146e66b73ba80d021ab34fce5db4dd9be67ca4566cda40d36b185ce54f4"}, - {file = "grpcio_status-1.59.2-py3-none-any.whl", hash = "sha256:24bdf3b3b83b9112f43bd0626f82510d12cc1d919a45028ac20eb6919218e508"}, + {file = "grpcio-status-1.48.2.tar.gz", hash = "sha256:53695f45da07437b7c344ee4ef60d370fd2850179f5a28bb26d8e2aa1102ec11"}, + {file = "grpcio_status-1.48.2-py3-none-any.whl", hash = "sha256:2c33bbdbe20188b2953f46f31af669263b6ee2a9b2d38fa0d36ee091532e21bf"}, ] [package.dependencies] googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.59.2" -protobuf = ">=4.21.6" - -[[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"}, -] +grpcio = ">=1.48.2" +protobuf = ">=3.12.0" [[package]] name = "h5py" version = "3.10.0" description = "Read and write HDF5 files from Python" + optional = false python-versions = ">=3.8" files = [ @@ -1534,54 +1567,11 @@ files = [ [package.dependencies] numpy = ">=1.17.3" -[[package]] -name = "httpcore" -version = "0.16.3" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.7" -files = [ - {file = "httpcore-0.16.3-py3-none-any.whl", hash = "sha256:da1fb708784a938aa084bde4feb8317056c55037247c787bd7e19eb2c2949dc0"}, - {file = "httpcore-0.16.3.tar.gz", hash = "sha256:c5d6f04e2fc530f39e0c077e6a30caa53f1451096120f1f38b954afd0b17c0cb"}, -] - -[package.dependencies] -anyio = ">=3.0,<5.0" -certifi = "*" -h11 = ">=0.13,<0.15" -sniffio = "==1.*" - -[package.extras] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] - -[[package]] -name = "httpx" -version = "0.23.3" -description = "The next generation HTTP client." -optional = false -python-versions = ">=3.7" -files = [ - {file = "httpx-0.23.3-py3-none-any.whl", hash = "sha256:a211fcce9b1254ea24f0cd6af9869b3d29aba40154e947d2a07bb499b3e310d6"}, - {file = "httpx-0.23.3.tar.gz", hash = "sha256:9818458eb565bb54898ccb9b8b251a28785dd4a55afbc23d0eb410754fe7d0f9"}, -] - -[package.dependencies] -certifi = "*" -httpcore = ">=0.15.0,<0.17.0" -rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} -sniffio = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<13)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] - [[package]] name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" + optional = false python-versions = ">=3.5" files = [ @@ -1593,6 +1583,7 @@ files = [ 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 = [ @@ -1604,6 +1595,7 @@ files = [ name = "importlib-metadata" version = "6.8.0" description = "Read metadata from Python packages" + optional = false python-versions = ">=3.8" files = [ @@ -1621,13 +1613,14 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs [[package]] name = "importlib-resources" -version = "6.1.1" +version = "6.1.0" description = "Read resources from Python packages" +category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, - {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, + {file = "importlib_resources-6.1.0-py3-none-any.whl", hash = "sha256:aa50258bbfa56d4e33fbd8aa3ef48ded10d1735f11532b8df95388cc6bdb7e83"}, + {file = "importlib_resources-6.1.0.tar.gz", hash = "sha256:9d48dcccc213325e810fd723e7fbb45ccb39f6cf5c31f00cf2b965f5f10f3cb9"}, ] [package.dependencies] @@ -1641,6 +1634,7 @@ testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" + optional = false python-versions = ">=3.7" files = [ @@ -1650,23 +1644,25 @@ files = [ [[package]] name = "ipython" -version = "8.17.2" +version = "8.12.3" description = "IPython: Productive Interactive Computing" + optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" files = [ - {file = "ipython-8.17.2-py3-none-any.whl", hash = "sha256:1e4d1d666a023e3c93585ba0d8e962867f7a111af322efff6b9c58062b3e5444"}, - {file = "ipython-8.17.2.tar.gz", hash = "sha256:126bb57e1895594bb0d91ea3090bbd39384f6fe87c3d57fd558d0670f50339bb"}, + {file = "ipython-8.12.3-py3-none-any.whl", hash = "sha256:b0340d46a933d27c657b211a329d0be23793c36595acf9e6ef4164bc01a1804c"}, + {file = "ipython-8.12.3.tar.gz", hash = "sha256:3910c4b54543c2ad73d06579aa771041b7d5707b033bd488669b4cf544e3b363"}, ] [package.dependencies] appnope = {version = "*", markers = "sys_platform == \"darwin\""} +backcall = "*" 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\""} +pickleshare = "*" prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" pygments = ">=2.4.0" stack-data = "*" @@ -1674,54 +1670,23 @@ traitlets = ">=5" typing-extensions = {version = "*", markers = "python_version < \"3.10\""} [package.extras] -all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] black = ["black"] -doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] kernel = ["ipykernel"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] -test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] - -[[package]] -name = "ipywidgets" -version = "8.1.1" -description = "Jupyter interactive widgets" -optional = false -python-versions = ">=3.7" -files = [ - {file = "ipywidgets-8.1.1-py3-none-any.whl", hash = "sha256:2b88d728656aea3bbfd05d32c747cfd0078f9d7e159cf982433b58ad717eed7f"}, - {file = "ipywidgets-8.1.1.tar.gz", hash = "sha256:40211efb556adec6fa450ccc2a77d59ca44a060f4f9f136833df59c9f538e6e8"}, -] - -[package.dependencies] -comm = ">=0.1.3" -ipython = ">=6.1.0" -jupyterlab-widgets = ">=3.0.9,<3.1.0" -traitlets = ">=4.3.1" -widgetsnbextension = ">=4.0.9,<4.1.0" - -[package.extras] -test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] - -[[package]] -name = "iso8601" -version = "1.1.0" -description = "Simple module to parse ISO 8601 dates" -optional = false -python-versions = ">=3.6.2,<4.0" -files = [ - {file = "iso8601-1.1.0-py3-none-any.whl", hash = "sha256:8400e90141bf792bce2634df533dc57e3bee19ea120a87bebcd3da89a58ad73f"}, - {file = "iso8601-1.1.0.tar.gz", hash = "sha256:32811e7b81deee2063ea6d2e94f8819a86d1f3811e49d23623a41fa832bef03f"}, -] +test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] [[package]] name = "isort" version = "5.12.0" description = "A Python utility / library to sort Python imports." + optional = false python-versions = ">=3.8.0" files = [ @@ -1735,10 +1700,42 @@ pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib" plugins = ["setuptools"] requirements-deprecated-finder = ["pip-api", "pipreqs"] +[[package]] +name = "jax" +version = "0.4.13" +description = "Differentiate, compile, and transform Numpy code." + +optional = false +python-versions = ">=3.8" +files = [ + {file = "jax-0.4.13.tar.gz", hash = "sha256:03bfe6749dfe647f16f15f6616638adae6c4a7ca7167c75c21961ecfd3a3baaa"}, +] + +[package.dependencies] +importlib_metadata = {version = ">=4.6", markers = "python_version < \"3.10\""} +ml_dtypes = ">=0.1.0" +numpy = ">=1.21" +opt_einsum = "*" +scipy = ">=1.7" + +[package.extras] +australis = ["protobuf (>=3.13,<4)"] +ci = ["jaxlib (==0.4.12)"] +cpu = ["jaxlib (==0.4.13)"] +cuda = ["jaxlib (==0.4.13+cuda11.cudnn86)"] +cuda11-cudnn86 = ["jaxlib (==0.4.13+cuda11.cudnn86)"] +cuda11-local = ["jaxlib (==0.4.13+cuda11.cudnn86)"] +cuda11-pip = ["jaxlib (==0.4.13+cuda11.cudnn86)", "nvidia-cublas-cu11 (>=11.11)", "nvidia-cuda-cupti-cu11 (>=11.8)", "nvidia-cuda-nvcc-cu11 (>=11.8)", "nvidia-cuda-runtime-cu11 (>=11.8)", "nvidia-cudnn-cu11 (>=8.8)", "nvidia-cufft-cu11 (>=10.9)", "nvidia-cusolver-cu11 (>=11.4)", "nvidia-cusparse-cu11 (>=11.7)"] +cuda12-local = ["jaxlib (==0.4.13+cuda12.cudnn89)"] +cuda12-pip = ["jaxlib (==0.4.13+cuda12.cudnn89)", "nvidia-cublas-cu12", "nvidia-cuda-cupti-cu12", "nvidia-cuda-nvcc-cu12", "nvidia-cuda-runtime-cu12", "nvidia-cudnn-cu12 (>=8.9)", "nvidia-cufft-cu12", "nvidia-cusolver-cu12", "nvidia-cusparse-cu12"] +minimum-jaxlib = ["jaxlib (==0.4.11)"] +tpu = ["jaxlib (==0.4.13)", "libtpu-nightly (==0.1.dev20230622)"] + [[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 = [ @@ -1758,6 +1755,7 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." + optional = false python-versions = ">=3.7" files = [ @@ -1775,6 +1773,7 @@ i18n = ["Babel (>=2.7)"] name = "joblib" version = "1.3.2" description = "Lightweight pipelining with Python functions" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1784,37 +1783,59 @@ files = [ [[package]] name = "jsonschema" -version = "4.17.3" +version = "4.19.1" description = "An implementation of JSON Schema validation for Python" + optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, - {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, + {file = "jsonschema-4.19.1-py3-none-any.whl", hash = "sha256:cd5f1f9ed9444e554b38ba003af06c0a8c2868131e56bfbef0550fb450c0330e"}, + {file = "jsonschema-4.19.1.tar.gz", hash = "sha256:ec84cc37cfa703ef7cd4928db24f9cb31428a5d0fa77747b8b51a847458e0bbf"}, ] [package.dependencies] -attrs = ">=17.4.0" -pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" +attrs = ">=22.2.0" +importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} +jsonschema-specifications = ">=2023.03.6" +pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" [package.extras] format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] +[[package]] +name = "jsonschema-specifications" +version = "2023.7.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" + +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.7.1-py3-none-any.whl", hash = "sha256:05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1"}, + {file = "jsonschema_specifications-2023.7.1.tar.gz", hash = "sha256:c91a50404e88a1f6ba40636778e2ee08f6e24c5613fe4c53ac24578a5a7f72bb"}, +] + +[package.dependencies] +importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} +referencing = ">=0.28.0" + [[package]] name = "jupyter-client" -version = "8.6.0" +version = "8.5.0" description = "Jupyter protocol implementation and client libraries" + optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.6.0-py3-none-any.whl", hash = "sha256:909c474dbe62582ae62b758bca86d6518c85234bdee2d908c778db6d72f39d99"}, - {file = "jupyter_client-8.6.0.tar.gz", hash = "sha256:0642244bb83b4764ae60d07e010e15f0e2d275ec4e918a8f7b80fbbef3ca60c7"}, + {file = "jupyter_client-8.5.0-py3-none-any.whl", hash = "sha256:c3877aac7257ec68d79b5c622ce986bd2a992ca42f6ddc9b4dd1da50e89f7028"}, + {file = "jupyter_client-8.5.0.tar.gz", hash = "sha256:e8754066510ce456358df363f97eae64b50860f30dc1fe8c6771440db3be9a63"}, ] [package.dependencies] importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" python-dateutil = ">=2.8.2" pyzmq = ">=23.0" tornado = ">=6.2" @@ -1828,6 +1849,7 @@ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pyt name = "jupyter-core" version = "5.5.0" description = "Jupyter core package. A base package on which Jupyter projects rely." + optional = false python-versions = ">=3.8" files = [ @@ -1848,6 +1870,7 @@ test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] name = "jupyterlab-pygments" version = "0.2.2" description = "Pygments theme using JupyterLab CSS variables" + optional = false python-versions = ">=3.7" files = [ @@ -1855,32 +1878,22 @@ files = [ {file = "jupyterlab_pygments-0.2.2.tar.gz", hash = "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d"}, ] -[[package]] -name = "jupyterlab-widgets" -version = "3.0.9" -description = "Jupyter interactive widgets for JupyterLab" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jupyterlab_widgets-3.0.9-py3-none-any.whl", hash = "sha256:3cf5bdf5b897bf3bccf1c11873aa4afd776d7430200f765e0686bd352487b58d"}, - {file = "jupyterlab_widgets-3.0.9.tar.gz", hash = "sha256:6005a4e974c7beee84060fdfba341a3218495046de8ae3ec64888e5fe19fdb4c"}, -] - [[package]] name = "keras" -version = "2.14.0" +version = "2.12.0" description = "Deep learning for humans." + optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" files = [ - {file = "keras-2.14.0-py3-none-any.whl", hash = "sha256:d7429d1d2131cc7eb1f2ea2ec330227c7d9d38dab3dfdf2e78defee4ecc43fcd"}, - {file = "keras-2.14.0.tar.gz", hash = "sha256:22788bdbc86d9988794fe9703bb5205141da797c4faeeb59497c58c3d94d34ed"}, + {file = "keras-2.12.0-py2.py3-none-any.whl", hash = "sha256:35c39534011e909645fb93515452e98e1a0ce23727b55d4918b9c58b2308c15e"}, ] [[package]] name = "kiwisolver" version = "1.4.5" description = "A fast implementation of the Cassowary constraint solver" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1994,6 +2007,7 @@ files = [ name = "lark" version = "0.11.3" description = "a modern parsing library" + optional = false python-versions = "*" files = [ @@ -2009,6 +2023,7 @@ regex = ["regex"] name = "latexcodec" version = "2.0.1" description = "A lexer and codec to work with LaTeX code in Python." + optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2023,6 +2038,7 @@ six = ">=1.4.1" name = "lazy-object-proxy" version = "1.9.0" description = "A fast and thorough lazy object proxy." + optional = false python-versions = ">=3.7" files = [ @@ -2068,6 +2084,7 @@ files = [ name = "libclang" version = "16.0.6" description = "Clang Python Bindings, mirrored from the official LLVM repo: https://github.com/llvm/llvm-project/tree/main/clang/bindings/python, to make the installation process easier." + optional = false python-versions = "*" files = [ @@ -2088,6 +2105,7 @@ files = [ name = "llvmlite" version = "0.41.1" description = "lightweight wrapper around basic LLVM functionality" + optional = false python-versions = ">=3.8" files = [ @@ -2119,13 +2137,14 @@ files = [ [[package]] name = "markdown" -version = "3.5.1" +version = "3.5" description = "Python implementation of John Gruber's Markdown." + optional = false python-versions = ">=3.8" files = [ - {file = "Markdown-3.5.1-py3-none-any.whl", hash = "sha256:5874b47d4ee3f0b14d764324d2c94c03ea66bee56f2d929da9f2508d65e722dc"}, - {file = "Markdown-3.5.1.tar.gz", hash = "sha256:b65d7beb248dc22f2e8a31fb706d93798093c308dc1aba295aedeb9d41a813bd"}, + {file = "Markdown-3.5-py3-none-any.whl", hash = "sha256:4afb124395ce5fc34e6d9886dab977fd9ae987fc6e85689f08278cf0c69d4bf3"}, + {file = "Markdown-3.5.tar.gz", hash = "sha256:a807eb2e4778d9156c8f07876c6e4d50b5494c5665c4834f67b06459dfd877b3"}, ] [package.dependencies] @@ -2139,6 +2158,7 @@ testing = ["coverage", "pyyaml"] name = "markupsafe" version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." + optional = false python-versions = ">=3.7" files = [ @@ -2162,6 +2182,16 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -2196,39 +2226,59 @@ files = [ [[package]] name = "matplotlib" -version = "3.8.1" +version = "3.7.3" description = "Python plotting package" +category = "main" optional = false -python-versions = ">=3.9" -files = [ - {file = "matplotlib-3.8.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:e11ab864323fa73ac1b7849688d9671c47a2665242e899785b4db1a375b547e1"}, - {file = "matplotlib-3.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:43a9d40feb63c9e31a0b8b069dcbd74a912f59bdc0095d187126694cd26977e4"}, - {file = "matplotlib-3.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:608ea2951838d391e45dec2e644888db6899c752d3c29e157af9dcefb3d7d8d5"}, - {file = "matplotlib-3.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82ec95b02e894561c21e066bd0c716e4b410df141ce9441aa5af6cd937e4ade2"}, - {file = "matplotlib-3.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e3ad1759ad4a5245172c6d32b8ada603a6020d03211524c39d78d25c9a7dc0d2"}, - {file = "matplotlib-3.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:20a0fdfd3ee836179047f3782be060057b878ad37f5abe29edf006a1ff3ecd73"}, - {file = "matplotlib-3.8.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7658b7073c1d6a2922ecc0ed41602410fae88586cb8a54f7a2063d537b6beaf7"}, - {file = "matplotlib-3.8.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf6889643d4560fcc56f9f0941f078e4df0d72a6c3e4ca548841fc13c5642664"}, - {file = "matplotlib-3.8.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff842e27bc6a80de08c40e0bfdce460bd08080e8a94af131162b6a1b8948f2cc"}, - {file = "matplotlib-3.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f99d07c0e753717775be7be39ab383453b4d8b629c9fa174596b970c6555890"}, - {file = "matplotlib-3.8.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f34b46dbb1db1f09bfa937cd5853e5f2af232caeeff509c3ab6e43fd33780eae"}, - {file = "matplotlib-3.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:1fcb49b6baf0375281979cbf26695ec10bd1cada1e311893e89533b3b70143e7"}, - {file = "matplotlib-3.8.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e17674ee127f78f26fea237e7f4d5cf910a8be82beb6260fedf358b88075b823"}, - {file = "matplotlib-3.8.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d921c0270647ab11c3ef283efaaa3d46fd005ba233bfb3aea75231cdf3656de8"}, - {file = "matplotlib-3.8.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2afe7d2f8c9e35e94fbcfcfd9b28f29cb32f0a9068cba469cf907428379c8db9"}, - {file = "matplotlib-3.8.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5a504ff40f81d6233603475a45497a6dca37a873393fa20ae6f7dd6596ef72b"}, - {file = "matplotlib-3.8.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cd54bbf089953140905768ed4626d7223e1ad1d7e2a138410a9c4d3b865ccd80"}, - {file = "matplotlib-3.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:27502d2452208ae784c19504644f09f83742809143bbeae147617640930aa344"}, - {file = "matplotlib-3.8.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:f55fb5ff02d999a100be28bf6ffe826e1867a54c7b465409685332c9dd48ffa5"}, - {file = "matplotlib-3.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:afb72822ae410d62aa1a2920c6563cb5680de9078358f0e9474396c6c3e06be2"}, - {file = "matplotlib-3.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43cf368a4a1d8cbc426944806e5e183cead746647a64d2cdb786441546235967"}, - {file = "matplotlib-3.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c54c55457c7f5ea4dfdba0020004fc7667f5c10c8d9b8010d735345acc06c9b8"}, - {file = "matplotlib-3.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e3bb809b743653b5aab5d72ee45c8c937c28e147b0846b0826a54bece898608c"}, - {file = "matplotlib-3.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:c1b0ecaa0d1f4fe1e30f625a2347f0034a89a7d17c39efbb502e554d92ee2f61"}, - {file = "matplotlib-3.8.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ca84deaa38cb64b7dd160ca2046b45f7b5dbff2b0179642e1339fadc337446c9"}, - {file = "matplotlib-3.8.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed3b29f54f6bbf3eaca4cbd23bc260155153ace63b7f597c474fa6fc6f386530"}, - {file = "matplotlib-3.8.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d24c47a1bb47e392fbcd26fe322e4ff3431653ac1e8718e4e147d450ae97a44"}, - {file = "matplotlib-3.8.1.tar.gz", hash = "sha256:044df81c1f6f3a8e52d70c4cfcb44e77ea9632a10929932870dfaa90de94365d"}, +python-versions = ">=3.8" +files = [ + {file = "matplotlib-3.7.3-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:085c33b27561d9c04386789d5aa5eb4a932ddef43cfcdd0e01735f9a6e85ce0c"}, + {file = "matplotlib-3.7.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c568e80e1c17f68a727f30f591926751b97b98314d8e59804f54f86ae6fa6a22"}, + {file = "matplotlib-3.7.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7baf98c5ad59c5c4743ea884bb025cbffa52dacdfdac0da3e6021a285a90377e"}, + {file = "matplotlib-3.7.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:236024f582e40dac39bca592258888b38ae47a9fed7b8de652d68d3d02d47d2b"}, + {file = "matplotlib-3.7.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12b4f6795efea037ce2d41e7c417ad8bd02d5719c6ad4a8450a0708f4a1cfb89"}, + {file = "matplotlib-3.7.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b2136cc6c5415b78977e0e8c608647d597204b05b1d9089ccf513c7d913733"}, + {file = "matplotlib-3.7.3-cp310-cp310-win32.whl", hash = "sha256:122dcbf9be0086e2a95d9e5e0632dbf3bd5b65eaa68c369363310a6c87753059"}, + {file = "matplotlib-3.7.3-cp310-cp310-win_amd64.whl", hash = "sha256:4aab27d9e33293389e3c1d7c881d414a72bdfda0fedc3a6bf46c6fa88d9b8015"}, + {file = "matplotlib-3.7.3-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:d5adc743de91e8e0b13df60deb1b1c285b8effea3d66223afceb14b63c9b05de"}, + {file = "matplotlib-3.7.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:55de4cf7cd0071b8ebf203981b53ab64f988a0a1f897a2dff300a1124e8bcd8b"}, + {file = "matplotlib-3.7.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ac03377fd908aaee2312d0b11735753e907adb6f4d1d102de5e2425249693f6c"}, + {file = "matplotlib-3.7.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:755bafc10a46918ce9a39980009b54b02dd249594e5adf52f9c56acfddb5d0b7"}, + {file = "matplotlib-3.7.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a6094c6f8e8d18db631754df4fe9a34dec3caf074f6869a7db09f18f9b1d6b2"}, + {file = "matplotlib-3.7.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:272dba2f1b107790ed78ebf5385b8d14b27ad9e90419de340364b49fe549a993"}, + {file = "matplotlib-3.7.3-cp311-cp311-win32.whl", hash = "sha256:591c123bed1cb4b9996fb60b41a6d89c2ec4943244540776c5f1283fb6960a53"}, + {file = "matplotlib-3.7.3-cp311-cp311-win_amd64.whl", hash = "sha256:3bf3a178c6504694cee8b88b353df0051583f2f6f8faa146f67115c27c856881"}, + {file = "matplotlib-3.7.3-cp312-cp312-macosx_10_12_universal2.whl", hash = "sha256:edf54cac8ee3603f3093616b40a931e8c063969756a4d78a86e82c2fea9659f7"}, + {file = "matplotlib-3.7.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:91e36a85ea639a1ba9f91427041eac064b04829945fe331a92617b6cb21d27e5"}, + {file = "matplotlib-3.7.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:caf5eaaf7c68f8d7df269dfbcaf46f48a70ff482bfcebdcc97519671023f2a7d"}, + {file = "matplotlib-3.7.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74bf57f505efea376097e948b7cdd87191a7ce8180616390aef496639edf601f"}, + {file = "matplotlib-3.7.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee152a88a0da527840a426535514b6ed8ac4240eb856b1da92cf48124320e346"}, + {file = "matplotlib-3.7.3-cp312-cp312-win_amd64.whl", hash = "sha256:67a410a9c9e07cbc83581eeea144bbe298870bf0ac0ee2f2e10a015ab7efee19"}, + {file = "matplotlib-3.7.3-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:259999c05285cb993d7f2a419cea547863fa215379eda81f7254c9e932963729"}, + {file = "matplotlib-3.7.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:3f4e7fd5a6157e1d018ce2166ec8e531a481dd4a36f035b5c23edfe05a25419a"}, + {file = "matplotlib-3.7.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:faa3d12d8811d08d14080a8b7b9caea9a457dc495350166b56df0db4b9909ef5"}, + {file = "matplotlib-3.7.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:336e88900c11441e458da01c8414fc57e04e17f9d3bb94958a76faa2652bcf6b"}, + {file = "matplotlib-3.7.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:12f4c0dd8aa280d796c8772ea8265a14f11a04319baa3a16daa5556065e8baea"}, + {file = "matplotlib-3.7.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1990955b11e7918d256cf3b956b10997f405b7917a3f1c7d8e69c1d15c7b1930"}, + {file = "matplotlib-3.7.3-cp38-cp38-win32.whl", hash = "sha256:e78707b751260b42b721507ad7aa60fe4026d7f51c74cca6b9cd8b123ebb633a"}, + {file = "matplotlib-3.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:e594ee43c59ea39ca5c6244667cac9d017a3527febc31f5532ad9135cf7469ec"}, + {file = "matplotlib-3.7.3-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:6eaa1cf0e94c936a26b78f6d756c5fbc12e0a58c8a68b7248a2a31456ce4e234"}, + {file = "matplotlib-3.7.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0a97af9d22e8ebedc9f00b043d9bbd29a375e9e10b656982012dded44c10fd77"}, + {file = "matplotlib-3.7.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1f9c6c16597af660433ab330b59ee2934b832ee1fabcaf5cbde7b2add840f31e"}, + {file = "matplotlib-3.7.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7240259b4b9cbc62381f6378cff4d57af539162a18e832c1e48042fabc40b6b"}, + {file = "matplotlib-3.7.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:747c6191d2e88ae854809e69aa358dbf852ff1a5738401b85c1cc9012309897a"}, + {file = "matplotlib-3.7.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec726b08a5275d827aa91bb951e68234a4423adb91cf65bc0fcdc0f2777663f7"}, + {file = "matplotlib-3.7.3-cp39-cp39-win32.whl", hash = "sha256:40e3b9b450c6534f07278310c4e34caff41c2a42377e4b9d47b0f8d3ac1083a2"}, + {file = "matplotlib-3.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfc118642903a23e309b1da32886bb39a4314147d013e820c86b5fb4cb2e36d0"}, + {file = "matplotlib-3.7.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:165c8082bf8fc0360c24aa4724a22eaadbfd8c28bf1ccf7e94d685cad48261e4"}, + {file = "matplotlib-3.7.3-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebd8470cc2a3594746ff0513aecbfa2c55ff6f58e6cef2efb1a54eb87c88ffa2"}, + {file = "matplotlib-3.7.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7153453669c9672b52095119fd21dd032d19225d48413a2871519b17db4b0fde"}, + {file = "matplotlib-3.7.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:498a08267dc69dd8f24c4b5d7423fa584d7ce0027ba71f7881df05fc09b89bb7"}, + {file = "matplotlib-3.7.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d48999c4b19b5a0c058c9cd828ff6fc7748390679f6cf9a2ad653a3e802c87d3"}, + {file = "matplotlib-3.7.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22d65d18b4ee8070a5fea5761d59293f1f9e2fac37ec9ce090463b0e629432fd"}, + {file = "matplotlib-3.7.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c40cde976c36693cc0767e27cf5f443f91c23520060bd9496678364adfafe9c"}, + {file = "matplotlib-3.7.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:39018a2b17592448fbfdf4b8352955e6c3905359939791d4ff429296494d1a0c"}, + {file = "matplotlib-3.7.3.tar.gz", hash = "sha256:f09b3dd6bdeb588de91f853bbb2d6f0ff8ab693485b0c49035eaa510cb4f142e"}, ] [package.dependencies] @@ -2236,17 +2286,19 @@ contourpy = ">=1.0.1" cycler = ">=0.10" fonttools = ">=4.22.0" importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} -kiwisolver = ">=1.3.1" -numpy = ">=1.21,<2" +kiwisolver = ">=1.0.1" +numpy = ">=1.20,<2" packaging = ">=20.0" -pillow = ">=8" +pillow = ">=6.2.0" pyparsing = ">=2.3.1" python-dateutil = ">=2.7" +setuptools_scm = ">=7" [[package]] name = "matplotlib-inline" version = "0.1.6" description = "Inline Matplotlib backend for Jupyter" + optional = false python-versions = ">=3.5" files = [ @@ -2261,6 +2313,7 @@ traitlets = "*" name = "mccabe" version = "0.7.0" description = "McCabe checker, plugin for flake8" + optional = false python-versions = ">=3.6" files = [ @@ -2272,6 +2325,7 @@ files = [ name = "mistune" version = "3.0.2" description = "A sane and fast Markdown parser with useful plugins and renderers" + optional = false python-versions = ">=3.7" files = [ @@ -2283,6 +2337,7 @@ files = [ name = "ml-dtypes" version = "0.2.0" description = "" + optional = false python-versions = ">=3.7" files = [ @@ -2307,18 +2362,31 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.23.3", markers = "python_version > \"3.10\""}, - {version = ">=1.21.2", markers = "python_version > \"3.9\" and python_version <= \"3.10\""}, {version = ">1.20", markers = "python_version <= \"3.9\""}, + {version = ">=1.21.2", markers = "python_version > \"3.9\""}, + {version = ">=1.23.3", markers = "python_version > \"3.10\""}, ] [package.extras] dev = ["absl-py", "pyink", "pylint (>=2.6.0)", "pytest", "pytest-xdist"] +[[package]] +name = "more-itertools" +version = "9.1.0" +description = "More routines for operating on iterables, beyond itertools" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "more-itertools-9.1.0.tar.gz", hash = "sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d"}, + {file = "more_itertools-9.1.0-py3-none-any.whl", hash = "sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3"}, +] + [[package]] name = "mpmath" version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" +category = "main" optional = false python-versions = "*" files = [ @@ -2336,6 +2404,7 @@ tests = ["pytest (>=4.6)"] name = "msgpack" version = "1.0.7" description = "MessagePack serializer" + optional = false python-versions = ">=3.8" files = [ @@ -2401,6 +2470,7 @@ files = [ name = "nbclient" version = "0.8.0" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." + optional = false python-versions = ">=3.8.0" files = [ @@ -2410,7 +2480,7 @@ files = [ [package.dependencies] jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" nbformat = ">=5.1" traitlets = ">=5.4" @@ -2421,13 +2491,14 @@ test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>= [[package]] name = "nbconvert" -version = "7.11.0" +version = "7.10.0" description = "Converting Jupyter Notebooks" + optional = false python-versions = ">=3.8" files = [ - {file = "nbconvert-7.11.0-py3-none-any.whl", hash = "sha256:d1d417b7f34a4e38887f8da5bdfd12372adf3b80f995d57556cb0972c68909fe"}, - {file = "nbconvert-7.11.0.tar.gz", hash = "sha256:abedc01cf543177ffde0bfc2a69726d5a478f6af10a332fc1bf29fcb4f0cf000"}, + {file = "nbconvert-7.10.0-py3-none-any.whl", hash = "sha256:8cf1d95e569730f136feb85e4bba25bdcf3a63fefb122d854ddff6771c0ac933"}, + {file = "nbconvert-7.10.0.tar.gz", hash = "sha256:4bedff08848626be544de193b7594d98a048073f392178008ff4f171f5e21d26"}, ] [package.dependencies] @@ -2454,13 +2525,14 @@ docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sp qtpdf = ["nbconvert[qtpng]"] qtpng = ["pyqtwebengine (>=5.15)"] serve = ["tornado (>=6.1)"] -test = ["flaky", "ipykernel", "ipywidgets (>=7)", "pytest"] +test = ["flaky", "ipykernel", "ipywidgets (>=7)", "pytest", "pytest-dependency"] webpdf = ["playwright"] [[package]] name = "nbformat" version = "5.9.2" description = "The Jupyter Notebook format" + optional = false python-versions = ">=3.8" files = [ @@ -2482,6 +2554,7 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] name = "nbsphinx" version = "0.8.12" description = "Jupyter Notebook Tools for Sphinx" + optional = false python-versions = ">=3.6" files = [ @@ -2501,6 +2574,7 @@ traitlets = ">=5" name = "networkx" version = "2.8.8" description = "Python package for creating and manipulating graphs and networks" + optional = false python-versions = ">=3.8" files = [ @@ -2519,6 +2593,7 @@ test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] name = "numba" version = "0.58.1" description = "compiling Python code using LLVM" + optional = false python-versions = ">=3.8" files = [ @@ -2546,54 +2621,53 @@ files = [ ] [package.dependencies] -llvmlite = "==0.41.*" +importlib-metadata = {version = "*", markers = "python_version < \"3.9\""} +llvmlite = ">=0.41.0dev0,<0.42" numpy = ">=1.22,<1.27" [[package]] name = "numpy" -version = "1.26.1" -description = "Fundamental package for array computing in Python" -optional = false -python-versions = "<3.13,>=3.9" -files = [ - {file = "numpy-1.26.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82e871307a6331b5f09efda3c22e03c095d957f04bf6bc1804f30048d0e5e7af"}, - {file = "numpy-1.26.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdd9ec98f0063d93baeb01aad472a1a0840dee302842a2746a7a8e92968f9575"}, - {file = "numpy-1.26.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d78f269e0c4fd365fc2992c00353e4530d274ba68f15e968d8bc3c69ce5f5244"}, - {file = "numpy-1.26.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ab9163ca8aeb7fd32fe93866490654d2f7dda4e61bc6297bf72ce07fdc02f67"}, - {file = "numpy-1.26.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:78ca54b2f9daffa5f323f34cdf21e1d9779a54073f0018a3094ab907938331a2"}, - {file = "numpy-1.26.1-cp310-cp310-win32.whl", hash = "sha256:d1cfc92db6af1fd37a7bb58e55c8383b4aa1ba23d012bdbba26b4bcca45ac297"}, - {file = "numpy-1.26.1-cp310-cp310-win_amd64.whl", hash = "sha256:d2984cb6caaf05294b8466966627e80bf6c7afd273279077679cb010acb0e5ab"}, - {file = "numpy-1.26.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cd7837b2b734ca72959a1caf3309457a318c934abef7a43a14bb984e574bbb9a"}, - {file = "numpy-1.26.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1c59c046c31a43310ad0199d6299e59f57a289e22f0f36951ced1c9eac3665b9"}, - {file = "numpy-1.26.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d58e8c51a7cf43090d124d5073bc29ab2755822181fcad978b12e144e5e5a4b3"}, - {file = "numpy-1.26.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6081aed64714a18c72b168a9276095ef9155dd7888b9e74b5987808f0dd0a974"}, - {file = "numpy-1.26.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:97e5d6a9f0702c2863aaabf19f0d1b6c2628fbe476438ce0b5ce06e83085064c"}, - {file = "numpy-1.26.1-cp311-cp311-win32.whl", hash = "sha256:b9d45d1dbb9de84894cc50efece5b09939752a2d75aab3a8b0cef6f3a35ecd6b"}, - {file = "numpy-1.26.1-cp311-cp311-win_amd64.whl", hash = "sha256:3649d566e2fc067597125428db15d60eb42a4e0897fc48d28cb75dc2e0454e53"}, - {file = "numpy-1.26.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1d1bd82d539607951cac963388534da3b7ea0e18b149a53cf883d8f699178c0f"}, - {file = "numpy-1.26.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:afd5ced4e5a96dac6725daeb5242a35494243f2239244fad10a90ce58b071d24"}, - {file = "numpy-1.26.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a03fb25610ef560a6201ff06df4f8105292ba56e7cdd196ea350d123fc32e24e"}, - {file = "numpy-1.26.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcfaf015b79d1f9f9c9fd0731a907407dc3e45769262d657d754c3a028586124"}, - {file = "numpy-1.26.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e509cbc488c735b43b5ffea175235cec24bbc57b227ef1acc691725beb230d1c"}, - {file = "numpy-1.26.1-cp312-cp312-win32.whl", hash = "sha256:af22f3d8e228d84d1c0c44c1fbdeb80f97a15a0abe4f080960393a00db733b66"}, - {file = "numpy-1.26.1-cp312-cp312-win_amd64.whl", hash = "sha256:9f42284ebf91bdf32fafac29d29d4c07e5e9d1af862ea73686581773ef9e73a7"}, - {file = "numpy-1.26.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bb894accfd16b867d8643fc2ba6c8617c78ba2828051e9a69511644ce86ce83e"}, - {file = "numpy-1.26.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e44ccb93f30c75dfc0c3aa3ce38f33486a75ec9abadabd4e59f114994a9c4617"}, - {file = "numpy-1.26.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9696aa2e35cc41e398a6d42d147cf326f8f9d81befcb399bc1ed7ffea339b64e"}, - {file = "numpy-1.26.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5b411040beead47a228bde3b2241100454a6abde9df139ed087bd73fc0a4908"}, - {file = "numpy-1.26.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1e11668d6f756ca5ef534b5be8653d16c5352cbb210a5c2a79ff288e937010d5"}, - {file = "numpy-1.26.1-cp39-cp39-win32.whl", hash = "sha256:d1d2c6b7dd618c41e202c59c1413ef9b2c8e8a15f5039e344af64195459e3104"}, - {file = "numpy-1.26.1-cp39-cp39-win_amd64.whl", hash = "sha256:59227c981d43425ca5e5c01094d59eb14e8772ce6975d4b2fc1e106a833d5ae2"}, - {file = "numpy-1.26.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:06934e1a22c54636a059215d6da99e23286424f316fddd979f5071093b648668"}, - {file = "numpy-1.26.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76ff661a867d9272cd2a99eed002470f46dbe0943a5ffd140f49be84f68ffc42"}, - {file = "numpy-1.26.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6965888d65d2848e8768824ca8288db0a81263c1efccec881cb35a0d805fcd2f"}, - {file = "numpy-1.26.1.tar.gz", hash = "sha256:c8c6c72d4a9f831f328efb1312642a1cafafaa88981d9ab76368d50d07d93cbe"}, +version = "1.23.5" +description = "NumPy is the fundamental package for array computing with Python." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "numpy-1.23.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63"}, + {file = "numpy-1.23.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d"}, + {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43"}, + {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1"}, + {file = "numpy-1.23.5-cp310-cp310-win32.whl", hash = "sha256:522e26bbf6377e4d76403826ed689c295b0b238f46c28a7251ab94716da0b280"}, + {file = "numpy-1.23.5-cp310-cp310-win_amd64.whl", hash = "sha256:dbee87b469018961d1ad79b1a5d50c0ae850000b639bcb1b694e9981083243b6"}, + {file = "numpy-1.23.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ce571367b6dfe60af04e04a1834ca2dc5f46004ac1cc756fb95319f64c095a96"}, + {file = "numpy-1.23.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56e454c7833e94ec9769fa0f86e6ff8e42ee38ce0ce1fa4cbb747ea7e06d56aa"}, + {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5039f55555e1eab31124a5768898c9e22c25a65c1e0037f4d7c495a45778c9f2"}, + {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58f545efd1108e647604a1b5aa809591ccd2540f468a880bedb97247e72db387"}, + {file = "numpy-1.23.5-cp311-cp311-win32.whl", hash = "sha256:b2a9ab7c279c91974f756c84c365a669a887efa287365a8e2c418f8b3ba73fb0"}, + {file = "numpy-1.23.5-cp311-cp311-win_amd64.whl", hash = "sha256:0cbe9848fad08baf71de1a39e12d1b6310f1d5b2d0ea4de051058e6e1076852d"}, + {file = "numpy-1.23.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f063b69b090c9d918f9df0a12116029e274daf0181df392839661c4c7ec9018a"}, + {file = "numpy-1.23.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0aaee12d8883552fadfc41e96b4c82ee7d794949e2a7c3b3a7201e968c7ecab9"}, + {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92c8c1e89a1f5028a4c6d9e3ccbe311b6ba53694811269b992c0b224269e2398"}, + {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d208a0f8729f3fb790ed18a003f3a57895b989b40ea4dce4717e9cf4af62c6bb"}, + {file = "numpy-1.23.5-cp38-cp38-win32.whl", hash = "sha256:06005a2ef6014e9956c09ba07654f9837d9e26696a0470e42beedadb78c11b07"}, + {file = "numpy-1.23.5-cp38-cp38-win_amd64.whl", hash = "sha256:ca51fcfcc5f9354c45f400059e88bc09215fb71a48d3768fb80e357f3b457e1e"}, + {file = "numpy-1.23.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8969bfd28e85c81f3f94eb4a66bc2cf1dbdc5c18efc320af34bffc54d6b1e38f"}, + {file = "numpy-1.23.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7ac231a08bb37f852849bbb387a20a57574a97cfc7b6cabb488a4fc8be176de"}, + {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf837dc63ba5c06dc8797c398db1e223a466c7ece27a1f7b5232ba3466aafe3d"}, + {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33161613d2269025873025b33e879825ec7b1d831317e68f4f2f0f84ed14c719"}, + {file = "numpy-1.23.5-cp39-cp39-win32.whl", hash = "sha256:af1da88f6bc3d2338ebbf0e22fe487821ea4d8e89053e25fa59d1d79786e7481"}, + {file = "numpy-1.23.5-cp39-cp39-win_amd64.whl", hash = "sha256:09b7847f7e83ca37c6e627682f145856de331049013853f344f37b0c9690e3df"}, + {file = "numpy-1.23.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:abdde9f795cf292fb9651ed48185503a2ff29be87770c3b8e2a14b0cd7aa16f8"}, + {file = "numpy-1.23.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135"}, + {file = "numpy-1.23.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:01dd17cbb340bf0fc23981e52e1d18a9d4050792e8fb8363cecbf066a84b827d"}, + {file = "numpy-1.23.5.tar.gz", hash = "sha256:1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a"}, ] [[package]] name = "oauthlib" version = "3.2.2" description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" + optional = false python-versions = ">=3.6" files = [ @@ -2610,6 +2684,7 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] name = "opt-einsum" version = "3.3.0" description = "Optimizing numpys einsum function" + optional = false python-versions = ">=3.5" files = [ @@ -2628,6 +2703,7 @@ tests = ["pytest", "pytest-cov", "pytest-pep8"] name = "osqp" version = "0.6.3" description = "OSQP: The Operator Splitting QP Solver" + optional = false python-versions = "*" files = [ @@ -2667,6 +2743,7 @@ scipy = ">=0.13.2" name = "packaging" version = "23.2" description = "Core utilities for Python packages" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2676,75 +2753,77 @@ files = [ [[package]] name = "pandas" -version = "2.1.2" +version = "2.0.3" description = "Powerful data structures for data analysis, time series, and statistics" + optional = false -python-versions = ">=3.9" -files = [ - {file = "pandas-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:24057459f19db9ebb02984c6fdd164a970b31a95f38e4a49cf7615b36a1b532c"}, - {file = "pandas-2.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a6cf8fcc8a63d333970b950a7331a30544cf59b1a97baf0a7409e09eafc1ac38"}, - {file = "pandas-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ae6ffbd9d614c20d028c7117ee911fc4e266b4dca2065d5c5909e401f8ff683"}, - {file = "pandas-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eff794eeb7883c5aefb1ed572e7ff533ae779f6c6277849eab9e77986e352688"}, - {file = "pandas-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:02954e285e8e2f4006b6f22be6f0df1f1c3c97adbb7ed211c6b483426f20d5c8"}, - {file = "pandas-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:5b40c9f494e1f27588c369b9e4a6ca19cd924b3a0e1ef9ef1a8e30a07a438f43"}, - {file = "pandas-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:08d287b68fd28906a94564f15118a7ca8c242e50ae7f8bd91130c362b2108a81"}, - {file = "pandas-2.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bbd98dcdcd32f408947afdb3f7434fade6edd408c3077bbce7bd840d654d92c6"}, - {file = "pandas-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e90c95abb3285d06f6e4feedafc134306a8eced93cb78e08cf50e224d5ce22e2"}, - {file = "pandas-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52867d69a54e71666cd184b04e839cff7dfc8ed0cd6b936995117fdae8790b69"}, - {file = "pandas-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d0382645ede2fde352da2a885aac28ec37d38587864c0689b4b2361d17b1d4c"}, - {file = "pandas-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:65177d1c519b55e5b7f094c660ed357bb7d86e799686bb71653b8a4803d8ff0d"}, - {file = "pandas-2.1.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5aa6b86802e8cf7716bf4b4b5a3c99b12d34e9c6a9d06dad254447a620437931"}, - {file = "pandas-2.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d594e2ce51b8e0b4074e6644758865dc2bb13fd654450c1eae51201260a539f1"}, - {file = "pandas-2.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3223f997b6d2ebf9c010260cf3d889848a93f5d22bb4d14cd32638b3d8bba7ad"}, - {file = "pandas-2.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4944dc004ca6cc701dfa19afb8bdb26ad36b9bed5bcec617d2a11e9cae6902"}, - {file = "pandas-2.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3f76280ce8ec216dde336e55b2b82e883401cf466da0fe3be317c03fb8ee7c7d"}, - {file = "pandas-2.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:7ad20d24acf3a0042512b7e8d8fdc2e827126ed519d6bd1ed8e6c14ec8a2c813"}, - {file = "pandas-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:021f09c15e1381e202d95d4a21ece8e7f2bf1388b6d7e9cae09dfe27bd2043d1"}, - {file = "pandas-2.1.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e7f12b2de0060b0b858cfec0016e7d980ae5bae455a1746bfcc70929100ee633"}, - {file = "pandas-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c166b9bb27c1715bed94495d9598a7f02950b4749dba9349c1dd2cbf10729d"}, - {file = "pandas-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25c9976c17311388fcd953cb3d0697999b2205333f4e11e669d90ff8d830d429"}, - {file = "pandas-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:851b5afbb0d62f6129ae891b533aa508cc357d5892c240c91933d945fff15731"}, - {file = "pandas-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:e78507adcc730533619de07bfdd1c62b2918a68cd4419ea386e28abf7f6a1e5c"}, - {file = "pandas-2.1.2.tar.gz", hash = "sha256:52897edc2774d2779fbeb6880d2cfb305daa0b1a29c16b91f531a18918a6e0f3"}, +python-versions = ">=3.8" +files = [ + {file = "pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8"}, + {file = "pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f"}, + {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183"}, + {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0"}, + {file = "pandas-2.0.3-cp310-cp310-win32.whl", hash = "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210"}, + {file = "pandas-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e"}, + {file = "pandas-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8"}, + {file = "pandas-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26"}, + {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d"}, + {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df"}, + {file = "pandas-2.0.3-cp311-cp311-win32.whl", hash = "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd"}, + {file = "pandas-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b"}, + {file = "pandas-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061"}, + {file = "pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5"}, + {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089"}, + {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0"}, + {file = "pandas-2.0.3-cp38-cp38-win32.whl", hash = "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02"}, + {file = "pandas-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78"}, + {file = "pandas-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b"}, + {file = "pandas-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e"}, + {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b"}, + {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641"}, + {file = "pandas-2.0.3-cp39-cp39-win32.whl", hash = "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682"}, + {file = "pandas-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc"}, + {file = "pandas-2.0.3.tar.gz", hash = "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c"}, ] [package.dependencies] numpy = [ - {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""}, - {version = ">=1.23.2,<2", markers = "python_version == \"3.11\""}, + {version = ">=1.20.3", markers = "python_version < \"3.10\""}, + {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, + {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" tzdata = ">=2022.1" [package.extras] -all = ["PyQt5 (>=5.15.6)", "SQLAlchemy (>=1.4.36)", "beautifulsoup4 (>=4.11.1)", "bottleneck (>=1.3.4)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=0.8.1)", "fsspec (>=2022.05.0)", "gcsfs (>=2022.05.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.8.0)", "matplotlib (>=3.6.1)", "numba (>=0.55.2)", "numexpr (>=2.8.0)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pandas-gbq (>=0.17.5)", "psycopg2 (>=2.9.3)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.5)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "pyxlsb (>=1.0.9)", "qtpy (>=2.2.0)", "s3fs (>=2022.05.0)", "scipy (>=1.8.1)", "tables (>=3.7.0)", "tabulate (>=0.8.10)", "xarray (>=2022.03.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)", "zstandard (>=0.17.0)"] -aws = ["s3fs (>=2022.05.0)"] -clipboard = ["PyQt5 (>=5.15.6)", "qtpy (>=2.2.0)"] -compression = ["zstandard (>=0.17.0)"] -computation = ["scipy (>=1.8.1)", "xarray (>=2022.03.0)"] -consortium-standard = ["dataframe-api-compat (>=0.1.7)"] -excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pyxlsb (>=1.0.9)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)"] +all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] +aws = ["s3fs (>=2021.08.0)"] +clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] +compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] +computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] feather = ["pyarrow (>=7.0.0)"] -fss = ["fsspec (>=2022.05.0)"] -gcp = ["gcsfs (>=2022.05.0)", "pandas-gbq (>=0.17.5)"] -hdf5 = ["tables (>=3.7.0)"] -html = ["beautifulsoup4 (>=4.11.1)", "html5lib (>=1.1)", "lxml (>=4.8.0)"] -mysql = ["SQLAlchemy (>=1.4.36)", "pymysql (>=1.0.2)"] -output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.8.10)"] +fss = ["fsspec (>=2021.07.0)"] +gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] +hdf5 = ["tables (>=3.6.1)"] +html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] +mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] parquet = ["pyarrow (>=7.0.0)"] -performance = ["bottleneck (>=1.3.4)", "numba (>=0.55.2)", "numexpr (>=2.8.0)"] +performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] plot = ["matplotlib (>=3.6.1)"] -postgresql = ["SQLAlchemy (>=1.4.36)", "psycopg2 (>=2.9.3)"] -spss = ["pyreadstat (>=1.1.5)"] -sql-other = ["SQLAlchemy (>=1.4.36)"] -test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] -xml = ["lxml (>=4.8.0)"] +postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] +spss = ["pyreadstat (>=1.1.2)"] +sql-other = ["SQLAlchemy (>=1.4.16)"] +test = ["hypothesis (>=6.34.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.6.3)"] [[package]] name = "pandocfilters" version = "1.5.0" description = "Utilities for writing pandoc filters in python" + optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2756,6 +2835,7 @@ files = [ name = "parso" version = "0.8.3" description = "A Python Parser" + optional = false python-versions = ">=3.6" files = [ @@ -2791,6 +2871,7 @@ testing = ["funcsigs", "pytest"] name = "pexpect" version = "4.8.0" description = "Pexpect allows easy control of interactive console applications." + optional = false python-versions = "*" files = [ @@ -2801,10 +2882,23 @@ files = [ [package.dependencies] ptyprocess = ">=0.5" +[[package]] +name = "pickleshare" +version = "0.7.5" +description = "Tiny 'shelve'-like database with concurrency support" + +optional = false +python-versions = "*" +files = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] + [[package]] name = "pillow" version = "10.1.0" description = "Python Imaging Library (Fork)" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2868,10 +2962,23 @@ files = [ docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +[[package]] +name = "pkgutil-resolve-name" +version = "1.3.10" +description = "Resolve a name to an object." + +optional = false +python-versions = ">=3.6" +files = [ + {file = "pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"}, + {file = "pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174"}, +] + [[package]] name = "platformdirs" version = "3.11.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." + optional = false python-versions = ">=3.7" files = [ @@ -2887,6 +2994,7 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-co name = "pluggy" version = "1.3.0" description = "plugin and hook calling mechanisms for python" + optional = false python-versions = ">=3.8" files = [ @@ -2902,6 +3010,7 @@ testing = ["pytest", "pytest-benchmark"] name = "ply" version = "3.11" description = "Python Lex & Yacc" + optional = false python-versions = "*" files = [ @@ -2913,6 +3022,7 @@ files = [ name = "prompt-toolkit" version = "3.0.39" description = "Library for building powerful interactive command lines in Python" + optional = false python-versions = ">=3.7.0" files = [ @@ -2927,6 +3037,7 @@ wcwidth = "*" name = "proto-plus" version = "1.22.3" description = "Beautiful, Pythonic protocol buffers." + optional = false python-versions = ">=3.6" files = [ @@ -2942,28 +3053,41 @@ testing = ["google-api-core[grpc] (>=1.31.5)"] [[package]] name = "protobuf" -version = "4.25.0" -description = "" +version = "3.20.3" +description = "Protocol Buffers" + optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "protobuf-4.25.0-cp310-abi3-win32.whl", hash = "sha256:5c1203ac9f50e4853b0a0bfffd32c67118ef552a33942982eeab543f5c634395"}, - {file = "protobuf-4.25.0-cp310-abi3-win_amd64.whl", hash = "sha256:c40ff8f00aa737938c5378d461637d15c442a12275a81019cc2fef06d81c9419"}, - {file = "protobuf-4.25.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:cf21faba64cd2c9a3ed92b7a67f226296b10159dbb8fbc5e854fc90657d908e4"}, - {file = "protobuf-4.25.0-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:32ac2100b0e23412413d948c03060184d34a7c50b3e5d7524ee96ac2b10acf51"}, - {file = "protobuf-4.25.0-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:683dc44c61f2620b32ce4927de2108f3ebe8ccf2fd716e1e684e5a50da154054"}, - {file = "protobuf-4.25.0-cp38-cp38-win32.whl", hash = "sha256:1a3ba712877e6d37013cdc3476040ea1e313a6c2e1580836a94f76b3c176d575"}, - {file = "protobuf-4.25.0-cp38-cp38-win_amd64.whl", hash = "sha256:b2cf8b5d381f9378afe84618288b239e75665fe58d0f3fd5db400959274296e9"}, - {file = "protobuf-4.25.0-cp39-cp39-win32.whl", hash = "sha256:63714e79b761a37048c9701a37438aa29945cd2417a97076048232c1df07b701"}, - {file = "protobuf-4.25.0-cp39-cp39-win_amd64.whl", hash = "sha256:d94a33db8b7ddbd0af7c467475fb9fde0c705fb315a8433c0e2020942b863a1f"}, - {file = "protobuf-4.25.0-py3-none-any.whl", hash = "sha256:1a53d6f64b00eecf53b65ff4a8c23dc95df1fa1e97bb06b8122e5a64f49fc90a"}, - {file = "protobuf-4.25.0.tar.gz", hash = "sha256:68f7caf0d4f012fd194a301420cf6aa258366144d814f358c5b32558228afa7c"}, + {file = "protobuf-3.20.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f4bd856d702e5b0d96a00ec6b307b0f51c1982c2bf9c0052cf9019e9a544ba99"}, + {file = "protobuf-3.20.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9aae4406ea63d825636cc11ffb34ad3379335803216ee3a856787bcf5ccc751e"}, + {file = "protobuf-3.20.3-cp310-cp310-win32.whl", hash = "sha256:28545383d61f55b57cf4df63eebd9827754fd2dc25f80c5253f9184235db242c"}, + {file = "protobuf-3.20.3-cp310-cp310-win_amd64.whl", hash = "sha256:67a3598f0a2dcbc58d02dd1928544e7d88f764b47d4a286202913f0b2801c2e7"}, + {file = "protobuf-3.20.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:899dc660cd599d7352d6f10d83c95df430a38b410c1b66b407a6b29265d66469"}, + {file = "protobuf-3.20.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e64857f395505ebf3d2569935506ae0dfc4a15cb80dc25261176c784662cdcc4"}, + {file = "protobuf-3.20.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d9e4432ff660d67d775c66ac42a67cf2453c27cb4d738fc22cb53b5d84c135d4"}, + {file = "protobuf-3.20.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:74480f79a023f90dc6e18febbf7b8bac7508420f2006fabd512013c0c238f454"}, + {file = "protobuf-3.20.3-cp37-cp37m-win32.whl", hash = "sha256:b6cc7ba72a8850621bfec987cb72623e703b7fe2b9127a161ce61e61558ad905"}, + {file = "protobuf-3.20.3-cp37-cp37m-win_amd64.whl", hash = "sha256:8c0c984a1b8fef4086329ff8dd19ac77576b384079247c770f29cc8ce3afa06c"}, + {file = "protobuf-3.20.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:de78575669dddf6099a8a0f46a27e82a1783c557ccc38ee620ed8cc96d3be7d7"}, + {file = "protobuf-3.20.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee"}, + {file = "protobuf-3.20.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:44246bab5dd4b7fbd3c0c80b6f16686808fab0e4aca819ade6e8d294a29c7050"}, + {file = "protobuf-3.20.3-cp38-cp38-win32.whl", hash = "sha256:c02ce36ec760252242a33967d51c289fd0e1c0e6e5cc9397e2279177716add86"}, + {file = "protobuf-3.20.3-cp38-cp38-win_amd64.whl", hash = "sha256:447d43819997825d4e71bf5769d869b968ce96848b6479397e29fc24c4a5dfe9"}, + {file = "protobuf-3.20.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:398a9e0c3eaceb34ec1aee71894ca3299605fa8e761544934378bbc6c97de23b"}, + {file = "protobuf-3.20.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf01b5720be110540be4286e791db73f84a2b721072a3711efff6c324cdf074b"}, + {file = "protobuf-3.20.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:daa564862dd0d39c00f8086f88700fdbe8bc717e993a21e90711acfed02f2402"}, + {file = "protobuf-3.20.3-cp39-cp39-win32.whl", hash = "sha256:819559cafa1a373b7096a482b504ae8a857c89593cf3a25af743ac9ecbd23480"}, + {file = "protobuf-3.20.3-cp39-cp39-win_amd64.whl", hash = "sha256:03038ac1cfbc41aa21f6afcbcd357281d7521b4157926f30ebecc8d4ea59dcb7"}, + {file = "protobuf-3.20.3-py2.py3-none-any.whl", hash = "sha256:a7ca6d488aa8ff7f329d4c545b2dbad8ac31464f1d8b1c87ad1346717731e4db"}, + {file = "protobuf-3.20.3.tar.gz", hash = "sha256:2e3427429c9cffebf259491be0af70189607f365c2f41c7c3764af6f337105f2"}, ] [[package]] name = "psutil" version = "5.9.6" description = "Cross-platform lib for process and system monitoring in Python." +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ @@ -2992,6 +3116,7 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" + optional = false python-versions = "*" files = [ @@ -3003,6 +3128,7 @@ files = [ name = "pure-eval" version = "0.2.2" description = "Safely evaluate AST nodes without side effects" + optional = false python-versions = "*" files = [ @@ -3013,21 +3139,11 @@ files = [ [package.extras] tests = ["pytest"] -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] - [[package]] name = "pyasn1" version = "0.5.0" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" + optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -3039,6 +3155,7 @@ files = [ name = "pyasn1-modules" version = "0.3.0" description = "A collection of ASN.1-based protocols modules" + optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -3053,6 +3170,7 @@ pyasn1 = ">=0.4.6,<0.6.0" name = "pybind11" version = "2.11.1" description = "Seamless operability between C++11 and Python" + optional = false python-versions = ">=3.6" files = [ @@ -3067,6 +3185,7 @@ global = ["pybind11-global (==2.11.1)"] name = "pybtex" version = "0.24.0" description = "A BibTeX-compatible bibliography processor in Python" + optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" files = [ @@ -3086,6 +3205,7 @@ test = ["pytest"] name = "pybtex-docutils" version = "1.0.3" description = "A docutils backend for pybtex." + optional = false python-versions = ">=3.7" files = [ @@ -3101,6 +3221,7 @@ pybtex = ">=0.16" name = "pycparser" version = "2.21" description = "C parser in Python" + optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3112,6 +3233,7 @@ files = [ name = "pydantic" version = "1.10.13" description = "Data validation and settings management using python type hints" + optional = false python-versions = ">=3.7" files = [ @@ -3164,6 +3286,7 @@ email = ["email-validator (>=1.0.3)"] name = "pygments" version = "2.16.1" description = "Pygments is a syntax highlighting package written in Python." + optional = false python-versions = ">=3.7" files = [ @@ -3174,27 +3297,11 @@ files = [ [package.extras] plugins = ["importlib-metadata"] -[[package]] -name = "pyjwt" -version = "2.8.0" -description = "JSON Web Token implementation in Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, - {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, -] - -[package.extras] -crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] - [[package]] name = "pylint" version = "2.17.7" description = "python code static checker" + optional = false python-versions = ">=3.7.2" files = [ @@ -3224,6 +3331,7 @@ testutils = ["gitpython (>3)"] name = "pyparsing" version = "3.1.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "main" optional = false python-versions = ">=3.6.8" files = [ @@ -3236,26 +3344,34 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pyquil" -version = "3.2.1" +version = "4.0.3" description = "A Python library for creating Quantum Instruction Language (Quil) programs." + optional = false -python-versions = ">=3.7,<4.0" +python-versions = ">=3.8,<4.0" files = [ - {file = "pyquil-3.2.1-py3-none-any.whl", hash = "sha256:619ebf13307e98d437f0a4e9a5c16ce97e254fa9d56379e0793f7a411502f938"}, - {file = "pyquil-3.2.1.tar.gz", hash = "sha256:6ae46a38bf6d7d4acee4c3f2a90c49b3b644d97754699548d3ab6a128055c6c4"}, + {file = "pyquil-4.0.3-py3-none-any.whl", hash = "sha256:4abc72adf7cbd22a55d2f674d9c2b076cb5bc3a066320c515b59a9f794ba66d0"}, + {file = "pyquil-4.0.3.tar.gz", hash = "sha256:fd5d65ad4fba788c232c8f7e18cab6a83ecc2514dc6eb4da4dd3db86668b2ddf"}, ] [package.dependencies] +deprecated = ">=1.2.13,<2.0.0" lark = ">=0.11.1,<0.12.0" -networkx = ">=2.5,<3.0" -numpy = ">=1.20,<2.0" -qcs-api-client = ">=0.20.13,<0.22.0" -retry = ">=0.9.2,<0.10.0" +matplotlib-inline = ">=0.1.6,<0.2.0" +networkx = ">=2.5" +numpy = ">=1.22,<2.0" +packaging = ">=23.1,<24.0" +pydantic = ">=1.10.7,<2.0.0" +qcs-sdk-python = "0.12.8" rpcq = ">=3.10.0,<4.0.0" -scipy = ">=1.6.1,<2.0.0" +scipy = ">=1.7.3,<2.0.0" +tenacity = ">=8.2.2,<9.0.0" +types-deprecated = ">=1.2.9.2,<2.0.0.0" +types-python-dateutil = ">=2.8.19,<3.0.0" +types-retry = ">=0.9.9,<0.10.0" [package.extras] -docs = ["Sphinx (>=4.0.2,<5.0.0)", "nbsphinx (>=0.8.6,<0.9.0)", "recommonmark (>=0.7.1,<0.8.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)"] +docs = ["Sphinx (>=7.1.2,<8.0.0)", "matplotlib (>=3.7.1,<4.0.0)", "nbsphinx (>=0.9.1,<0.10.0)", "pandoc (==2.4b0)", "recommonmark (>=0.7.1,<0.8.0)", "seaborn (>=0.12.2,<0.13.0)", "sphinx-rtd-theme (>=1.3.0,<2.0.0)"] latex = ["ipython (>=7.21.0,<8.0.0)"] [[package]] @@ -3278,51 +3394,11 @@ files = [ {file = "pyrepl-0.9.0.tar.gz", hash = "sha256:292570f34b5502e871bbb966d639474f2b57fbfcd3373c2d6a2f3d56e681a775"}, ] -[[package]] -name = "pyrsistent" -version = "0.20.0" -description = "Persistent/Functional/Immutable data structures" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyrsistent-0.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce"}, - {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f"}, - {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34"}, - {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b"}, - {file = "pyrsistent-0.20.0-cp310-cp310-win32.whl", hash = "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f"}, - {file = "pyrsistent-0.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7"}, - {file = "pyrsistent-0.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958"}, - {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8"}, - {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a"}, - {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224"}, - {file = "pyrsistent-0.20.0-cp311-cp311-win32.whl", hash = "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656"}, - {file = "pyrsistent-0.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee"}, - {file = "pyrsistent-0.20.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e"}, - {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e"}, - {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3"}, - {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d"}, - {file = "pyrsistent-0.20.0-cp312-cp312-win32.whl", hash = "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174"}, - {file = "pyrsistent-0.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d"}, - {file = "pyrsistent-0.20.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054"}, - {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98"}, - {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714"}, - {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86"}, - {file = "pyrsistent-0.20.0-cp38-cp38-win32.whl", hash = "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423"}, - {file = "pyrsistent-0.20.0-cp38-cp38-win_amd64.whl", hash = "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d"}, - {file = "pyrsistent-0.20.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce"}, - {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0"}, - {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022"}, - {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca"}, - {file = "pyrsistent-0.20.0-cp39-cp39-win32.whl", hash = "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f"}, - {file = "pyrsistent-0.20.0-cp39-cp39-win_amd64.whl", hash = "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf"}, - {file = "pyrsistent-0.20.0-py3-none-any.whl", hash = "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b"}, - {file = "pyrsistent-0.20.0.tar.gz", hash = "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4"}, -] - [[package]] name = "pytest" version = "7.4.3" description = "pytest: simple powerful testing with Python" + optional = false python-versions = ">=3.7" files = [ @@ -3345,6 +3421,7 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no name = "pytest-cov" version = "4.1.0" description = "Pytest plugin for measuring coverage." + optional = false python-versions = ">=3.7" files = [ @@ -3363,6 +3440,7 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -3377,6 +3455,7 @@ six = ">=1.5" name = "python-rapidjson" version = "1.13" description = "Python wrapper around rapidjson" + optional = false python-versions = ">=3.6" files = [ @@ -3442,6 +3521,7 @@ files = [ name = "pytz" version = "2023.3.post1" description = "World timezone definitions, modern and historical" + optional = false python-versions = "*" files = [ @@ -3453,6 +3533,7 @@ files = [ name = "pywin32" version = "306" description = "Python for Window Extensions" + optional = false python-versions = "*" files = [ @@ -3476,6 +3557,7 @@ files = [ name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" + optional = false python-versions = ">=3.6" files = [ @@ -3484,6 +3566,7 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -3491,8 +3574,15 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -3509,6 +3599,7 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -3516,6 +3607,7 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -3525,6 +3617,7 @@ files = [ name = "pyzmq" version = "25.1.1" description = "Python bindings for 0MQ" + optional = false python-versions = ">=3.6" files = [ @@ -3627,31 +3720,40 @@ files = [ cffi = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] -name = "qcs-api-client" -version = "0.21.6" -description = "A client library for accessing the Rigetti QCS API" +name = "qcs-sdk-python" +version = "0.12.8" +description = "Python interface for the QCS Rust SDK" + optional = false -python-versions = ">=3.7,<4.0" +python-versions = "*" files = [ - {file = "qcs_api_client-0.21.6-py3-none-any.whl", hash = "sha256:0231c9a741c137adc78539068b7fe1d4e1854bee4e3e868017abc4eb3876c3a0"}, - {file = "qcs_api_client-0.21.6.tar.gz", hash = "sha256:1da391ff03715c9d50e14aa6006b5f0c3cffde9018fb968ff27545cc90c87a9c"}, + {file = "qcs_sdk_python-0.12.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:c8d33a63e950576ca0dc41a69a709fb7e6d004138f57d9b9650626ef6bc18400"}, + {file = "qcs_sdk_python-0.12.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ad7d11d696a0e39a5c231f72ab189f144a28e3c7aadfcb11cd446ea3ad3bcab"}, + {file = "qcs_sdk_python-0.12.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1673925ce4518adb4bcdd4cf2ad38171a1d7d9468759f84918a2c52043213432"}, + {file = "qcs_sdk_python-0.12.8-cp310-none-win_amd64.whl", hash = "sha256:fe822d085ebcecdf9df1d98e67eaa6f400b92e3091798685d0b69a5131e853bf"}, + {file = "qcs_sdk_python-0.12.8-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:17669efa260dad1b166bd5d31076bfb4bd5cbe70d41b0327b30f86cac52b1df0"}, + {file = "qcs_sdk_python-0.12.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d3623253336dee5c10e4513cbe5b645256e9e5b47ddb0aacaaea2b0463fdb64"}, + {file = "qcs_sdk_python-0.12.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0282e088cfb43f06d7274b5e1483bd91c8d7467d9e6ca3faf751acc6396e2a8d"}, + {file = "qcs_sdk_python-0.12.8-cp311-none-win_amd64.whl", hash = "sha256:6fa57d6515b61a262b1b62870dcf03c413c2833e4883b607dd8d5ad3f1899767"}, + {file = "qcs_sdk_python-0.12.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5de242120e60fb8d4e94152db1e28af7243f10fd13a552fc23cf5073878c0fc1"}, + {file = "qcs_sdk_python-0.12.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:393b6d9745743e2c74660c3274c5cf4607a3f9cc1042b40c5b42d5115144e97c"}, + {file = "qcs_sdk_python-0.12.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62ed8e87638d097cc9f04b251bf0cd9d7014f44467da6af0d62d01b6e05a1319"}, + {file = "qcs_sdk_python-0.12.8-cp38-none-win_amd64.whl", hash = "sha256:84d3275d52366df547a2f5656438218714c7bf7da2565d87d8b6f1d4833c3b0e"}, + {file = "qcs_sdk_python-0.12.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:c9e07017d105ac8027dd41be57e287d8338db588bb653f21ac3362e0a2a63a7b"}, + {file = "qcs_sdk_python-0.12.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f25c65f9acfe4ef1b0355047685061e777819fb1d40bb5fde8acf426b65d1ea"}, + {file = "qcs_sdk_python-0.12.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fe1165651d93f217e18d63f6687f5db3e21230933234ebffeaa0562f9c8e7fd"}, + {file = "qcs_sdk_python-0.12.8-cp39-none-win_amd64.whl", hash = "sha256:6d352f57ccbaa1a2dac8d1a56fb604bb2e6c54075a2ebdf7ee2e81282a60a53f"}, + {file = "qcs_sdk_python-0.12.8.tar.gz", hash = "sha256:ef39c8a50059a55fd391e71d34b3f223839d3d4585d1a79b2e11cf83ef8789d6"}, ] [package.dependencies] -attrs = ">=21.3.0,<22.0.0" -httpx = ">=0.23.0,<0.24.0" -iso8601 = ">=1.0.2,<2.0.0" -pydantic = ">=1.7.2,<2.0.0" -PyJWT = ">=2.4.0,<3.0.0" -python-dateutil = ">=2.8.1,<3.0.0" -retrying = ">=1.3.3,<2.0.0" -rfc3339 = ">=6.2,<7.0" -toml = ">=0.10.2,<0.11.0" +quil = "0.5.7" [[package]] name = "qdldl" version = "0.1.7.post0" description = "QDLDL, a free LDL factorization routine." + optional = false python-versions = "*" files = [ @@ -3682,8 +3784,9 @@ scipy = ">=0.13.2" [[package]] name = "qibojit" -version = "0.1.2" +version = "0.1.1" description = "Simulation tools based on numba and cupy." + optional = false python-versions = ">=3.8.0,<3.12" files = [] @@ -3692,19 +3795,50 @@ develop = false [package.dependencies] numba = ">=0.51.0" psutil = "^5.9.5" -qibo = ">=0.2.2" +qibo = ">=0.2.0" scipy = "^1.10.1" [package.source] type = "git" url = "https://github.com/qiboteam/qibojit.git" reference = "HEAD" -resolved_reference = "1d335f312bea3d1a522289332f53a2649c69d300" +resolved_reference = "0519c0e2273563d6439583fdca8d3010acb5dd19" + +[[package]] +name = "quil" +version = "0.5.7" +description = "A Python package for building and parsing Quil programs." + +optional = false +python-versions = ">=3.8" +files = [ + {file = "quil-0.5.7-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ab0c8221f2f6df06bc77d7408611a1bb25f8df31c9201f4e35625948e1fa9960"}, + {file = "quil-0.5.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dde46f1dec73e6c4ed3d793f6d2eb6e59ae8b7852538e01b4f9eadcdc1ce54c1"}, + {file = "quil-0.5.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6948a98d4882a2ff3ccb2898d5353f63181b4f6e85f163e085ddf3e2a87ecb7"}, + {file = "quil-0.5.7-cp310-none-win32.whl", hash = "sha256:834df8c66e9bc14d6295211606481186e306eadc3b3513106fa47dc62a176e52"}, + {file = "quil-0.5.7-cp310-none-win_amd64.whl", hash = "sha256:fff71da0396a782f3bb5f76afb6f098ac97071ef894b9978210cd962cd49636f"}, + {file = "quil-0.5.7-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:2e15e851db2fb05993baa49d8c76f1519ead0422219e691d94e8ce04ed517ea6"}, + {file = "quil-0.5.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41486358498ac92708fb6f68cf600082beb32e29f8852e598ce375c5fae0f75c"}, + {file = "quil-0.5.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c43ad9299ff5180f6bafe936639b3c0881637d0cad7a837d1041eebb42f59e7d"}, + {file = "quil-0.5.7-cp311-none-win32.whl", hash = "sha256:6303c3bbc9f325e9d5515b6ec989a8d348180a18942238e5f1d8e430bae7968c"}, + {file = "quil-0.5.7-cp311-none-win_amd64.whl", hash = "sha256:99403f934620b8ccdf43196245197f20b81613513c1faa32f84beb3f88475f3d"}, + {file = "quil-0.5.7-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ef35c4b44346f6724302705a54e8762f94ca574f51b5e7226f1f7140539e429c"}, + {file = "quil-0.5.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:018fa87c5bee1a4016ef90d3fc8dc38a821ffe504bb8abab07db7bc05eb29d07"}, + {file = "quil-0.5.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dba0e78718c118c5607e91c9a569d087919aa0dba88dbd12539fdf55ff2d9d87"}, + {file = "quil-0.5.7-cp38-none-win32.whl", hash = "sha256:a2d1078282608546357b1502bdd26325f5e57d8cf1b2a6e514041c608a8c9dd5"}, + {file = "quil-0.5.7-cp38-none-win_amd64.whl", hash = "sha256:ea875d3155c6b35a234a63d26881c7cce1a8a6c50ebcb124614aff743ec56c57"}, + {file = "quil-0.5.7-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:795abbd209dc1022261d8538a79cd81b19082d5b1a4f56dfe4fbcc876c40f164"}, + {file = "quil-0.5.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:171da20314564d9695b7cd6c91a488cb5378c011fe612ed569053658a5798087"}, + {file = "quil-0.5.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:827069ad86334251b0a213e64bdceb97847996e81712f75b6afeadc8d32dc752"}, + {file = "quil-0.5.7-cp39-none-win32.whl", hash = "sha256:7fb1ecc7dd5d589e79424c0dea6823995f107b205dbe879ccd01d3ba646ad9ec"}, + {file = "quil-0.5.7-cp39-none-win_amd64.whl", hash = "sha256:a9e0ec7bdd4513a323e0a0e2cc1a4faabc8501df85d4bc3b80394e728c986244"}, +] [[package]] name = "recommonmark" version = "0.7.1" description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." + optional = false python-versions = "*" files = [ @@ -3717,10 +3851,27 @@ commonmark = ">=0.8.1" docutils = ">=0.11" sphinx = ">=1.3.1" +[[package]] +name = "referencing" +version = "0.30.2" +description = "JSON Referencing + Python" + +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.30.2-py3-none-any.whl", hash = "sha256:449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf"}, + {file = "referencing-0.30.2.tar.gz", hash = "sha256:794ad8003c65938edcdbc027f1933215e0d0ccc0291e3ce20a4d87432b59efc0"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + [[package]] name = "requests" version = "2.31.0" description = "Python HTTP for Humans." + optional = false python-versions = ">=3.7" files = [ @@ -3742,6 +3893,7 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "requests-oauthlib" version = "1.3.1" description = "OAuthlib authentication support for Requests." + optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3756,67 +3908,11 @@ requests = ">=2.0.0" [package.extras] rsa = ["oauthlib[signedtoken] (>=3.0.0)"] -[[package]] -name = "retry" -version = "0.9.2" -description = "Easy to use retry decorator." -optional = false -python-versions = "*" -files = [ - {file = "retry-0.9.2-py2.py3-none-any.whl", hash = "sha256:ccddf89761fa2c726ab29391837d4327f819ea14d244c232a1d24c67a2f98606"}, - {file = "retry-0.9.2.tar.gz", hash = "sha256:f8bfa8b99b69c4506d6f5bd3b0aabf77f98cdb17f3c9fc3f5ca820033336fba4"}, -] - -[package.dependencies] -decorator = ">=3.4.2" -py = ">=1.4.26,<2.0.0" - -[[package]] -name = "retrying" -version = "1.3.4" -description = "Retrying" -optional = false -python-versions = "*" -files = [ - {file = "retrying-1.3.4-py3-none-any.whl", hash = "sha256:8cc4d43cb8e1125e0ff3344e9de678fefd85db3b750b81b2240dc0183af37b35"}, - {file = "retrying-1.3.4.tar.gz", hash = "sha256:345da8c5765bd982b1d1915deb9102fd3d1f7ad16bd84a9700b85f64d24e8f3e"}, -] - -[package.dependencies] -six = ">=1.7.0" - -[[package]] -name = "rfc3339" -version = "6.2" -description = "Format dates according to the RFC 3339." -optional = false -python-versions = "*" -files = [ - {file = "rfc3339-6.2-py3-none-any.whl", hash = "sha256:f44316b21b21db90a625cde04ebb0d46268f153e6093021fa5893e92a96f58a3"}, - {file = "rfc3339-6.2.tar.gz", hash = "sha256:d53c3b5eefaef892b7240ba2a91fef012e86faa4d0a0ca782359c490e00ad4d0"}, -] - -[[package]] -name = "rfc3986" -version = "1.5.0" -description = "Validating URI References per RFC 3986" -optional = false -python-versions = "*" -files = [ - {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, - {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, -] - -[package.dependencies] -idna = {version = "*", optional = true, markers = "extra == \"idna2008\""} - -[package.extras] -idna2008 = ["idna"] - [[package]] name = "rpcq" version = "3.11.0" description = "The RPC framework and message specification for Rigetti QCS." + optional = false python-versions = ">=3.6" files = [ @@ -3829,10 +3925,120 @@ python-rapidjson = "*" pyzmq = ">=17" "ruamel.yaml" = "*" +[[package]] +name = "rpds-py" +version = "0.10.6" +description = "Python bindings to Rust's persistent data structures (rpds)" + +optional = false +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.10.6-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:6bdc11f9623870d75692cc33c59804b5a18d7b8a4b79ef0b00b773a27397d1f6"}, + {file = "rpds_py-0.10.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:26857f0f44f0e791f4a266595a7a09d21f6b589580ee0585f330aaccccb836e3"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7f5e15c953ace2e8dde9824bdab4bec50adb91a5663df08d7d994240ae6fa31"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61fa268da6e2e1cd350739bb61011121fa550aa2545762e3dc02ea177ee4de35"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c48f3fbc3e92c7dd6681a258d22f23adc2eb183c8cb1557d2fcc5a024e80b094"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0503c5b681566e8b722fe8c4c47cce5c7a51f6935d5c7012c4aefe952a35eed"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:734c41f9f57cc28658d98270d3436dba65bed0cfc730d115b290e970150c540d"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a5d7ed104d158c0042a6a73799cf0eb576dfd5fc1ace9c47996e52320c37cb7c"}, + {file = "rpds_py-0.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e3df0bc35e746cce42579826b89579d13fd27c3d5319a6afca9893a9b784ff1b"}, + {file = "rpds_py-0.10.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:73e0a78a9b843b8c2128028864901f55190401ba38aae685350cf69b98d9f7c9"}, + {file = "rpds_py-0.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5ed505ec6305abd2c2c9586a7b04fbd4baf42d4d684a9c12ec6110deefe2a063"}, + {file = "rpds_py-0.10.6-cp310-none-win32.whl", hash = "sha256:d97dd44683802000277bbf142fd9f6b271746b4846d0acaf0cefa6b2eaf2a7ad"}, + {file = "rpds_py-0.10.6-cp310-none-win_amd64.whl", hash = "sha256:b455492cab07107bfe8711e20cd920cc96003e0da3c1f91297235b1603d2aca7"}, + {file = "rpds_py-0.10.6-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:e8cdd52744f680346ff8c1ecdad5f4d11117e1724d4f4e1874f3a67598821069"}, + {file = "rpds_py-0.10.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66414dafe4326bca200e165c2e789976cab2587ec71beb80f59f4796b786a238"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc435d059f926fdc5b05822b1be4ff2a3a040f3ae0a7bbbe672babb468944722"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8e7f2219cb72474571974d29a191714d822e58be1eb171f229732bc6fdedf0ac"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3953c6926a63f8ea5514644b7afb42659b505ece4183fdaaa8f61d978754349e"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2bb2e4826be25e72013916eecd3d30f66fd076110de09f0e750163b416500721"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bf347b495b197992efc81a7408e9a83b931b2f056728529956a4d0858608b80"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:102eac53bb0bf0f9a275b438e6cf6904904908562a1463a6fc3323cf47d7a532"}, + {file = "rpds_py-0.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40f93086eef235623aa14dbddef1b9fb4b22b99454cb39a8d2e04c994fb9868c"}, + {file = "rpds_py-0.10.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e22260a4741a0e7a206e175232867b48a16e0401ef5bce3c67ca5b9705879066"}, + {file = "rpds_py-0.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f4e56860a5af16a0fcfa070a0a20c42fbb2012eed1eb5ceeddcc7f8079214281"}, + {file = "rpds_py-0.10.6-cp311-none-win32.whl", hash = "sha256:0774a46b38e70fdde0c6ded8d6d73115a7c39d7839a164cc833f170bbf539116"}, + {file = "rpds_py-0.10.6-cp311-none-win_amd64.whl", hash = "sha256:4a5ee600477b918ab345209eddafde9f91c0acd931f3776369585a1c55b04c57"}, + {file = "rpds_py-0.10.6-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:5ee97c683eaface61d38ec9a489e353d36444cdebb128a27fe486a291647aff6"}, + {file = "rpds_py-0.10.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0713631d6e2d6c316c2f7b9320a34f44abb644fc487b77161d1724d883662e31"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5a53f5998b4bbff1cb2e967e66ab2addc67326a274567697379dd1e326bded7"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6a555ae3d2e61118a9d3e549737bb4a56ff0cec88a22bd1dfcad5b4e04759175"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:945eb4b6bb8144909b203a88a35e0a03d22b57aefb06c9b26c6e16d72e5eb0f0"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:52c215eb46307c25f9fd2771cac8135d14b11a92ae48d17968eda5aa9aaf5071"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1b3cd23d905589cb205710b3988fc8f46d4a198cf12862887b09d7aaa6bf9b9"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64ccc28683666672d7c166ed465c09cee36e306c156e787acef3c0c62f90da5a"}, + {file = "rpds_py-0.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:516a611a2de12fbea70c78271e558f725c660ce38e0006f75139ba337d56b1f6"}, + {file = "rpds_py-0.10.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9ff93d3aedef11f9c4540cf347f8bb135dd9323a2fc705633d83210d464c579d"}, + {file = "rpds_py-0.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d858532212f0650be12b6042ff4378dc2efbb7792a286bee4489eaa7ba010586"}, + {file = "rpds_py-0.10.6-cp312-none-win32.whl", hash = "sha256:3c4eff26eddac49d52697a98ea01b0246e44ca82ab09354e94aae8823e8bda02"}, + {file = "rpds_py-0.10.6-cp312-none-win_amd64.whl", hash = "sha256:150eec465dbc9cbca943c8e557a21afdcf9bab8aaabf386c44b794c2f94143d2"}, + {file = "rpds_py-0.10.6-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:cf693eb4a08eccc1a1b636e4392322582db2a47470d52e824b25eca7a3977b53"}, + {file = "rpds_py-0.10.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4134aa2342f9b2ab6c33d5c172e40f9ef802c61bb9ca30d21782f6e035ed0043"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e782379c2028a3611285a795b89b99a52722946d19fc06f002f8b53e3ea26ea9"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f6da6d842195fddc1cd34c3da8a40f6e99e4a113918faa5e60bf132f917c247"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4a9fe992887ac68256c930a2011255bae0bf5ec837475bc6f7edd7c8dfa254e"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b788276a3c114e9f51e257f2a6f544c32c02dab4aa7a5816b96444e3f9ffc336"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:caa1afc70a02645809c744eefb7d6ee8fef7e2fad170ffdeacca267fd2674f13"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bddd4f91eede9ca5275e70479ed3656e76c8cdaaa1b354e544cbcf94c6fc8ac4"}, + {file = "rpds_py-0.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:775049dfa63fb58293990fc59473e659fcafd953bba1d00fc5f0631a8fd61977"}, + {file = "rpds_py-0.10.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c6c45a2d2b68c51fe3d9352733fe048291e483376c94f7723458cfd7b473136b"}, + {file = "rpds_py-0.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0699ab6b8c98df998c3eacf51a3b25864ca93dab157abe358af46dc95ecd9801"}, + {file = "rpds_py-0.10.6-cp38-none-win32.whl", hash = "sha256:ebdab79f42c5961682654b851f3f0fc68e6cc7cd8727c2ac4ffff955154123c1"}, + {file = "rpds_py-0.10.6-cp38-none-win_amd64.whl", hash = "sha256:24656dc36f866c33856baa3ab309da0b6a60f37d25d14be916bd3e79d9f3afcf"}, + {file = "rpds_py-0.10.6-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:0898173249141ee99ffcd45e3829abe7bcee47d941af7434ccbf97717df020e5"}, + {file = "rpds_py-0.10.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e9184fa6c52a74a5521e3e87badbf9692549c0fcced47443585876fcc47e469"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5752b761902cd15073a527b51de76bbae63d938dc7c5c4ad1e7d8df10e765138"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:99a57006b4ec39dbfb3ed67e5b27192792ffb0553206a107e4aadb39c5004cd5"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09586f51a215d17efdb3a5f090d7cbf1633b7f3708f60a044757a5d48a83b393"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e225a6a14ecf44499aadea165299092ab0cba918bb9ccd9304eab1138844490b"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2039f8d545f20c4e52713eea51a275e62153ee96c8035a32b2abb772b6fc9e5"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:34ad87a831940521d462ac11f1774edf867c34172010f5390b2f06b85dcc6014"}, + {file = "rpds_py-0.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dcdc88b6b01015da066da3fb76545e8bb9a6880a5ebf89e0f0b2e3ca557b3ab7"}, + {file = "rpds_py-0.10.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:25860ed5c4e7f5e10c496ea78af46ae8d8468e0be745bd233bab9ca99bfd2647"}, + {file = "rpds_py-0.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7854a207ef77319ec457c1eb79c361b48807d252d94348305db4f4b62f40f7f3"}, + {file = "rpds_py-0.10.6-cp39-none-win32.whl", hash = "sha256:e6fcc026a3f27c1282c7ed24b7fcac82cdd70a0e84cc848c0841a3ab1e3dea2d"}, + {file = "rpds_py-0.10.6-cp39-none-win_amd64.whl", hash = "sha256:e98c4c07ee4c4b3acf787e91b27688409d918212dfd34c872201273fdd5a0e18"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:68fe9199184c18d997d2e4293b34327c0009a78599ce703e15cd9a0f47349bba"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:3339eca941568ed52d9ad0f1b8eb9fe0958fa245381747cecf2e9a78a5539c42"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a360cfd0881d36c6dc271992ce1eda65dba5e9368575663de993eeb4523d895f"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:031f76fc87644a234883b51145e43985aa2d0c19b063e91d44379cd2786144f8"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f36a9d751f86455dc5278517e8b65580eeee37d61606183897f122c9e51cef3"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:052a832078943d2b2627aea0d19381f607fe331cc0eb5df01991268253af8417"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:023574366002bf1bd751ebaf3e580aef4a468b3d3c216d2f3f7e16fdabd885ed"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:defa2c0c68734f4a82028c26bcc85e6b92cced99866af118cd6a89b734ad8e0d"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:879fb24304ead6b62dbe5034e7b644b71def53c70e19363f3c3be2705c17a3b4"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:53c43e10d398e365da2d4cc0bcaf0854b79b4c50ee9689652cdc72948e86f487"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:3777cc9dea0e6c464e4b24760664bd8831738cc582c1d8aacf1c3f546bef3f65"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:40578a6469e5d1df71b006936ce95804edb5df47b520c69cf5af264d462f2cbb"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:cf71343646756a072b85f228d35b1d7407da1669a3de3cf47f8bbafe0c8183a4"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10f32b53f424fc75ff7b713b2edb286fdbfc94bf16317890260a81c2c00385dc"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:81de24a1c51cfb32e1fbf018ab0bdbc79c04c035986526f76c33e3f9e0f3356c"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac17044876e64a8ea20ab132080ddc73b895b4abe9976e263b0e30ee5be7b9c2"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e8a78bd4879bff82daef48c14d5d4057f6856149094848c3ed0ecaf49f5aec2"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78ca33811e1d95cac8c2e49cb86c0fb71f4d8409d8cbea0cb495b6dbddb30a55"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c63c3ef43f0b3fb00571cff6c3967cc261c0ebd14a0a134a12e83bdb8f49f21f"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:7fde6d0e00b2fd0dbbb40c0eeec463ef147819f23725eda58105ba9ca48744f4"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:79edd779cfc46b2e15b0830eecd8b4b93f1a96649bcb502453df471a54ce7977"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9164ec8010327ab9af931d7ccd12ab8d8b5dc2f4c6a16cbdd9d087861eaaefa1"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d29ddefeab1791e3c751e0189d5f4b3dbc0bbe033b06e9c333dca1f99e1d523e"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:30adb75ecd7c2a52f5e76af50644b3e0b5ba036321c390b8e7ec1bb2a16dd43c"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd609fafdcdde6e67a139898196698af37438b035b25ad63704fd9097d9a3482"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6eef672de005736a6efd565577101277db6057f65640a813de6c2707dc69f396"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cf4393c7b41abbf07c88eb83e8af5013606b1cdb7f6bc96b1b3536b53a574b8"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad857f42831e5b8d41a32437f88d86ead6c191455a3499c4b6d15e007936d4cf"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d7360573f1e046cb3b0dceeb8864025aa78d98be4bb69f067ec1c40a9e2d9df"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d08f63561c8a695afec4975fae445245386d645e3e446e6f260e81663bfd2e38"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:f0f17f2ce0f3529177a5fff5525204fad7b43dd437d017dd0317f2746773443d"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:442626328600bde1d09dc3bb00434f5374948838ce75c41a52152615689f9403"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e9616f5bd2595f7f4a04b67039d890348ab826e943a9bfdbe4938d0eba606971"}, + {file = "rpds_py-0.10.6.tar.gz", hash = "sha256:4ce5a708d65a8dbf3748d2474b580d606b1b9f91b5c6ab2a316e0b0cf7a4ba50"}, +] + [[package]] name = "rsa" version = "4.9" description = "Pure-Python RSA implementation" + optional = false python-versions = ">=3.6,<4" files = [ @@ -3845,13 +4051,14 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruamel-yaml" -version = "0.18.5" +version = "0.18.3" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" + optional = false -python-versions = ">=3.7" +python-versions = ">=3" files = [ - {file = "ruamel.yaml-0.18.5-py3-none-any.whl", hash = "sha256:a013ac02f99a69cdd6277d9664689eb1acba07069f912823177c5eced21a6ada"}, - {file = "ruamel.yaml-0.18.5.tar.gz", hash = "sha256:61917e3a35a569c1133a8f772e1226961bf5a1198bea7e23f06a0841dea1ab0e"}, + {file = "ruamel.yaml-0.18.3-py3-none-any.whl", hash = "sha256:b5d119e1f9678cf90b58f64bbd2a4e78af76860ae39fab3e73323e622b462df9"}, + {file = "ruamel.yaml-0.18.3.tar.gz", hash = "sha256:36dbbe90390d977f957436570d2bd540bfd600e6ec5a1ea42bcdb9fc7963d802"}, ] [package.dependencies] @@ -3865,36 +4072,57 @@ jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] name = "ruamel-yaml-clib" version = "0.2.8" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" + optional = false python-versions = ">=3.6" files = [ {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:d92f81886165cb14d7b067ef37e142256f1c6a90a65cd156b063a43da1708cfd"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win32.whl", hash = "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d"}, {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:b5edda50e5e9e15e54a6a8a0070302b00c518a9d32accc2346ad6c984aacd279"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win32.whl", hash = "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7"}, {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:7048c338b6c86627afb27faecf418768acb6331fc24cfa56c93e8c9780f815fa"}, {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win32.whl", hash = "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b"}, {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3fcc54cb0c8b811ff66082de1680b4b14cf8a81dce0d4fbf665c2265a81e07a1"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win32.whl", hash = "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b"}, {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:665f58bfd29b167039f714c6998178d27ccd83984084c286110ef26b230f259f"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win32.whl", hash = "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe"}, {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:9eb5dee2772b0f704ca2e45b1713e4e5198c18f515b52743576d196348f374d3"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win32.whl", hash = "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5"}, {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15"}, {file = "ruamel.yaml.clib-0.2.8.tar.gz", hash = "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512"}, @@ -3904,6 +4132,7 @@ files = [ name = "scikit-learn" version = "1.3.2" description = "A set of python modules for machine learning and data mining" + optional = false python-versions = ">=3.8" files = [ @@ -3949,50 +4178,48 @@ tests = ["black (>=23.3.0)", "matplotlib (>=3.1.3)", "mypy (>=1.3)", "numpydoc ( [[package]] name = "scipy" -version = "1.11.3" +version = "1.10.1" description = "Fundamental algorithms for scientific computing in Python" -optional = false -python-versions = "<3.13,>=3.9" -files = [ - {file = "scipy-1.11.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:370f569c57e1d888304052c18e58f4a927338eafdaef78613c685ca2ea0d1fa0"}, - {file = "scipy-1.11.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:9885e3e4f13b2bd44aaf2a1a6390a11add9f48d5295f7a592393ceb8991577a3"}, - {file = "scipy-1.11.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e04aa19acc324a1a076abb4035dabe9b64badb19f76ad9c798bde39d41025cdc"}, - {file = "scipy-1.11.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e1a8a4657673bfae1e05e1e1d6e94b0cabe5ed0c7c144c8aa7b7dbb774ce5c1"}, - {file = "scipy-1.11.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7abda0e62ef00cde826d441485e2e32fe737bdddee3324e35c0e01dee65e2a88"}, - {file = "scipy-1.11.3-cp310-cp310-win_amd64.whl", hash = "sha256:033c3fd95d55012dd1148b201b72ae854d5086d25e7c316ec9850de4fe776929"}, - {file = "scipy-1.11.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:925c6f09d0053b1c0f90b2d92d03b261e889b20d1c9b08a3a51f61afc5f58165"}, - {file = "scipy-1.11.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5664e364f90be8219283eeb844323ff8cd79d7acbd64e15eb9c46b9bc7f6a42a"}, - {file = "scipy-1.11.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00f325434b6424952fbb636506f0567898dca7b0f7654d48f1c382ea338ce9a3"}, - {file = "scipy-1.11.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f290cf561a4b4edfe8d1001ee4be6da60c1c4ea712985b58bf6bc62badee221"}, - {file = "scipy-1.11.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:91770cb3b1e81ae19463b3c235bf1e0e330767dca9eb4cd73ba3ded6c4151e4d"}, - {file = "scipy-1.11.3-cp311-cp311-win_amd64.whl", hash = "sha256:e1f97cd89c0fe1a0685f8f89d85fa305deb3067d0668151571ba50913e445820"}, - {file = "scipy-1.11.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dfcc1552add7cb7c13fb70efcb2389d0624d571aaf2c80b04117e2755a0c5d15"}, - {file = "scipy-1.11.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0d3a136ae1ff0883fffbb1b05b0b2fea251cb1046a5077d0b435a1839b3e52b7"}, - {file = "scipy-1.11.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bae66a2d7d5768eaa33008fa5a974389f167183c87bf39160d3fefe6664f8ddc"}, - {file = "scipy-1.11.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2f6dee6cbb0e263b8142ed587bc93e3ed5e777f1f75448d24fb923d9fd4dce6"}, - {file = "scipy-1.11.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:74e89dc5e00201e71dd94f5f382ab1c6a9f3ff806c7d24e4e90928bb1aafb280"}, - {file = "scipy-1.11.3-cp312-cp312-win_amd64.whl", hash = "sha256:90271dbde4be191522b3903fc97334e3956d7cfb9cce3f0718d0ab4fd7d8bfd6"}, - {file = "scipy-1.11.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a63d1ec9cadecce838467ce0631c17c15c7197ae61e49429434ba01d618caa83"}, - {file = "scipy-1.11.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:5305792c7110e32ff155aed0df46aa60a60fc6e52cd4ee02cdeb67eaccd5356e"}, - {file = "scipy-1.11.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ea7f579182d83d00fed0e5c11a4aa5ffe01460444219dedc448a36adf0c3917"}, - {file = "scipy-1.11.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c77da50c9a91e23beb63c2a711ef9e9ca9a2060442757dffee34ea41847d8156"}, - {file = "scipy-1.11.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:15f237e890c24aef6891c7d008f9ff7e758c6ef39a2b5df264650eb7900403c0"}, - {file = "scipy-1.11.3-cp39-cp39-win_amd64.whl", hash = "sha256:4b4bb134c7aa457e26cc6ea482b016fef45db71417d55cc6d8f43d799cdf9ef2"}, - {file = "scipy-1.11.3.tar.gz", hash = "sha256:bba4d955f54edd61899776bad459bf7326e14b9fa1c552181f0479cc60a568cd"}, +category = "main" +optional = false +python-versions = "<3.12,>=3.8" +files = [ + {file = "scipy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7354fd7527a4b0377ce55f286805b34e8c54b91be865bac273f527e1b839019"}, + {file = "scipy-1.10.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4b3f429188c66603a1a5c549fb414e4d3bdc2a24792e061ffbd607d3d75fd84e"}, + {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1553b5dcddd64ba9a0d95355e63fe6c3fc303a8fd77c7bc91e77d61363f7433f"}, + {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c0ff64b06b10e35215abce517252b375e580a6125fd5fdf6421b98efbefb2d2"}, + {file = "scipy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:fae8a7b898c42dffe3f7361c40d5952b6bf32d10c4569098d276b4c547905ee1"}, + {file = "scipy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f1564ea217e82c1bbe75ddf7285ba0709ecd503f048cb1236ae9995f64217bd"}, + {file = "scipy-1.10.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d925fa1c81b772882aa55bcc10bf88324dadb66ff85d548c71515f6689c6dac5"}, + {file = "scipy-1.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaea0a6be54462ec027de54fca511540980d1e9eea68b2d5c1dbfe084797be35"}, + {file = "scipy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15a35c4242ec5f292c3dd364a7c71a61be87a3d4ddcc693372813c0b73c9af1d"}, + {file = "scipy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:43b8e0bcb877faf0abfb613d51026cd5cc78918e9530e375727bf0625c82788f"}, + {file = "scipy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5678f88c68ea866ed9ebe3a989091088553ba12c6090244fdae3e467b1139c35"}, + {file = "scipy-1.10.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:39becb03541f9e58243f4197584286e339029e8908c46f7221abeea4b749fa88"}, + {file = "scipy-1.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bce5869c8d68cf383ce240e44c1d9ae7c06078a9396df68ce88a1230f93a30c1"}, + {file = "scipy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07c3457ce0b3ad5124f98a86533106b643dd811dd61b548e78cf4c8786652f6f"}, + {file = "scipy-1.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:049a8bbf0ad95277ffba9b3b7d23e5369cc39e66406d60422c8cfef40ccc8415"}, + {file = "scipy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cd9f1027ff30d90618914a64ca9b1a77a431159df0e2a195d8a9e8a04c78abf9"}, + {file = "scipy-1.10.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:79c8e5a6c6ffaf3a2262ef1be1e108a035cf4f05c14df56057b64acc5bebffb6"}, + {file = "scipy-1.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51af417a000d2dbe1ec6c372dfe688e041a7084da4fdd350aeb139bd3fb55353"}, + {file = "scipy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b4735d6c28aad3cdcf52117e0e91d6b39acd4272f3f5cd9907c24ee931ad601"}, + {file = "scipy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ff7f37b1bf4417baca958d254e8e2875d0cc23aaadbe65b3d5b3077b0eb23ea"}, + {file = "scipy-1.10.1.tar.gz", hash = "sha256:2cf9dfb80a7b4589ba4c40ce7588986d6d5cebc5457cad2c2880f6bc2d42f3a5"}, ] [package.dependencies] -numpy = ">=1.21.6,<1.28.0" +numpy = ">=1.19.5,<1.27.0" [package.extras] -dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] -doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +dev = ["click", "doit (>=0.36.0)", "flake8", "mypy", "pycodestyle", "pydevtool", "rich-click", "typing_extensions"] +doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "scs" version = "3.2.3" description = "scs: splitting conic solver" + optional = false python-versions = "*" files = [ @@ -4022,6 +4249,7 @@ scipy = ">=0.13.2" name = "setuptools" version = "68.2.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4034,10 +4262,34 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +[[package]] +name = "setuptools-scm" +version = "8.0.4" +description = "the blessed package to manage your versions by scm tags" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-scm-8.0.4.tar.gz", hash = "sha256:b5f43ff6800669595193fd09891564ee9d1d7dcb196cab4b2506d53a2e1c95c7"}, + {file = "setuptools_scm-8.0.4-py3-none-any.whl", hash = "sha256:b47844cd2a84b83b3187a5782c71128c28b4c94cad8bfb871da2784a5cb54c4f"}, +] + +[package.dependencies] +packaging = ">=20" +setuptools = "*" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} +typing-extensions = "*" + +[package.extras] +docs = ["entangled-cli[rich]", "mkdocs", "mkdocs-entangled-plugin", "mkdocs-material", "mkdocstrings[python]", "pygments"] +rich = ["rich"] +test = ["build", "pytest", "rich", "wheel"] + [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -4045,21 +4297,11 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -[[package]] -name = "sniffio" -version = "1.3.0" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, -] - [[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 = [ @@ -4071,6 +4313,7 @@ files = [ name = "sortedcontainers" version = "2.4.0" description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" + optional = false python-versions = "*" files = [ @@ -4082,6 +4325,7 @@ files = [ name = "soupsieve" version = "2.5" description = "A modern CSS selector implementation for Beautiful Soup." + optional = false python-versions = ">=3.8" files = [ @@ -4093,6 +4337,7 @@ files = [ name = "sphinx" version = "6.2.1" description = "Python documentation generator" + optional = false python-versions = ">=3.8" files = [ @@ -4128,6 +4373,7 @@ test = ["cython", "filelock", "html5lib", "pytest (>=4.6)"] name = "sphinx-basic-ng" version = "1.0.0b2" description = "A modern skeleton for Sphinx themes." + optional = false python-versions = ">=3.7" files = [ @@ -4145,6 +4391,7 @@ docs = ["furo", "ipython", "myst-parser", "sphinx-copybutton", "sphinx-inline-ta name = "sphinx-copybutton" version = "0.5.2" description = "Add a copy button to each of your code cells." + optional = false python-versions = ">=3.7" files = [ @@ -4163,6 +4410,7 @@ rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"] name = "sphinx-markdown-tables" version = "0.0.17" description = "A Sphinx extension for rendering tables written in markdown" + optional = false python-versions = "*" files = [ @@ -4175,18 +4423,16 @@ markdown = ">=3.4" [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.7" +version = "1.0.4" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" + optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" files = [ - {file = "sphinxcontrib_applehelp-1.0.7-py3-none-any.whl", hash = "sha256:094c4d56209d1734e7d252f6e0b3ccc090bd52ee56807a5d9315b19c122ab15d"}, - {file = "sphinxcontrib_applehelp-1.0.7.tar.gz", hash = "sha256:39fdc8d762d33b01a7d8f026a3b7d71563ea3b72787d5f00ad8465bd9d6dfbfa"}, + {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"}, + {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] @@ -4195,6 +4441,7 @@ test = ["pytest"] name = "sphinxcontrib-bibtex" version = "2.5.0" description = "Sphinx extension for BibTeX style citations." + optional = false python-versions = ">=3.6" files = [ @@ -4211,36 +4458,32 @@ Sphinx = ">=2.1" [[package]] name = "sphinxcontrib-devhelp" -version = "1.0.5" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" +version = "1.0.2" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." + optional = false -python-versions = ">=3.9" +python-versions = ">=3.5" files = [ - {file = "sphinxcontrib_devhelp-1.0.5-py3-none-any.whl", hash = "sha256:fe8009aed765188f08fcaadbb3ea0d90ce8ae2d76710b7e29ea7d047177dae2f"}, - {file = "sphinxcontrib_devhelp-1.0.5.tar.gz", hash = "sha256:63b41e0d38207ca40ebbeabcf4d8e51f76c03e78cd61abe118cf4435c73d4212"}, + {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, + {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.4" +version = "2.0.1" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" + optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" files = [ - {file = "sphinxcontrib_htmlhelp-2.0.4-py3-none-any.whl", hash = "sha256:8001661c077a73c29beaf4a79968d0726103c5605e27db92b9ebed8bab1359e9"}, - {file = "sphinxcontrib_htmlhelp-2.0.4.tar.gz", hash = "sha256:6c26a118a05b76000738429b724a0568dbde5b72391a688577da08f11891092a"}, + {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"}, + {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["html5lib", "pytest"] @@ -4249,6 +4492,7 @@ test = ["html5lib", "pytest"] 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 = [ @@ -4261,36 +4505,32 @@ test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" -version = "1.0.6" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" +version = "1.0.3" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." + optional = false -python-versions = ">=3.9" +python-versions = ">=3.5" files = [ - {file = "sphinxcontrib_qthelp-1.0.6-py3-none-any.whl", hash = "sha256:bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4"}, - {file = "sphinxcontrib_qthelp-1.0.6.tar.gz", hash = "sha256:62b9d1a186ab7f5ee3356d906f648cacb7a6bdb94d201ee7adf26db55092982d"}, + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "sphinxcontrib-serializinghtml" -version = "1.1.9" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" +version = "1.1.5" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." + optional = false -python-versions = ">=3.9" +python-versions = ">=3.5" files = [ - {file = "sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl", hash = "sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1"}, - {file = "sphinxcontrib_serializinghtml-1.1.9.tar.gz", hash = "sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54"}, + {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, + {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] @@ -4299,6 +4539,7 @@ test = ["pytest"] name = "stack-data" version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" + optional = false python-versions = "*" files = [ @@ -4318,6 +4559,7 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] name = "sympy" version = "1.12" description = "Computer algebra system (CAS) in Python" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4332,6 +4574,7 @@ mpmath = ">=0.19" name = "tabulate" version = "0.9.0" description = "Pretty-print tabular data" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4342,14 +4585,30 @@ files = [ [package.extras] widechars = ["wcwidth"] +[[package]] +name = "tenacity" +version = "8.2.3" +description = "Retry code until it succeeds" + +optional = false +python-versions = ">=3.7" +files = [ + {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, + {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, +] + +[package.extras] +doc = ["reno", "sphinx", "tornado (>=4.5)"] + [[package]] name = "tensorboard" -version = "2.14.1" +version = "2.12.3" description = "TensorBoard lets you watch Tensors Flow" + optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" files = [ - {file = "tensorboard-2.14.1-py3-none-any.whl", hash = "sha256:3db108fb58f023b6439880e177743c5f1e703e9eeb5fb7d597871f949f85fd58"}, + {file = "tensorboard-2.12.3-py3-none-any.whl", hash = "sha256:b4a69366784bc347e02fbe7d847e01896a649ca52f8948a11005e205dcf724fb"}, ] [package.dependencies] @@ -4362,14 +4621,15 @@ numpy = ">=1.12.0" protobuf = ">=3.19.6" requests = ">=2.21.0,<3" setuptools = ">=41.0.0" -six = ">1.9" tensorboard-data-server = ">=0.7.0,<0.8.0" werkzeug = ">=1.0.1" +wheel = ">=0.26" [[package]] name = "tensorboard-data-server" version = "0.7.2" description = "Fast data loading for TensorBoard" + optional = false python-versions = ">=3.7" files = [ @@ -4380,69 +4640,70 @@ files = [ [[package]] name = "tensorflow" -version = "2.14.0" +version = "2.12.0" description = "TensorFlow is an open source machine learning framework for everyone." + optional = false -python-versions = ">=3.9" -files = [ - {file = "tensorflow-2.14.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:318b21b18312df6d11f511d0f205d55809d9ad0f46d5f9c13d8325ce4fe3b159"}, - {file = "tensorflow-2.14.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:927868c9bd4b3d2026ac77ec65352226a9f25e2d24ec3c7d088c68cff7583c9b"}, - {file = "tensorflow-2.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3870063433aebbd1b8da65ed4dcb09495f9239397f8cb5a8822025b6bb65e04"}, - {file = "tensorflow-2.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c9c1101269efcdb63492b45c8e83df0fc30c4454260a252d507dfeaebdf77ff"}, - {file = "tensorflow-2.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:0b7eaab5e034f1695dc968f7be52ce7ccae4621182d1e2bf6d5b3fab583be98c"}, - {file = "tensorflow-2.14.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:00c42e7d8280c660b10cf5d0b3164fdc5e38fd0bf16b3f9963b7cd0e546346d8"}, - {file = "tensorflow-2.14.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:c92f5526c2029d31a036be06eb229c71f1c1821472876d34d0184d19908e318c"}, - {file = "tensorflow-2.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c224c076160ef9f60284e88f59df2bed347d55e64a0ca157f30f9ca57e8495b0"}, - {file = "tensorflow-2.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a80cabe6ab5f44280c05533e5b4a08e5b128f0d68d112564cffa3b96638e28aa"}, - {file = "tensorflow-2.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:0587ece626c4f7c4fcb2132525ea6c77ad2f2f5659a9b0f4451b1000be1b5e16"}, - {file = "tensorflow-2.14.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:6d65b54f6928490e2b6ff51836b97f88f5d5b29b5943fe81d8ac5d8c809ccca4"}, - {file = "tensorflow-2.14.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:e2840b549686080bfb824cc1578b5a15d5ec416badacc0c327d93f8762ee6b56"}, - {file = "tensorflow-2.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fb16641092b04a37ec2916c30412f986ca6adf969e6062057839efb788985f8"}, - {file = "tensorflow-2.14.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba2ee1f9fe7f453bcd27d39a36928142de75a427ac2097dee2db1516387c9d5"}, - {file = "tensorflow-2.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:6531e76276b1421f43e008280107ba215256d4570cc56fd54856db7ff45e58f7"}, +python-versions = ">=3.8" +files = [ + {file = "tensorflow-2.12.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:be4ac0dfcc7a16f6df2bc19bd322e312235ab3f7b0c7297f96c92c44bb14d2a1"}, + {file = "tensorflow-2.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5193ddb3bb5120cb445279beb08ed9e74a85a4eeb2485550d6fb707a89d9a88"}, + {file = "tensorflow-2.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357d9d2851188a8d27ee195345b4d175cad970150d1344ba9d9fcc4bf2b68336"}, + {file = "tensorflow-2.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:c8001210df7202ef6267150865b0b79f834c3ca69ee3132277de8eeb994dffde"}, + {file = "tensorflow-2.12.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:91dccda42c03569d8c787190482a11ecae3b9b173aaa9166f0ab20cecc9c31f4"}, + {file = "tensorflow-2.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31f81eb8adaeb558963f5d8b47dbfcc398d898f0857bf3de6b6484350236b7b5"}, + {file = "tensorflow-2.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ec4a2934ea19e92f27a9668ece43025ed5efe14b5d19be53b07692bc8a4189d"}, + {file = "tensorflow-2.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e7641e2a6e32f31ff233495478a9cc86b7c038140eab714a61eeddbbbb327c3"}, + {file = "tensorflow-2.12.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:a7194e744c5a7f3e759ecb949527b4a07718a6d1110e6e82fd4ce0c5586a7d4a"}, + {file = "tensorflow-2.12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4afc2dd57435f29ebe249eb5f595d89b0e73be94922eeb7110aa6280a332837c"}, + {file = "tensorflow-2.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23850332f1f9f778d697c9dba63ca52be72cb73363e75ad358f07ddafef63c01"}, + {file = "tensorflow-2.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:e29fcf6cfd069aefb4b44f357cccbb4415a5a3d7b5b516eaf4450062fe40021e"}, + {file = "tensorflow-2.12.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:42fc2635e9420faee781a16bd393126f29cd39aa2b9d02901f24d8497bd6f958"}, + {file = "tensorflow-2.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76414355e420edb9154b4e72113eef5813ccb71701fda959afbbc1eebe3099bd"}, + {file = "tensorflow-2.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:020d6a54cb26020bdc71a7bae8ee35be05096f63e773dc517f6e87c49de62c50"}, + {file = "tensorflow-2.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:9f70a8f9ab46e5ed436850aa60d1cd40645f5c669e14bcad48915dc1f597dda2"}, ] [package.dependencies] absl-py = ">=1.0.0" astunparse = ">=1.6.0" -flatbuffers = ">=23.5.26" -gast = ">=0.2.1,<0.5.0 || >0.5.0,<0.5.1 || >0.5.1,<0.5.2 || >0.5.2" +flatbuffers = ">=2.0" +gast = ">=0.2.1,<=0.4.0" google-pasta = ">=0.1.1" grpcio = ">=1.24.3,<2.0" h5py = ">=2.9.0" -keras = ">=2.14.0,<2.15" +jax = ">=0.3.15" +keras = ">=2.12.0,<2.13" libclang = ">=13.0.0" -ml-dtypes = "0.2.0" -numpy = ">=1.23.5" +numpy = ">=1.22,<1.24" opt-einsum = ">=2.3.2" packaging = "*" protobuf = ">=3.20.3,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" setuptools = "*" six = ">=1.12.0" -tensorboard = ">=2.14,<2.15" -tensorflow-estimator = ">=2.14.0,<2.15" -tensorflow-io-gcs-filesystem = ">=0.23.1" +tensorboard = ">=2.12,<2.13" +tensorflow-estimator = ">=2.12.0,<2.13" +tensorflow-io-gcs-filesystem = {version = ">=0.23.1", markers = "platform_machine != \"arm64\" or platform_system != \"Darwin\""} termcolor = ">=1.1.0" typing-extensions = ">=3.6.6" wrapt = ">=1.11.0,<1.15" -[package.extras] -and-cuda = ["nvidia-cublas-cu11 (==11.11.3.6)", "nvidia-cuda-cupti-cu11 (==11.8.87)", "nvidia-cuda-nvcc-cu11 (==11.8.89)", "nvidia-cuda-runtime-cu11 (==11.8.89)", "nvidia-cudnn-cu11 (==8.7.0.84)", "nvidia-cufft-cu11 (==10.9.0.58)", "nvidia-curand-cu11 (==10.3.0.86)", "nvidia-cusolver-cu11 (==11.4.1.48)", "nvidia-cusparse-cu11 (==11.7.5.86)", "nvidia-nccl-cu11 (==2.16.5)", "tensorrt (==8.5.3.1)"] - [[package]] name = "tensorflow-estimator" -version = "2.14.0" +version = "2.12.0" description = "TensorFlow Estimator." + optional = false python-versions = ">=3.7" files = [ - {file = "tensorflow_estimator-2.14.0-py2.py3-none-any.whl", hash = "sha256:820bf57c24aa631abb1bbe4371739ed77edb11361d61381fd8e790115ac0fd57"}, + {file = "tensorflow_estimator-2.12.0-py2.py3-none-any.whl", hash = "sha256:59b191bead4883822de3d63ac02ace11a83bfe6c10d64d0c4dfde75a50e60ca1"}, ] [[package]] name = "tensorflow-io-gcs-filesystem" version = "0.34.0" description = "TensorFlow IO" + optional = false python-versions = ">=3.7, <3.12" files = [ @@ -4478,6 +4739,7 @@ tensorflow-rocm = ["tensorflow-rocm (>=2.13.0,<2.14.0)"] name = "termcolor" version = "2.3.0" description = "ANSI color formatting for output in terminal" + optional = false python-versions = ">=3.7" files = [ @@ -4492,6 +4754,7 @@ tests = ["pytest", "pytest-cov"] name = "threadpoolctl" version = "3.2.0" description = "threadpoolctl" + optional = false python-versions = ">=3.8" files = [ @@ -4503,6 +4766,7 @@ files = [ name = "tinycss2" version = "1.2.1" description = "A tiny CSS parser" + optional = false python-versions = ">=3.7" files = [ @@ -4517,21 +4781,11 @@ webencodings = ">=0.4" doc = ["sphinx", "sphinx_rtd_theme"] test = ["flake8", "isort", "pytest"] -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] - [[package]] name = "tomli" version = "2.0.1" description = "A lil' TOML parser" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4541,19 +4795,21 @@ files = [ [[package]] name = "tomlkit" -version = "0.12.2" +version = "0.12.1" description = "Style preserving TOML library" + optional = false python-versions = ">=3.7" files = [ - {file = "tomlkit-0.12.2-py3-none-any.whl", hash = "sha256:eeea7ac7563faeab0a1ed8fe12c2e5a51c61f933f2502f7e9db0241a65163ad0"}, - {file = "tomlkit-0.12.2.tar.gz", hash = "sha256:df32fab589a81f0d7dc525a4267b6d7a64ee99619cbd1eeb0fae32c1dd426977"}, + {file = "tomlkit-0.12.1-py3-none-any.whl", hash = "sha256:712cbd236609acc6a3e2e97253dfc52d4c2082982a88f61b640ecf0817eab899"}, + {file = "tomlkit-0.12.1.tar.gz", hash = "sha256:38e1ff8edb991273ec9f6181244a6a391ac30e9f5098e7535640ea6be97a7c86"}, ] [[package]] name = "tornado" version = "6.3.3" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." + optional = false python-versions = ">= 3.8" files = [ @@ -4574,6 +4830,7 @@ files = [ name = "tqdm" version = "4.66.1" description = "Fast, Extensible Progress Meter" + optional = false python-versions = ">=3.7" files = [ @@ -4594,6 +4851,7 @@ telegram = ["requests"] name = "traitlets" version = "5.13.0" description = "Traitlets Python configuration system" + optional = false python-versions = ">=3.8" files = [ @@ -4605,10 +4863,47 @@ files = [ docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] test = ["argcomplete (>=3.0.3)", "mypy (>=1.6.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] +[[package]] +name = "types-deprecated" +version = "1.2.9.3" +description = "Typing stubs for Deprecated" + +optional = false +python-versions = "*" +files = [ + {file = "types-Deprecated-1.2.9.3.tar.gz", hash = "sha256:ef87327adf3e3c4a4c7d8e06e58f6476710d3466ecfb53c49efb080804a70ef3"}, + {file = "types_Deprecated-1.2.9.3-py3-none-any.whl", hash = "sha256:24da9210763e5e1b3d0d4f6f8bba9ad3bb6af3fe7f6815fc37e3ede4681704f5"}, +] + +[[package]] +name = "types-python-dateutil" +version = "2.8.19.14" +description = "Typing stubs for python-dateutil" + +optional = false +python-versions = "*" +files = [ + {file = "types-python-dateutil-2.8.19.14.tar.gz", hash = "sha256:1f4f10ac98bb8b16ade9dbee3518d9ace017821d94b057a425b069f834737f4b"}, + {file = "types_python_dateutil-2.8.19.14-py3-none-any.whl", hash = "sha256:f977b8de27787639986b4e28963263fd0e5158942b3ecef91b9335c130cb1ce9"}, +] + +[[package]] +name = "types-retry" +version = "0.9.9.4" +description = "Typing stubs for retry" + +optional = false +python-versions = "*" +files = [ + {file = "types-retry-0.9.9.4.tar.gz", hash = "sha256:e4731dc684b56b875d9746459ad665d3bc281a56b530acdf1c97730167799941"}, + {file = "types_retry-0.9.9.4-py3-none-any.whl", hash = "sha256:f29760a9fe8b1fefe253e5fe6be7e4c0eba243932c600e0eccffb42a21d17765"}, +] + [[package]] name = "typing-extensions" version = "4.8.0" description = "Backported and Experimental Type Hints for Python 3.8+" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4620,6 +4915,7 @@ files = [ name = "tzdata" version = "2023.3" description = "Provider of IANA time zone data" + optional = false python-versions = ">=2" files = [ @@ -4631,6 +4927,7 @@ files = [ name = "urllib3" version = "2.0.7" description = "HTTP library with thread-safe connection pooling, file post, and more." + optional = false python-versions = ">=3.7" files = [ @@ -4646,19 +4943,21 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "wcwidth" -version = "0.2.9" +version = "0.2.8" description = "Measures the displayed width of unicode strings in a terminal" + optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.9-py2.py3-none-any.whl", hash = "sha256:9a929bd8380f6cd9571a968a9c8f4353ca58d7cd812a4822bba831f8d685b223"}, - {file = "wcwidth-0.2.9.tar.gz", hash = "sha256:a675d1a4a2d24ef67096a04b85b02deeecd8e226f57b5e3a72dbb9ed99d27da8"}, + {file = "wcwidth-0.2.8-py2.py3-none-any.whl", hash = "sha256:77f719e01648ed600dfa5402c347481c0992263b81a027344f3e1ba25493a704"}, + {file = "wcwidth-0.2.8.tar.gz", hash = "sha256:8705c569999ffbb4f6a87c6d1b80f324bd6db952f5eb0b95bc07517f4c1813d4"}, ] [[package]] name = "webencodings" version = "0.5.1" description = "Character encoding aliases for legacy web content" + optional = false python-versions = "*" files = [ @@ -4670,6 +4969,7 @@ files = [ name = "werkzeug" version = "3.0.1" description = "The comprehensive WSGI web application library." + optional = false python-versions = ">=3.8" files = [ @@ -4687,6 +4987,7 @@ watchdog = ["watchdog (>=2.3)"] name = "wheel" version = "0.41.3" description = "A built-package format for Python" + optional = false python-versions = ">=3.7" files = [ @@ -4697,17 +4998,6 @@ files = [ [package.extras] test = ["pytest (>=6.0.0)", "setuptools (>=65)"] -[[package]] -name = "widgetsnbextension" -version = "4.0.9" -description = "Jupyter interactive widgets for Jupyter Notebook" -optional = false -python-versions = ">=3.7" -files = [ - {file = "widgetsnbextension-4.0.9-py3-none-any.whl", hash = "sha256:91452ca8445beb805792f206e560c1769284267a30ceb1cec9f5bcc887d15175"}, - {file = "widgetsnbextension-4.0.9.tar.gz", hash = "sha256:3c1f5e46dc1166dfd40a42d685e6a51396fd34ff878742a3e47c6f0cc4a2a385"}, -] - [[package]] name = "wmctrl" version = "0.5" @@ -4729,6 +5019,7 @@ test = ["pytest"] name = "wrapt" version = "1.14.1" description = "Module for decorators, wrappers and monkey patching." + optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" files = [ @@ -4751,6 +5042,16 @@ files = [ {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, + {file = "wrapt-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecee4132c6cd2ce5308e21672015ddfed1ff975ad0ac8d27168ea82e71413f55"}, + {file = "wrapt-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2020f391008ef874c6d9e208b24f28e31bcb85ccff4f335f15a3251d222b92d9"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2feecf86e1f7a86517cab34ae6c2f081fd2d0dac860cb0c0ded96d799d20b335"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:240b1686f38ae665d1b15475966fe0472f78e71b1b4903c143a842659c8e4cb9"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9008dad07d71f68487c91e96579c8567c98ca4c3881b9b113bc7b33e9fd78b8"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6447e9f3ba72f8e2b985a1da758767698efa72723d5b59accefd716e9e8272bf"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:acae32e13a4153809db37405f5eba5bac5fbe2e2ba61ab227926a22901051c0a"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49ef582b7a1152ae2766557f0550a9fcbf7bbd76f43fbdc94dd3bf07cc7168be"}, + {file = "wrapt-1.14.1-cp311-cp311-win32.whl", hash = "sha256:358fe87cc899c6bb0ddc185bf3dbfa4ba646f05b1b0b9b5a27c2cb92c2cea204"}, + {file = "wrapt-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:26046cd03936ae745a502abf44dac702a5e6880b2b01c29aea8ddf3353b68224"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, @@ -4802,6 +5103,7 @@ files = [ name = "zipp" version = "3.17.0" description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4815,5 +5117,5 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" -python-versions = ">=3.9,<3.12" -content-hash = "327a0ba97d3ffa7d730d3fbe1720dc6d4ab9a4fbd2cc4f5547eddfa0faded916" +python-versions = ">=3.8,<3.12" +content-hash = "bbd46d54bd4d0537d02d16d733e4e22bbb3d83c77aaab1183aa466313072da28" diff --git a/src/qibo/transpiler/__init__.py b/src/qibo/transpiler/__init__.py new file mode 100644 index 0000000000..3ed3779d69 --- /dev/null +++ b/src/qibo/transpiler/__init__.py @@ -0,0 +1,6 @@ +from qibo.transpiler.optimizer import Preprocessing, Rearrange +from qibo.transpiler.pipeline import Passes +from qibo.transpiler.placer import Custom, Random, ReverseTraversal, Subgraph, Trivial +from qibo.transpiler.router import Sabre, ShortestPaths +from qibo.transpiler.star_connectivity import StarConnectivity +from qibo.transpiler.unroller import NativeGates diff --git a/src/qibo/transpiler/abstract.py b/src/qibo/transpiler/abstract.py new file mode 100644 index 0000000000..d9daae15b0 --- /dev/null +++ b/src/qibo/transpiler/abstract.py @@ -0,0 +1,122 @@ +from abc import ABC, abstractmethod +from enum import Flag, auto +from typing import Tuple + +import networkx as nx + +from qibo import gates +from qibo.config import raise_error +from qibo.models import Circuit + + +class NativeType(Flag): + """Define available types of native gates. + + Should have the same names with qibo gates. + """ + + M = auto() + Z = auto() + RZ = auto() + GPI2 = auto() + CZ = auto() + iSWAP = auto() + + @classmethod + def from_gate(cls, gate: gates.Gate): + try: + return getattr(cls, gate.__class__.__name__) + except AttributeError: + raise ValueError(f"Gate {gate} cannot be used as native.") + + +class Placer(ABC): + @abstractmethod + def __init__(self, connectivity: nx.Graph, *args): + """A placer implements the initial logical-physical qubit mapping""" + + @abstractmethod + def __call__(self, circuit: Circuit, *args) -> dict: + """Find initial qubit mapping + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): circuit to be mapped. + + Returns: + (dict): dictionary containing the initial logical to physical qubit mapping. + """ + + +class Router(ABC): + @abstractmethod + def __init__(self, connectivity: nx.Graph, *args): + """A router implements the mapping of a circuit on a specific hardware.""" + + @abstractmethod + def __call__( + self, circuit: Circuit, initial_layout: dict, *args + ) -> Tuple[Circuit, dict]: + """Match circuit to hardware connectivity. + + Args: + circuit (qibo.models.Circuit): circuit to be routed. + initial_layout (dict): dictionary containing the initial logical to physical qubit mapping. + + Returns: + (:class:`qibo.models.circuit.Circuit`, dict): routed circuit and dictionary containing the final logical to physical qubit mapping. + """ + + +class Optimizer(ABC): + """An optimizer tries to reduce the number of gates during transpilation.""" + + @abstractmethod + def __call__(self, circuit: Circuit, *args) -> Circuit: + """Find initial qubit mapping + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): circuit to be optimized + + Returns: + (:class:`qibo.models.circuit.Circuit`): circuit with optimized number of gates. + """ + + +class Unroller(ABC): + @abstractmethod + def __init__(self, native_gates: NativeType, *args): + """An unroller decomposes gates into native gates.""" + + @abstractmethod + def __call__(self, circuit: Circuit, *args) -> Circuit: + """Find initial qubit mapping + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): circuit to be optimized + + Returns: + (:class:`qibo.models.circuit.Circuit`): circuit with native gates. + """ + + +def _find_gates_qubits_pairs(circuit: Circuit): + """Translate qibo circuit into a list of pairs of qubits to be used by the router and placer. + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): circuit to be transpiled. + + Returns: + (list): list containing qubits targeted by two qubit gates. + """ + translated_circuit = [] + for gate in circuit.queue: + if isinstance(gate, gates.M): + pass + elif len(gate.qubits) == 2: + translated_circuit.append(sorted(gate.qubits)) + elif len(gate.qubits) >= 3: + raise_error( + ValueError, "Gates targeting more than 2 qubits are not supported" + ) + + return translated_circuit diff --git a/src/qibo/transpiler/blocks.py b/src/qibo/transpiler/blocks.py new file mode 100644 index 0000000000..7c0ec3d902 --- /dev/null +++ b/src/qibo/transpiler/blocks.py @@ -0,0 +1,346 @@ +from typing import Optional, Union + +from qibo import Circuit, gates +from qibo.config import raise_error +from qibo.gates import Gate +from qibo.transpiler.exceptions import BlockingError + + +class Block: + """A block contains a subset of gates acting on two qubits. + + Args: + qubits (tuple): qubits where the block is acting. + gates (list): list of gates that compose the block. + name (str or int, optional): name of the block. Defaults to ``None``. + """ + + def __init__( + self, qubits: tuple, gates: list, name: Optional[Union[str, int]] = None + ): + self.qubits = qubits + self.gates = gates + self.name = name + + @property + def entangled(self): + """Returns ``True`` if the block contains two-qubit gates.""" + return self._count_2q_gates() > 0 + + def add_gate(self, gate: Gate): + """Add a new gate to the block. + + Args: + gate (:class:`qibo.gates.abstract.Gate`): gate to be added. + """ + if not set(gate.qubits).issubset(self.qubits): + raise_error( + BlockingError, + f"Gate acting on qubits {gate.qubits} can't be added " + + f"to block acting on qubits {self._qubits}.", + ) + self.gates.append(gate) + + def _count_2q_gates(self): + """Return the number of two qubit gates in the block.""" + return _count_2q_gates(self.gates) + + @property + def qubits(self): + """Returns a sorted tuple with qubits of the block.""" + return tuple(sorted(self._qubits)) + + @qubits.setter + def qubits(self, qubits): + self._qubits = qubits + + def fuse(self, block, name: Optional[str] = None): + """Fuses the current block with a new one, the qubits they are acting on must coincide. + + Args: + block (:class:`qibo.transpiler.blocks.Block`): block to fuse. + name (str, optional): name of the fused block. Defaults to ``None``. + + Return: + (:class:`qibo.transpiler.blocks.Block`): fusion of the two input blocks. + """ + if not self.qubits == block.qubits: + raise_error( + BlockingError, "In order to fuse two blocks their qubits must coincide." + ) + return Block(qubits=self.qubits, gates=self.gates + block.gates, name=name) + + def on_qubits(self, new_qubits: tuple): + """Return a new block acting on the new qubits. + + Args: + new_qubits (tuple): new qubits where the block is acting. + """ + qubits_dict = dict(zip(self.qubits, new_qubits)) + new_gates = [gate.on_qubits(qubits_dict) for gate in self.gates] + + return Block(qubits=new_qubits, gates=new_gates, name=self.name) + + # TODO: use real QM properties to check commutation + def commute(self, block): + """Check if a block commutes with the current one. + + Args: + block (:class:`qibo.transpiler.blocks.Block`): block to check commutation. + + Return: + True if the two blocks don't share any qubit. + False otherwise. + """ + if len(set(self.qubits).intersection(block.qubits)) > 0: + return False + return True + + # TODO + def kak_decompose(self): # pragma: no cover + """Return KAK decomposition of the block. + This should be done only if the block is entangled and the number of + two qubit gates is higher than the number after the decomposition. + """ + raise_error(NotImplementedError, "") + + +class CircuitBlocks: + """A CircuitBlocks contains a quantum circuit decomposed in two qubits blocks. + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): circuit to be decomposed. + index_names (bool, optional): assign names to the blocks. Defaults to ``False``. + """ + + def __init__(self, circuit: Circuit, index_names: bool = False): + self.block_list = block_decomposition(circuit) + self._index_names = index_names + if index_names: + for index, block in enumerate(self.block_list): + block.name = index + self.qubits = circuit.nqubits + + def __call__(self): + return self.block_list + + def search_by_index(self, index: int): + """Find a block from its index, requires index_names == True""" + if not self._index_names: + raise_error( + BlockingError, + "You need to assign index names in order to use search_by_index.", + ) + for block in self.block_list: + if block.name == index: + return block + raise_error(BlockingError, f"No block found with index {index}.") + + def add_block(self, block: "Block"): + """Add a two qubits block.""" + if not set(block.qubits).issubset(range(self.qubits)): + raise_error( + BlockingError, + "The block can't be added to the circuit because it acts on different qubits", + ) + self.block_list.append(block) + + def circuit(self): + """Return the quantum circuit.""" + circuit = Circuit(self.qubits) + for block in self.block_list: + for gate in block.gates: + circuit.add(gate) + return circuit + + def remove_block(self, block: "Block"): + """Remove a block from the circuit blocks.""" + try: + self.block_list.remove(block) + except ValueError: + raise_error( + BlockingError, + "The block you are trying to remove is not present in the circuit blocks.", + ) + + +def block_decomposition(circuit: Circuit, fuse: bool = True): + """Decompose a circuit into blocks of gates acting on two qubits. + Break measurements on multiple qubits into measurements of single qubit. + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): circuit to be decomposed. + fuse (bool, optional): fuse adjacent blocks acting on the same qubits. + + Return: + (list): list of blocks that act on two qubits. + """ + if circuit.nqubits < 2: + raise_error( + BlockingError, + "Only circuits with at least two qubits can be decomposed with block_decomposition.", + ) + + if _check_multi_qubit_measurements(circuit): + circuit = _split_multi_qubit_measurements(circuit) + initial_blocks = _initial_block_decomposition(circuit) + + if not fuse: + return initial_blocks + + blocks = [] + while len(initial_blocks) > 0: + first_block = initial_blocks[0] + remove_list = [first_block] + if len(initial_blocks[1:]) > 0: + for second_block in initial_blocks[1:]: + try: + first_block = first_block.fuse(second_block) + remove_list.append(second_block) + except BlockingError: + if not first_block.commute(second_block): + break + blocks.append(first_block) + _remove_gates(initial_blocks, remove_list) + + return blocks + + +def _initial_block_decomposition(circuit: Circuit): + """Helper method for :meth:'qibo.transpiler.blocks.block_decomposition'. + + Decompose a circuit into blocks of gates acting on two qubits. + This decomposition is not minimal. + + Args: + circuit (qibo.models.Circuit): circuit to be decomposed. + + Return: + blocks (list): list of blocks that act on two qubits. + """ + blocks = [] + all_gates = list(circuit.queue) + while _count_multi_qubit_gates(all_gates) > 0: + for idx, gate in enumerate(all_gates): + if len(gate.qubits) == 2: + qubits = gate.qubits + block_gates = _find_previous_gates(all_gates[0:idx], qubits) + block_gates.append(gate) + block_gates.extend(_find_successive_gates(all_gates[idx + 1 :], qubits)) + block = Block(qubits=qubits, gates=block_gates) + _remove_gates(all_gates, block_gates) + blocks.append(block) + break + elif len(gate.qubits) > 2: + raise_error( + BlockingError, + "Gates targeting more than 2 qubits are not supported.", + ) + + # Now we need to deal with the remaining spare single qubit gates + while len(all_gates) > 0: + first_qubit = all_gates[0].qubits[0] + block_gates = _gates_on_qubit(gatelist=all_gates, qubit=first_qubit) + _remove_gates(all_gates, block_gates) + # Add other single qubits if there are still single qubit gates + if len(all_gates) > 0: + second_qubit = all_gates[0].qubits[0] + second_qubit_block_gates = _gates_on_qubit( + gatelist=all_gates, qubit=second_qubit + ) + block_gates += second_qubit_block_gates + _remove_gates(all_gates, second_qubit_block_gates) + block = Block(qubits=(first_qubit, second_qubit), gates=block_gates) + # In case there are no other spare single qubit gates create a block using a following qubit as placeholder + else: + block = Block( + qubits=(first_qubit, (first_qubit + 1) % circuit.nqubits), + gates=block_gates, + ) + blocks.append(block) + + return blocks + + +def _check_multi_qubit_measurements(circuit: Circuit): + """Helper method for :meth:'qibo.transpiler.blocks.block_decomposition'. + + Return True if the circuit contains measurements acting on multiple qubits.""" + for gate in circuit.queue: + if isinstance(gate, gates.M) and len(gate.qubits) > 1: + return True + return False + + +def _split_multi_qubit_measurements(circuit: Circuit): + """Helper method for :meth:'qibo.transpiler.blocks.block_decomposition'. + + Return an equivalent circuit containinig measurements acting only on single qubits. + """ + new_circuit = Circuit(circuit.nqubits) + for gate in circuit.queue: + if isinstance(gate, gates.M) and len(gate.qubits) > 1: + for qubit in gate.qubits: + new_circuit.add(gates.M(qubit)) + else: + new_circuit.add(gate) + return new_circuit + + +def _gates_on_qubit(gatelist, qubit): + """Helper method for :meth:'qibo.transpiler.blocks.block_decomposition'. + + Return a list of all single qubit gates in gatelist acting on a specific qubit.""" + selected_gates = [] + for gate in gatelist: + if gate.qubits[0] == qubit: + selected_gates.append(gate) + return selected_gates + + +def _remove_gates(gatelist, remove_list): + """Helper method for :meth:'qibo.transpiler.blocks.block_decomposition'. + + Remove all gates present in remove_list from gatelist.""" + for gate in remove_list: + gatelist.remove(gate) + + +def _count_2q_gates(gatelist: list): + """Helper method for :meth:'qibo.transpiler.blocks.block_decomposition'. + + Return the number of two qubit gates in a list of gates.""" + return len([gate for gate in gatelist if len(gate.qubits) == 2]) + + +def _count_multi_qubit_gates(gatelist: list): + """Helper method for :meth:'qibo.transpiler.blocks.block_decomposition'. + + Return the number of multi qubit gates in a list of gates.""" + return len([gate for gate in gatelist if len(gate.qubits) >= 2]) + + +def _find_successive_gates(gates_list: list, qubits: tuple): + """Helper method for :meth:'qibo.transpiler.blocks.block_decomposition'. + + Return a list containing all gates acting on qubits until a new two qubit gate acting on qubits is found. + """ + successive_gates = [] + for qubit in qubits: + for gate in gates_list: + if (len(gate.qubits) == 1) and (gate.qubits[0] == qubit): + successive_gates.append(gate) + elif (len(gate.qubits) == 2) and (qubit in gate.qubits): + break + return successive_gates + + +def _find_previous_gates(gates_list: list, qubits: tuple): + """Helper method for :meth:'qibo.transpiler.blocks.block_decomposition'. + + Return a list containing all gates acting on qubits.""" + previous_gates = [] + for gate in gates_list: + if gate.qubits[0] in qubits: + previous_gates.append(gate) + return previous_gates diff --git a/src/qibo/transpiler/exceptions.py b/src/qibo/transpiler/exceptions.py new file mode 100644 index 0000000000..2d81c81dc7 --- /dev/null +++ b/src/qibo/transpiler/exceptions.py @@ -0,0 +1,22 @@ +"""Custom exceptions raised in transpiler routines.""" + + +class BlockingError(Exception): + """Raise when an error occurs in the blocking procedure""" + + +class ConnectivityError(Exception): + """Raise for an error in the connectivity""" + + +class DecompositionError(Exception): + """A decomposition error is raised when, during transpiling, + gates are not correctly decomposed in native gates""" + + +class PlacementError(Exception): + """Raise for an error in the initial qubit placement""" + + +class TranspilerPipelineError(Exception): + """Raise when an error occurs in the transpiler pipeline""" diff --git a/src/qibo/transpiler/optimizer.py b/src/qibo/transpiler/optimizer.py new file mode 100644 index 0000000000..7008957627 --- /dev/null +++ b/src/qibo/transpiler/optimizer.py @@ -0,0 +1,57 @@ +import networkx as nx + +from qibo import gates +from qibo.config import raise_error +from qibo.models import Circuit +from qibo.transpiler.abstract import Optimizer + + +class Preprocessing(Optimizer): + """Match the number of qubits of the circuit with the number of qubits of the chip if possible. + + Args: + connectivity (:class:`networkx.Graph`): hardware chip connectivity. + """ + + def __init__(self, connectivity: nx.Graph): + self.connectivity = connectivity + + def __call__(self, circuit: Circuit) -> Circuit: + physical_qubits = self.connectivity.number_of_nodes() + logical_qubits = circuit.nqubits + if logical_qubits > physical_qubits: + raise_error( + ValueError, + "The number of qubits in the circuit can't be greater " + + "than the number of physical qubits.", + ) + if logical_qubits == physical_qubits: + return circuit + new_circuit = Circuit(physical_qubits) + for gate in circuit.queue: + new_circuit.add(gate) + return new_circuit + + +class Rearrange(Optimizer): + """Rearranges gates using qibo's fusion algorithm. + May reduce number of SWAPs when fixing for connectivity + but this has not been tested. + + Args: + max_qubits (int, optional): maximum number of qubits to fuse gates. + Defaults to :math:`1`. + """ + + def __init__(self, max_qubits: int = 1): + self.max_qubits = max_qubits + + def __call__(self, circuit: Circuit): + fused_circuit = circuit.fuse(max_qubits=self.max_qubits) + new = circuit.__class__(circuit.nqubits) + for fgate in fused_circuit.queue: + if isinstance(fgate, gates.FusedGate): + new.add(gates.Unitary(fgate.matrix(), *fgate.qubits)) + else: + new.add(fgate) + return new diff --git a/src/qibo/transpiler/pipeline.py b/src/qibo/transpiler/pipeline.py new file mode 100644 index 0000000000..ecc1b8b687 --- /dev/null +++ b/src/qibo/transpiler/pipeline.py @@ -0,0 +1,219 @@ +from typing import Optional + +import networkx as nx +import numpy as np + +from qibo.backends import NumpyBackend +from qibo.config import raise_error +from qibo.models import Circuit +from qibo.quantum_info.random_ensembles import random_statevector +from qibo.transpiler.abstract import NativeType, Optimizer, Placer, Router, Unroller +from qibo.transpiler.exceptions import TranspilerPipelineError +from qibo.transpiler.optimizer import Preprocessing +from qibo.transpiler.placer import Trivial, assert_placement +from qibo.transpiler.router import ConnectivityError, assert_connectivity +from qibo.transpiler.star_connectivity import StarConnectivity +from qibo.transpiler.unroller import ( + DecompositionError, + NativeGates, + assert_decomposition, +) + + +def assert_circuit_equivalence( + original_circuit: Circuit, + transpiled_circuit: Circuit, + final_map: dict, + initial_map: Optional[dict] = None, + test_states: Optional[list] = None, + ntests: int = 3, +): + """Checks that the transpiled circuit agrees with the original using simulation. + + Args: + original_circuit (:class:`qibo.models.circuit.Circuit`): Original circuit. + transpiled_circuit (:class:`qibo.models.circuit.Circuit`): Transpiled circuit. + final_map (dict): logical-physical qubit mapping after routing. + initial_map (dict, optional): logical_physical qubit mapping before routing. + If ``None``, trivial initial map is used. Defauts to ``None``. + test_states (list, optional): states on which the test is performed. + If ``None``, ``ntests`` random states will be tested. Defauts to ``None``. + ntests (int, optional): number of random states tested. Defauts to :math:`3`. + """ + backend = NumpyBackend() + ordering = np.argsort(np.array(list(final_map.values()))) + if transpiled_circuit.nqubits != original_circuit.nqubits: + raise_error( + ValueError, + "Transpiled and original circuit do not have the same number of qubits.", + ) + + if test_states is None: + test_states = [ + random_statevector(dims=2**original_circuit.nqubits, backend=backend) + for _ in range(ntests) + ] + if initial_map is not None: + reordered_test_states = [] + initial_map = np.array(list(initial_map.values())) + reordered_test_states = [ + _transpose_qubits(initial_state, initial_map) + for initial_state in test_states + ] + else: + reordered_test_states = test_states + + for i in range(len(test_states)): + target_state = backend.execute_circuit( + original_circuit, initial_state=test_states[i] + ).state() + final_state = backend.execute_circuit( + transpiled_circuit, initial_state=reordered_test_states[i] + ).state() + final_state = _transpose_qubits(final_state, ordering) + fidelity = np.abs(np.dot(np.conj(target_state), final_state)) + try: + np.testing.assert_allclose(fidelity, 1.0) + except AssertionError: + raise_error(TranspilerPipelineError, "Circuit equivalence not satisfied.") + + +def _transpose_qubits(state: np.ndarray, qubits_ordering: np.ndarray): + """Reorders qubits of a given state vector. + + Args: + state (np.ndarray): final state of the circuit. + qubits_ordering (np.ndarray): final qubit ordering. + """ + original_shape = state.shape + state = np.reshape(state, len(qubits_ordering) * (2,)) + state = np.transpose(state, qubits_ordering) + return np.reshape(state, original_shape) + + +def assert_transpiling( + original_circuit: Circuit, + transpiled_circuit: Circuit, + connectivity: nx.Graph, + initial_layout: dict, + final_layout: dict, + native_gates: NativeType = NativeType.CZ, + check_circuit_equivalence=True, +): + """Check that all transpiler passes have been executed correctly. + + Args: + original_circuit (qibo.models.Circuit): circuit before transpiling. + transpiled_circuit (qibo.models.Circuit): circuit after transpiling. + connectivity (networkx.Graph): chip qubits connectivity. + initial_layout (dict): initial physical-logical qubit mapping. + final_layout (dict): final physical-logical qubit mapping. + native_gates: (NativeType): native gates supported by the hardware. + """ + assert_connectivity(circuit=transpiled_circuit, connectivity=connectivity) + assert_decomposition(circuit=transpiled_circuit, two_qubit_natives=native_gates) + if original_circuit.nqubits != transpiled_circuit.nqubits: + qubit_matcher = Preprocessing(connectivity=connectivity) + original_circuit = qubit_matcher(circuit=original_circuit) + assert_placement(circuit=original_circuit, layout=initial_layout) + assert_placement(circuit=transpiled_circuit, layout=final_layout) + if check_circuit_equivalence: + assert_circuit_equivalence( + original_circuit=original_circuit, + transpiled_circuit=transpiled_circuit, + initial_map=initial_layout, + final_map=final_layout, + ) + + +class Passes: + """Define a transpiler pipeline consisting of smaller transpiler steps that are applied sequentially: + + Args: + passes (list): list of passes to be applied sequentially, + if None default transpiler will be used, it requires hardware connectivity. + connectivity (nx.Graph): hardware qubit connectivity. + """ + + def __init__( + self, + passes: list = None, + connectivity: nx.Graph = None, + native_gates: NativeType = NativeType.CZ, + ): + self.native_gates = native_gates + if passes is None: + self.passes = self.default(connectivity) + else: + self.passes = passes + self.connectivity = connectivity + + def default(self, connectivity: nx.Graph): + """Return the default transpiler pipeline for the required hardware connectivity.""" + if not isinstance(connectivity, nx.Graph): + raise_error( + TranspilerPipelineError, + "Define the hardware chip connectivity to use default transpiler", + ) + default_passes = [] + # preprocessing + default_passes.append(Preprocessing(connectivity=connectivity)) + # default placer pass + default_passes.append(Trivial(connectivity=connectivity)) + # default router pass + default_passes.append(StarConnectivity()) + # default unroller pass + default_passes.append(NativeGates(two_qubit_natives=self.native_gates)) + return default_passes + + def __call__(self, circuit): + self.initial_layout = None + final_layout = None + for transpiler_pass in self.passes: + if isinstance(transpiler_pass, Optimizer): + circuit = transpiler_pass(circuit) + elif isinstance(transpiler_pass, Placer): + if self.initial_layout == None: + self.initial_layout = transpiler_pass(circuit) + else: + raise_error( + TranspilerPipelineError, + "You are defining more than one placer pass.", + ) + elif isinstance(transpiler_pass, Router): + if self.initial_layout is not None: + circuit, final_layout = transpiler_pass( + circuit, self.initial_layout + ) + else: + raise_error( + TranspilerPipelineError, "Use a placement pass before routing." + ) + elif isinstance(transpiler_pass, Unroller): + circuit = transpiler_pass(circuit) + else: + raise_error( + TranspilerPipelineError, + f"Unrecognised transpiler pass: {transpiler_pass}", + ) + return circuit, final_layout + + def is_satisfied(self, circuit): + """Return True if the circuit respects the hardware connectivity and native gates, False otherwise. + + Args: + circuit (qibo.models.Circuit): circuit to be checked. + native_gates (NativeType): two qubit native gates. + """ + try: + assert_connectivity(circuit=circuit, connectivity=self.connectivity) + assert_decomposition(circuit=circuit, two_qubit_natives=self.native_gates) + return True + except ConnectivityError: + return False + except DecompositionError: + return False + + def get_initial_layout(self): + """Return initial qubit layout""" + return self.initial_layout diff --git a/src/qibo/transpiler/placer.py b/src/qibo/transpiler/placer.py new file mode 100644 index 0000000000..cb9ed21a2b --- /dev/null +++ b/src/qibo/transpiler/placer.py @@ -0,0 +1,341 @@ +import random +from typing import Optional, Union + +import networkx as nx + +from qibo import gates +from qibo.config import raise_error +from qibo.models import Circuit +from qibo.transpiler.abstract import Placer, Router, _find_gates_qubits_pairs +from qibo.transpiler.exceptions import PlacementError + + +def assert_placement(circuit: Circuit, layout: dict) -> bool: + """Check if layout is in the correct form and matches the number of qubits of the circuit. + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): Circuit model to check. + layout (dict): physical to logical qubit mapping. + """ + assert_mapping_consistency(layout) + if circuit.nqubits > len(layout): + raise_error( + PlacementError, + "Layout can't be used on circuit. The circuit requires more qubits.", + ) + if circuit.nqubits < len(layout): + raise_error( + PlacementError, + "Layout can't be used on circuit. Ancillary extra qubits need to be added to the circuit.", + ) + + +def assert_mapping_consistency(layout: dict): + """Check if layout is in the correct form. + + Args: + layout (dict): physical to logical qubit mapping. + """ + values = sorted(layout.values()) + keys = list(layout) + ref_keys = ["q" + str(i) for i in range(len(keys))] + if keys != ref_keys: + raise_error( + PlacementError, + "Some physical qubits in the layout may be missing or duplicated.", + ) + if values != list(range(len(values))): + raise_error( + PlacementError, + "Some logical qubits in the layout may be missing or duplicated.", + ) + + +class Trivial(Placer): + """Place qubits according to the following notation: + + .. math:: + \\{\\textup{"q0"} : 0, \\textup{"q1"} : 1, ..., \\textup{"qn"} : n}. + + Args: + connectivity (networkx.Graph, optional): chip connectivity. + """ + + def __init__(self, connectivity: nx.Graph = None): + self.connectivity = connectivity + + def __call__(self, circuit: Circuit): + """Find the trivial placement for the circuit. + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): circuit to be transpiled. + + Returns: + (dict): physical to logical qubit mapping. + """ + if self.connectivity is not None: + if self.connectivity.number_of_nodes() != circuit.nqubits: + raise_error( + PlacementError, + "The number of nodes of the connectivity graph must match " + + "the number of qubits in the circuit", + ) + return dict( + zip( + list("q" + str(i) for i in range(circuit.nqubits)), + range(circuit.nqubits), + ) + ) + + +class Custom(Placer): + """Define a custom initial qubit mapping. + + Args: + map (list or dict): physical to logical qubit mapping. + Examples: :math:`[1,2,0]` or + :math:`{\\textup{"q0"}: 1, \\textup{"q1"}: 2, \\textup{"q2"}:0}` + to assign the physical qubits :math:`\\{0, 1, 2\\}` + to the logical qubits :math:`[1, 2, 0]`. + connectivity (networkx.Graph, optional): chip connectivity. + """ + + def __init__(self, map: Union[list, dict], connectivity: nx.Graph = None): + self.connectivity = connectivity + self.map = map + + def __call__(self, circuit=None): + """Return the custom placement if it can be applied to the given circuit (if given). + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): circuit to be transpiled. + + Returns: + (dict): physical to logical qubit mapping. + """ + if isinstance(self.map, dict): + pass + elif isinstance(self.map, list): + self.map = dict( + zip(list("q" + str(i) for i in range(len(self.map))), self.map) + ) + else: + raise_error(TypeError, "Use dict or list to define mapping.") + if circuit is not None: + assert_placement(circuit, self.map) + else: + assert_mapping_consistency(self.map) + return self.map + + +class Subgraph(Placer): + """ + Subgraph isomorphism qubit placer. + + Since it is a :math:`NP`-complete problem, it can take exponential time for large circuits. + This initialization method may fail for very short circuits. + + Attributes: + connectivity (:class:`networkx.Graph`): chip connectivity. + """ + + def __init__(self, connectivity: nx.Graph): + self.connectivity = connectivity + + def __call__(self, circuit: Circuit): + """Find the initial layout of the given circuit using subgraph isomorphism. + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): circuit to be transpiled. + + Returns: + (dict): physical to logical qubit mapping. + """ + gates_qubits_pairs = _find_gates_qubits_pairs(circuit) + if len(gates_qubits_pairs) < 3: + raise_error( + ValueError, + "Circuit must contain at least two two-qubit gates to implement subgraph placement.", + ) + circuit_subgraph = nx.Graph() + circuit_subgraph.add_nodes_from(range(self.connectivity.number_of_nodes())) + matcher = nx.algorithms.isomorphism.GraphMatcher( + self.connectivity, circuit_subgraph + ) + i = 0 + circuit_subgraph.add_edge(gates_qubits_pairs[i][0], gates_qubits_pairs[i][1]) + while matcher.subgraph_is_monomorphic() == True: + result = matcher + i += 1 + circuit_subgraph.add_edge( + gates_qubits_pairs[i][0], gates_qubits_pairs[i][1] + ) + matcher = nx.algorithms.isomorphism.GraphMatcher( + self.connectivity, circuit_subgraph + ) + if ( + self.connectivity.number_of_edges() + == circuit_subgraph.number_of_edges() + or i == len(gates_qubits_pairs) - 1 + ): + break + return {"q" + str(i): result.mapping[i] for i in range(len(result.mapping))} + + +class Random(Placer): + """ + Random initialization with greedy policy, let a maximum number of 2-qubit + gates can be applied without introducing any SWAP gate. + + Attributes: + connectivity (:class:`networkx.Graph`): chip connectivity. + samples (int, optional): number of initial random layouts tested. + Defaults to :math:`100`. + """ + + def __init__(self, connectivity, samples: int = 100): + self.connectivity = connectivity + self.samples = samples + + def __call__(self, circuit): + """Find an initial layout of the given circuit using random greedy algorithm. + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): Circuit to be transpiled. + + Returns: + (dict): physical-to-logical qubit mapping. + """ + gates_qubits_pairs = _find_gates_qubits_pairs(circuit) + nodes = self.connectivity.number_of_nodes() + keys = list(self.connectivity.nodes()) + final_mapping = dict(zip(keys, range(nodes))) + final_graph = nx.relabel_nodes(self.connectivity, final_mapping) + final_mapping = { + "q" + str(i): final_mapping[i] for i in range(len(final_mapping)) + } + final_cost = self._cost(final_graph, gates_qubits_pairs) + for _ in range(self.samples): + mapping = dict(zip(keys, random.sample(range(nodes), nodes))) + graph = nx.relabel_nodes(self.connectivity, mapping) + cost = self._cost(graph, gates_qubits_pairs) + if cost == 0: + return {"q" + str(i): mapping[i] for i in range(len(mapping))} + if cost < final_cost: + final_graph = graph + final_mapping = {"q" + str(i): mapping[i] for i in range(len(mapping))} + final_cost = cost + return final_mapping + + def _cost(self, graph: nx.Graph, gates_qubits_pairs: list): + """ + Compute the cost associated to an initial layout as the lengh of the reduced circuit. + + Args: + graph (:class:`networkx.Graph`): current hardware qubit mapping. + gates_qubits_pairs (list): circuit representation. + + Returns: + (int): lengh of the reduced circuit. + """ + for allowed, gate in enumerate(gates_qubits_pairs): + if gate not in graph.edges(): + return len(gates_qubits_pairs) - allowed - 1 + return 0 + + +class ReverseTraversal(Placer): + """ + Places qubits based on the algorithm proposed in Reference [1]. + + Compatible with all the available ``Router``s. + + Args: + connectivity (:class:`networkx.Graph`): chip connectivity. + routing_algorithm (:class:`qibo.transpiler.abstract.Router`): routing algorithm. + depth (int, optional): number of two-qubit gates considered before finding initial layout. + If ``None`` just one backward step will be implemented. + If depth is greater than the number of two-qubit gates in the circuit, + the circuit will be routed more than once. + Example: on a circuit with four two-qubit gates :math:`A-B-C-D` + using depth :math:`d = 6`, the routing will be performed + on the circuit :math:`C-D-D-C-B-A`. + + References: + 1. G. Li, Y. Ding, and Y. Xie, *Tackling the Qubit Mapping Problem for NISQ-Era Quantum Devices*. + `arXiv:1809.02573 [cs.ET] `_. + """ + + def __init__( + self, + connectivity: nx.Graph, + routing_algorithm: Router, + depth: Optional[int] = None, + ): + self.connectivity = connectivity + self.routing_algorithm = routing_algorithm + self.depth = depth + + def __call__(self, circuit: Circuit): + """Find the initial layout of the given circuit using Reverse Traversal placement. + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): circuit to be transpiled. + + Returns: + (dict): physical to logical qubit mapping. + """ + + initial_placer = Trivial(self.connectivity) + initial_placement = initial_placer(circuit=circuit) + new_circuit = self._assemble_circuit(circuit) + final_placement = self._routing_step(initial_placement, new_circuit) + return final_placement + + def _assemble_circuit(self, circuit: Circuit): + """Assemble a single circuit to apply Reverse Traversal placement based on depth. + + Example: for a circuit with four two-qubit gates :math:`A-B-C-D` + using depth :math:`d = 6`, the function will return the circuit :math:`C-D-D-C-B-A`. + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): circuit to be transpiled. + + Returns: + (:class:`qibo.models.circuit.Circuit`): assembled circuit to perform Reverse Traversal placement. + """ + + if self.depth is None: + return circuit.invert() + + gates_qubits_pairs = _find_gates_qubits_pairs(circuit) + circuit_gates = len(gates_qubits_pairs) + if circuit_gates == 0: + raise_error( + ValueError, "The circuit must contain at least a two-qubit gate." + ) + repetitions, remainder = divmod(self.depth, circuit_gates) + + assembled_gates_qubits_pairs = [] + for _ in range(repetitions): + assembled_gates_qubits_pairs += gates_qubits_pairs[:] + gates_qubits_pairs.reverse() + assembled_gates_qubits_pairs += gates_qubits_pairs[0:remainder] + + new_circuit = Circuit(circuit.nqubits) + for qubits in assembled_gates_qubits_pairs: + # As only the connectivity is important here we can replace everything with CZ gates + new_circuit.add(gates.CZ(qubits[0], qubits[1])) + + return new_circuit.invert() + + def _routing_step(self, layout: dict, circuit: Circuit): + """Perform routing of the circuit. + + Args: + layout (dict): intial qubit layout. + circuit (:class:`qibo.models.circuit.Circuit`): circuit to be routed. + """ + + _, final_mapping = self.routing_algorithm(circuit, layout) + return final_mapping diff --git a/src/qibo/transpiler/router.py b/src/qibo/transpiler/router.py new file mode 100644 index 0000000000..ebc6571252 --- /dev/null +++ b/src/qibo/transpiler/router.py @@ -0,0 +1,640 @@ +import random +from copy import deepcopy + +import networkx as nx +import numpy as np + +from qibo import gates +from qibo.config import log, raise_error +from qibo.models import Circuit +from qibo.transpiler.abstract import Router, _find_gates_qubits_pairs +from qibo.transpiler.blocks import Block, CircuitBlocks +from qibo.transpiler.exceptions import ConnectivityError +from qibo.transpiler.placer import assert_placement + + +def assert_connectivity(connectivity: nx.Graph, circuit: Circuit): + """Assert if a circuit can be executed on Hardware. + + No gates acting on more than two qubits. + All two-qubit operations can be performed on hardware. + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): circuit model to check. + connectivity (:class:`networkx.Graph`): chip connectivity. + """ + + for gate in circuit.queue: + if len(gate.qubits) > 2 and not isinstance(gate, gates.M): + raise_error(ConnectivityError, f"{gate.name} acts on more than two qubits.") + if len(gate.qubits) == 2: + if (gate.qubits[0], gate.qubits[1]) not in connectivity.edges: + raise_error( + ConnectivityError, + f"Circuit does not respect connectivity. {gate.name} acts on {gate.qubits}.", + ) + + +# TODO: make this class work with CircuitMap +class ShortestPaths(Router): + """A class to perform initial qubit mapping and connectivity matching. + + Args: + connectivity (:class:`networkx.Graph`): chip connectivity. + sampling_split (float, optional): fraction of paths tested + (between :math:`0` and :math:`1`). Defaults to :math:`1.0`. + verbose (bool, optional): If ``True``, print info messages. Defaults to ``False``. + """ + + def __init__( + self, connectivity: nx.Graph, sampling_split: float = 1.0, verbose: bool = False + ): + self.connectivity = connectivity + self.sampling_split = sampling_split + self.verbose = verbose + + self.initial_layout = None + self._added_swaps = 0 + self.final_map = None + self._gates_qubits_pairs = None + self._mapping = None + self._swap_map = None + self._added_swaps_list = [] + self._graph = None + self._qubit_map = None + self._transpiled_circuit = None + self._circuit_position = 0 + + def __call__(self, circuit: Circuit, initial_layout: dict): + """Circuit connectivity matching. + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): circuit to be matched to hardware connectivity. + initial_layout (dict): initial physical-to-logical qubit mapping + + Returns: + (:class:`qibo.models.circuit.Circuit`, dict): circut mapped to hardware topology, and final qubit mapping. + """ + self._mapping = initial_layout + init_qubit_map = np.asarray(list(initial_layout.values())) + self._initial_checks(circuit.nqubits) + self._gates_qubits_pairs = _find_gates_qubits_pairs(circuit) + self._mapping = dict(zip(range(len(initial_layout)), initial_layout.values())) + self._graph = nx.relabel_nodes(self.connectivity, self._mapping) + self._qubit_map = np.sort(init_qubit_map) + self._swap_map = deepcopy(init_qubit_map) + self._first_transpiler_step(circuit) + + while len(self._gates_qubits_pairs) != 0: + self._transpiler_step(circuit) + hardware_mapped_circuit = self._remap_circuit(np.argsort(init_qubit_map)) + final_mapping = { + "q" + str(j): self._swap_map[j] + for j in range(self._graph.number_of_nodes()) + } + + return hardware_mapped_circuit, final_mapping + + @property + def added_swaps(self): + """Number of added swaps during transpiling.""" + return self._added_swaps + + @property + def sampling_split(self): + """Fraction of possible shortest paths to be analyzed.""" + return self._sampling_split + + @sampling_split.setter + def sampling_split(self, sampling_split: float): + """Set the sampling split, the fraction of possible shortest paths to be analyzed. + + Args: + sampling_split (float): define fraction of shortest path tested. + """ + + if 0.0 < sampling_split <= 1.0: + self._sampling_split = sampling_split + else: + raise_error(ValueError, "Sampling_split must be in (0:1].") + + def _transpiler_step(self, circuit: Circuit): + """Transpilation step. Find new mapping, add swap gates and apply gates that can be run with this configuration. + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): circuit to be transpiled. + """ + len_before_step = len(self._gates_qubits_pairs) + path, meeting_point = self._relocate() + self._add_swaps(path, meeting_point) + self._update_qubit_map() + self._add_gates(circuit, len_before_step - len(self._gates_qubits_pairs)) + + def _first_transpiler_step(self, circuit: Circuit): + """First transpilation step. Apply gates that can be run with the initial qubit mapping. + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): circuit to be transpiled. + """ + self._circuit_position = 0 + self._added_swaps = 0 + self._added_swaps_list = [] + len_2q_circuit = len(self._gates_qubits_pairs) + self._gates_qubits_pairs = self._reduce(self._graph) + self._add_gates(circuit, len_2q_circuit - len(self._gates_qubits_pairs)) + + def _reduce(self, graph: nx.Graph): + """Reduces the circuit by deleting two-qubit gates if it can be applied on the current configuration. + + Args: + graph (:class:`networkx.Graph`): current hardware qubit mapping. + + Returns: + (list): reduced circuit. + """ + new_circuit = self._gates_qubits_pairs.copy() + while ( + new_circuit != [] + and (new_circuit[0][0], new_circuit[0][1]) in graph.edges() + ): + del new_circuit[0] + return new_circuit + + def _map_list(self, path: list): + """Return all possible walks of qubits, or a fraction, for a given path. + + Args: + path (list): path to move qubits. + + Returns: + (list, list): all possible walks of qubits, or a fraction of them based on self.sampling_split, for a given path, and qubit meeting point for each path. + """ + path_ends = [path[0], path[-1]] + path_middle = path[1:-1] + mapping_list = [] + meeting_point_list = [] + test_paths = range(len(path) - 1) + if self.sampling_split != 1.0: + test_paths = np.random.choice( + test_paths, + size=int(np.ceil(len(test_paths) * self.sampling_split)), + replace=False, + ) + for i in test_paths: + values = path_middle[:i] + path_ends + path_middle[i:] + mapping = dict(zip(path, values)) + mapping_list.append(mapping) + meeting_point_list.append(i) + + return mapping_list, meeting_point_list + + def _relocate(self): + """Greedy algorithm to decide which path to take, and how qubits should walk. + + Returns: + (list, int): best path to move qubits and qubit meeting point in the path. + """ + nodes = self._graph.number_of_nodes() + circuit = self._reduce(self._graph) + final_circuit = circuit + keys = list(range(nodes)) + final_graph = self._graph + final_mapping = dict(zip(keys, keys)) + # Consider all shortest paths + path_list = [ + p + for p in nx.all_shortest_paths( + self._graph, source=circuit[0][0], target=circuit[0][1] + ) + ] + self._added_swaps += len(path_list[0]) - 2 + # Here test all paths + for path in path_list: + # map_list uses self.sampling_split + list_, meeting_point_list = self._map_list(path) + for j, mapping in enumerate(list_): + new_graph = nx.relabel_nodes(self._graph, mapping) + new_circuit = self._reduce(new_graph) + # Greedy looking for the optimal path and the optimal walk on this path + if len(new_circuit) < len(final_circuit): + final_graph = new_graph + final_circuit = new_circuit + final_mapping = mapping + final_path = path + meeting_point = meeting_point_list[j] + self._graph = final_graph + self._mapping = final_mapping + self._gates_qubits_pairs = final_circuit + + return final_path, meeting_point + + def _initial_checks(self, qubits: int): + """Initializes the transpiled circuit and check if it can be mapped to the defined connectivity. + + Args: + qubits (int): number of qubits in the circuit to be transpiled. + """ + nodes = self.connectivity.number_of_nodes() + if qubits > nodes: + raise_error( + ValueError, + "There are not enough physical qubits in the hardware to map the circuit.", + ) + if qubits == nodes: + new_circuit = Circuit(nodes) + else: + if self.verbose: + log.info( + "You are using more physical qubits than required by the circuit, some ancillary qubits will be added to the circuit." + ) + new_circuit = Circuit(nodes) + assert_placement(new_circuit, self._mapping) + self._transpiled_circuit = new_circuit + + def _add_gates(self, circuit: Circuit, matched_gates: int): + """Adds one and two qubit gates to transpiled circuit until connectivity is matched. + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): circuit to be transpiled. + matched_gates (int): number of two-qubit gates that + can be applied with the current qubit mapping. + """ + index = 0 + while self._circuit_position < len(circuit.queue): + gate = circuit.queue[self._circuit_position] + if isinstance(gate, gates.M): + measured_qubits = gate.qubits + self._transpiled_circuit.add( + gate.on_qubits( + { + measured_qubits[i]: self._qubit_map[measured_qubits[i]] + for i in range(len(measured_qubits)) + } + ) + ) + self._circuit_position += 1 + elif len(gate.qubits) == 1: + self._transpiled_circuit.add( + gate.on_qubits({gate.qubits[0]: self._qubit_map[gate.qubits[0]]}) + ) + self._circuit_position += 1 + else: + index += 1 + if index == matched_gates + 1: + break + self._transpiled_circuit.add( + gate.on_qubits( + { + gate.qubits[0]: self._qubit_map[gate.qubits[0]], + gate.qubits[1]: self._qubit_map[gate.qubits[1]], + } + ) + ) + self._circuit_position += 1 + + def _add_swaps(self, path: list, meeting_point: int): + """Adds swaps to the transpiled circuit to move qubits. + + Args: + path (list): path to move qubits. + meeting_point (int): qubit meeting point in the path. + """ + forward = path[0 : meeting_point + 1] + backward = list(reversed(path[meeting_point + 1 :])) + if len(forward) > 1: + for f1, f2 in zip(forward[:-1], forward[1:]): + gate = gates.SWAP(self._qubit_map[f1], self._qubit_map[f2]) + self._transpiled_circuit.add(gate) + self._added_swaps_list.append(gate) + + if len(backward) > 1: + for b1, b2 in zip(backward[:-1], backward[1:]): + gate = gates.SWAP(self._qubit_map[b1], self._qubit_map[b2]) + self._transpiled_circuit.add(gate) + self._added_swaps_list.append(gate) + + def _update_swap_map(self, swap: tuple): + """Updates the qubit swap map.""" + temp = self._swap_map[swap[0]] + self._swap_map[swap[0]] = self._swap_map[swap[1]] + self._swap_map[swap[1]] = temp + + def _update_qubit_map(self): + """Update the qubit mapping after adding swaps.""" + old_mapping = self._qubit_map.copy() + for key, value in self._mapping.items(): + self._qubit_map[value] = old_mapping[key] + + def _remap_circuit(self, qubit_map): + """Map logical to physical qubits in a circuit. + + Args: + qubit_map (ndarray): new qubit mapping. + + Returns: + (:class:`qibo.models.circuit.Circuit`): transpiled circuit mapped with initial qubit mapping. + """ + new_circuit = Circuit(self._transpiled_circuit.nqubits) + for gate in self._transpiled_circuit.queue: + new_circuit.add(gate.on_qubits({q: qubit_map[q] for q in gate.qubits})) + if gate in self._added_swaps_list: + self._update_swap_map( + tuple(qubit_map[gate.qubits[i]] for i in range(2)) + ) + return new_circuit + + +class CircuitMap: + """Class to keep track of the circuit and physical-logical mapping during routing, + this class also implements the initial two qubit blocks decomposition. + + Args: + initial_layout (dict): initial logical-to-physical qubit mapping. + circuit (Circuit): circuit to be routed. + """ + + def __init__(self, initial_layout: dict, circuit: Circuit): + self.circuit_blocks = CircuitBlocks(circuit, index_names=True) + self._circuit_logical = list(range(len(initial_layout))) + self._physical_logical = list(initial_layout.values()) + self._routed_blocks = CircuitBlocks(Circuit(circuit.nqubits)) + self._swaps = 0 + + def blocks_qubits_pairs(self): + """Returns a list containing the qubit pairs of each block.""" + return [block.qubits for block in self.circuit_blocks()] + + def execute_block(self, block: Block): + """Executes a block by removing it from the circuit representation + and adding it to the routed circuit. + """ + self._routed_blocks.add_block(block.on_qubits(self.get_physical_qubits(block))) + self.circuit_blocks.remove_block(block) + + def routed_circuit(self): + """Returns circuit of the routed circuit.""" + return self._routed_blocks.circuit() + + def final_layout(self): + """Returns the final physical-circuit qubits mapping.""" + unsorted_dict = { + "q" + str(self.circuit_to_physical(i)): i + for i in range(len(self._circuit_logical)) + } + return dict(sorted(unsorted_dict.items())) + + def update(self, swap: tuple): + """Updates the logical-physical qubit mapping after applying a SWAP + and add the SWAP gate to the routed blocks, the swap is represented by a tuple containing + the logical qubits to be swapped. + """ + physical_swap = self.logical_to_physical(swap) + self._routed_blocks.add_block( + Block(qubits=physical_swap, gates=[gates.SWAP(*physical_swap)]) + ) + self._swaps += 1 + idx_0, idx_1 = self._circuit_logical.index( + swap[0] + ), self._circuit_logical.index(swap[1]) + self._circuit_logical[idx_0], self._circuit_logical[idx_1] = swap[1], swap[0] + + def get_logical_qubits(self, block: Block): + """Returns the current logical qubits where a block is acting""" + return self.circuit_to_logical(block.qubits) + + def get_physical_qubits(self, block: Block or int): + """Returns the physical qubits where a block is acting.""" + if isinstance(block, int): + block = self.circuit_blocks.search_by_index(block) + return self.logical_to_physical(self.get_logical_qubits(block)) + + def logical_to_physical(self, logical_qubits: tuple): + """Returns the physical qubits associated to the logical qubits.""" + return tuple(self._physical_logical.index(logical_qubits[i]) for i in range(2)) + + def circuit_to_logical(self, circuit_qubits: tuple): + """Returns the current logical qubits associated to the initial circuit qubits.""" + return tuple(self._circuit_logical[circuit_qubits[i]] for i in range(2)) + + def circuit_to_physical(self, circuit_qubit: int): + """Returns the current physical qubit associated to an initial circuit qubit.""" + return self._physical_logical.index(self._circuit_logical[circuit_qubit]) + + +class Sabre(Router): + def __init__( + self, + connectivity: nx.Graph, + lookahead: int = 2, + decay_lookahead: float = 0.6, + delta: float = 0.001, + seed=None, + ): + """Routing algorithm proposed in Ref [1]. + + Args: + connectivity (dict): hardware chip connectivity. + lookahead (int): lookahead factor, how many dag layers will be considered in computing the cost. + decay_lookahead (float): value in interval [0,1]. + How the weight of the distance in the dag layers decays in computing the cost. + delta (float): this parameter defines the number of swaps vs depth trade-off by deciding + how the algorithm tends to select non-overlapping SWAPs. + seed (int): seed for the candidate random choice as tiebraker. + + References: + 1. G. Li, Y. Ding, and Y. Xie, *Tackling the Qubit Mapping Problem for NISQ-Era Quantum Devices*. + `arXiv:1809.02573 [cs.ET] `_. + """ + self.connectivity = connectivity + self.lookahead = lookahead + self.decay = decay_lookahead + self.delta = delta + self._delta_register = None + self._dist_matrix = None + self._dag = None + self._front_layer = None + self.circuit = None + self._memory_map = None + random.seed(seed) + + def __call__(self, circuit: Circuit, initial_layout: dict): + """Route the circuit. + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): circuit to be routed. + initial_layout (dict): initial physical to logical qubit mapping. + + Returns: + (:class:`qibo.models.circuit.Circuit`, dict): routed circuit and final layout. + """ + self._preprocessing(circuit=circuit, initial_layout=initial_layout) + while self._dag.number_of_nodes() != 0: + execute_block_list = self._check_execution() + if execute_block_list is not None: + self._execute_blocks(execute_block_list) + else: + self._find_new_mapping() + + return self.circuit.routed_circuit(), self.circuit.final_layout() + + @property + def added_swaps(self): + """Number of SWAP gates added to the circuit during routing.""" + return self.circuit._swaps + + def _preprocessing(self, circuit: Circuit, initial_layout: dict): + """The following objects will be initialised: + - circuit: class to represent circuit and to perform logical-physical qubit mapping. + - _dist_matrix: matrix reporting the shortest path lengh between all node pairs. + - _dag: direct acyclic graph of the circuit based on commutativity. + - _memory_map: list to remember previous SWAP moves. + - _front_layer: list containing the blocks to be executed. + - _delta_register: list containing the special weigh added to qubits + to prevent overlapping swaps. + """ + self.circuit = CircuitMap(initial_layout, circuit) + self._dist_matrix = nx.floyd_warshall_numpy(self.connectivity) + self._dag = _create_dag(self.circuit.blocks_qubits_pairs()) + self._memory_map = [] + self._update_dag_layers() + self._update_front_layer() + self._delta_register = [1.0 for _ in range(circuit.nqubits)] + + def _update_dag_layers(self): + for layer, nodes in enumerate(nx.topological_generations(self._dag)): + for node in nodes: + self._dag.nodes[node]["layer"] = layer + + def _update_front_layer(self): + """Update the front layer of the dag.""" + self._front_layer = self._get_dag_layer(0) + + def _get_dag_layer(self, n_layer): + """Return the :math:`n`-topological layer of the dag.""" + return [node[0] for node in self._dag.nodes(data="layer") if node[1] == n_layer] + + def _find_new_mapping(self): + """Find the new best mapping by adding one swap.""" + candidates_evaluation = {} + self._memory_map.append(deepcopy(self.circuit._circuit_logical)) + for candidate in self._swap_candidates(): + candidates_evaluation[candidate] = self._compute_cost(candidate) + best_cost = min(candidates_evaluation.values()) + best_candidates = [ + key for key, value in candidates_evaluation.items() if value == best_cost + ] + best_candidate = random.choice(best_candidates) + for qubit in self.circuit.logical_to_physical(best_candidate): + self._delta_register[qubit] += self.delta + self.circuit.update(best_candidate) + + def _compute_cost(self, candidate): + """Compute the cost associated to a possible SWAP candidate.""" + temporary_circuit = deepcopy(self.circuit) + temporary_circuit.update(candidate) + if temporary_circuit._circuit_logical in self._memory_map: + return float("inf") + tot_distance = 0.0 + weight = 1.0 + for layer in range(self.lookahead + 1): + layer_gates = self._get_dag_layer(layer) + avg_layer_distance = 0.0 + for gate in layer_gates: + qubits = temporary_circuit.get_physical_qubits(gate) + avg_layer_distance += ( + max(self._delta_register[i] for i in qubits) + * (self._dist_matrix[qubits[0], qubits[1]] - 1.0) + / len(layer_gates) + ) + tot_distance += weight * avg_layer_distance + weight *= self.decay + return tot_distance + + def _swap_candidates(self): + """Return a list of possible candidate SWAPs (to be applied on logical qubits directly). + The possible candidates are the ones sharing at least one qubit with a block in the front layer. + """ + candidates = [] + for block in self._front_layer: + for qubit in self.circuit.get_physical_qubits(block): + for connected in self.connectivity.neighbors(qubit): + candidate = tuple( + sorted( + ( + self.circuit._physical_logical[qubit], + self.circuit._physical_logical[connected], + ) + ) + ) + if candidate not in candidates: + candidates.append(candidate) + return candidates + + def _check_execution(self): + """Check if some gatesblocks in the front layer can be executed in the current configuration. + + Returns: + (list): executable blocks if there are, ``None`` otherwise. + """ + executable_blocks = [] + for block in self._front_layer: + if ( + self.circuit.get_physical_qubits(block) in self.connectivity.edges + or not self.circuit.circuit_blocks.search_by_index(block).entangled + ): + executable_blocks.append(block) + if len(executable_blocks) == 0: + return None + return executable_blocks + + def _execute_blocks(self, blocklist: list): + """Execute a list of blocks: + -Remove the correspondent nodes from the dag and circuit representation. + -Add the executed blocks to the routed circuit. + -Update the dag layers and front layer. + -Reset the mapping memory. + """ + for block_id in blocklist: + block = self.circuit.circuit_blocks.search_by_index(block_id) + self.circuit.execute_block(block) + self._dag.remove_node(block_id) + self._update_dag_layers() + self._update_front_layer() + self._memory_map = [] + self._delta_register = [1.0 for _ in self._delta_register] + + +def _create_dag(gates_qubits_pairs): + """Helper method for :meth:`qibo.transpiler.router.Sabre`. + Create direct acyclic graph (dag) of the circuit based on two qubit gates commutativity relations. + + Args: + gates_qubits_pairs (list): list of qubits tuples where gates/blocks acts. + + Returns: + (:class:`networkx.DiGraph`): adjoint of the circuit. + """ + dag = nx.DiGraph() + dag.add_nodes_from(range(len(gates_qubits_pairs))) + # Find all successors + connectivity_list = [] + for idx, gate in enumerate(gates_qubits_pairs): + saturated_qubits = [] + for next_idx, next_gate in enumerate(gates_qubits_pairs[idx + 1 :]): + for qubit in gate: + if (qubit in next_gate) and (not qubit in saturated_qubits): + saturated_qubits.append(qubit) + connectivity_list.append((idx, next_idx + idx + 1)) + if len(saturated_qubits) >= 2: + break + dag.add_edges_from(connectivity_list) + return _remove_redundant_connections(dag) + + +def _remove_redundant_connections(dag: nx.Graph): + """Remove redundant connection from a DAG unsing transitive reduction.""" + new_dag = nx.DiGraph() + new_dag.add_nodes_from(range(dag.number_of_nodes())) + transitive_reduction = nx.transitive_reduction(dag) + new_dag.add_edges_from(transitive_reduction.edges) + return new_dag diff --git a/src/qibo/transpiler/star_connectivity.py b/src/qibo/transpiler/star_connectivity.py new file mode 100644 index 0000000000..3439211be9 --- /dev/null +++ b/src/qibo/transpiler/star_connectivity.py @@ -0,0 +1,124 @@ +from qibo import Circuit, gates +from qibo.transpiler.abstract import Router +from qibo.transpiler.router import ConnectivityError + + +class StarConnectivity(Router): + """Transforms an arbitrary circuit to one that can be executed on hardware. + + This transpiler produces a circuit that respects the following connectivity: + + q + | + q -- q -- q + | + q + + by adding SWAP gates when needed. + + Args: + connectivity (:class:`networkx.Graph`): chip connectivity, not used for this transpiler. + middle_qubit (int, optional): qubit id of the qubit that is in the middle of the star. + """ + + def __init__(self, connectivity=None, middle_qubit: int = 2): + self.middle_qubit = middle_qubit + + def __call__(self, circuit: Circuit, initial_layout=None): + """Apply the transpiler transformation on a given circuit. + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): The original Qibo circuit to transform. + This circuit must contain up to two-qubit gates. + + Returns: + (:class:`qibo.models.circuit.Circuit`, list): circuit that performs the same operation + as the original but respects the hardware connectivity, + and list that maps logical to hardware qubits. + """ + + middle_qubit = self.middle_qubit + # find the number of qubits for hardware circuit + if circuit.nqubits == 1: + nqubits = 1 + else: + nqubits = max(circuit.nqubits, middle_qubit + 1) + # new circuit object that will be compatible with hardware connectivity + new = circuit.__class__(nqubits) + # list to maps logical to hardware qubits + hardware_qubits = list(range(nqubits)) + + # find initial qubit mapping + for i, gate in enumerate(circuit.queue): + if len(gate.qubits) == 2: + if middle_qubit not in gate.qubits: + new_middle = _find_connected_qubit( + gate.qubits, circuit.queue[i + 1 :], hardware_qubits + ) + hardware_qubits[middle_qubit], hardware_qubits[new_middle] = ( + hardware_qubits[new_middle], + hardware_qubits[middle_qubit], + ) + break + + # the first SWAP is not needed as it can be applied via virtual mapping + add_swap = False + for i, gate in enumerate(circuit.queue): + # map gate qubits to hardware + qubits = tuple(hardware_qubits.index(q) for q in gate.qubits) + if isinstance(gate, gates.M): + new_gate = gates.M(*qubits, **gate.init_kwargs) + new_gate.result = gate.result + new.add(new_gate) + continue + + if len(qubits) > 2: + raise ConnectivityError( + "Gates targeting more than two qubits are not supported." + ) + + elif len(qubits) == 2 and middle_qubit not in qubits: + # find which qubit should be moved to 0 + new_middle = _find_connected_qubit( + qubits, circuit.queue[i + 1 :], hardware_qubits + ) + # update hardware qubits according to the swap + hardware_qubits[middle_qubit], hardware_qubits[new_middle] = ( + hardware_qubits[new_middle], + hardware_qubits[middle_qubit], + ) + if add_swap: + new.add(gates.SWAP(middle_qubit, new_middle)) + # update gate qubits according to the new swap + qubits = tuple(hardware_qubits.index(q) for q in gate.qubits) + + # add gate to the hardware circuit + if isinstance(gate, gates.Unitary): + # gates.Unitary requires matrix as first argument + matrix = gate.init_args[0] + new.add(gate.__class__(matrix, *qubits, **gate.init_kwargs)) + else: + new.add(gate.__class__(*qubits, **gate.init_kwargs)) + if len(qubits) == 2: + add_swap = True + hardware_qubits_keys = ["q" + str(i) for i in range(5)] + return new, dict(zip(hardware_qubits_keys, hardware_qubits)) + + +def _find_connected_qubit(qubits, queue, hardware_qubits): + """Helper method for :meth:`qibo.transpiler.StarConnectivity`. + + Finds which qubit should be mapped to hardware middle qubit + by looking at the two-qubit gates that follow. + """ + possible_qubits = set(qubits) + for next_gate in queue: + if len(next_gate.qubits) == 2: + possible_qubits &= {hardware_qubits.index(q) for q in next_gate.qubits} + if not possible_qubits: + # freedom of choice + return qubits[0] + elif len(possible_qubits) == 1: + return possible_qubits.pop() + # freedom of choice + return qubits[0] diff --git a/src/qibo/transpiler/unitary_decompositions.py b/src/qibo/transpiler/unitary_decompositions.py new file mode 100644 index 0000000000..e737ba649e --- /dev/null +++ b/src/qibo/transpiler/unitary_decompositions.py @@ -0,0 +1,291 @@ +import numpy as np + +from qibo import gates, matrices +from qibo.backends import GlobalBackend, NumpyBackend +from qibo.config import raise_error + +magic_basis = np.array( + [[1, -1j, 0, 0], [0, 0, 1, -1j], [0, 0, -1, -1j], [1, 1j, 0, 0]] +) / np.sqrt(2) + +bell_basis = np.array( + [[1, 1, 0, 0], [0, 0, 1, 1], [0, 0, 1, -1], [1, -1, 0, 0]] +) / np.sqrt(2) + +H = np.array([[1, 1], [1, -1]]) / np.sqrt(2) + + +def u3_decomposition(unitary): + """Decomposes arbitrary one-qubit gates to U3. + + Args: + unitary (ndarray): Unitary :math:`2 \\times 2` matrix to be decomposed. + + Returns: + (float, float, float): parameters of U3 gate. + """ + # https://github.com/Qiskit/qiskit-terra/blob/d2e3340adb79719f9154b665e8f6d8dc26b3e0aa/qiskit/quantum_info/synthesis/one_qubit_decompose.py#L221 + su2 = unitary / np.sqrt(np.linalg.det(unitary)) + theta = 2 * np.arctan2(abs(su2[1, 0]), abs(su2[0, 0])) + plus = np.angle(su2[1, 1]) + minus = np.angle(su2[1, 0]) + phi = plus + minus + lam = plus - minus + + return theta, phi, lam + + +def calculate_psi(unitary, magic_basis=magic_basis, backend=None): + """Solves the eigenvalue problem of :math:`U^{T} U`. + + See step (1) of Appendix A in arXiv:quant-ph/0011050. + + Args: + unitary (ndarray): Unitary matrix of the gate we are decomposing + in the computational basis. + magic_basis (ndarray, optional): basis in which to solve the eigenvalue problem. + Defaults to ``magic basis``. + backend (:class:`qibo.backends.abstract.Backend`): Backend to use for calculations. + + Returns: + (ndarray) Eigenvectors in the computational basis and eigenvalues of :math:`U^{T} U`. + """ + if backend is None: # pragma: no cover + backend = GlobalBackend() + + if backend.__class__.__name__ in [ + "CupyBackend", + "CuQuantumBackend", + ]: # pragma: no cover + raise_error( + NotImplementedError, + f"{backend.__class__.__name__} does not support `linalg.eig.`", + ) + + magic_basis = backend.cast(magic_basis, dtype=magic_basis.dtype) + # write unitary in magic basis + u_magic = np.transpose(np.conj(magic_basis)) @ unitary @ magic_basis + # construct and diagonalize UT_U + ut_u = np.transpose(u_magic) @ u_magic + # When the matrix given to np.linalg.eig is a diagonal matrix up to machine precision the decomposition + # is not accurate anymore. decimals = 20 works for random 2q Clifford unitaries. + eigvals, psi_magic = np.linalg.eig(np.round(ut_u, decimals=20)) + # orthogonalize eigenvectors in the case of degeneracy (Gram-Schmidt) + psi_magic, _ = np.linalg.qr(psi_magic) + # write psi in computational basis + psi = np.dot(magic_basis, psi_magic) + return psi, eigvals + + +def schmidt_decompose(state): + """Decomposes a two-qubit product state to its single-qubit parts. + + Args: + state (ndarray): product state to be decomposed. + + Returns: + (ndarray, ndarray): decomposition + + """ + u, d, v = np.linalg.svd(np.reshape(state, (2, 2))) + if not np.allclose(d, [1, 0]): # pragma: no cover + raise_error( + ValueError, + f"Unexpected singular values: {d}\nCan only decompose product states.", + ) + return u[:, 0], v[0] + + +def calculate_single_qubit_unitaries(psi): + """Calculates local unitaries that maps a maximally entangled basis to the magic basis. + + See Lemma 1 of Appendix A in arXiv:quant-ph/0011050. + + Args: + psi (ndarray): Maximally entangled two-qubit states that define a basis. + + Returns: + (ndarray, ndarray): Local unitaries UA and UB that map the given basis to the magic basis. + """ + + # TODO: Handle the case where psi is not real in the magic basis + psi_magic = np.dot(np.conj(magic_basis).T, psi) + if not np.allclose(psi_magic.imag, np.zeros_like(psi_magic)): # pragma: no cover + raise_error(NotImplementedError, "Given state is not real in the magic basis.") + psi_bar = np.copy(psi).T + + # find e and f by inverting (A3), (A4) + ef = (psi_bar[0] + 1j * psi_bar[1]) / np.sqrt(2) + e_f_ = (psi_bar[0] - 1j * psi_bar[1]) / np.sqrt(2) + e, f = schmidt_decompose(ef) + e_, f_ = schmidt_decompose(e_f_) + # find exp(1j * delta) using (A5a) + ef_ = np.kron(e, f_) + phase = 1j * np.sqrt(2) * np.dot(np.conj(ef_), psi_bar[2]) + + # construct unitaries UA, UB using (A6a), (A6b) + ua = np.tensordot([1, 0], np.conj(e), axes=0) + phase * np.tensordot( + [0, 1], np.conj(e_), axes=0 + ) + ub = np.tensordot([1, 0], np.conj(f), axes=0) + np.conj(phase) * np.tensordot( + [0, 1], np.conj(f_), axes=0 + ) + return ua, ub + + +def calculate_diagonal(unitary, ua, ub, va, vb): + """Calculates Ud matrix that can be written as exp(-iH). + + See Eq. (A1) in arXiv:quant-ph/0011050. + Ud is diagonal in the magic and Bell basis. + """ + # normalize U_A, U_B, V_A, V_B so that detU_d = 1 + # this is required so that sum(lambdas) = 0 + # and Ud can be written as exp(-iH) + det = np.linalg.det(unitary) ** (1 / 16) + ua *= det + ub *= det + va *= det + vb *= det + u_dagger = np.transpose(np.conj(np.kron(ua, ub))) + v_dagger = np.transpose(np.conj(np.kron(va, vb))) + ud = u_dagger @ unitary @ v_dagger + return ua, ub, ud, va, vb + + +def magic_decomposition(unitary, backend=None): + if backend is None: # pragma: no cover + backend = GlobalBackend() + """Decomposes an arbitrary unitary to (A1) from arXiv:quant-ph/0011050.""" + psi, eigvals = calculate_psi(unitary, backend=backend) + psi_tilde = np.conj(np.sqrt(eigvals)) * np.dot(unitary, psi) + va, vb = calculate_single_qubit_unitaries(psi) + ua_dagger, ub_dagger = calculate_single_qubit_unitaries(psi_tilde) + ua, ub = np.transpose(np.conj(ua_dagger)), np.transpose(np.conj(ub_dagger)) + return calculate_diagonal(unitary, ua, ub, va, vb) + + +def to_bell_diagonal(ud, bell_basis=bell_basis, backend=None): + """Transforms a matrix to the Bell basis and checks if it is diagonal.""" + if backend is None: # pragma: no cover + backend = GlobalBackend() + + ud = backend.cast(ud) + bell_basis = backend.cast(bell_basis, dtype=bell_basis.dtype) + + ud_bell = np.transpose(np.conj(bell_basis)) @ ud @ bell_basis + ud_diag = np.diag(ud_bell) + if not np.allclose(np.diag(ud_diag), ud_bell): # pragma: no cover + return None + uprod = np.prod(ud_diag) + if not np.allclose(uprod, 1): # pragma: no cover + return None + return ud_diag + + +def calculate_h_vector(ud_diag): + """Finds h parameters corresponding to exp(-iH). + + See Eq. (4)-(5) in arXiv:quant-ph/0307177. + """ + lambdas = -np.angle(ud_diag) + hx = (lambdas[0] + lambdas[2]) / 2.0 + hy = (lambdas[1] + lambdas[2]) / 2.0 + hz = (lambdas[0] + lambdas[1]) / 2.0 + return hx, hy, hz + + +def cnot_decomposition(q0, q1, hx, hy, hz): + """Performs decomposition (6) from arXiv:quant-ph/0307177.""" + u3 = -1j * matrices.H + # use corrected version from PRA paper (not arXiv) + u2 = -u3 @ gates.RX(0, 2 * hx - np.pi / 2).matrix(NumpyBackend()) + # add an extra exp(-i pi / 4) global phase to get exact match + v2 = np.exp(-1j * np.pi / 4) * gates.RZ(0, 2 * hz).matrix(NumpyBackend()) + v3 = gates.RZ(0, -2 * hy).matrix(NumpyBackend()) + w = (matrices.I - 1j * matrices.X) / np.sqrt(2) + # change CNOT to CZ using Hadamard gates + return [ + gates.H(q1), + gates.CZ(q0, q1), + gates.Unitary(u2, q0), + gates.Unitary(H @ v2 @ H, q1), + gates.CZ(q0, q1), + gates.Unitary(u3, q0), + gates.Unitary(H @ v3 @ H, q1), + gates.CZ(q0, q1), + gates.Unitary(w, q0), + gates.Unitary(np.conj(w).T @ H, q1), + ] + + +def cnot_decomposition_light(q0, q1, hx, hy): + """Performs decomposition (24) from arXiv:quant-ph/0307177.""" + w = (matrices.I - 1j * matrices.X) / np.sqrt(2) + u2 = gates.RX(0, 2 * hx).matrix(NumpyBackend()) + v2 = gates.RZ(0, -2 * hy).matrix(NumpyBackend()) + # change CNOT to CZ using Hadamard gates + return [ + gates.Unitary(np.conj(w).T, q0), + gates.Unitary(H @ w, q1), + gates.CZ(q0, q1), + gates.Unitary(u2, q0), + gates.Unitary(H @ v2 @ H, q1), + gates.CZ(q0, q1), + gates.Unitary(w, q0), + gates.Unitary(np.conj(w).T @ H, q1), + ] + + +def two_qubit_decomposition(q0, q1, unitary, backend=None): + """Performs two qubit unitary gate decomposition (24) from arXiv:quant-ph/0307177. + + Args: + q0 (int): index of the first qubit. + q1 (int): index of the second qubit. + unitary (ndarray): Unitary :math:`4 \\times 4` to be decomposed. + + Returns: + (list): gates implementing decomposition (24) from arXiv:quant-ph/0307177 + """ + if backend is None: # pragma: no cover + backend = GlobalBackend() + + ud_diag = to_bell_diagonal(unitary, backend=backend) + ud = None + if ud_diag is None: + u4, v4, ud, u1, v1 = magic_decomposition(unitary, backend=backend) + ud_diag = to_bell_diagonal(ud, backend=backend) + + hx, hy, hz = calculate_h_vector(ud_diag) + hx, hy, hz = float(hx), float(hy), float(hz) + if np.allclose([hx, hy, hz], [0, 0, 0]): + u4, v4, ud, u1, v1 = magic_decomposition(unitary, backend=backend) + gatelist = [gates.Unitary(u4 @ u1, q0), gates.Unitary(v4 @ v1, q1)] + elif np.allclose(hz, 0): + gatelist = cnot_decomposition_light(q0, q1, hx, hy) + if ud is None: + return gatelist + g0, g1 = gatelist[:2] + gatelist[0] = gates.Unitary(g0.parameters[0] @ u1, q0) + gatelist[1] = gates.Unitary(g1.parameters[0] @ v1, q1) + + g0, g1 = gatelist[-2:] + gatelist[-2] = gates.Unitary(u4 @ g0.parameters[0], q0) + gatelist[-1] = gates.Unitary(v4 @ g1.parameters[0], q1) + + else: + cnot_dec = cnot_decomposition(q0, q1, hx, hy, hz) + if ud is None: + return cnot_dec + + gatelist = [ + gates.Unitary(u1, q0), + gates.Unitary(H @ v1, q1), + ] + gatelist.extend(cnot_dec[1:]) + g0, g1 = gatelist[-2:] + gatelist[-2] = gates.Unitary(u4 @ g0.parameters[0], q0) + gatelist[-1] = gates.Unitary(v4 @ g1.parameters[0], q1) + + return gatelist diff --git a/src/qibo/transpiler/unroller.py b/src/qibo/transpiler/unroller.py new file mode 100644 index 0000000000..74f42ace99 --- /dev/null +++ b/src/qibo/transpiler/unroller.py @@ -0,0 +1,470 @@ +import numpy as np + +from qibo import gates +from qibo.backends import NumpyBackend +from qibo.config import raise_error +from qibo.models import Circuit +from qibo.transpiler.abstract import NativeType, Unroller +from qibo.transpiler.exceptions import DecompositionError +from qibo.transpiler.unitary_decompositions import ( + two_qubit_decomposition, + u3_decomposition, +) + +backend = NumpyBackend() + + +# TODO: Make setting single-qubit native gates more flexible +class NativeGates(Unroller): + """Translates a circuit to native gates. + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): circuit model to translate + into native gates. + single_qubit_natives (tuple): single qubit native gates. + two_qubit_natives (:class:`qibo.transpiler.abstract.NativeType`): two-qubit native gates + supported by the quantum hardware. + + Returns: + (:class:`qibo.models.circuit.Circuit`): equivalent circuit with native gates. + """ + + def __init__( + self, + two_qubit_natives: NativeType, + single_qubit_natives=(gates.I, gates.Z, gates.RZ, gates.U3), + translate_single_qubit: bool = True, + ): + self.two_qubit_natives = two_qubit_natives + self.single_qubit_natives = single_qubit_natives + self.translate_single_qubit = translate_single_qubit + + def __call__(self, circuit: Circuit): + two_qubit_translated_circuit = circuit.__class__(circuit.nqubits) + translated_circuit = circuit.__class__(circuit.nqubits) + for gate in circuit.queue: + if len(gate.qubits) > 1 or self.translate_single_qubit: + two_qubit_translated_circuit.add( + translate_gate(gate, self.two_qubit_natives) + ) + else: + two_qubit_translated_circuit.add(gate) + if self.translate_single_qubit: + for gate in two_qubit_translated_circuit.queue: + if len(gate.qubits) == 1: + translated_circuit.add(translate_gate(gate, self.two_qubit_natives)) + else: + translated_circuit.add(gate) + else: + translated_circuit = two_qubit_translated_circuit + return translated_circuit + + +def assert_decomposition( + circuit: Circuit, + two_qubit_natives: NativeType, + single_qubit_natives=(gates.I, gates.Z, gates.RZ, gates.U3), +): + """Checks if a circuit has been correctly decmposed into native gates. + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): circuit model to check. + """ + for gate in circuit.queue: + if isinstance(gate, gates.M): + continue + if len(gate.qubits) == 1: + if not isinstance(gate, single_qubit_natives): + raise_error( + DecompositionError, + f"{gate.name} is not a single qubit native gate.", + ) + elif len(gate.qubits) == 2: + try: + native_type_gate = NativeType.from_gate(gate) + if not (native_type_gate in two_qubit_natives): + raise_error( + DecompositionError, + f"{gate.name} is not a two qubit native gate.", + ) + except ValueError: + raise_error( + DecompositionError, f"{gate.name} is not a two qubit native gate." + ) + else: + raise_error( + DecompositionError, f"{gate.name} acts on more than two qubits." + ) + + +def translate_gate(gate, native_gates: NativeType): + """Maps gates to a hardware-native implementation. + + Args: + gate (:class:`qibo.gates.abstract.Gate`): gate to be decomposed. + native_gates (:class:`qibo.transpiler.abstract.NativeType`): + two-qubit native gates supported by the quantum hardware. + + Returns: + (list): List of native gates + """ + if isinstance(gate, (gates.M, gates.I, gates.Align)): + return gate + + if len(gate.qubits) == 1: + return onequbit_dec(gate) + + if native_gates is NativeType.CZ | NativeType.iSWAP: + # Check for a special optimized decomposition. + if gate.__class__ in opt_dec.decompositions: + return opt_dec(gate) + # Check if the gate has a CZ decomposition + if not gate.__class__ in iswap_dec.decompositions: + return cz_dec(gate) + # Check the decomposition with less 2 qubit gates. + else: + if cz_dec.count_2q(gate) < iswap_dec.count_2q(gate): + return cz_dec(gate) + elif cz_dec.count_2q(gate) > iswap_dec.count_2q(gate): + return iswap_dec(gate) + # If equal check the decomposition with less 1 qubit gates. + # This is never used for now but may be useful for future generalization + elif cz_dec.count_1q(gate) < iswap_dec.count_1q(gate): # pragma: no cover + return cz_dec(gate) + else: # pragma: no cover + return iswap_dec(gate) + elif native_gates is NativeType.CZ: + return cz_dec(gate) + elif native_gates is NativeType.iSWAP: + if gate.__class__ in iswap_dec.decompositions: + return iswap_dec(gate) + else: + # First decompose into CZ + cz_decomposed = cz_dec(gate) + # Then CZ are decomposed into iSWAP + iswap_decomposed = [] + for g in cz_decomposed: + # Need recursive function as gates.Unitary is not in iswap_dec + for g_translated in translate_gate(g, NativeType.iSWAP): + iswap_decomposed.append(g_translated) + return iswap_decomposed + else: # pragma: no cover + raise_error(NotImplementedError, "Use only CZ and/or iSWAP as native gates") + + +class GateDecompositions: + """Abstract data structure that holds decompositions of gates.""" + + def __init__(self): + self.decompositions = {} + + def add(self, gate, decomposition): + """Register a decomposition for a gate.""" + self.decompositions[gate] = decomposition + + def count_2q(self, gate): + """Count the number of two-qubit gates in the decomposition of the given gate.""" + if gate.parameters: + decomposition = self.decompositions[gate.__class__](gate) + else: + decomposition = self.decompositions[gate.__class__] + return len(tuple(g for g in decomposition if len(g.qubits) > 1)) + + def count_1q(self, gate): + """Count the number of single qubit gates in the decomposition of the given gate.""" + if gate.parameters: + decomposition = self.decompositions[gate.__class__](gate) + else: + decomposition = self.decompositions[gate.__class__] + return len(tuple(g for g in decomposition if len(g.qubits) == 1)) + + def __call__(self, gate): + """Decompose a gate.""" + decomposition = self.decompositions[gate.__class__] + if callable(decomposition): + decomposition = decomposition(gate) + return [ + g.on_qubits({i: q for i, q in enumerate(gate.qubits)}) + for g in decomposition + ] + + +onequbit_dec = GateDecompositions() +onequbit_dec.add(gates.H, [gates.U3(0, 7 * np.pi / 2, np.pi, 0)]) +onequbit_dec.add(gates.X, [gates.U3(0, np.pi, 0, np.pi)]) +onequbit_dec.add(gates.Y, [gates.U3(0, np.pi, 0, 0)]) +# apply virtually by changing ``phase`` instead of using pulses +onequbit_dec.add(gates.Z, [gates.Z(0)]) +onequbit_dec.add(gates.S, [gates.RZ(0, np.pi / 2)]) +onequbit_dec.add(gates.SDG, [gates.RZ(0, -np.pi / 2)]) +onequbit_dec.add(gates.T, [gates.RZ(0, np.pi / 4)]) +onequbit_dec.add(gates.TDG, [gates.RZ(0, -np.pi / 4)]) +onequbit_dec.add( + gates.RX, lambda gate: [gates.U3(0, gate.parameters[0], -np.pi / 2, np.pi / 2)] +) +onequbit_dec.add(gates.RY, lambda gate: [gates.U3(0, gate.parameters[0], 0, 0)]) +# apply virtually by changing ``phase`` instead of using pulses +onequbit_dec.add(gates.RZ, lambda gate: [gates.RZ(0, gate.parameters[0])]) +# apply virtually by changing ``phase`` instead of using pulses +onequbit_dec.add(gates.GPI2, lambda gate: [gates.GPI2(0, gate.parameters[0])]) +# implemented as single RX90 pulse +onequbit_dec.add(gates.U1, lambda gate: [gates.RZ(0, gate.parameters[0])]) +onequbit_dec.add( + gates.U2, + lambda gate: [gates.U3(0, np.pi / 2, gate.parameters[0], gate.parameters[1])], +) +onequbit_dec.add( + gates.U3, + lambda gate: [ + gates.U3(0, gate.parameters[0], gate.parameters[1], gate.parameters[2]) + ], +) +onequbit_dec.add( + gates.Unitary, + lambda gate: [gates.U3(0, *u3_decomposition(gate.parameters[0]))], +) +onequbit_dec.add( + gates.FusedGate, + lambda gate: [gates.U3(0, *u3_decomposition(gate.matrix(backend)))], +) + +# register the iSWAP decompositions +iswap_dec = GateDecompositions() +iswap_dec.add( + gates.CNOT, + [ + gates.U3(0, 3 * np.pi / 2, np.pi, 0), + gates.U3(1, np.pi / 2, -np.pi, -np.pi), + gates.iSWAP(0, 1), + gates.U3(0, np.pi, 0, np.pi), + gates.U3(1, np.pi / 2, -np.pi, -np.pi), + gates.iSWAP(0, 1), + gates.U3(0, np.pi / 2, np.pi / 2, -np.pi), + gates.U3(1, np.pi / 2, -np.pi, -np.pi / 2), + ], +) +iswap_dec.add( + gates.CZ, + [ + gates.U3(0, 7 * np.pi / 2, np.pi, 0), + gates.U3(1, 7 * np.pi / 2, np.pi, 0), + gates.U3(1, np.pi / 2, -np.pi, -np.pi), + gates.iSWAP(0, 1), + gates.U3(0, np.pi, 0, np.pi), + gates.U3(1, np.pi / 2, -np.pi, -np.pi), + gates.iSWAP(0, 1), + gates.U3(0, np.pi / 2, np.pi / 2, -np.pi), + gates.U3(1, np.pi / 2, -np.pi, -np.pi / 2), + gates.U3(1, 7 * np.pi / 2, np.pi, 0), + ], +) +iswap_dec.add( + gates.SWAP, + [ + gates.iSWAP(0, 1), + gates.U3(1, np.pi / 2, -np.pi / 2, np.pi / 2), + gates.iSWAP(0, 1), + gates.U3(0, np.pi / 2, -np.pi / 2, np.pi / 2), + gates.iSWAP(0, 1), + gates.U3(1, np.pi / 2, -np.pi / 2, np.pi / 2), + ], +) +iswap_dec.add(gates.iSWAP, [gates.iSWAP(0, 1)]) + +# register CZ decompositions +cz_dec = GateDecompositions() +cz_dec.add(gates.CNOT, [gates.H(1), gates.CZ(0, 1), gates.H(1)]) +cz_dec.add(gates.CZ, [gates.CZ(0, 1)]) +cz_dec.add( + gates.SWAP, + [ + gates.H(1), + gates.CZ(0, 1), + gates.H(1), + gates.H(0), + gates.CZ(1, 0), + gates.H(0), + gates.H(1), + gates.CZ(0, 1), + gates.H(1), + ], +) +cz_dec.add( + gates.iSWAP, + [ + gates.U3(0, np.pi / 2.0, 0, -np.pi / 2.0), + gates.U3(1, np.pi / 2.0, 0, -np.pi / 2.0), + gates.CZ(0, 1), + gates.H(0), + gates.H(1), + gates.CZ(0, 1), + gates.H(0), + gates.H(1), + ], +) +cz_dec.add( + gates.CRX, + lambda gate: [ + gates.RX(1, gate.parameters[0] / 2.0), + gates.CZ(0, 1), + gates.RX(1, -gate.parameters[0] / 2.0), + gates.CZ(0, 1), + ], +) +cz_dec.add( + gates.CRY, + lambda gate: [ + gates.RY(1, gate.parameters[0] / 2.0), + gates.CZ(0, 1), + gates.RY(1, -gate.parameters[0] / 2.0), + gates.CZ(0, 1), + ], +) +cz_dec.add( + gates.CRZ, + lambda gate: [ + gates.RZ(1, gate.parameters[0] / 2.0), + gates.H(1), + gates.CZ(0, 1), + gates.RX(1, -gate.parameters[0] / 2.0), + gates.CZ(0, 1), + gates.H(1), + ], +) +cz_dec.add( + gates.CU1, + lambda gate: [ + gates.RZ(0, gate.parameters[0] / 2.0), + gates.H(1), + gates.CZ(0, 1), + gates.RX(1, -gate.parameters[0] / 2.0), + gates.CZ(0, 1), + gates.H(1), + gates.RZ(1, gate.parameters[0] / 2.0), + ], +) +cz_dec.add( + gates.CU2, + lambda gate: [ + gates.RZ(1, (gate.parameters[1] - gate.parameters[0]) / 2.0), + gates.H(1), + gates.CZ(0, 1), + gates.H(1), + gates.U3(1, -np.pi / 4, 0, -(gate.parameters[1] + gate.parameters[0]) / 2.0), + gates.H(1), + gates.CZ(0, 1), + gates.H(1), + gates.U3(1, np.pi / 4, gate.parameters[0], 0), + ], +) +cz_dec.add( + gates.CU3, + lambda gate: [ + gates.RZ(1, (gate.parameters[2] - gate.parameters[1]) / 2.0), + gates.H(1), + gates.CZ(0, 1), + gates.H(1), + gates.U3( + 1, + -gate.parameters[0] / 2.0, + 0, + -(gate.parameters[2] + gate.parameters[1]) / 2.0, + ), + gates.H(1), + gates.CZ(0, 1), + gates.H(1), + gates.U3(1, gate.parameters[0] / 2.0, gate.parameters[1], 0), + ], +) +cz_dec.add( + gates.FSWAP, + [ + gates.U3(0, np.pi / 2, -np.pi / 2, -np.pi), + gates.U3(1, np.pi / 2, np.pi / 2, np.pi / 2), + gates.CZ(0, 1), + gates.U3(0, np.pi / 2, 0, -np.pi / 2), + gates.U3(1, np.pi / 2, 0, np.pi / 2), + gates.CZ(0, 1), + gates.U3(0, np.pi / 2, np.pi / 2, -np.pi), + gates.U3(1, np.pi / 2, 0, -np.pi), + ], +) +cz_dec.add( + gates.RXX, + lambda gate: [ + gates.H(0), + gates.CZ(0, 1), + gates.RX(1, gate.parameters[0]), + gates.CZ(0, 1), + gates.H(0), + ], +) +cz_dec.add( + gates.RYY, + lambda gate: [ + gates.RX(0, np.pi / 2), + gates.U3(1, np.pi / 2, np.pi / 2, -np.pi), + gates.CZ(0, 1), + gates.RX(1, gate.parameters[0]), + gates.CZ(0, 1), + gates.RX(0, -np.pi / 2), + gates.U3(1, np.pi / 2, 0, np.pi / 2), + ], +) +cz_dec.add( + gates.RZZ, + lambda gate: [ + gates.H(1), + gates.CZ(0, 1), + gates.RX(1, gate.parameters[0]), + gates.CZ(0, 1), + gates.H(1), + ], +) +cz_dec.add( + gates.TOFFOLI, + [ + gates.CZ(1, 2), + gates.RX(2, -np.pi / 4), + gates.CZ(0, 2), + gates.RX(2, np.pi / 4), + gates.CZ(1, 2), + gates.RX(2, -np.pi / 4), + gates.CZ(0, 2), + gates.RX(2, np.pi / 4), + gates.RZ(1, np.pi / 4), + gates.H(1), + gates.CZ(0, 1), + gates.RZ(0, np.pi / 4), + gates.RX(1, -np.pi / 4), + gates.CZ(0, 1), + gates.H(1), + ], +) +cz_dec.add( + gates.Unitary, + lambda gate: two_qubit_decomposition(0, 1, gate.parameters[0], backend=backend), +) +cz_dec.add( + gates.fSim, + lambda gate: two_qubit_decomposition(0, 1, gate.matrix(backend), backend=backend), +) +cz_dec.add( + gates.GeneralizedfSim, + lambda gate: two_qubit_decomposition(0, 1, gate.matrix(backend), backend=backend), +) + + +# register other optimized gate decompositions +opt_dec = GateDecompositions() +opt_dec.add( + gates.SWAP, + [ + gates.H(0), + gates.SDG(0), + gates.SDG(1), + gates.iSWAP(0, 1), + gates.CZ(0, 1), + gates.H(1), + ], +) diff --git a/tests/test_transpiler_abstract.py b/tests/test_transpiler_abstract.py new file mode 100644 index 0000000000..9967e5295a --- /dev/null +++ b/tests/test_transpiler_abstract.py @@ -0,0 +1,23 @@ +import pytest + +from qibo import gates +from qibo.models import Circuit +from qibo.transpiler.abstract import _find_gates_qubits_pairs + + +def test_circuit_representation(): + circuit = Circuit(5) + circuit.add(gates.CNOT(1, 0)) + circuit.add(gates.CNOT(2, 0)) + circuit.add(gates.X(1)) + circuit.add(gates.CZ(3, 0)) + circuit.add(gates.CNOT(4, 0)) + repr = _find_gates_qubits_pairs(circuit) + assert repr == [[0, i + 1] for i in range(4)] + + +def test_circuit_representation_fail(): + circuit = Circuit(5) + circuit.add(gates.TOFFOLI(0, 1, 2)) + with pytest.raises(ValueError): + repr = _find_gates_qubits_pairs(circuit) diff --git a/tests/test_transpiler_blocks.py b/tests/test_transpiler_blocks.py new file mode 100644 index 0000000000..4d2446c806 --- /dev/null +++ b/tests/test_transpiler_blocks.py @@ -0,0 +1,373 @@ +import numpy as np +import pytest + +from qibo import Circuit, gates +from qibo.transpiler.blocks import ( + Block, + BlockingError, + CircuitBlocks, + _check_multi_qubit_measurements, + _count_multi_qubit_gates, + _find_previous_gates, + _find_successive_gates, + _gates_on_qubit, + _initial_block_decomposition, + _remove_gates, + _split_multi_qubit_measurements, + block_decomposition, +) + + +def assert_gates_equality(gates_1: list, gates_2: list): + """Check that the gates are the same.""" + for g_1, g_2 in zip(gates_1, gates_2): + assert g_1.qubits == g_2.qubits + assert g_1.__class__ == g_2.__class__ + + +def test_count_2q_gates(): + block = Block(qubits=(0, 1), gates=[gates.CZ(0, 1), gates.CZ(0, 1), gates.H(0)]) + assert block._count_2q_gates() == 2 + + +def test_add_gate_and_entanglement(): + block = Block(qubits=(0, 1), gates=[gates.H(0)]) + assert block.entangled == False + block.add_gate(gates.CZ(0, 1)) + assert block.entangled == True + assert block._count_2q_gates() == 1 + + +def test_add_gate_error(): + block = Block(qubits=(0, 1), gates=[gates.CZ(0, 1)]) + with pytest.raises(BlockingError): + block.add_gate(gates.CZ(0, 2)) + + +def test_fuse_blocks(): + block_1 = Block(qubits=(0, 1), gates=[gates.CZ(0, 1)]) + block_2 = Block(qubits=(0, 1), gates=[gates.H(0)]) + fused = block_1.fuse(block_2) + assert_gates_equality(fused.gates, block_1.gates + block_2.gates) + + +def test_fuse_blocks_error(): + block_1 = Block(qubits=(0, 1), gates=[gates.CZ(0, 1)]) + block_2 = Block(qubits=(1, 2), gates=[gates.CZ(1, 2)]) + with pytest.raises(BlockingError): + fused = block_1.fuse(block_2) + + +@pytest.mark.parametrize("qubits", [(0, 1), (2, 1)]) +def test_commute_false(qubits): + block_1 = Block(qubits=(0, 1), gates=[gates.CZ(0, 1)]) + block_2 = Block(qubits=qubits, gates=[gates.CZ(*qubits)]) + assert block_1.commute(block_2) == False + + +def test_commute_true(): + block_1 = Block(qubits=(0, 1), gates=[gates.CZ(0, 1)]) + block_2 = Block(qubits=(2, 3), gates=[gates.CZ(2, 3)]) + assert block_1.commute(block_2) == True + + +def test_count_multi_qubit_gates(): + gatelist = [gates.CZ(0, 1), gates.H(0), gates.TOFFOLI(0, 1, 2)] + assert _count_multi_qubit_gates(gatelist) == 2 + + +def test_gates_on_qubit(): + gatelist = [gates.H(0), gates.H(1), gates.H(2), gates.H(0)] + assert_gates_equality(_gates_on_qubit(gatelist, 0), [gatelist[0], gatelist[-1]]) + assert_gates_equality(_gates_on_qubit(gatelist, 1), [gatelist[1]]) + assert_gates_equality(_gates_on_qubit(gatelist, 2), [gatelist[2]]) + + +def test_remove_gates(): + gatelist = [gates.H(0), gates.CZ(0, 1), gates.H(2), gates.CZ(0, 2)] + remaining = [gates.CZ(0, 1), gates.H(2)] + delete_list = [gatelist[0], gatelist[3]] + _remove_gates(gatelist, delete_list) + assert_gates_equality(gatelist, remaining) + + +def test_find_previous_gates(): + gatelist = [gates.H(0), gates.H(1), gates.H(2)] + previous_gates = _find_previous_gates(gatelist, (0, 1)) + assert_gates_equality(previous_gates, gatelist[:2]) + + +def test_find_successive_gates(): + gatelist = [gates.H(0), gates.CZ(2, 3), gates.H(1), gates.H(2), gates.CZ(2, 1)] + successive_gates = _find_successive_gates(gatelist, (0, 1)) + assert_gates_equality(successive_gates, [gatelist[0], gatelist[2]]) + + +def test_initial_block_decomposition(): + circ = Circuit(5) + circ.add(gates.H(1)) + circ.add(gates.H(0)) + circ.add(gates.CZ(0, 1)) + circ.add(gates.CZ(0, 1)) + circ.add(gates.CZ(1, 2)) + circ.add(gates.H(3)) + circ.add(gates.H(4)) + blocks = _initial_block_decomposition(circ) + assert_gates_equality(blocks[0].gates, [gates.H(1), gates.H(0), gates.CZ(0, 1)]) + assert len(blocks) == 4 + assert len(blocks[0].gates) == 3 + assert len(blocks[1].gates) == 1 + assert blocks[2].entangled == True + assert blocks[3].entangled == False + assert len(blocks[3].gates) == 2 + + +def test_check_measurements(): + circ = Circuit(2) + circ.add(gates.H(1)) + circ.add(gates.M(0, 1)) + assert _check_multi_qubit_measurements(circ) + circ = Circuit(2) + circ.add(gates.H(1)) + circ.add(gates.M(0)) + circ.add(gates.M(1)) + assert not _check_multi_qubit_measurements(circ) + + +def test_split_measurements(): + circ = Circuit(2) + circ.add(gates.H(1)) + circ.add(gates.M(0, 1)) + new_circ = _split_multi_qubit_measurements(circ) + assert_gates_equality(new_circ.queue, [gates.H(1), gates.M(0), gates.M(1)]) + + +def test_initial_block_decomposition_measurements(): + circ = Circuit(5) + circ.add(gates.M(0)) + circ.add(gates.M(1)) + circ.add(gates.H(1)) + circ.add(gates.H(0)) + circ.add(gates.CZ(0, 1)) + circ.add(gates.CZ(0, 1)) + circ.add(gates.M(1)) + circ.add(gates.M(3)) + circ.add(gates.H(3)) + circ.add(gates.H(4)) + blocks = _initial_block_decomposition(circ) + print(blocks[0].gates) + assert_gates_equality( + blocks[0].gates, + [gates.M(0), gates.M(1), gates.H(1), gates.H(0), gates.CZ(0, 1)], + ) + assert_gates_equality(blocks[1].gates, [gates.CZ(0, 1), gates.M(1)]) + assert_gates_equality(blocks[2].gates, [gates.M(3), gates.H(3), gates.H(4)]) + + +def test_initial_block_decomposition_error(): + circ = Circuit(3) + circ.add(gates.TOFFOLI(0, 1, 2)) + print(len(circ.queue[0].qubits)) + with pytest.raises(BlockingError): + blocks = _initial_block_decomposition(circ) + + +def test_block_decomposition_error(): + circ = Circuit(1) + with pytest.raises(BlockingError): + block_decomposition(circ) + + +def test_block_decomposition_no_fuse(): + circ = Circuit(4) + circ.add(gates.H(1)) + circ.add(gates.H(0)) + circ.add(gates.H(0)) + circ.add(gates.CZ(0, 1)) + circ.add(gates.H(0)) + circ.add(gates.CZ(0, 1)) + circ.add(gates.CZ(1, 2)) + circ.add(gates.H(1)) + circ.add(gates.H(3)) + blocks = block_decomposition(circ, fuse=False) + assert_gates_equality( + blocks[0].gates, + [gates.H(1), gates.H(0), gates.H(0), gates.CZ(0, 1), gates.H(0)], + ) + assert len(blocks) == 4 + assert len(blocks[0].gates) == 5 + assert len(blocks[1].gates) == 1 + assert blocks[2].entangled == True + assert blocks[3].entangled == False + + +def test_block_decomposition(): + circ = Circuit(4) + circ.add(gates.H(1)) # first block + circ.add(gates.H(0)) # first block + circ.add(gates.CZ(0, 1)) # first block + circ.add(gates.H(0)) # first block + circ.add(gates.CZ(0, 1)) # first block + circ.add(gates.CZ(1, 2)) # second block + circ.add(gates.CZ(1, 2)) # second block + circ.add(gates.H(1)) # second block + circ.add(gates.H(3)) # 4 block + circ.add(gates.CZ(0, 1)) # 3 block + circ.add(gates.CZ(0, 1)) # 3 block + circ.add(gates.CZ(2, 3)) # 4 block + circ.add(gates.CZ(0, 1)) # 3 block + blocks = block_decomposition(circ) + assert_gates_equality( + blocks[0].gates, + [gates.H(1), gates.H(0), gates.CZ(0, 1), gates.H(0), gates.CZ(0, 1)], + ) + assert len(blocks) == 4 + assert blocks[0]._count_2q_gates() == 2 + assert len(blocks[0].gates) == 5 + assert blocks[0].qubits == (0, 1) + assert blocks[1]._count_2q_gates() == 2 + assert len(blocks[1].gates) == 3 + assert blocks[3]._count_2q_gates() == 1 + assert len(blocks[3].gates) == 2 + assert blocks[3].qubits == (2, 3) + assert blocks[2]._count_2q_gates() == 3 + assert len(blocks[2].gates) == 3 + + +def test_block_decomposition_measurements(): + circ = Circuit(4) + circ.add(gates.H(1)) # first block + circ.add(gates.H(0)) # first block + circ.add(gates.CZ(0, 1)) # first block + circ.add(gates.H(0)) # first block + circ.add(gates.M(0, 1)) # first block + circ.add(gates.CZ(1, 2)) # second block + circ.add(gates.CZ(1, 2)) # second block + circ.add(gates.H(1)) # second block + circ.add(gates.H(3)) # 4 block + circ.add(gates.CZ(0, 1)) # 3 block + circ.add(gates.CZ(0, 1)) # 3 block + circ.add(gates.CZ(2, 3)) # 4 block + circ.add(gates.M(0, 1)) # 3 block + blocks = block_decomposition(circ) + print(blocks[0].gates) + assert_gates_equality( + blocks[0].gates, + [gates.H(1), gates.H(0), gates.CZ(0, 1), gates.H(0), gates.M(0), gates.M(1)], + ) + assert len(blocks) == 4 + assert blocks[0]._count_2q_gates() == 1 + assert len(blocks[0].gates) == 6 + assert blocks[0].qubits == (0, 1) + assert blocks[1]._count_2q_gates() == 2 + assert len(blocks[1].gates) == 3 + assert blocks[3]._count_2q_gates() == 1 + assert len(blocks[3].gates) == 2 + assert blocks[3].qubits == (2, 3) + assert blocks[2]._count_2q_gates() == 2 + assert len(blocks[2].gates) == 4 + + +def test_circuit_blocks(backend): + circ = Circuit(4) + circ.add(gates.H(1)) + circ.add(gates.H(0)) + circ.add(gates.CZ(0, 1)) + circ.add(gates.H(0)) + circ.add(gates.CZ(0, 1)) + circ.add(gates.CZ(1, 2)) + circ.add(gates.CZ(1, 2)) + circ.add(gates.H(1)) + circ.add(gates.H(3)) + circ.add(gates.CZ(0, 1)) + circ.add(gates.CZ(0, 1)) + circ.add(gates.CZ(2, 3)) + circ.add(gates.CZ(0, 1)) + circuit_blocks = CircuitBlocks(circ, index_names=True) + for index, block in enumerate(circuit_blocks()): + assert block.name == index + reconstructed_circ = circuit_blocks.circuit() + backend.assert_allclose( + backend.execute_circuit(circ).state(), + backend.execute_circuit(reconstructed_circ).state(), + ) + first_block = circuit_blocks.search_by_index(0) + assert_gates_equality( + first_block.gates, + [gates.H(1), gates.H(0), gates.CZ(0, 1), gates.H(0), gates.CZ(0, 1)], + ) + + +def test_add_block(): + circ = Circuit(4) + circ.add(gates.H(1)) + circ.add(gates.H(0)) + circ.add(gates.CZ(0, 1)) + circ.add(gates.H(0)) + circ.add(gates.CZ(0, 1)) + circ.add(gates.CZ(1, 2)) + circuit_blocks = CircuitBlocks(circ) + new_block = Block(qubits=(2, 3), gates=[gates.CZ(2, 3)]) + circ.add(gates.CZ(2, 3)) + circuit_blocks.add_block(new_block) + reconstructed_circ = circuit_blocks.circuit() + assert_gates_equality(reconstructed_circ.queue, circ.queue) + + +def test_add_block_error(): + circ = Circuit(2) + circ.add(gates.CZ(0, 1)) + circuit_blocks = CircuitBlocks(circ) + new_block = Block(qubits=(2, 3), gates=[gates.CZ(2, 3)]) + with pytest.raises(BlockingError): + circuit_blocks.add_block(new_block) + + +def test_remove_block(): + circ = Circuit(3) + circ.add(gates.CZ(0, 1)) + circ.add(gates.CZ(1, 2)) + circuit_blocks = CircuitBlocks(circ) + blocks = circuit_blocks() + circuit_blocks.remove_block(blocks[0]) + remaining_block = circuit_blocks() + assert_gates_equality(remaining_block[0].gates, [gates.CZ(1, 2)]) + + +def test_remove_block_error(): + circ = Circuit(3) + circ.add(gates.CZ(0, 1)) + circ.add(gates.CZ(1, 2)) + circuit_blocks = CircuitBlocks(circ) + new_block = Block(qubits=(2, 3), gates=[gates.CZ(2, 3)]) + with pytest.raises(BlockingError): + circuit_blocks.remove_block(new_block) + + +def test_search_by_index_error_no_indexes(): + circ = Circuit(2) + circ.add(gates.CZ(0, 1)) + circuit_blocks = CircuitBlocks(circ) + with pytest.raises(BlockingError): + circuit_blocks.search_by_index(0) + + +def test_search_by_index_error_no_index_found(): + circ = Circuit(2) + circ.add(gates.CZ(0, 1)) + circuit_blocks = CircuitBlocks(circ, index_names=True) + with pytest.raises(BlockingError): + circuit_blocks.search_by_index(1) + + +def test_block_on_qubits(): + block = Block( + qubits=(0, 1), + gates=[gates.H(0), gates.CZ(0, 1), gates.H(1), gates.CZ(1, 0), gates.M(1)], + ) + new_block = block.on_qubits(new_qubits=(2, 3)) + assert new_block.gates[0].qubits == (2,) + assert new_block.gates[1].qubits == (2, 3) + assert new_block.gates[2].qubits == (3,) + assert new_block.gates[3].qubits == (3, 2) + assert new_block.gates[4].qubits == (3,) diff --git a/tests/test_transpiler_optimizer.py b/tests/test_transpiler_optimizer.py new file mode 100644 index 0000000000..ad82e49911 --- /dev/null +++ b/tests/test_transpiler_optimizer.py @@ -0,0 +1,50 @@ +import networkx as nx +import pytest + +from qibo import gates +from qibo.models import Circuit +from qibo.transpiler.optimizer import Preprocessing, Rearrange + + +def star_connectivity(): + Q = ["q" + str(i) for i in range(5)] + chip = nx.Graph() + chip.add_nodes_from(Q) + graph_list = [(Q[i], Q[2]) for i in range(5) if i != 2] + chip.add_edges_from(graph_list) + return chip + + +def test_preprocessing_error(): + circ = Circuit(7) + preprocesser = Preprocessing(connectivity=star_connectivity()) + with pytest.raises(ValueError): + new_circuit = preprocesser(circuit=circ) + + +def test_preprocessing_same(): + circ = Circuit(5) + circ.add(gates.CNOT(0, 1)) + preprocesser = Preprocessing(connectivity=star_connectivity()) + new_circuit = preprocesser(circuit=circ) + assert new_circuit.ngates == 1 + + +def test_preprocessing_add(): + circ = Circuit(3) + circ.add(gates.CNOT(0, 1)) + preprocesser = Preprocessing(connectivity=star_connectivity()) + new_circuit = preprocesser(circuit=circ) + assert new_circuit.ngates == 1 + assert new_circuit.nqubits == 5 + + +def test_fusion(): + circuit = Circuit(2) + circuit.add(gates.X(0)) + circuit.add(gates.Z(0)) + circuit.add(gates.Y(0)) + circuit.add(gates.X(1)) + fusion = Rearrange(max_qubits=1) + fused_circ = fusion(circuit) + assert isinstance(fused_circ.queue[0], gates.Unitary) diff --git a/tests/test_transpiler_pipeline.py b/tests/test_transpiler_pipeline.py new file mode 100644 index 0000000000..f887d4b964 --- /dev/null +++ b/tests/test_transpiler_pipeline.py @@ -0,0 +1,243 @@ +import itertools + +import networkx as nx +import numpy as np +import pytest + +from qibo import gates +from qibo.models import Circuit +from qibo.transpiler.abstract import NativeType +from qibo.transpiler.optimizer import Preprocessing +from qibo.transpiler.pipeline import ( + Passes, + TranspilerPipelineError, + assert_circuit_equivalence, + assert_transpiling, +) +from qibo.transpiler.placer import Random, ReverseTraversal, Trivial +from qibo.transpiler.router import ShortestPaths +from qibo.transpiler.unroller import NativeGates + + +def generate_random_circuit(nqubits, ngates, seed=None): + """Generate random circuits one-qubit rotations and CZ gates.""" + pairs = list(itertools.combinations(range(nqubits), 2)) + if seed is not None: # pragma: no cover + np.random.seed(seed) + + one_qubit_gates = [gates.RX, gates.RY, gates.RZ, gates.X, gates.Y, gates.Z, gates.H] + two_qubit_gates = [ + gates.CNOT, + gates.CZ, + gates.SWAP, + gates.iSWAP, + gates.CRX, + gates.CRY, + gates.CRZ, + ] + n1, n2 = len(one_qubit_gates), len(two_qubit_gates) + n = n1 + n2 if nqubits > 1 else n1 + circuit = Circuit(nqubits) + for _ in range(ngates): + igate = int(np.random.randint(0, n)) + if igate >= n1: + q = tuple(np.random.randint(0, nqubits, 2)) + while q[0] == q[1]: + q = tuple(np.random.randint(0, nqubits, 2)) + gate = two_qubit_gates[igate - n1] + else: + q = (np.random.randint(0, nqubits),) + gate = one_qubit_gates[igate] + if issubclass(gate, gates.ParametrizedGate): + theta = 2 * np.pi * np.random.random() + circuit.add(gate(*q, theta=theta)) + else: + circuit.add(gate(*q)) + return circuit + + +def small_circuit(): + circuit = Circuit(2) + circuit.add(gates.H(0)) + circuit.add(gates.CZ(0, 1)) + return circuit + + +def star_connectivity(): + Q = [i for i in range(5)] + chip = nx.Graph() + chip.add_nodes_from(Q) + graph_list = [(Q[i], Q[2]) for i in range(5) if i != 2] + chip.add_edges_from(graph_list) + return chip + + +@pytest.mark.parametrize("ngates", [5, 10, 50]) +def test_pipeline_default(ngates): + circ = generate_random_circuit(nqubits=5, ngates=ngates) + default_transpiler = Passes(connectivity=star_connectivity()) + transpiled_circ, final_layout = default_transpiler(circ) + initial_layout = default_transpiler.get_initial_layout() + assert_transpiling( + original_circuit=circ, + transpiled_circuit=transpiled_circ, + connectivity=star_connectivity(), + initial_layout=initial_layout, + final_layout=final_layout, + native_gates=NativeType.CZ, + check_circuit_equivalence=False, + ) + + +def test_assert_circuit_equivalence_equal(): + circ1 = Circuit(2) + circ2 = Circuit(2) + circ1.add(gates.X(0)) + circ1.add(gates.CZ(0, 1)) + circ2.add(gates.X(0)) + circ2.add(gates.CZ(0, 1)) + final_map = {"q0": 0, "q1": 1} + assert_circuit_equivalence(circ1, circ2, final_map=final_map) + + +def test_assert_circuit_equivalence_swap(): + circ1 = Circuit(2) + circ2 = Circuit(2) + circ1.add(gates.X(0)) + circ2.add(gates.SWAP(0, 1)) + circ2.add(gates.X(1)) + final_map = {"q0": 1, "q1": 0} + assert_circuit_equivalence(circ1, circ2, final_map=final_map) + + +def test_assert_circuit_equivalence_false(): + circ1 = Circuit(2) + circ2 = Circuit(2) + circ1.add(gates.X(0)) + circ2.add(gates.SWAP(0, 1)) + circ2.add(gates.X(1)) + final_map = {"q0": 0, "q1": 1} + with pytest.raises(TranspilerPipelineError): + assert_circuit_equivalence(circ1, circ2, final_map=final_map) + + +def test_assert_circuit_equivalence_wrong_nqubits(): + circ1 = Circuit(1) + circ2 = Circuit(2) + final_map = {"q0": 0, "q1": 1} + with pytest.raises(ValueError): + assert_circuit_equivalence(circ1, circ2, final_map=final_map) + + +def test_error_connectivity(): + with pytest.raises(TranspilerPipelineError): + default_transpiler = Passes() + + +def test_is_satisfied(): + default_transpiler = Passes(connectivity=star_connectivity()) + circuit = Circuit(5) + circuit.add(gates.CZ(0, 2)) + circuit.add(gates.Z(0)) + assert default_transpiler.is_satisfied(circuit) + + +def test_is_satisfied_false_decomposition(): + default_transpiler = Passes(connectivity=star_connectivity()) + circuit = Circuit(5) + circuit.add(gates.CZ(0, 2)) + circuit.add(gates.X(0)) + assert not default_transpiler.is_satisfied(circuit) + + +def test_is_satisfied_false_connectivity(): + default_transpiler = Passes(connectivity=star_connectivity()) + circuit = Circuit(5) + circuit.add(gates.CZ(0, 1)) + circuit.add(gates.Z(0)) + assert not default_transpiler.is_satisfied(circuit) + + +@pytest.mark.parametrize( + "circ", [generate_random_circuit(nqubits=5, ngates=20), small_circuit()] +) +def test_custom_passes(circ): + custom_passes = [] + custom_passes.append(Preprocessing(connectivity=star_connectivity())) + custom_passes.append(Random(connectivity=star_connectivity())) + custom_passes.append(ShortestPaths(connectivity=star_connectivity())) + custom_passes.append(NativeGates(two_qubit_natives=NativeType.iSWAP)) + custom_pipeline = Passes( + custom_passes, connectivity=star_connectivity(), native_gates=NativeType.iSWAP + ) + transpiled_circ, final_layout = custom_pipeline(circ) + initial_layout = custom_pipeline.get_initial_layout() + assert_transpiling( + original_circuit=circ, + transpiled_circuit=transpiled_circ, + connectivity=star_connectivity(), + initial_layout=initial_layout, + final_layout=final_layout, + native_gates=NativeType.iSWAP, + ) + + +@pytest.mark.parametrize( + "circ", [generate_random_circuit(nqubits=5, ngates=20), small_circuit()] +) +def test_custom_passes_reverse(circ): + custom_passes = [] + custom_passes.append(Preprocessing(connectivity=star_connectivity())) + custom_passes.append( + ReverseTraversal( + connectivity=star_connectivity(), + routing_algorithm=ShortestPaths(connectivity=star_connectivity()), + depth=20, + ) + ) + custom_passes.append(ShortestPaths(connectivity=star_connectivity())) + custom_passes.append(NativeGates(two_qubit_natives=NativeType.iSWAP)) + custom_pipeline = Passes( + custom_passes, connectivity=star_connectivity(), native_gates=NativeType.iSWAP + ) + transpiled_circ, final_layout = custom_pipeline(circ) + initial_layout = custom_pipeline.get_initial_layout() + assert_transpiling( + original_circuit=circ, + transpiled_circuit=transpiled_circ, + connectivity=star_connectivity(), + initial_layout=initial_layout, + final_layout=final_layout, + native_gates=NativeType.iSWAP, + ) + + +def test_custom_passes_multiple_placer(): + custom_passes = [] + custom_passes.append(Random(connectivity=star_connectivity())) + custom_passes.append(Trivial(connectivity=star_connectivity())) + custom_pipeline = Passes( + custom_passes, connectivity=star_connectivity(), native_gates=NativeType.CZ + ) + circ = generate_random_circuit(nqubits=5, ngates=20) + with pytest.raises(TranspilerPipelineError): + transpiled_circ, final_layout = custom_pipeline(circ) + + +def test_custom_passes_no_placer(): + custom_passes = [] + custom_passes.append(ShortestPaths(connectivity=star_connectivity())) + custom_pipeline = Passes( + custom_passes, connectivity=star_connectivity(), native_gates=NativeType.CZ + ) + circ = generate_random_circuit(nqubits=5, ngates=20) + with pytest.raises(TranspilerPipelineError): + transpiled_circ, final_layout = custom_pipeline(circ) + + +def test_custom_passes_wrong_pass(): + custom_passes = [0] + custom_pipeline = Passes(passes=custom_passes) + circ = generate_random_circuit(nqubits=5, ngates=5) + with pytest.raises(TranspilerPipelineError): + transpiled_circ, final_layout = custom_pipeline(circ) diff --git a/tests/test_transpiler_placer.py b/tests/test_transpiler_placer.py new file mode 100644 index 0000000000..748d469f0b --- /dev/null +++ b/tests/test_transpiler_placer.py @@ -0,0 +1,201 @@ +import networkx as nx +import pytest + +from qibo import gates +from qibo.models import Circuit +from qibo.transpiler.placer import ( + Custom, + PlacementError, + Random, + ReverseTraversal, + Subgraph, + Trivial, + assert_mapping_consistency, + assert_placement, +) +from qibo.transpiler.router import ShortestPaths + + +def star_connectivity(): + Q = [i for i in range(5)] + chip = nx.Graph() + chip.add_nodes_from(Q) + graph_list = [ + (Q[0], Q[2]), + (Q[1], Q[2]), + (Q[3], Q[2]), + (Q[4], Q[2]), + ] + chip.add_edges_from(graph_list) + return chip + + +def star_circuit(): + circuit = Circuit(5) + for i in range(1, 5): + circuit.add(gates.CNOT(i, 0)) + return circuit + + +def test_assert_placement_true(): + layout = {"q0": 0, "q1": 1, "q2": 2, "q3": 3, "q4": 4} + circuit = Circuit(5) + assert_placement(circuit, layout) + + +@pytest.mark.parametrize("qubits", [5, 3]) +@pytest.mark.parametrize( + "layout", [{"q0": 0, "q1": 1, "q2": 2, "q3": 3}, {"q0": 0, "q0": 1, "q2": 2}] +) +def test_assert_placement_false(qubits, layout): + circuit = Circuit(qubits) + with pytest.raises(PlacementError): + assert_placement(circuit, layout) + + +def test_mapping_consistency_true(): + layout = {"q0": 0, "q1": 2, "q2": 1, "q3": 4, "q4": 3} + assert_mapping_consistency(layout) + + +@pytest.mark.parametrize( + "layout", + [ + {"q0": 0, "q1": 0, "q2": 1, "q3": 4, "q4": 3}, + {"q0": 0, "q1": 2, "q0": 1, "q3": 4, "q4": 3}, + ], +) +def test_mapping_consistency_false(layout): + with pytest.raises(PlacementError): + assert_mapping_consistency(layout) + + +def test_trivial(): + circuit = Circuit(5) + connectivity = star_connectivity() + placer = Trivial(connectivity=connectivity) + layout = placer(circuit) + assert layout == {"q0": 0, "q1": 1, "q2": 2, "q3": 3, "q4": 4} + assert_placement(circuit, layout) + + +def test_trivial_error(): + circuit = Circuit(4) + connectivity = star_connectivity() + placer = Trivial(connectivity=connectivity) + with pytest.raises(PlacementError): + layout = placer(circuit) + + +@pytest.mark.parametrize( + "custom_layout", [[4, 3, 2, 1, 0], {"q0": 4, "q1": 3, "q2": 2, "q3": 1, "q4": 0}] +) +@pytest.mark.parametrize("give_circuit", [True, False]) +def test_custom(custom_layout, give_circuit): + if give_circuit: + circuit = Circuit(5) + else: + circuit = None + connectivity = star_connectivity() + placer = Custom(connectivity=connectivity, map=custom_layout) + layout = placer(circuit) + assert layout == {"q0": 4, "q1": 3, "q2": 2, "q3": 1, "q4": 0} + + +def test_custom_error_circuit(): + circuit = Circuit(3) + custom_layout = [4, 3, 2, 1, 0] + connectivity = star_connectivity() + placer = Custom(connectivity=connectivity, map=custom_layout) + with pytest.raises(PlacementError): + layout = placer(circuit) + + +def test_custom_error_no_circuit(): + connectivity = star_connectivity() + custom_layout = {"q0": 4, "q1": 3, "q2": 2, "q3": 0, "q4": 0} + placer = Custom(connectivity=connectivity, map=custom_layout) + with pytest.raises(PlacementError): + layout = placer() + + +def test_custom_error_type(): + circuit = Circuit(5) + connectivity = star_connectivity() + layout = 1 + placer = Custom(connectivity=connectivity, map=layout) + with pytest.raises(TypeError): + layout = placer(circuit) + + +def test_subgraph_perfect(): + connectivity = star_connectivity() + placer = Subgraph(connectivity=connectivity) + layout = placer(star_circuit()) + assert layout["q2"] == 0 + assert_placement(star_circuit(), layout) + + +def imperfect_circuit(): + circuit = Circuit(5) + circuit.add(gates.CNOT(1, 3)) + circuit.add(gates.CNOT(2, 4)) + circuit.add(gates.CNOT(2, 1)) + circuit.add(gates.CNOT(4, 3)) + circuit.add(gates.CNOT(3, 2)) + circuit.add(gates.CNOT(2, 1)) + circuit.add(gates.CNOT(4, 3)) + circuit.add(gates.CNOT(1, 2)) + circuit.add(gates.CNOT(3, 1)) + return circuit + + +def test_subgraph_non_perfect(): + connectivity = star_connectivity() + placer = Subgraph(connectivity=connectivity) + layout = placer(imperfect_circuit()) + assert_placement(imperfect_circuit(), layout) + + +def test_subgraph_error(): + connectivity = star_connectivity() + placer = Subgraph(connectivity=connectivity) + circuit = Circuit(5) + with pytest.raises(ValueError): + layout = placer(circuit) + + +@pytest.mark.parametrize("reps", [1, 10, 100]) +def test_random(reps): + connectivity = star_connectivity() + placer = Random(connectivity=connectivity, samples=reps) + layout = placer(star_circuit()) + assert_placement(star_circuit(), layout) + + +def test_random_perfect(): + circ = Circuit(5) + circ.add(gates.CZ(0, 1)) + connectivity = star_connectivity() + placer = Random(connectivity=connectivity, samples=1000) + layout = placer(circ) + assert_placement(star_circuit(), layout) + + +@pytest.mark.parametrize("gates", [None, 5, 13]) +def test_reverse_traversal(gates): + circuit = star_circuit() + connectivity = star_connectivity() + routing = ShortestPaths(connectivity=connectivity) + placer = ReverseTraversal(connectivity, routing, depth=gates) + layout = placer(circuit) + assert_placement(circuit, layout) + + +def test_reverse_traversal_no_gates(): + connectivity = star_connectivity() + routing = ShortestPaths(connectivity=connectivity) + placer = ReverseTraversal(connectivity, routing, depth=10) + circuit = Circuit(5) + with pytest.raises(ValueError): + layout = placer(circuit) diff --git a/tests/test_transpiler_router.py b/tests/test_transpiler_router.py new file mode 100644 index 0000000000..146e11b849 --- /dev/null +++ b/tests/test_transpiler_router.py @@ -0,0 +1,333 @@ +import networkx as nx +import numpy as np +import pytest + +from qibo import gates +from qibo.models import Circuit +from qibo.transpiler.optimizer import Preprocessing +from qibo.transpiler.pipeline import assert_circuit_equivalence +from qibo.transpiler.placer import ( + Custom, + PlacementError, + Random, + Subgraph, + Trivial, + assert_placement, +) +from qibo.transpiler.router import ( + CircuitMap, + ConnectivityError, + Sabre, + ShortestPaths, + assert_connectivity, +) + + +def star_connectivity(): + Q = [i for i in range(5)] + chip = nx.Graph() + chip.add_nodes_from(Q) + graph_list = [(Q[i], Q[2]) for i in range(5) if i != 2] + chip.add_edges_from(graph_list) + return chip + + +def grid_connectivity(): + Q = [i for i in range(5)] + chip = nx.Graph() + chip.add_nodes_from(Q) + graph_list = [(Q[0], Q[1]), (Q[1], Q[2]), (Q[2], Q[3]), (Q[3], Q[0]), (Q[0], Q[4])] + chip.add_edges_from(graph_list) + return chip + + +def generate_random_circuit(nqubits, ngates, seed=42): + """Generate a random circuit with RX and CZ gates.""" + np.random.seed(seed) + one_qubit_gates = [gates.RX, gates.RY, gates.RZ] + two_qubit_gates = [gates.CZ, gates.CNOT, gates.SWAP] + n1, n2 = len(one_qubit_gates), len(two_qubit_gates) + n = n1 + n2 if nqubits > 1 else n1 + circuit = Circuit(nqubits) + for _ in range(ngates): + igate = int(np.random.randint(0, n)) + if igate >= n1: + q = tuple(np.random.randint(0, nqubits, 2)) + while q[0] == q[1]: + q = tuple(np.random.randint(0, nqubits, 2)) + gate = two_qubit_gates[igate - n1] + else: + q = (np.random.randint(0, nqubits),) + gate = one_qubit_gates[igate] + if issubclass(gate, gates.ParametrizedGate): + theta = 2 * np.pi * np.random.random() + circuit.add(gate(*q, theta=theta, trainable=False)) + else: + circuit.add(gate(*q)) + return circuit + + +def star_circuit(): + circuit = Circuit(5) + for i in range(1, 5): + circuit.add(gates.CNOT(i, 0)) + return circuit + + +def matched_circuit(): + """Return a simple circuit that can be executed on star connectivity""" + circuit = Circuit(5) + circuit.add(gates.CZ(0, 2)) + circuit.add(gates.CZ(1, 2)) + circuit.add(gates.Z(1)) + circuit.add(gates.CZ(2, 1)) + circuit.add(gates.M(0)) + return circuit + + +def test_assert_connectivity(): + assert_connectivity(star_connectivity(), matched_circuit()) + + +def test_assert_connectivity_false(): + circuit = Circuit(5) + circuit.add(gates.CZ(0, 1)) + with pytest.raises(ConnectivityError): + assert_connectivity(star_connectivity(), circuit) + + +def test_assert_connectivity_3q(): + circuit = Circuit(5) + circuit.add(gates.TOFFOLI(0, 1, 2)) + with pytest.raises(ConnectivityError): + assert_connectivity(star_connectivity(), circuit) + + +@pytest.mark.parametrize("split", [2.0, -1.0]) +def test_split_setter(split): + with pytest.raises(ValueError): + transpiler = ShortestPaths( + connectivity=star_connectivity(), sampling_split=split + ) + + +def test_insufficient_qubits(): + circuit = generate_random_circuit(10, 20) + placer = Trivial() + initial_layout = placer(circuit) + transpiler = ShortestPaths(connectivity=star_connectivity()) + with pytest.raises(ValueError): + transpiler(circuit, initial_layout) + + +def test_incorrect_initial_layout(): + placer = Trivial() + circuit = Circuit(4) + circuit.add(gates.CNOT(1, 0)) + circuit.add(gates.CNOT(2, 0)) + circuit.add(gates.CNOT(3, 0)) + initial_layout = placer(circuit) + transpiler = ShortestPaths(connectivity=star_connectivity()) + with pytest.raises(PlacementError): + transpiler(circuit, initial_layout) + + +@pytest.mark.parametrize("gates", [5, 25]) +@pytest.mark.parametrize("qubits", [3, 5]) +@pytest.mark.parametrize("placer", [Trivial, Random]) +@pytest.mark.parametrize("connectivity", [star_connectivity(), grid_connectivity()]) +@pytest.mark.parametrize("split", [1.0, 0.5]) +def test_random_circuits_5q(gates, qubits, placer, connectivity, split): + placer = placer(connectivity=connectivity) + layout_circ = Circuit(5) + initial_layout = placer(layout_circ) + transpiler = ShortestPaths( + connectivity=connectivity, verbose=True, sampling_split=split + ) + circuit = generate_random_circuit(nqubits=qubits, ngates=gates) + transpiled_circuit, final_qubit_map = transpiler(circuit, initial_layout) + assert transpiler.added_swaps >= 0 + assert_connectivity(connectivity, transpiled_circuit) + assert_placement(transpiled_circuit, final_qubit_map) + assert gates + transpiler.added_swaps == transpiled_circuit.ngates + qubit_matcher = Preprocessing(connectivity=connectivity) + new_circuit = qubit_matcher(circuit=circuit) + assert_circuit_equivalence( + original_circuit=new_circuit, + transpiled_circuit=transpiled_circuit, + final_map=final_qubit_map, + initial_map=initial_layout, + ) + + +def test_star_circuit(): + placer = Subgraph(star_connectivity()) + initial_layout = placer(star_circuit()) + transpiler = ShortestPaths(connectivity=star_connectivity()) + transpiled_circuit, final_qubit_map = transpiler(star_circuit(), initial_layout) + assert transpiler.added_swaps == 0 + assert_connectivity(star_connectivity(), transpiled_circuit) + assert_placement(transpiled_circuit, final_qubit_map) + assert_circuit_equivalence( + original_circuit=star_circuit(), + transpiled_circuit=transpiled_circuit, + final_map=final_qubit_map, + initial_map=initial_layout, + ) + + +def test_star_circuit_custom_map(): + placer = Custom(map=[1, 0, 2, 3, 4], connectivity=star_connectivity()) + initial_layout = placer() + transpiler = ShortestPaths(connectivity=star_connectivity()) + transpiled_circuit, final_qubit_map = transpiler(star_circuit(), initial_layout) + assert transpiler.added_swaps == 1 + assert_connectivity(star_connectivity(), transpiled_circuit) + assert_placement(transpiled_circuit, final_qubit_map) + assert_circuit_equivalence( + original_circuit=star_circuit(), + transpiled_circuit=transpiled_circuit, + final_map=final_qubit_map, + initial_map=initial_layout, + ) + + +def test_routing_with_measurements(): + placer = Trivial(connectivity=star_connectivity()) + circuit = Circuit(5) + circuit.add(gates.CNOT(0, 1)) + circuit.add(gates.M(0, 2, 3)) + initial_layout = placer(circuit=circuit) + transpiler = ShortestPaths(connectivity=star_connectivity()) + transpiled_circuit, final_qubit_map = transpiler(circuit, initial_layout) + assert transpiled_circuit.ngates == 3 + measured_qubits = transpiled_circuit.queue[2].qubits + assert measured_qubits == (0, 1, 3) + assert_circuit_equivalence( + original_circuit=circuit, + transpiled_circuit=transpiled_circuit, + final_map=final_qubit_map, + initial_map=initial_layout, + ) + + +def test_circuit_map(): + circ = Circuit(4) + circ.add(gates.H(1)) + circ.add(gates.H(0)) + circ.add(gates.CZ(0, 1)) + circ.add(gates.H(0)) + circ.add(gates.CZ(1, 2)) + circ.add(gates.CZ(0, 1)) + circ.add(gates.CZ(2, 3)) + initial_layout = {"q0": 2, "q1": 0, "q2": 1, "q3": 3} + circuit_map = CircuitMap(initial_layout=initial_layout, circuit=circ) + block_list = circuit_map.circuit_blocks + # test blocks_qubits_pairs + assert circuit_map.blocks_qubits_pairs() == [(0, 1), (1, 2), (0, 1), (2, 3)] + # test execute_block and routed_circuit + circuit_map.execute_block(block_list.search_by_index(0)) + routed_circuit = circuit_map.routed_circuit() + assert isinstance(routed_circuit.queue[0], gates.H) + assert len(routed_circuit.queue) == 4 + assert routed_circuit.queue[2].qubits == (1, 2) + # test update + circuit_map.update((0, 2)) + routed_circuit = circuit_map.routed_circuit() + assert isinstance(routed_circuit.queue[4], gates.SWAP) + assert routed_circuit.queue[4].qubits == (1, 0) + assert circuit_map._swaps == 1 + assert circuit_map._circuit_logical == [2, 1, 0, 3] + circuit_map.update((1, 2)) + routed_circuit = circuit_map.routed_circuit() + assert routed_circuit.queue[5].qubits == (2, 0) + assert circuit_map._circuit_logical == [1, 2, 0, 3] + # test execute_block after multiple swaps + circuit_map.execute_block(block_list.search_by_index(1)) + circuit_map.execute_block(block_list.search_by_index(2)) + circuit_map.execute_block(block_list.search_by_index(3)) + routed_circuit = circuit_map.routed_circuit() + assert isinstance(routed_circuit.queue[6], gates.CZ) + # circuit to logical map: [1,2,0,3]. initial map: {"q0": 2, "q1": 0, "q2": 1, "q3": 3}. + assert routed_circuit.queue[6].qubits == (0, 1) # initial circuit qubits (1,2) + assert routed_circuit.queue[7].qubits == (2, 0) # (0,1) + assert routed_circuit.queue[8].qubits == (1, 3) # (2,3) + assert len(circuit_map.circuit_blocks()) == 0 + # test final layout + assert circuit_map.final_layout() == {"q0": 1, "q1": 2, "q2": 0, "q3": 3} + + +def test_sabre_matched(): + placer = Trivial() + layout_circ = Circuit(5) + initial_layout = placer(layout_circ) + router = Sabre(connectivity=star_connectivity()) + routed_circuit, final_map = router( + circuit=matched_circuit(), initial_layout=initial_layout + ) + assert router.added_swaps == 0 + assert final_map == {"q0": 0, "q1": 1, "q2": 2, "q3": 3, "q4": 4} + assert_connectivity(circuit=routed_circuit, connectivity=star_connectivity()) + assert_circuit_equivalence( + original_circuit=matched_circuit(), + transpiled_circuit=routed_circuit, + final_map=final_map, + initial_map=initial_layout, + ) + + +@pytest.mark.parametrize("seed", [42]) +def test_sabre_simple(seed): + placer = Trivial() + circ = Circuit(5) + circ.add(gates.CZ(0, 1)) + initial_layout = placer(circ) + router = Sabre(connectivity=star_connectivity(), seed=seed) + routed_circuit, final_map = router(circuit=circ, initial_layout=initial_layout) + assert router.added_swaps == 1 + assert final_map == {"q0": 2, "q1": 1, "q2": 0, "q3": 3, "q4": 4} + assert routed_circuit.queue[0].qubits == (0, 2) + assert isinstance(routed_circuit.queue[0], gates.SWAP) + assert isinstance(routed_circuit.queue[1], gates.CZ) + assert_connectivity(circuit=routed_circuit, connectivity=star_connectivity()) + assert_circuit_equivalence( + original_circuit=circ, + transpiled_circuit=routed_circuit, + final_map=final_map, + initial_map=initial_layout, + ) + + +@pytest.mark.parametrize("gates", [10, 40]) +@pytest.mark.parametrize("look", [0, 5]) +@pytest.mark.parametrize("decay", [0.5, 1.0]) +@pytest.mark.parametrize("placer", [Trivial, Random]) +@pytest.mark.parametrize("connectivity", [star_connectivity(), grid_connectivity()]) +def test_sabre_random_circuits(gates, look, decay, placer, connectivity): + placer = placer(connectivity=connectivity) + layout_circ = Circuit(5) + initial_layout = placer(layout_circ) + router = Sabre(connectivity=connectivity, lookahead=look, decay_lookahead=decay) + circuit = generate_random_circuit(nqubits=5, ngates=gates) + transpiled_circuit, final_qubit_map = router(circuit, initial_layout) + assert router.added_swaps >= 0 + assert_connectivity(connectivity, transpiled_circuit) + assert_placement(transpiled_circuit, final_qubit_map) + assert gates + router.added_swaps == transpiled_circuit.ngates + assert_circuit_equivalence( + original_circuit=circuit, + transpiled_circuit=transpiled_circuit, + final_map=final_qubit_map, + initial_map=initial_layout, + ) + + +def test_sabre_memory_map(): + placer = Trivial() + layout_circ = Circuit(5) + initial_layout = placer(layout_circ) + router = Sabre(connectivity=star_connectivity()) + router._preprocessing(circuit=star_circuit(), initial_layout=initial_layout) + router._memory_map = [[1, 0, 2, 3, 4]] + value = router._compute_cost((0, 1)) + assert value == float("inf") diff --git a/tests/test_transpiler_star_connectivity.py b/tests/test_transpiler_star_connectivity.py new file mode 100644 index 0000000000..5a8e9a4b57 --- /dev/null +++ b/tests/test_transpiler_star_connectivity.py @@ -0,0 +1,98 @@ +import itertools + +import numpy as np +import pytest + +from qibo import gates +from qibo.backends import NumpyBackend +from qibo.models import Circuit +from qibo.quantum_info.random_ensembles import random_unitary +from qibo.transpiler.pipeline import _transpose_qubits +from qibo.transpiler.router import ConnectivityError +from qibo.transpiler.star_connectivity import StarConnectivity + + +def generate_random_circuit(nqubits, depth, seed=None, middle_qubit=2): + """Generate random circuits one-qubit rotations and CZ gates.""" + # find the number of qubits for hardware circuit + if nqubits == 1: + hardware_qubits = 1 + else: + hardware_qubits = max(nqubits, middle_qubit + 1) + + pairs = list(itertools.combinations(range(hardware_qubits), 2)) + if seed is not None: # pragma: no cover + np.random.seed(seed) + + rotations = [gates.RX, gates.RY, gates.RZ] + circuit = Circuit(hardware_qubits) + for _ in range(depth): + for i in range(hardware_qubits): + # generate a random rotation + rotation = rotations[int(np.random.randint(0, 3))] + theta = 2 * np.pi * np.random.random() + circuit.add(rotation(i, theta=theta)) + # add CZ gates on random qubit pairs + for i in np.random.randint(0, len(pairs), len(pairs)): + q1, q2 = pairs[i] + circuit.add(gates.CZ(q1, q2)) + + return circuit + + +def test_error_multi_qubit(): + circuit = Circuit(3) + circuit.add(gates.TOFFOLI(0, 1, 2)) + transpiler = StarConnectivity(middle_qubit=2) + with pytest.raises(ConnectivityError): + transpiled, hardware_qubits = transpiler(circuit) + + +@pytest.mark.parametrize("nqubits", [1, 2, 3, 4, 5]) +@pytest.mark.parametrize("middle_qubit", [0, 1, 2, 3, 4]) +@pytest.mark.parametrize("depth", [2, 10]) +@pytest.mark.parametrize("measurements", [True, False]) +def test_fix_connectivity(nqubits, depth, middle_qubit, measurements): + """Checks that the transpiled circuit can be executed and is equivalent to original.""" + original = generate_random_circuit(nqubits, depth, middle_qubit=middle_qubit) + if measurements: + original.add(gates.M(0)) + transpiler = StarConnectivity(middle_qubit=middle_qubit) + transpiled, hardware_qubits = transpiler(original) + backend = NumpyBackend() + final_state = backend.execute_circuit(transpiled).state() + target_state = backend.execute_circuit(original).state() + hardware_qubits = list(hardware_qubits.values()) + target_state = _transpose_qubits(target_state, hardware_qubits) + np.testing.assert_allclose(final_state, target_state) + + +@pytest.mark.parametrize("nqubits", [2, 3, 4, 5]) +@pytest.mark.parametrize("middle_qubit", [0, 1, 2, 3, 4]) +@pytest.mark.parametrize("unitary_dim", [1, 2]) +@pytest.mark.parametrize("depth", [2, 10]) +def test_fix_connectivity_unitaries(nqubits, unitary_dim, depth, middle_qubit): + """Checks that the transpiled circuit can be executed and is equivalent to original + when using unitaries.""" + # find the number of qubits for hardware circuit + n_hardware_qubits = max(nqubits, middle_qubit + 1) + + original = Circuit(n_hardware_qubits) + pairs = list(itertools.combinations(range(n_hardware_qubits), unitary_dim)) + for _ in range(depth): + qubits = pairs[int(np.random.randint(len(pairs)))] + original.add( + gates.Unitary( + random_unitary(2**unitary_dim, backend=NumpyBackend()), *qubits + ) + ) + + transpiler = StarConnectivity(middle_qubit=middle_qubit) + transpiled, hardware_qubits = transpiler(original) + # check that execution results agree with original (using simulation) + backend = NumpyBackend() + final_state = backend.execute_circuit(transpiled).state() + target_state = backend.execute_circuit(original).state() + hardware_qubits = list(hardware_qubits.values()) + target_state = _transpose_qubits(target_state, hardware_qubits) + np.testing.assert_allclose(final_state, target_state) diff --git a/tests/test_transpiler_unitary_decompositions.py b/tests/test_transpiler_unitary_decompositions.py new file mode 100644 index 0000000000..9d1bde2f3e --- /dev/null +++ b/tests/test_transpiler_unitary_decompositions.py @@ -0,0 +1,217 @@ +import numpy as np +import pytest +from scipy.linalg import expm + +from qibo import Circuit, gates, matrices +from qibo.config import PRECISION_TOL +from qibo.quantum_info.metrics import purity +from qibo.quantum_info.random_ensembles import random_unitary +from qibo.transpiler.unitary_decompositions import ( + bell_basis, + calculate_h_vector, + calculate_psi, + calculate_single_qubit_unitaries, + cnot_decomposition, + cnot_decomposition_light, + magic_basis, + magic_decomposition, + to_bell_diagonal, + two_qubit_decomposition, +) + + +def bell_unitary(hx, hy, hz): + ham = ( + hx * np.kron(matrices.X, matrices.X) + + hy * np.kron(matrices.Y, matrices.Y) + + hz * np.kron(matrices.Z, matrices.Z) + ) + return expm(-1j * ham) + + +def assert_single_qubits(backend, psi, ua, ub): + """Assert UA, UB map the maximally entangled basis ``psi`` to the magic basis.""" + uaub = np.kron(ua, ub) + for i, j in zip(range(4), [0, 1, 3, 2]): + final_state = np.dot(uaub, psi[:, i]) + target_state = magic_basis[:, j] + fidelity = np.abs(np.dot(np.conj(target_state), final_state)) + backend.assert_allclose(fidelity, 1) + + +def test_u3_decomposition(backend): + theta, phi, lam = 0.1, 0.2, 0.3 + u3_matrix = gates.U3(0, theta, phi, lam).matrix(backend) + + rz1 = gates.RZ(0, phi).matrix(backend) + rz2 = gates.RZ(0, theta).matrix(backend) + rz3 = gates.RZ(0, lam).matrix(backend) + rx1 = gates.RX(0, -np.pi / 2).matrix(backend) + rx2 = gates.RX(0, np.pi / 2).matrix(backend) + + target_matrix = rz1 @ rx1 @ rz2 @ rx2 @ rz3 + + backend.assert_allclose(u3_matrix, target_matrix) + + +@pytest.mark.parametrize("seed", [None, 10, np.random.default_rng(10)]) +def test_eigenbasis_entanglement(backend, seed): + unitary = random_unitary(4, seed=seed, backend=backend) + + if backend.__class__.__name__ in ["CupyBackend", "CuQuantumBackend"]: + with pytest.raises(NotImplementedError): + calculate_psi(unitary, backend=backend) + else: + """Check that the eigenvectors of UT_U are maximally entangled.""" + states, eigvals = calculate_psi(unitary, backend=backend) + eigvals = backend.cast(eigvals, dtype=eigvals.dtype) + backend.assert_allclose(np.abs(eigvals), np.ones(4)) + for state in np.transpose(states): + state = backend.partial_trace(state, [1], 2) + backend.assert_allclose(purity(state), 0.5) + + +@pytest.mark.parametrize("seed", [None, 10, np.random.default_rng(10)]) +def test_v_decomposition(backend, seed): + """Check that V_A V_B |psi_k> = |phi_k> according to Lemma 1.""" + unitary = random_unitary(4, seed=seed, backend=backend) + if backend.__class__.__name__ in ["CupyBackend", "CuQuantumBackend"]: + with pytest.raises(NotImplementedError): + calculate_psi(unitary, backend=backend) + else: + psi, _ = calculate_psi(unitary, backend=backend) + va, vb = calculate_single_qubit_unitaries(psi) + assert_single_qubits(backend, psi, va, vb) + + +@pytest.mark.parametrize("seed", [None, 10, np.random.default_rng(10)]) +def test_u_decomposition(backend, seed): + r"""Check that U_A\dagger U_B\dagger |psi_k tilde> = |phi_k> according to Lemma 1.""" + unitary = random_unitary(4, seed=seed, backend=backend) + if backend.__class__.__name__ in ["CupyBackend", "CuQuantumBackend"]: + with pytest.raises(NotImplementedError): + calculate_psi(unitary, backend=backend) + else: + psi, eigvals = calculate_psi(unitary, backend=backend) + psi_tilde = np.conj(np.sqrt(eigvals)) * np.dot(unitary, psi) + ua_dagger, ub_dagger = calculate_single_qubit_unitaries(psi_tilde) + assert_single_qubits(backend, psi_tilde, ua_dagger, ub_dagger) + + +@pytest.mark.parametrize("seed", [None, 10, np.random.default_rng(10)]) +def test_ud_eigenvalues(backend, seed): + """Check that U_d is diagonal in the Bell basis.""" + unitary = random_unitary(4, seed=seed, backend=backend) + if backend.__class__.__name__ in ["CupyBackend", "CuQuantumBackend"]: + with pytest.raises(NotImplementedError): + magic_decomposition(unitary, backend=backend) + else: + ua, ub, ud, va, vb = magic_decomposition(unitary, backend=backend) + + unitary_recon = np.kron(ua, ub) @ ud @ np.kron(va, vb) + backend.assert_allclose(unitary_recon, unitary) + + ud_bell = np.transpose(np.conj(bell_basis)) @ ud @ bell_basis + ud_diag = np.diag(ud_bell) + backend.assert_allclose(np.diag(ud_diag), ud_bell, atol=PRECISION_TOL) + backend.assert_allclose(np.prod(ud_diag), 1) + + +@pytest.mark.parametrize("seed", [None, 10, np.random.default_rng(10)]) +def test_calculate_h_vector(backend, seed): + unitary = random_unitary(4, seed=seed, backend=backend) + if backend.__class__.__name__ in ["CupyBackend", "CuQuantumBackend"]: + with pytest.raises(NotImplementedError): + magic_decomposition(unitary, backend=backend) + else: + _, _, ud, _, _ = magic_decomposition(unitary, backend=backend) + ud_diag = to_bell_diagonal(ud, backend=backend) + assert ud_diag is not None + hx, hy, hz = calculate_h_vector(ud_diag) + target_matrix = bell_unitary(hx, hy, hz) + backend.assert_allclose(ud, target_matrix, atol=PRECISION_TOL) + + +def test_cnot_decomposition(backend): + hx, hy, hz = np.random.random(3) + target_matrix = bell_unitary(hx, hy, hz) + c = Circuit(2) + c.add(cnot_decomposition(0, 1, hx, hy, hz)) + final_matrix = c.unitary(backend) + backend.assert_allclose(final_matrix, target_matrix, atol=PRECISION_TOL) + + +def test_cnot_decomposition_light(backend): + hx, hy = np.random.random(2) + target_matrix = bell_unitary(hx, hy, 0) + c = Circuit(2) + c.add(cnot_decomposition_light(0, 1, hx, hy)) + final_matrix = c.unitary(backend) + backend.assert_allclose(final_matrix, target_matrix, atol=PRECISION_TOL) + + +@pytest.mark.parametrize("seed", [None, 10, np.random.default_rng(10)]) +def test_two_qubit_decomposition(backend, seed): + unitary = random_unitary(4, seed=seed, backend=backend) + if backend.__class__.__name__ in ["CupyBackend", "CuQuantumBackend"]: + with pytest.raises(NotImplementedError): + two_qubit_decomposition(0, 1, unitary, backend=backend) + else: + c = Circuit(2) + c.add(two_qubit_decomposition(0, 1, unitary, backend=backend)) + final_matrix = c.unitary(backend) + backend.assert_allclose(final_matrix, unitary, atol=PRECISION_TOL) + + +@pytest.mark.parametrize("gatename", ["CNOT", "CZ", "SWAP", "iSWAP", "fSim", "I"]) +def test_two_qubit_decomposition_common_gates(backend, gatename): + """Test general two-qubit decomposition on some common gates.""" + if gatename == "fSim": + gate = gates.fSim(0, 1, theta=0.1, phi=0.2) + else: + gate = getattr(gates, gatename)(0, 1) + matrix = gate.matrix(backend) + if ( + backend.__class__.__name__ in ["CupyBackend", "CuQuantumBackend"] + and gatename != "iSWAP" + ): + with pytest.raises(NotImplementedError): + two_qubit_decomposition(0, 1, matrix, backend=backend) + else: + c = Circuit(2) + c.add(two_qubit_decomposition(0, 1, matrix, backend=backend)) + final_matrix = c.unitary(backend) + backend.assert_allclose(final_matrix, matrix, atol=PRECISION_TOL) + + +@pytest.mark.parametrize("hz_zero", [False, True]) +def test_two_qubit_decomposition_bell_unitary(backend, hz_zero): + hx, hy, hz = (2 * np.random.random(3) - 1) * np.pi + if hz_zero: + hz = 0 + unitary = bell_unitary(hx, hy, hz) + c = Circuit(2) + c.add(two_qubit_decomposition(0, 1, unitary)) + final_matrix = c.unitary(backend) + backend.assert_allclose(final_matrix, unitary, atol=PRECISION_TOL) + + +def test_two_qubit_decomposition_no_entanglement(backend): + """Test two-qubit decomposition on unitary that creates no entanglement.""" + matrix = np.array( + [ + [-1.0, 0.0, 0.0, 0.0], + [0.0, -1.0, 0.0, 0.0], + [0.0, 0.0, 1.0, 0.0], + [0.0, 0.0, 0.0, 1.0], + ] + ) + matrix = backend.cast(matrix, dtype=matrix.dtype) + c = Circuit(2) + if backend.__class__.__name__ in ["CupyBackend", "CuQuantumBackend"]: + with pytest.raises(NotImplementedError): + two_qubit_decomposition(0, 1, matrix, backend=backend) + else: + c.add(two_qubit_decomposition(0, 1, matrix, backend=backend)) + final_matrix = c.unitary(backend) + backend.assert_allclose(final_matrix, matrix, atol=PRECISION_TOL) diff --git a/tests/test_transpiler_unroller.py b/tests/test_transpiler_unroller.py new file mode 100644 index 0000000000..15afe7aed8 --- /dev/null +++ b/tests/test_transpiler_unroller.py @@ -0,0 +1,237 @@ +import numpy as np +import pytest + +from qibo import gates +from qibo.backends import NumpyBackend +from qibo.models import Circuit +from qibo.quantum_info.random_ensembles import random_unitary +from qibo.transpiler.abstract import NativeType +from qibo.transpiler.unroller import ( + DecompositionError, + NativeGates, + assert_decomposition, + translate_gate, +) + + +def assert_matrices_allclose(gate, two_qubit_natives, backend): + target_matrix = gate.matrix(backend) + target_matrix = backend.cast(target_matrix, dtype=target_matrix.dtype) + # Remove global phase from target matrix + normalisation = np.power( + np.linalg.det(target_matrix), 1 / float(target_matrix.shape[0]), dtype=complex + ) + normalisation = backend.cast(normalisation, dtype=normalisation.dtype) + target_unitary = target_matrix / normalisation + + circuit = Circuit(len(gate.qubits)) + circuit.add(translate_gate(gate, two_qubit_natives)) + native_matrix = circuit.unitary(backend) + # Remove global phase from native matrix + normalisation = np.power( + np.linalg.det(native_matrix), 1 / float(native_matrix.shape[0]), dtype=complex + ) + normalisation = backend.cast(normalisation, dtype=normalisation.dtype) + native_unitary = native_matrix / normalisation + + # There can still be phase differences of -1, -1j, 1j + c = 0 + for phase in [1, -1, 1j, -1j]: + if np.allclose(phase * native_unitary, target_unitary, atol=1e-12): + c = 1 + backend.assert_allclose(c, 1) + + +@pytest.mark.parametrize("gatename", ["H", "X", "Y", "I"]) +def test_pauli_to_native(backend, gatename): + gate = getattr(gates, gatename)(0) + assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) + + +@pytest.mark.parametrize("gatename", ["RX", "RY", "RZ"]) +def test_rotations_to_native(backend, gatename): + gate = getattr(gates, gatename)(0, theta=0.1) + assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) + + +@pytest.mark.parametrize("gatename", ["S", "SDG", "T", "TDG"]) +def test_special_single_qubit_to_native(backend, gatename): + gate = getattr(gates, gatename)(0) + assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) + + +def test_u1_to_native(backend): + gate = gates.U1(0, theta=0.5) + assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) + + +def test_u2_to_native(backend): + gate = gates.U2(0, phi=0.1, lam=0.3) + assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) + + +def test_u3_to_native(backend): + gate = gates.U3(0, theta=0.2, phi=0.1, lam=0.3) + assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) + + +def test_gpi2_to_native(backend): + gate = gates.GPI2(0, phi=0.123) + assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) + + +@pytest.mark.parametrize("gatename", ["CNOT", "CZ", "SWAP", "iSWAP", "FSWAP"]) +@pytest.mark.parametrize( + "natives", + [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], +) +def test_two_qubit_to_native(backend, gatename, natives): + gate = getattr(gates, gatename)(0, 1) + assert_matrices_allclose(gate, natives, backend) + + +@pytest.mark.parametrize( + "natives", + [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], +) +@pytest.mark.parametrize("gatename", ["CRX", "CRY", "CRZ"]) +def test_controlled_rotations_to_native(backend, gatename, natives): + gate = getattr(gates, gatename)(0, 1, 0.3) + assert_matrices_allclose(gate, natives, backend) + + +@pytest.mark.parametrize( + "natives", + [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], +) +def test_cu1_to_native(backend, natives): + gate = gates.CU1(0, 1, theta=0.4) + assert_matrices_allclose(gate, natives, backend) + + +@pytest.mark.parametrize( + "natives", + [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], +) +def test_cu2_to_native(backend, natives): + gate = gates.CU2(0, 1, phi=0.2, lam=0.3) + assert_matrices_allclose(gate, natives, backend) + + +@pytest.mark.parametrize( + "natives", + [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], +) +def test_cu3_to_native(backend, natives): + gate = gates.CU3(0, 1, theta=0.2, phi=0.3, lam=0.4) + assert_matrices_allclose(gate, natives, backend) + + +@pytest.mark.parametrize( + "natives", + [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], +) +def test_fSim_to_native(backend, natives): + gate = gates.fSim(0, 1, theta=0.3, phi=0.1) + assert_matrices_allclose(gate, natives, backend) + + +@pytest.mark.parametrize("seed", [None, 10, np.random.default_rng(10)]) +@pytest.mark.parametrize( + "natives", + [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], +) +def test_GeneralizedfSim_to_native(backend, natives, seed): + unitary = random_unitary(2, seed=seed, backend=backend) + gate = gates.GeneralizedfSim(0, 1, unitary, phi=0.1) + assert_matrices_allclose(gate, natives, backend) + + +@pytest.mark.parametrize( + "natives", + [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], +) +@pytest.mark.parametrize("gatename", ["RXX", "RZZ", "RYY"]) +def test_rnn_to_native(backend, gatename, natives): + gate = getattr(gates, gatename)(0, 1, theta=0.1) + assert_matrices_allclose(gate, natives, backend) + + +@pytest.mark.parametrize( + "natives", + [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], +) +def test_TOFFOLI_to_native(backend, natives): + gate = gates.TOFFOLI(0, 1, 2) + assert_matrices_allclose(gate, natives, backend) + + +@pytest.mark.parametrize("seed", [None, 10, np.random.default_rng(10)]) +@pytest.mark.parametrize( + "natives", + [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], +) +@pytest.mark.parametrize("nqubits", [1, 2]) +def test_unitary_to_native(backend, nqubits, natives, seed): + u = random_unitary(2**nqubits, seed=seed, backend=NumpyBackend()) + # transform to SU(2^nqubits) form + u = u / np.sqrt(np.linalg.det(u)) + gate = gates.Unitary(u, *range(nqubits)) + assert_matrices_allclose(gate, natives, backend) + + +def test_count_1q(): + from qibo.transpiler.unroller import cz_dec + + np.testing.assert_allclose(cz_dec.count_1q(gates.CNOT(0, 1)), 2) + np.testing.assert_allclose(cz_dec.count_1q(gates.CRX(0, 1, 0.1)), 2) + + +def test_count_2q(): + from qibo.transpiler.unroller import cz_dec + + np.testing.assert_allclose(cz_dec.count_2q(gates.CNOT(0, 1)), 1) + np.testing.assert_allclose(cz_dec.count_2q(gates.CRX(0, 1, 0.1)), 2) + + +def test_assert_decomposition(): + circuit = Circuit(2) + circuit.add(gates.CZ(0, 1)) + circuit.add(gates.Z(0)) + circuit.add(gates.M(1)) + assert_decomposition(circuit, two_qubit_natives=NativeType.CZ) + + +def test_assert_decomposition_fail_1q(): + circuit = Circuit(1) + circuit.add(gates.X(0)) + with pytest.raises(DecompositionError): + assert_decomposition(circuit, two_qubit_natives=NativeType.CZ) + + +@pytest.mark.parametrize("gate", [gates.CNOT(0, 1), gates.iSWAP(0, 1)]) +def test_assert_decomposition_fail_2q(gate): + circuit = Circuit(2) + circuit.add(gate) + with pytest.raises(DecompositionError): + assert_decomposition(circuit, two_qubit_natives=NativeType.CZ) + + +def test_assert_decomposition_fail_3q(): + circuit = Circuit(3) + circuit.add(gates.TOFFOLI(0, 1, 2)) + with pytest.raises(DecompositionError): + assert_decomposition(circuit, two_qubit_natives=NativeType.CZ) + + +def test_no_translate_single_qubit(): + unroller = NativeGates( + two_qubit_natives=NativeType.CZ, translate_single_qubit=False + ) + circuit = Circuit(2) + circuit.add(gates.X(0)) + circuit.add(gates.CNOT(0, 1)) + translated_circuit = unroller(circuit) + assert isinstance(translated_circuit.queue[0], gates.X) and isinstance( + translated_circuit.queue[2], gates.CZ + )