diff --git a/.github/.codecov.yml b/.github/.codecov.yml deleted file mode 100644 index 0c6bd02622..0000000000 --- a/.github/.codecov.yml +++ /dev/null @@ -1,3 +0,0 @@ -ignore: - - "setup.py" - - "src/qibo/tests/test_custom_functions.py" diff --git a/.github/codecov.yml b/.github/codecov.yml new file mode 100644 index 0000000000..5571132e2b --- /dev/null +++ b/.github/codecov.yml @@ -0,0 +1,8 @@ +coverage: + status: + project: + default: + threshold: 0.5% + +github_checks: + annotations: false diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 1399089483..c0b9fdf544 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,4 +1,4 @@ -name: Deploy docs +name: docs on: workflow_dispatch: diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 28dfdd0dfc..9e5265c24b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,7 +9,7 @@ repos: - id: check-yaml - id: debug-statements - repo: https://github.com/psf/black - rev: 24.1.1 + rev: 24.2.0 hooks: - id: black - repo: https://github.com/pycqa/isort @@ -18,7 +18,7 @@ repos: - id: isort args: ["--profile", "black"] - repo: https://github.com/asottile/pyupgrade - rev: v3.15.0 + rev: v3.15.1 hooks: - id: pyupgrade - repo: https://github.com/hadialqattan/pycln diff --git a/README.md b/README.md index bdb1e6f4f8..46a64fe115 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,8 @@ ![Logo](https://github.com/qiboteam/qibo/blob/master/doc/source/_static/qibo_logo_dark.svg) -![Tests](https://github.com/qiboteam/qibo/workflows/Tests/badge.svg) [![codecov](https://codecov.io/gh/qiboteam/qibo/branch/master/graph/badge.svg?token=1EKZKVEVX0)](https://codecov.io/gh/qiboteam/qibo) -[![DOI](https://zenodo.org/badge/241307936.svg)](https://zenodo.org/badge/latestdoi/241307936) -[![Matrix](https://img.shields.io/matrix/qibo%3Amatrix.org?logo=matrix)](https://matrix.to/#/#qibo:matrix.org) +![PyPI - Version](https://img.shields.io/pypi/v/qibo) +![PyPI - Python Version](https://img.shields.io/pypi/pyversions/qibo) Qibo is an open-source full stack API for quantum simulation and quantum hardware control. @@ -15,6 +14,8 @@ Some of the key features of Qibo are: ## Documentation +[![docs](https://github.com/qiboteam/qibo/actions/workflows/publish.yml/badge.svg)](https://qibo.science/qibo/stable/) + Qibo documentation is available [here](https://qibo.science). ## Minimum Working Examples @@ -49,6 +50,8 @@ result = c(nshots=100) In both cases, the simulation will run in a single device CPU or GPU in double precision `complex128`. ## Citation policy +[![arXiv](https://img.shields.io/badge/arXiv-2009.01845-b31b1b.svg)](https://arxiv.org/abs/2009.01845) +[![DOI](https://zenodo.org/badge/241307936.svg)](https://zenodo.org/badge/latestdoi/241307936) If you use the package please refer to [the documentation](https://qibo.science/qibo/stable/appendix/citing-qibo.html#publications) for citation instructions. @@ -56,7 +59,7 @@ If you use the package please refer to [the documentation](https://qibo.science/ To get in touch with the community and the developers, consider joining the Qibo workspace on Matrix: -https://matrix.to/#/#qibo:matrix.org +[![Matrix](https://img.shields.io/matrix/qibo%3Amatrix.org?logo=matrix)](https://matrix.to/#/#qibo:matrix.org) ## Supporters and collaborators diff --git a/doc/source/_static/comp_basis_encoder.png b/doc/source/_static/comp_basis_encoder.png new file mode 100644 index 0000000000..eb02139534 Binary files /dev/null and b/doc/source/_static/comp_basis_encoder.png differ diff --git a/doc/source/_static/phase_encoder.png b/doc/source/_static/phase_encoder.png new file mode 100644 index 0000000000..df6796e1d9 Binary files /dev/null and b/doc/source/_static/phase_encoder.png differ diff --git a/doc/source/_static/unary_encoder_ladder.png b/doc/source/_static/unary_encoder_ladder.png new file mode 100644 index 0000000000..fd7672b182 Binary files /dev/null and b/doc/source/_static/unary_encoder_ladder.png differ diff --git a/doc/source/_static/unary_encoder_tree.png b/doc/source/_static/unary_encoder_tree.png new file mode 100644 index 0000000000..dd17b20c8e Binary files /dev/null and b/doc/source/_static/unary_encoder_tree.png differ diff --git a/doc/source/api-reference/qibo.rst b/doc/source/api-reference/qibo.rst index 980faf2c70..3457ad0c0c 100644 --- a/doc/source/api-reference/qibo.rst +++ b/doc/source/api-reference/qibo.rst @@ -270,18 +270,119 @@ For instance, the following two circuit generations are equivalent: circuit_2.add(gates.X(2)) +.. image:: ../_static/comp_basis_encoder.png + :width: 3400px + :height: 2000px + :scale: 25 % + :align: center + + .. autofunction:: qibo.models.encodings.comp_basis_encoder +Phase Encoder +""""""""""""" + +Encodes data of length :math:`n` into the phases of :math:`n` qubits. + + +For instance, the following two circuit generations are equivalent: + +.. testsetup:: + + import numpy as np + + from qibo import Circuit, gates + from qibo.models.encodings import phase_encoder + +.. testcode:: + + nqubits = 3 + phases = np.random.rand(nqubits) + + circuit_1 = phase_encoder(phases, rotation="RX") + + circuit_2 = Circuit(3) + circuit_2.add(gates.RX(qubit, phases[qubit]) for qubit in range(nqubits)) + + +.. image:: ../_static/phase_encoder.png + :width: 1333px + :height: 1552px + :scale: 30 % + :align: center + + +.. autofunction:: qibo.models.encodings.phase_encoder + + Unary Encoder """"""""""""" +Given a classical ``data`` array :math:`\mathbf{x} \in \mathbb{R}^{d}` such that + +.. math:: + \mathbf{x} = (x_{1}, x_{2}, \dots, x_{d}) \, , + +this function generate the circuit that prepares the following quantum state +:math:`\ket{\psi} \in \mathcal{H}`: + +.. math:: + \ket{\psi} = \frac{1}{\|\mathbf{x}\|_{\textup{HS}}} \, + \sum_{k=1}^{d} \, x_{k} \, \ket{k} \, , + +with :math:`\mathcal{H} \cong \mathbb{C}^{d}` being a :math:`d`-qubit Hilbert space, +and :math:`\|\cdot\|_{\textup{HS}}` being the Hilbert-Schmidt norm. + +Here, :math:`\ket{k}` is a unary representation of the number :math:`k`. +For instance, for :math:`d = 3`, the final state would be + +.. math:: + \ket{\psi} = \frac{1}{\|\mathbf{x}\|_{\textup{HS}}} \, + \left( x_{1} \ket{001} + x_{2} \ket{010} + x_{3} \ket{100} \right) \, . + +There are multiple circuit architechtures that lead to unary encoding of classical data. +For example, to encode a :math:`8`-dimensional data, one could use the so-called +*tree* architechture below: + +.. image:: ../_static/unary_encoder_tree.png + :width: 1333px + :height: 1552px + :scale: 30 % + :align: center + +where the first gate is the :class:`qibo.gates.X` +and the parametrized gates are the :class:`qibo.gates.RBS`. +To know how the angles :math:`\{\theta_{k}\}_{[k]}` are calculated for this architecture, +please refer to S. Johri *et al.*, *Nearest Centroid Classification on a Trapped Ion Quantum Computer*, +`arXiv:2012.04145v2 [quant-ph] `_. + +On the other hand, the same encoding could be performed using the so-called +*diagonal* (also known as *ladder*) architecture below: + +.. image:: ../_static/unary_encoder_ladder.png + :width: 1867px + :height: 1552px + :scale: 30 % + :align: center + +This architecture leads to a choice of angles based on +`spherical coordinates in a d-dimensional hypersphere +`_. + + .. autofunction:: qibo.models.encodings.unary_encoder Unary Encoder for Random Gaussian States """""""""""""""""""""""""""""""""""""""" +Performs the same unary encoder as :class:`qibo.models.encodings.unary_encoder` +using the *tree* architecture , with the difference being that now each entry +of the :math:`d`-dimensional array is sampled from a Gaussian distribution +:math:`\mathcal{N}(0, 1)`. + + .. autofunction:: qibo.models.encodings.unary_encoder_random_gaussian @@ -1515,22 +1616,10 @@ The destabilizers can be extracted analogously with :meth:`qibo.quantum_info.cli :member-order: bysource -Metrics -^^^^^^^ - -Set of functions that are used to calculate metrics of states, (pseudo-)distance measures -between states, and distance measures between quantum channels. - -Purity -"""""" - -.. autofunction:: qibo.quantum_info.purity - - -Impurity -"""""""" +Entanglement measures +^^^^^^^^^^^^^^^^^^^^^ -.. autofunction:: qibo.quantum_info.impurity +Set of functions to calculate entanglement measures. Concurrence @@ -1545,45 +1634,149 @@ Entanglement of formation .. autofunction:: qibo.quantum_info.entanglement_of_formation -Entropy -""""""" +Entanglement fidelity +""""""""""""""""""""" + +.. autofunction:: qibo.quantum_info.entanglement_fidelity + + +Meyer-Wallach entanglement +"""""""""""""""""""""""""" + +.. autofunction:: qibo.quantum_info.meyer_wallach_entanglement + + +Entanglement capability +""""""""""""""""""""""" + +.. autofunction:: qibo.quantum_info.entangling_capability + + +Entropy measures +^^^^^^^^^^^^^^^^ + +Set of functions to calculate entropy measures. + + +Shannon entropy +""""""""""""""" + +.. autofunction:: qibo.quantum_info.shannon_entropy + + +Classical relative entropy +"""""""""""""""""""""""""" + +.. autofunction:: qibo.quantum_info.classical_relative_entropy + + +Classical Rényi entropy +""""""""""""""""""""""" + +.. autofunction:: qibo.quantum_info.classical_renyi_entropy + + +Classical Rényi relative entropy +"""""""""""""""""""""""""""""""" + +.. autofunction:: qibo.quantum_info.classical_relative_renyi_entropy + + +Classical Tsallis entropy +""""""""""""""""""""""""" + +.. autofunction:: qibo.quantum_info.classical_tsallis_entropy + + +von Neumann entropy +""""""""""""""""""" -.. autofunction:: qibo.quantum_info.entropy +.. autofunction:: qibo.quantum_info.von_neumann_entropy .. note:: - ``validate`` flag allows the user to choose if the function will check if input - ``state`` is Hermitian or not. Default option is ``validate=False``, i.e. the - assumption of Hermiticity, because it is faster and, more importantly, - the functions are intended to be used on Hermitian inputs. When ``validate=True`` + ``check_hermitian`` flag allows the user to choose if the function will check if input + ``state`` is Hermitian or not. Default option is ``check_hermitian=False``, i.e. the + assumption of Hermiticity. This is faster and, more importantly, + this function are intended to be used on Hermitian inputs. When ``check_hermitian=True`` and ``state`` is non-Hermitian, an error will be raised when using `cupy` backend. +Relative von Neumann entropy +"""""""""""""""""""""""""""" + +.. autofunction:: qibo.quantum_info.relative_von_neumann_entropy + +.. note:: + ``check_hermitian`` flag allows the user to choose if the function will check if input + ``state`` is Hermitian or not. Default option is ``check_hermitian=False``, i.e. the + assumption of Hermiticity. This is faster and, more importantly, + this function are intended to be used on Hermitian inputs. When ``check_hermitian=True`` + and either ``state`` or ``target`` is non-Hermitian, + an error will be raised when using `cupy` backend. + + +Rényi entropy +""""""""""""" + +.. autofunction:: qibo.quantum_info.renyi_entropy + + +Relative Rényi entropy +"""""""""""""""""""""" + +.. autofunction:: qibo.quantum_info.relative_renyi_entropy + + +Tsallis entropy +""""""""""""""" + +.. autofunction:: qibo.quantum_info.tsallis_entropy + + Entanglement entropy """""""""""""""""""" .. autofunction:: qibo.quantum_info.entanglement_entropy .. note:: - ``validate`` flag allows the user to choose if the function will check if + ``check_hermitian`` flag allows the user to choose if the function will check if the reduced density matrix resulting from tracing out ``bipartition`` from input - ``state`` is Hermitian or not. Default option is ``validate=False``, i.e. the - assumption of Hermiticity, because it is faster and, more importantly, - the functions are intended to be used on Hermitian inputs. When ``validate=True`` + ``state`` is Hermitian or not. Default option is ``check_hermitian=False``, i.e. the + assumption of Hermiticity. This is faster and, more importantly, + this function are intended to be used on Hermitian inputs. When ``check_hermitian=True`` and the reduced density matrix is non-Hermitian, an error will be raised when using `cupy` backend. +Metrics +^^^^^^^ + +Set of functions that are used to calculate metrics of states, (pseudo-)distance measures +between states, and distance measures between quantum channels. + +Purity +"""""" + +.. autofunction:: qibo.quantum_info.purity + + +Impurity +"""""""" + +.. autofunction:: qibo.quantum_info.impurity + + Trace distance """""""""""""" .. autofunction:: qibo.quantum_info.trace_distance .. note:: - ``validate`` flag allows the user to choose if the function will check if difference + ``check_hermitian`` flag allows the user to choose if the function will check if difference between inputs, ``state - target``, is Hermitian or not. Default option is - ``validate=False``, i.e. the assumption of Hermiticity, because it is faster and, + ``check_hermitian=False``, i.e. the assumption of Hermiticity, because it is faster and, more importantly, the functions are intended to be used on Hermitian inputs. - When ``validate=True`` and ``state - target`` is non-Hermitian, an error will be + When ``check_hermitian=True`` and ``state - target`` is non-Hermitian, an error will be raised when using `cupy` backend. @@ -1617,12 +1810,6 @@ Bures distance .. autofunction:: qibo.quantum_info.bures_distance -Entanglement fidelity -""""""""""""""""""""" - -.. autofunction:: qibo.quantum_info.entanglement_fidelity - - Process fidelity """""""""""""""" @@ -1653,18 +1840,6 @@ Diamond Norm .. autofunction:: qibo.quantum_info.diamond_norm -Meyer-Wallach entanglement -"""""""""""""""""""""""""" - -.. autofunction:: qibo.quantum_info.meyer_wallach_entanglement - - -Entanglement capability -""""""""""""""""""""""" - -.. autofunction:: qibo.quantum_info.entangling_capability - - Expressibility of parameterized quantum circuits """""""""""""""""""""""""""""""""""""""""""""""" @@ -1680,6 +1855,13 @@ Frame Potential Quantum Networks ^^^^^^^^^^^^^^^^ +Quantum network is an object that unifies the representation of quantum states, channels, +observables, and higher-order quantum operators. + +For more details, see G. Chiribella *et al.*, *Theoretical framework for quantum networks*, +`Physical Review A 80.2 (2009): 022339 +`_. + .. autoclass:: qibo.quantum_info.quantum_networks.QuantumNetwork :members: :member-order: bysource @@ -2075,18 +2257,6 @@ Hadamard Transform .. autofunction:: qibo.quantum_info.hadamard_transform -Shannon entropy -""""""""""""""" - -.. autofunction:: qibo.quantum_info.shannon_entropy - - -Total Variation distance -"""""""""""""""""""""""" - -.. autofunction:: qibo.quantum_info.total_variation_distance - - Hellinger distance """""""""""""""""" diff --git a/doc/source/appendix/citing-qibo.rst b/doc/source/appendix/citing-qibo.rst index 40f8a3b456..7d08dc2e2d 100644 --- a/doc/source/appendix/citing-qibo.rst +++ b/doc/source/appendix/citing-qibo.rst @@ -69,8 +69,28 @@ Peer-Reviewed Articles * S. Efthymiou, A. Orgaz-Fuertes, R. Carobene, J. Cereijo, A. Pasquale, S. Ramos-Calderer, S. Bordoni, D. Fuentes-Ruiz, A. Candido, E. Pedicillo, M. Robbiati, Y.P. Tan, J. Wilkens, I. Roth, J.I. Latorre, S. Carrazza, *Qibolab: - an open-source hybrid quantum operating system* (2023), (`arXiv:2308.06313`_). + an open-source hybrid quantum operating system* (2023), + `doi:10.22331/q-2024-02-12-1247`_, (`arXiv:2308.06313`_). + In *BibTeX* format: + + .. code-block:: text + + @article{qibolab_paper, + doi = {10.22331/q-2024-02-12-1247}, + url = {https://doi.org/10.22331/q-2024-02-12-1247}, + title = {Qibolab: an open-source hybrid quantum operating system}, + author = {Efthymiou, Stavros and Orgaz-Fuertes, Alvaro and Carobene, Rodolfo and Cereijo, Juan and Pasquale, Andrea and Ramos-Calderer, Sergi and Bordoni, Simone and Fuentes-Ruiz, David and Candido, Alessandro and Pedicillo, Edoardo and Robbiati, Matteo and Tan, Yuanzheng Paul and Wilkens, Jadwiga and Roth, Ingo and Latorre, Jos{\'{e}} Ignacio and Carrazza, Stefano}, + journal = {{Quantum}}, + issn = {2521-327X}, + publisher = {{Verein zur F{\"{o}}rderung des Open Access Publizierens in den Quantenwissenschaften}}, + volume = {8}, + pages = {1247}, + month = feb, + year = {2024} + } + +.. _`doi:10.22331/q-2024-02-12-1247`: https://doi.org/10.22331/q-2024-02-12-1247 .. _`arXiv:2308.06313`: https://arxiv.org/abs/2308.06313 * R. Carobene, A. Candido, J. Serrano, A.O-Fuertes, A. Giachero, S. Carrazza, diff --git a/doc/source/code-examples/tutorials/quantum_networks/README.md b/doc/source/code-examples/tutorials/quantum_networks/README.md new file mode 100644 index 0000000000..e0b074640c --- /dev/null +++ b/doc/source/code-examples/tutorials/quantum_networks/README.md @@ -0,0 +1,122 @@ +# Quantum Networks + +## The Quantum Network Model + +The quantum network model is a mathematical framework that allows us to uniquely describe quantum information processing that involves multiple points in time and space. +Each distinguished point in time and space is treated as a linear system $\mathcal{H}_ i$. +A quantum network involving $n$ points in time and space is a Hermitian operator $\mathcal{N}$ that acts on the tensor product of the linear systems $\mathcal{H}_ 0 \otimes \mathcal{H}_ 1 \otimes \cdots \otimes \mathcal{H}_ {n-1}$. +Each system $\mathcal{H}_ {i}$ is either an input or an output of the network. + +A physically implementable quantum network is described by a semi-positive definite operator $\mathcal{N}$ that satisfies the causal constraints. + +A simple example is a quantum channel $\Gamma: \mathcal{H}_ 0 \to \mathcal{H}_ 1$, where $\mathcal{H}_ 0$ is the input system and $\mathcal{H}_ 1$ is the output system. +The quantum channel is a linear map, such that it maps any input quantum state to an output quantum state, which is a sufficient and necessary condition for the map to be physical. +A Hermitian operator $J^\Gamma$ acting on $\mathcal{H}_ 0\otimes \mathcal{H}_ 1$ is associated with a quantum channel $\Gamma$, if $J^\Gamma$ satisfies the following conditions: +$$J^\Gamma \geq 0, \quad \text{and} \quad \text{Tr}_ {\mathcal{H}_ 1} J^\Gamma = \mathbb{I}_ {\mathcal{H} _0} .$$ + +The first condition is called *complete positivity*, and the second condition is called *trace-preserving*. +In particular, the second condition ensures that the information of the input system is only accessible through the output system. + +In particular, a quantum state $\rho$ may be also considered as a quantum network, where the input system is the trivial system $\mathbb{C}$, and the output system is the quantum system $\mathcal{H}$. +The constraints on the quantum channels are then equivalent to the constraints on the quantum states: +$$\rho \geq 0, \quad \text{and} \quad \text{Tr} \rho = \mathbb{I}_ \mathbb{C} = 1\ .$$ + +> For more details, see G. Chiribella *et al.*, *Theoretical framework for quantum networks*, +> [Physical Review A 80.2 (2009): 022339](https://journals.aps.org/pra/abstract/10.1103/PhysRevA.80.022339). + +## Quantum Network in `qibo` + +The manipulation of quantum networks in `qibo` is done through the `QuantumNetwork` class. + +```python +from qibo.quantum_info.quantum_networks import QuantumNetwork +``` + +A quantum state is a quantum network with a single input system and a single output system, where the input system is the trivial 1-dimensional system. +We need to specify the dimensions of each system in the `partition` argument. + +```python +from qibo.quantum_info import random_density_matrix, random_unitary + +state = random_density_matrix(2) +state_choi = QuantumNetwork(state, (1,2)) +print(f'A quantum state is a quantum netowrk of the form {state_choi}') +``` + +``` +>>> A quantum state is a quantum netowrk of the form J[1 -> 2] +``` + +A general quantum channel can be created in a similar way. + +```python +from qibo.gates import DepolarizingChannel + +test_ch = DepolarizingChannel(0,0.5) +N = len(test_ch.target_qubits) +partition = (2**N, 2**N) + +depolar_choi = QuantumNetwork(test_ch.to_choi(), partition) +print(f'A quantum channel is a quantum netowrk of the form {depolar_choi}') +``` + +``` +>>> A quantum channel is a quantum netowrk of the form J[2 -> 2] +``` + +One may apply a quantum channel to a quantum state, or compose two quantum channels, using the `@` operator. + +```python +new_state = depolar_choi @ depolar_choi @ state_choi +``` + +## Example + +For 3-dimensional systems, an unital channel may not be a mixed unitary channel. + +> Example 4.3 in (Watrous, John. The theory of quantum information. Cambridge university press, 2018.) + +```python +A1 = np.array([ + [0,0,0], + [0,0,1/np.sqrt(2)], + [0,-1/np.sqrt(2),0], +]) +A2 = np.array([ + [0,0,1/np.sqrt(2)], + [0,0,0], + [-1/np.sqrt(2),0,0], +]) +A3 = np.array([ + [0,1/np.sqrt(2),0], + [-1/np.sqrt(2),0,0], + [0,0,0], +]) + +Choi1 = QuantumNetwork(A1, (3,3), pure=True) * 3 +Choi2 = QuantumNetwork(A2, (3,3), pure=True)*3 +Choi3 = QuantumNetwork(A3, (3,3), pure=True)*3 +``` + +The three channels are pure but not unital. Which means they are not unitary. + +```python +print(f"Choi1 is unital: {Choi1.unital()}") +print(f"Choi2 is unital: {Choi2.unital()}") +print(f"Choi3 is unital: {Choi3.unital()}") +``` + +``` +>>> Choi1 is unital: False +Choi2 is unital: False +Choi3 is unital: False +``` + +However, the mixture of the three operators is unital. +As the matrices are orthogonal, they are the extreme points of the convex set of the unital channels. +Therefore, this mixed channel is not a mixed unitary channel. + +```python +Choi = Choi1/3 + Choi2/3 + Choi3/3 +print(f"The mixed channel is unital: {Choi.unital()}") +``` diff --git a/doc/source/conf.py b/doc/source/conf.py index be2efea28d..4937bd5889 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -43,6 +43,7 @@ "sphinx.ext.napoleon", "sphinx.ext.intersphinx", "sphinx_copybutton", + "sphinx.ext.viewcode", "recommonmark", "nbsphinx", ] diff --git a/doc/source/getting-started/backends.svg b/doc/source/getting-started/backends.svg index f41f94df97..10890f53b9 100644 --- a/doc/source/getting-started/backends.svg +++ b/doc/source/getting-started/backends.svg @@ -1,3500 +1,6 @@ - - - - - - image/svg+xml - - - - - - - - +
Qibo backends
Simulating on classical hardware
Clifford
Qibotn
Qibojit
tensorflow
numpy
CPU/lightweight
CPU/GPU high performance
Specialized
Executing on quantum hardware
Qibolab
diff --git a/doc/source/qibo_ecosystem.svg b/doc/source/qibo_ecosystem.svg index c3ace1030f..032c2a7431 100644 --- a/doc/source/qibo_ecosystem.svg +++ b/doc/source/qibo_ecosystem.svg @@ -1,13 +1,13 @@ -
Qibo
Language API
Quantum annealing
Quantum circuits
Quantum information
Implementation
Simulation
Clifford
Specialized in Clifford circuits simulation
Qibotn
TensorNetwork simulator
Qibojit
Efficient device-agnostic simulation with custom operators
tensorflow
Simulation of hybrid QML with automatic differentiation
numpy
Lightweight, fits +well with any CPU
Quantum hardware
Qibocal
Characterization
Calibration
Validation
Qibolab
Control drivers
Convert gates to pulses
Transpiler
= backends
= tools
RFSoCs
Application packages
Qibosoq
Qibochem
diff --git a/poetry.lock b/poetry.lock index 0af50a5b0c..1ecea2aeaa 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,24 +2,24 @@ [[package]] name = "absl-py" -version = "2.0.0" +version = "2.1.0" description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." optional = false python-versions = ">=3.7" files = [ - {file = "absl-py-2.0.0.tar.gz", hash = "sha256:d9690211c5fcfefcdd1a45470ac2b5c5acd45241c3af71eed96bc5441746c0d5"}, - {file = "absl_py-2.0.0-py3-none-any.whl", hash = "sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3"}, + {file = "absl-py-2.1.0.tar.gz", hash = "sha256:7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff"}, + {file = "absl_py-2.1.0-py3-none-any.whl", hash = "sha256:526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308"}, ] [[package]] name = "alabaster" -version = "0.7.13" -description = "A configurable sidebar-enabled Sphinx theme" +version = "0.7.16" +description = "A light, configurable Sphinx theme" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" files = [ - {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, - {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, + {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"}, + {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, ] [[package]] @@ -46,13 +46,13 @@ trio = ["trio (>=0.23)"] [[package]] name = "astroid" -version = "3.0.2" +version = "3.0.3" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.8.0" files = [ - {file = "astroid-3.0.2-py3-none-any.whl", hash = "sha256:d6e62862355f60e716164082d6b4b041d38e2a8cf1c7cd953ded5108bac8ff5c"}, - {file = "astroid-3.0.2.tar.gz", hash = "sha256:4a61cf0a59097c7bb52689b0fd63717cd2a8a14dc9f1eee97b82d814881c8c91"}, + {file = "astroid-3.0.3-py3-none-any.whl", hash = "sha256:92fcf218b89f449cdf9f7b39a269f8d5d617b27be68434912e11e79203963a17"}, + {file = "astroid-3.0.3.tar.gz", hash = "sha256:4148645659b08b70d72460ed1921158027a9e53ae8b7234149b1400eddacbb93"}, ] [package.dependencies] @@ -124,19 +124,22 @@ dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "beautifulsoup4" -version = "4.12.2" +version = "4.12.3" description = "Screen-scraping library" optional = false python-versions = ">=3.6.0" files = [ - {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, - {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, ] [package.dependencies] soupsieve = ">1.2" [package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] @@ -171,13 +174,13 @@ files = [ [[package]] name = "certifi" -version = "2023.11.17" +version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, - {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] [[package]] @@ -557,13 +560,13 @@ files = [ [[package]] name = "comm" -version = "0.2.0" +version = "0.2.1" 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"}, + {file = "comm-0.2.1-py3-none-any.whl", hash = "sha256:87928485c0dfc0e7976fd89fc1e187023cf587e7c353e4a9b417555b44adf021"}, + {file = "comm-0.2.1.tar.gz", hash = "sha256:0bc91edae1344d39d3661dcbc36937181fdaddb304790458f8b044dbc064b89a"}, ] [package.dependencies] @@ -651,63 +654,63 @@ test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" -version = "7.3.4" +version = "7.4.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.3.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aff2bd3d585969cc4486bfc69655e862028b689404563e6b549e6a8244f226df"}, - {file = "coverage-7.3.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4353923f38d752ecfbd3f1f20bf7a3546993ae5ecd7c07fd2f25d40b4e54571"}, - {file = "coverage-7.3.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea473c37872f0159294f7073f3fa72f68b03a129799f3533b2bb44d5e9fa4f82"}, - {file = "coverage-7.3.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5214362abf26e254d749fc0c18af4c57b532a4bfde1a057565616dd3b8d7cc94"}, - {file = "coverage-7.3.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f99b7d3f7a7adfa3d11e3a48d1a91bb65739555dd6a0d3fa68aa5852d962e5b1"}, - {file = "coverage-7.3.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:74397a1263275bea9d736572d4cf338efaade2de9ff759f9c26bcdceb383bb49"}, - {file = "coverage-7.3.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f154bd866318185ef5865ace5be3ac047b6d1cc0aeecf53bf83fe846f4384d5d"}, - {file = "coverage-7.3.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e0d84099ea7cba9ff467f9c6f747e3fc3906e2aadac1ce7b41add72e8d0a3712"}, - {file = "coverage-7.3.4-cp310-cp310-win32.whl", hash = "sha256:3f477fb8a56e0c603587b8278d9dbd32e54bcc2922d62405f65574bd76eba78a"}, - {file = "coverage-7.3.4-cp310-cp310-win_amd64.whl", hash = "sha256:c75738ce13d257efbb6633a049fb2ed8e87e2e6c2e906c52d1093a4d08d67c6b"}, - {file = "coverage-7.3.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:997aa14b3e014339d8101b9886063c5d06238848905d9ad6c6eabe533440a9a7"}, - {file = "coverage-7.3.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8a9c5bc5db3eb4cd55ecb8397d8e9b70247904f8eca718cc53c12dcc98e59fc8"}, - {file = "coverage-7.3.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27ee94f088397d1feea3cb524e4313ff0410ead7d968029ecc4bc5a7e1d34fbf"}, - {file = "coverage-7.3.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ce03e25e18dd9bf44723e83bc202114817f3367789052dc9e5b5c79f40cf59d"}, - {file = "coverage-7.3.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85072e99474d894e5df582faec04abe137b28972d5e466999bc64fc37f564a03"}, - {file = "coverage-7.3.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a877810ef918d0d345b783fc569608804f3ed2507bf32f14f652e4eaf5d8f8d0"}, - {file = "coverage-7.3.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9ac17b94ab4ca66cf803f2b22d47e392f0977f9da838bf71d1f0db6c32893cb9"}, - {file = "coverage-7.3.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:36d75ef2acab74dc948d0b537ef021306796da551e8ac8b467810911000af66a"}, - {file = "coverage-7.3.4-cp311-cp311-win32.whl", hash = "sha256:47ee56c2cd445ea35a8cc3ad5c8134cb9bece3a5cb50bb8265514208d0a65928"}, - {file = "coverage-7.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:11ab62d0ce5d9324915726f611f511a761efcca970bd49d876cf831b4de65be5"}, - {file = "coverage-7.3.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:33e63c578f4acce1b6cd292a66bc30164495010f1091d4b7529d014845cd9bee"}, - {file = "coverage-7.3.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:782693b817218169bfeb9b9ba7f4a9f242764e180ac9589b45112571f32a0ba6"}, - {file = "coverage-7.3.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c4277ddaad9293454da19121c59f2d850f16bcb27f71f89a5c4836906eb35ef"}, - {file = "coverage-7.3.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d892a19ae24b9801771a5a989fb3e850bd1ad2e2b6e83e949c65e8f37bc67a1"}, - {file = "coverage-7.3.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3024ec1b3a221bd10b5d87337d0373c2bcaf7afd86d42081afe39b3e1820323b"}, - {file = "coverage-7.3.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a1c3e9d2bbd6f3f79cfecd6f20854f4dc0c6e0ec317df2b265266d0dc06535f1"}, - {file = "coverage-7.3.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e91029d7f151d8bf5ab7d8bfe2c3dbefd239759d642b211a677bc0709c9fdb96"}, - {file = "coverage-7.3.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6879fe41c60080aa4bb59703a526c54e0412b77e649a0d06a61782ecf0853ee1"}, - {file = "coverage-7.3.4-cp312-cp312-win32.whl", hash = "sha256:fd2f8a641f8f193968afdc8fd1697e602e199931012b574194052d132a79be13"}, - {file = "coverage-7.3.4-cp312-cp312-win_amd64.whl", hash = "sha256:d1d0ce6c6947a3a4aa5479bebceff2c807b9f3b529b637e2b33dea4468d75fc7"}, - {file = "coverage-7.3.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:36797b3625d1da885b369bdaaa3b0d9fb8865caed3c2b8230afaa6005434aa2f"}, - {file = "coverage-7.3.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfed0ec4b419fbc807dec417c401499ea869436910e1ca524cfb4f81cf3f60e7"}, - {file = "coverage-7.3.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f97ff5a9fc2ca47f3383482858dd2cb8ddbf7514427eecf5aa5f7992d0571429"}, - {file = "coverage-7.3.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:607b6c6b35aa49defaebf4526729bd5238bc36fe3ef1a417d9839e1d96ee1e4c"}, - {file = "coverage-7.3.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8e258dcc335055ab59fe79f1dec217d9fb0cdace103d6b5c6df6b75915e7959"}, - {file = "coverage-7.3.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a02ac7c51819702b384fea5ee033a7c202f732a2a2f1fe6c41e3d4019828c8d3"}, - {file = "coverage-7.3.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b710869a15b8caf02e31d16487a931dbe78335462a122c8603bb9bd401ff6fb2"}, - {file = "coverage-7.3.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c6a23ae9348a7a92e7f750f9b7e828448e428e99c24616dec93a0720342f241d"}, - {file = "coverage-7.3.4-cp38-cp38-win32.whl", hash = "sha256:758ebaf74578b73f727acc4e8ab4b16ab6f22a5ffd7dd254e5946aba42a4ce76"}, - {file = "coverage-7.3.4-cp38-cp38-win_amd64.whl", hash = "sha256:309ed6a559bc942b7cc721f2976326efbfe81fc2b8f601c722bff927328507dc"}, - {file = "coverage-7.3.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:aefbb29dc56317a4fcb2f3857d5bce9b881038ed7e5aa5d3bcab25bd23f57328"}, - {file = "coverage-7.3.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:183c16173a70caf92e2dfcfe7c7a576de6fa9edc4119b8e13f91db7ca33a7923"}, - {file = "coverage-7.3.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a4184dcbe4f98d86470273e758f1d24191ca095412e4335ff27b417291f5964"}, - {file = "coverage-7.3.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93698ac0995516ccdca55342599a1463ed2e2d8942316da31686d4d614597ef9"}, - {file = "coverage-7.3.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb220b3596358a86361139edce40d97da7458412d412e1e10c8e1970ee8c09ab"}, - {file = "coverage-7.3.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d5b14abde6f8d969e6b9dd8c7a013d9a2b52af1235fe7bebef25ad5c8f47fa18"}, - {file = "coverage-7.3.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:610afaf929dc0e09a5eef6981edb6a57a46b7eceff151947b836d869d6d567c1"}, - {file = "coverage-7.3.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d6ed790728fb71e6b8247bd28e77e99d0c276dff952389b5388169b8ca7b1c28"}, - {file = "coverage-7.3.4-cp39-cp39-win32.whl", hash = "sha256:c15fdfb141fcf6a900e68bfa35689e1256a670db32b96e7a931cab4a0e1600e5"}, - {file = "coverage-7.3.4-cp39-cp39-win_amd64.whl", hash = "sha256:38d0b307c4d99a7aca4e00cad4311b7c51b7ac38fb7dea2abe0d182dd4008e05"}, - {file = "coverage-7.3.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b1e0f25ae99cf247abfb3f0fac7ae25739e4cd96bf1afa3537827c576b4847e5"}, - {file = "coverage-7.3.4.tar.gz", hash = "sha256:020d56d2da5bc22a0e00a5b0d54597ee91ad72446fa4cf1b97c35022f6b6dbf0"}, + {file = "coverage-7.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:077d366e724f24fc02dbfe9d946534357fda71af9764ff99d73c3c596001bbd7"}, + {file = "coverage-7.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0193657651f5399d433c92f8ae264aff31fc1d066deee4b831549526433f3f61"}, + {file = "coverage-7.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d17bbc946f52ca67adf72a5ee783cd7cd3477f8f8796f59b4974a9b59cacc9ee"}, + {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3277f5fa7483c927fe3a7b017b39351610265308f5267ac6d4c2b64cc1d8d25"}, + {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dceb61d40cbfcf45f51e59933c784a50846dc03211054bd76b421a713dcdf19"}, + {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6008adeca04a445ea6ef31b2cbaf1d01d02986047606f7da266629afee982630"}, + {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c61f66d93d712f6e03369b6a7769233bfda880b12f417eefdd4f16d1deb2fc4c"}, + {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9bb62fac84d5f2ff523304e59e5c439955fb3b7f44e3d7b2085184db74d733b"}, + {file = "coverage-7.4.1-cp310-cp310-win32.whl", hash = "sha256:f86f368e1c7ce897bf2457b9eb61169a44e2ef797099fb5728482b8d69f3f016"}, + {file = "coverage-7.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:869b5046d41abfea3e381dd143407b0d29b8282a904a19cb908fa24d090cc018"}, + {file = "coverage-7.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b8ffb498a83d7e0305968289441914154fb0ef5d8b3157df02a90c6695978295"}, + {file = "coverage-7.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3cacfaefe6089d477264001f90f55b7881ba615953414999c46cc9713ff93c8c"}, + {file = "coverage-7.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d6850e6e36e332d5511a48a251790ddc545e16e8beaf046c03985c69ccb2676"}, + {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18e961aa13b6d47f758cc5879383d27b5b3f3dcd9ce8cdbfdc2571fe86feb4dd"}, + {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfd1e1b9f0898817babf840b77ce9fe655ecbe8b1b327983df485b30df8cc011"}, + {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6b00e21f86598b6330f0019b40fb397e705135040dbedc2ca9a93c7441178e74"}, + {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:536d609c6963c50055bab766d9951b6c394759190d03311f3e9fcf194ca909e1"}, + {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7ac8f8eb153724f84885a1374999b7e45734bf93a87d8df1e7ce2146860edef6"}, + {file = "coverage-7.4.1-cp311-cp311-win32.whl", hash = "sha256:f3771b23bb3675a06f5d885c3630b1d01ea6cac9e84a01aaf5508706dba546c5"}, + {file = "coverage-7.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:9d2f9d4cc2a53b38cabc2d6d80f7f9b7e3da26b2f53d48f05876fef7956b6968"}, + {file = "coverage-7.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f68ef3660677e6624c8cace943e4765545f8191313a07288a53d3da188bd8581"}, + {file = "coverage-7.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23b27b8a698e749b61809fb637eb98ebf0e505710ec46a8aa6f1be7dc0dc43a6"}, + {file = "coverage-7.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e3424c554391dc9ef4a92ad28665756566a28fecf47308f91841f6c49288e66"}, + {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0860a348bf7004c812c8368d1fc7f77fe8e4c095d661a579196a9533778e156"}, + {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe558371c1bdf3b8fa03e097c523fb9645b8730399c14fe7721ee9c9e2a545d3"}, + {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3468cc8720402af37b6c6e7e2a9cdb9f6c16c728638a2ebc768ba1ef6f26c3a1"}, + {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:02f2edb575d62172aa28fe00efe821ae31f25dc3d589055b3fb64d51e52e4ab1"}, + {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ca6e61dc52f601d1d224526360cdeab0d0712ec104a2ce6cc5ccef6ed9a233bc"}, + {file = "coverage-7.4.1-cp312-cp312-win32.whl", hash = "sha256:ca7b26a5e456a843b9b6683eada193fc1f65c761b3a473941efe5a291f604c74"}, + {file = "coverage-7.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:85ccc5fa54c2ed64bd91ed3b4a627b9cce04646a659512a051fa82a92c04a448"}, + {file = "coverage-7.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8bdb0285a0202888d19ec6b6d23d5990410decb932b709f2b0dfe216d031d218"}, + {file = "coverage-7.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:918440dea04521f499721c039863ef95433314b1db00ff826a02580c1f503e45"}, + {file = "coverage-7.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:379d4c7abad5afbe9d88cc31ea8ca262296480a86af945b08214eb1a556a3e4d"}, + {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b094116f0b6155e36a304ff912f89bbb5067157aff5f94060ff20bbabdc8da06"}, + {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f5968608b1fe2a1d00d01ad1017ee27efd99b3437e08b83ded9b7af3f6f766"}, + {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:10e88e7f41e6197ea0429ae18f21ff521d4f4490aa33048f6c6f94c6045a6a75"}, + {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a4a3907011d39dbc3e37bdc5df0a8c93853c369039b59efa33a7b6669de04c60"}, + {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d224f0c4c9c98290a6990259073f496fcec1b5cc613eecbd22786d398ded3ad"}, + {file = "coverage-7.4.1-cp38-cp38-win32.whl", hash = "sha256:23f5881362dcb0e1a92b84b3c2809bdc90db892332daab81ad8f642d8ed55042"}, + {file = "coverage-7.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:a07f61fc452c43cd5328b392e52555f7d1952400a1ad09086c4a8addccbd138d"}, + {file = "coverage-7.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8e738a492b6221f8dcf281b67129510835461132b03024830ac0e554311a5c54"}, + {file = "coverage-7.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46342fed0fff72efcda77040b14728049200cbba1279e0bf1188f1f2078c1d70"}, + {file = "coverage-7.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9641e21670c68c7e57d2053ddf6c443e4f0a6e18e547e86af3fad0795414a628"}, + {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeb2c2688ed93b027eb0d26aa188ada34acb22dceea256d76390eea135083950"}, + {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d12c923757de24e4e2110cf8832d83a886a4cf215c6e61ed506006872b43a6d1"}, + {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0491275c3b9971cdbd28a4595c2cb5838f08036bca31765bad5e17edf900b2c7"}, + {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8dfc5e195bbef80aabd81596ef52a1277ee7143fe419efc3c4d8ba2754671756"}, + {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1a78b656a4d12b0490ca72651fe4d9f5e07e3c6461063a9b6265ee45eb2bdd35"}, + {file = "coverage-7.4.1-cp39-cp39-win32.whl", hash = "sha256:f90515974b39f4dea2f27c0959688621b46d96d5a626cf9c53dbc653a895c05c"}, + {file = "coverage-7.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:64e723ca82a84053dd7bfcc986bdb34af8d9da83c521c19d6b472bc6880e191a"}, + {file = "coverage-7.4.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:32a8d985462e37cfdab611a6f95b09d7c091d07668fdc26e47a725ee575fe166"}, + {file = "coverage-7.4.1.tar.gz", hash = "sha256:1ed4b95480952b1a26d863e546fa5094564aa0065e1e5f0d4d0041f293251d04"}, ] [package.dependencies] @@ -854,7 +857,6 @@ python-versions = "*" files = [ {file = "cutensor_cu11-1.7.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:c5598670f4f31906d725f5ea852f0df675522e3ff5a7bf886057eab36497062d"}, {file = "cutensor_cu11-1.7.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:67b6c7427d9ab50cb82e01360948bd1b23d73775b5767ab92071c7afcfec4b8b"}, - {file = "cutensor_cu11-1.7.0-py3-none-win_amd64.whl", hash = "sha256:d173b3d0fd51cf761b371a4d4be9a3afd3ef230a55ae4336ae31e905336480e1"}, ] [[package]] @@ -866,7 +868,6 @@ python-versions = "*" files = [ {file = "cutensor_cu12-1.7.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:515caa2406e09ffe9c6524328b7da2106169811665f7684836052753a30dda27"}, {file = "cutensor_cu12-1.7.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:29bdde551788fd3a611992026a5bb422831069e38fd44ab920af5aa00cffa12c"}, - {file = "cutensor_cu12-1.7.0-py3-none-win_amd64.whl", hash = "sha256:e1a9a759a615a64d1b8c6d2b8ffd925deb805750c28481b1a8310d05f35ce229"}, ] [[package]] @@ -899,32 +900,32 @@ cutensor-cu12 = ">=1.6.1,<2" [[package]] name = "cvxpy" -version = "1.4.1" +version = "1.4.2" description = "A domain-specific language for modeling convex optimization problems in Python." optional = false python-versions = ">=3.8" files = [ - {file = "cvxpy-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:03588055b660c043848f5281fe24dbd21f005b34bd8bd3b56906d8ad457c14ae"}, - {file = "cvxpy-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:315609ff96adeda4970471b349bc19d44ff4043e15630cf5ac70c029658fe8fc"}, - {file = "cvxpy-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55e08ffb973d62b3fabc675ad464cb6013ea5ce69799f330b33a084a2e580d8d"}, - {file = "cvxpy-1.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f1482558b785f2db51c76b9c6e91cc85dbd146675b126a799e7d7aab5b15354"}, - {file = "cvxpy-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:2f84687d15d11f9b49ca902f20103a2076efd47773c399cace71237ef53cdadc"}, - {file = "cvxpy-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d6bfbd535fdaabc5fa55f28de7a1d40f3a803a27fe3fec86e90700fa159a3afc"}, - {file = "cvxpy-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:71a95aaccf22431fd25a63bcb12d583e1b0baeaeb4fafa3e25857cec03b9e2f3"}, - {file = "cvxpy-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bae3bf31e4eb6ed6407f78c6bc3c7bc4b4145cdbbb9ba8c61c3fc541d7067"}, - {file = "cvxpy-1.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41cfaecf86f85162ca53c7be7377b4143e316204fb9b6a7df8b7a08c826e3806"}, - {file = "cvxpy-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:edf66010e49b64d3f2dd1a7abde8fa3e615ce7a2b3eb185ab744b0beb3a6adb9"}, - {file = "cvxpy-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6b0f17dca85b2a410e73f5d84b28f35f57a20cfec1b0adc9b16f0f8aabff9961"}, - {file = "cvxpy-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9318c4e679b3db470e76e7f23cce362b038bd2d68c4a7326a7c21577ddbdc542"}, - {file = "cvxpy-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a46ef722c8d1590875e86360d5781703dfcbd08be73eb98a2fc91a280870064"}, - {file = "cvxpy-1.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57593a852c563ce77bdb075a3e75f23d36d4b3162ebf3199b54cc7fe75088ef2"}, - {file = "cvxpy-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:db89b55025514bad821b1f1781bed373cbb6aa22fe84420431efd510dbe7f858"}, - {file = "cvxpy-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:372c0825cc6e6bb03ecc550d83718761a1bbdbbb48010fec6f9718581ebd45b5"}, - {file = "cvxpy-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:163caffd7f7f27b6cb151f4ccff283068e063c3673158793048761690cbe4bbe"}, - {file = "cvxpy-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f24067c54979b09910aea0a03256247121d8a8169538facf087c1923e9e2701a"}, - {file = "cvxpy-1.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a3ec054279880a9ebf5fd9d2ac4109acf944b8c45ea8b24e461680e34f3d7b5"}, - {file = "cvxpy-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:d220a7ee55907da9b55b98e5238d03735118d03b82855ba87b872cb2e6977367"}, - {file = "cvxpy-1.4.1.tar.gz", hash = "sha256:7a9ef34e3c57ff8c844d86f0a3834fb5575af19233947639de0ba577c6122e3e"}, + {file = "cvxpy-1.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:06231c0b2a65f7c8ba32c2772576c24e93e1ca964444b90c6bad366b9c0a5bdc"}, + {file = "cvxpy-1.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f257971b007261d53ec7f50618f0c6a511387dd7df6cd686d2647c3fa91da0eb"}, + {file = "cvxpy-1.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38c2191d4142baac206ac590ba9e5cb1c6e025ac95d0a746692c9cf8d1afd46e"}, + {file = "cvxpy-1.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba9d006f76925127cd42b80e2d98c950a8339f8204b4c23fa25af83d895e95fa"}, + {file = "cvxpy-1.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:2a09ebd8f7a8b6b5d026d03295daee0780e2f6847fbe6f207e9764045ffbbfc9"}, + {file = "cvxpy-1.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:079fe6aeaeec2ddf6163ff8ca6510afd5c2b66ea391605791a77b51e534b935e"}, + {file = "cvxpy-1.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8419dffcadefc16e6fcbe8a088068c29edb1f28ea90582f075a96f21ae7ff11"}, + {file = "cvxpy-1.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6551ef3b325d707e98f920dd120ebaa968f3ac3484c21f8567f2081967d26f0"}, + {file = "cvxpy-1.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fea513f4bf83491a1c9e5366faa4ca9fc21ec9522c30bcd55e49de9bb85fe9a2"}, + {file = "cvxpy-1.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:78560a02607d16fbb26db6306e7ce6d8e4fcda49cf04578d199ac050c2e74daa"}, + {file = "cvxpy-1.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9817cf8da86641e2d322911844e86b8e7b1d93d9b2d57ae6d33e84be430e1e04"}, + {file = "cvxpy-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:32999d550a923c9448d973ef9d3ab75d73e1bdf56102fc32fe7ccb5e0cb5d7a3"}, + {file = "cvxpy-1.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213b465450f4254226e6c18c70e25e911ae2c60176621f1bc2d9a0eb874288db"}, + {file = "cvxpy-1.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec30efa81d1f79f668b0fa6e8ac654047db7a3e844ab16022e1b5dcf52177192"}, + {file = "cvxpy-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:779c19be964f7a586337fd4d017c7a0202bf845e08b04a174850f962b45b2a00"}, + {file = "cvxpy-1.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bb1d6af8406efa1de0408d0a76c248da3185cade49f45c443239772830b7d6bb"}, + {file = "cvxpy-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:63102885fdfd3eae716c042ee7aad9439d0b71ba22e5432c85f0e35056fcb159"}, + {file = "cvxpy-1.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20015b82117c0253ca803c4e174010067bda0eedb539503ba58b98e00acdd0f2"}, + {file = "cvxpy-1.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f73ff4f0e7bff1e438dc2b02490d7a8e1027c421057a7971b4ca4982c28d60"}, + {file = "cvxpy-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b7cfc6be34b288acade31b58a1e88b119487165d0ed877db9decf7fd676502f6"}, + {file = "cvxpy-1.4.2.tar.gz", hash = "sha256:0a386a5788dbd78b7b20dd071524ec636c8fa72b3628e69f1abc714c8f9811e5"}, ] [package.dependencies] @@ -1011,17 +1012,18 @@ dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] [[package]] name = "dill" -version = "0.3.7" +version = "0.3.8" description = "serialize all of Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, - {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, + {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, + {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, ] [package.extras] graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] [[package]] name = "docutils" @@ -1050,27 +1052,30 @@ dev-env = ["black (==22.3.0)", "isort (==5.7.*)", "mypy (==0.931.*)", "pylint (= [[package]] name = "ecos" -version = "2.0.12" +version = "2.0.13" description = "This is the Python package for ECOS: Embedded Cone Solver. See Github page for more information." optional = false python-versions = "*" files = [ - {file = "ecos-2.0.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:835298a299c88c207b3402fba60ad9b5688b59bbbf2ac34a46de5b37165d773a"}, - {file = "ecos-2.0.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608bc822ee8e070927ab3519169b13a1a0fe88f3d562212d6b5dbb1039776360"}, - {file = "ecos-2.0.12-cp310-cp310-win_amd64.whl", hash = "sha256:5184a9d8521ad1af90ffcd9902a6fa75c7bc473f37d30d86f97beda1033dfca2"}, - {file = "ecos-2.0.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eba07599084724eedc20b2862d5580eebebb09609f4740baadc78401cb99827c"}, - {file = "ecos-2.0.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4979dc2d1cb6667e371a45a61887068505c1305437eef104ed6ef16f4b6aa0e3"}, - {file = "ecos-2.0.12-cp311-cp311-win_amd64.whl", hash = "sha256:da8fbbca3feb83a9e27075d29b3765417d0c80af8ea83cbdc4a558cae7b564af"}, - {file = "ecos-2.0.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f70e4547966f530fd7715756f7a65d5b9b90b312b9d37f243ef9356c05e7d74c"}, - {file = "ecos-2.0.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:617be25d74222849622b0f82b94a11abcf1fae78ccaf69977b328321ee6ffa0b"}, - {file = "ecos-2.0.12-cp37-cp37m-win_amd64.whl", hash = "sha256:29d00164eaea66ed54697a3b361c575284a8bca54f2623381a0635806c7303a7"}, - {file = "ecos-2.0.12-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4e86671397d1d2cd7cccff8a9c45be0541b0c60af8b92a0ff3581c9ed869db67"}, - {file = "ecos-2.0.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:858a4dd3177bdc8cc6e362031732f5177b62138a1e4ef91c0dc3c6bd7d2d1248"}, - {file = "ecos-2.0.12-cp38-cp38-win_amd64.whl", hash = "sha256:528b02f53835bd1baeb2e23f8153b8d6cc2b3704e1768be6a1a972f542241670"}, - {file = "ecos-2.0.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e42bd4c19af6e04f76ccc85d941b1f1adc7faeee4d06d482395a6beb7bec895"}, - {file = "ecos-2.0.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6def54336a15b5a49bc3bfcaa36035e8557cae8a4853b17ca84f5a29c93bcaea"}, - {file = "ecos-2.0.12-cp39-cp39-win_amd64.whl", hash = "sha256:7af08941552fce108bd80145cdb6be7fa74477a20bacdac170800442cc7027d4"}, - {file = "ecos-2.0.12.tar.gz", hash = "sha256:f48816d73b87ae325556ea537b7c8743187311403c80e3832035224156337c4e"}, + {file = "ecos-2.0.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a1c1acf33b70f8657c25f07ec8d7b59bb01dbad39f072fa61fc956c2166ed979"}, + {file = "ecos-2.0.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ea88ee2c94192004d6be9c55a3c79f184eaba3bbf31474229045a1b0a8a1536"}, + {file = "ecos-2.0.13-cp310-cp310-win_amd64.whl", hash = "sha256:df8ae7fce79be9e5f79f0511c51a4824795de5154847fabe1a0288bc2ea349d3"}, + {file = "ecos-2.0.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88dd628bc6e77a069165fa5f50340e2856795c28e00e3fce213a04d7c41c584a"}, + {file = "ecos-2.0.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b2c969c7e22fd8a1d1cd0a90f4325d90572da23e2e923b0da6138ce62503d0"}, + {file = "ecos-2.0.13-cp311-cp311-win_amd64.whl", hash = "sha256:936890fb85a186360a5c8f228dd19acb760e234b38c598d0b46ab29644e31dfc"}, + {file = "ecos-2.0.13-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:62ed497ab56017f1d7264eb56223826a984462b1d84fb850d10f0bec3490877d"}, + {file = "ecos-2.0.13-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf2b1384012bee9e58e5a2373905d3644f74a0ea000b307a239366fe7850c29c"}, + {file = "ecos-2.0.13-cp312-cp312-win_amd64.whl", hash = "sha256:2c1ea09069e32185912506f946bb6d1f144841ba1d1cd0217c67f72cbdf7a8fd"}, + {file = "ecos-2.0.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b9f4a76a3e1165359e1704ec6b1b89d487858ec0d838d62a7268133d88221914"}, + {file = "ecos-2.0.13-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3c2d4e0d3ada1a619ddd62fbf48ccbe9b738fdbef119945fe2a05566d03b85a"}, + {file = "ecos-2.0.13-cp37-cp37m-win_amd64.whl", hash = "sha256:84c72e1e5ffa41cd38352dcf0a8c25418f5bf04ed76a576db0daaf9a69f5568f"}, + {file = "ecos-2.0.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1979f1f17ec7f1a0fc45964d02d762393f9f427d965fe8a893e7b1476a9023c3"}, + {file = "ecos-2.0.13-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:059e6c29c89f47a490353e4f9336e96350a5102a97e1d8a2aaff796bcbe50058"}, + {file = "ecos-2.0.13-cp38-cp38-win_amd64.whl", hash = "sha256:30c7d0cce6c830da5b9ea25af0d47b203255639524eb4d03d1331c600958c834"}, + {file = "ecos-2.0.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba42c15f1d79eb2ada532e9781b4aeb3ed84b1c7e38239ba4d6502c6a092d5b1"}, + {file = "ecos-2.0.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32fb33185f6dd94a1c798bc481eb86c9f4e832efec91f6ab0584e2fc26fd375e"}, + {file = "ecos-2.0.13-cp39-cp39-win_amd64.whl", hash = "sha256:68995ab12d363576dddb2d1f91ead3b9c8a8ca61f29000f0b1daef1b4e7b5b64"}, + {file = "ecos-2.0.13.tar.gz", hash = "sha256:f2a9dc108ade7faf6f6f4fad245f4714b7293c8767d2a351ead59428a94a98b9"}, ] [package.dependencies] @@ -1122,13 +1127,13 @@ pyrepl = ">=0.8.2" [[package]] name = "fastjsonschema" -version = "2.19.0" +version = "2.19.1" description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" files = [ - {file = "fastjsonschema-2.19.0-py3-none-any.whl", hash = "sha256:b9fd1a2dd6971dbc7fee280a95bd199ae0dd9ce22beb91cc75e9c1c528a5170e"}, - {file = "fastjsonschema-2.19.0.tar.gz", hash = "sha256:e25df6647e1bc4a26070b700897b07b542ec898dd4f1f6ea013e7f6a88417225"}, + {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"}, + {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"}, ] [package.extras] @@ -1231,60 +1236,60 @@ files = [ [[package]] name = "fonttools" -version = "4.47.0" +version = "4.49.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.47.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2d2404107626f97a221dc1a65b05396d2bb2ce38e435f64f26ed2369f68675d9"}, - {file = "fonttools-4.47.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c01f409be619a9a0f5590389e37ccb58b47264939f0e8d58bfa1f3ba07d22671"}, - {file = "fonttools-4.47.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d986b66ff722ef675b7ee22fbe5947a41f60a61a4da15579d5e276d897fbc7fa"}, - {file = "fonttools-4.47.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8acf6dd0434b211b3bd30d572d9e019831aae17a54016629fa8224783b22df8"}, - {file = "fonttools-4.47.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:495369c660e0c27233e3c572269cbe520f7f4978be675f990f4005937337d391"}, - {file = "fonttools-4.47.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c59227d7ba5b232281c26ae04fac2c73a79ad0e236bca5c44aae904a18f14faf"}, - {file = "fonttools-4.47.0-cp310-cp310-win32.whl", hash = "sha256:59a6c8b71a245800e923cb684a2dc0eac19c56493e2f896218fcf2571ed28984"}, - {file = "fonttools-4.47.0-cp310-cp310-win_amd64.whl", hash = "sha256:52c82df66201f3a90db438d9d7b337c7c98139de598d0728fb99dab9fd0495ca"}, - {file = "fonttools-4.47.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:854421e328d47d70aa5abceacbe8eef231961b162c71cbe7ff3f47e235e2e5c5"}, - {file = "fonttools-4.47.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:511482df31cfea9f697930f61520f6541185fa5eeba2fa760fe72e8eee5af88b"}, - {file = "fonttools-4.47.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0e2c88c8c985b7b9a7efcd06511fb0a1fe3ddd9a6cd2895ef1dbf9059719d7"}, - {file = "fonttools-4.47.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7a0a8848726956e9d9fb18c977a279013daadf0cbb6725d2015a6dd57527992"}, - {file = "fonttools-4.47.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e869da810ae35afb3019baa0d0306cdbab4760a54909c89ad8904fa629991812"}, - {file = "fonttools-4.47.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dd23848f877c3754f53a4903fb7a593ed100924f9b4bff7d5a4e2e8a7001ae11"}, - {file = "fonttools-4.47.0-cp311-cp311-win32.whl", hash = "sha256:bf1810635c00f7c45d93085611c995fc130009cec5abdc35b327156aa191f982"}, - {file = "fonttools-4.47.0-cp311-cp311-win_amd64.whl", hash = "sha256:61df4dee5d38ab65b26da8efd62d859a1eef7a34dcbc331299a28e24d04c59a7"}, - {file = "fonttools-4.47.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e3f4d61f3a8195eac784f1d0c16c0a3105382c1b9a74d99ac4ba421da39a8826"}, - {file = "fonttools-4.47.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:174995f7b057e799355b393e97f4f93ef1f2197cbfa945e988d49b2a09ecbce8"}, - {file = "fonttools-4.47.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea592e6a09b71cb7a7661dd93ac0b877a6228e2d677ebacbad0a4d118494c86d"}, - {file = "fonttools-4.47.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40bdbe90b33897d9cc4a39f8e415b0fcdeae4c40a99374b8a4982f127ff5c767"}, - {file = "fonttools-4.47.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:843509ae9b93db5aaf1a6302085e30bddc1111d31e11d724584818f5b698f500"}, - {file = "fonttools-4.47.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9acfa1cdc479e0dde528b61423855913d949a7f7fe09e276228298fef4589540"}, - {file = "fonttools-4.47.0-cp312-cp312-win32.whl", hash = "sha256:66c92ec7f95fd9732550ebedefcd190a8d81beaa97e89d523a0d17198a8bda4d"}, - {file = "fonttools-4.47.0-cp312-cp312-win_amd64.whl", hash = "sha256:e8fa20748de55d0021f83754b371432dca0439e02847962fc4c42a0e444c2d78"}, - {file = "fonttools-4.47.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c75e19971209fbbce891ebfd1b10c37320a5a28e8d438861c21d35305aedb81c"}, - {file = "fonttools-4.47.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e79f1a3970d25f692bbb8c8c2637e621a66c0d60c109ab48d4a160f50856deff"}, - {file = "fonttools-4.47.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:562681188c62c024fe2c611b32e08b8de2afa00c0c4e72bed47c47c318e16d5c"}, - {file = "fonttools-4.47.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a77a60315c33393b2bd29d538d1ef026060a63d3a49a9233b779261bad9c3f71"}, - {file = "fonttools-4.47.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4fabb8cc9422efae1a925160083fdcbab8fdc96a8483441eb7457235df625bd"}, - {file = "fonttools-4.47.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2a78dba8c2a1e9d53a0fb5382979f024200dc86adc46a56cbb668a2249862fda"}, - {file = "fonttools-4.47.0-cp38-cp38-win32.whl", hash = "sha256:e6b968543fde4119231c12c2a953dcf83349590ca631ba8216a8edf9cd4d36a9"}, - {file = "fonttools-4.47.0-cp38-cp38-win_amd64.whl", hash = "sha256:4a9a51745c0439516d947480d4d884fa18bd1458e05b829e482b9269afa655bc"}, - {file = "fonttools-4.47.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:62d8ddb058b8e87018e5dc26f3258e2c30daad4c87262dfeb0e2617dd84750e6"}, - {file = "fonttools-4.47.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5dde0eab40faaa5476133123f6a622a1cc3ac9b7af45d65690870620323308b4"}, - {file = "fonttools-4.47.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4da089f6dfdb822293bde576916492cd708c37c2501c3651adde39804630538"}, - {file = "fonttools-4.47.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:253bb46bab970e8aae254cebf2ae3db98a4ef6bd034707aa68a239027d2b198d"}, - {file = "fonttools-4.47.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1193fb090061efa2f9e2d8d743ae9850c77b66746a3b32792324cdce65784154"}, - {file = "fonttools-4.47.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:084511482dd265bce6dca24c509894062f0117e4e6869384d853f46c0e6d43be"}, - {file = "fonttools-4.47.0-cp39-cp39-win32.whl", hash = "sha256:97620c4af36e4c849e52661492e31dc36916df12571cb900d16960ab8e92a980"}, - {file = "fonttools-4.47.0-cp39-cp39-win_amd64.whl", hash = "sha256:e77bdf52185bdaf63d39f3e1ac3212e6cfa3ab07d509b94557a8902ce9c13c82"}, - {file = "fonttools-4.47.0-py3-none-any.whl", hash = "sha256:d6477ba902dd2d7adda7f0fd3bfaeb92885d45993c9e1928c9f28fc3961415f7"}, - {file = "fonttools-4.47.0.tar.gz", hash = "sha256:ec13a10715eef0e031858c1c23bfaee6cba02b97558e4a7bfa089dba4a8c2ebf"}, + {file = "fonttools-4.49.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d970ecca0aac90d399e458f0b7a8a597e08f95de021f17785fb68e2dc0b99717"}, + {file = "fonttools-4.49.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac9a745b7609f489faa65e1dc842168c18530874a5f5b742ac3dd79e26bca8bc"}, + {file = "fonttools-4.49.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ba0e00620ca28d4ca11fc700806fd69144b463aa3275e1b36e56c7c09915559"}, + {file = "fonttools-4.49.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdee3ab220283057e7840d5fb768ad4c2ebe65bdba6f75d5d7bf47f4e0ed7d29"}, + {file = "fonttools-4.49.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ce7033cb61f2bb65d8849658d3786188afd80f53dad8366a7232654804529532"}, + {file = "fonttools-4.49.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:07bc5ea02bb7bc3aa40a1eb0481ce20e8d9b9642a9536cde0218290dd6085828"}, + {file = "fonttools-4.49.0-cp310-cp310-win32.whl", hash = "sha256:86eef6aab7fd7c6c8545f3ebd00fd1d6729ca1f63b0cb4d621bccb7d1d1c852b"}, + {file = "fonttools-4.49.0-cp310-cp310-win_amd64.whl", hash = "sha256:1fac1b7eebfce75ea663e860e7c5b4a8831b858c17acd68263bc156125201abf"}, + {file = "fonttools-4.49.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:edc0cce355984bb3c1d1e89d6a661934d39586bb32191ebff98c600f8957c63e"}, + {file = "fonttools-4.49.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:83a0d9336de2cba86d886507dd6e0153df333ac787377325a39a2797ec529814"}, + {file = "fonttools-4.49.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36c8865bdb5cfeec88f5028e7e592370a0657b676c6f1d84a2108e0564f90e22"}, + {file = "fonttools-4.49.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33037d9e56e2562c710c8954d0f20d25b8386b397250d65581e544edc9d6b942"}, + {file = "fonttools-4.49.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8fb022d799b96df3eaa27263e9eea306bd3d437cc9aa981820850281a02b6c9a"}, + {file = "fonttools-4.49.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:33c584c0ef7dc54f5dd4f84082eabd8d09d1871a3d8ca2986b0c0c98165f8e86"}, + {file = "fonttools-4.49.0-cp311-cp311-win32.whl", hash = "sha256:cbe61b158deb09cffdd8540dc4a948d6e8f4d5b4f3bf5cd7db09bd6a61fee64e"}, + {file = "fonttools-4.49.0-cp311-cp311-win_amd64.whl", hash = "sha256:fc11e5114f3f978d0cea7e9853627935b30d451742eeb4239a81a677bdee6bf6"}, + {file = "fonttools-4.49.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d647a0e697e5daa98c87993726da8281c7233d9d4ffe410812a4896c7c57c075"}, + {file = "fonttools-4.49.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f3bbe672df03563d1f3a691ae531f2e31f84061724c319652039e5a70927167e"}, + {file = "fonttools-4.49.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bebd91041dda0d511b0d303180ed36e31f4f54b106b1259b69fade68413aa7ff"}, + {file = "fonttools-4.49.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4145f91531fd43c50f9eb893faa08399816bb0b13c425667c48475c9f3a2b9b5"}, + {file = "fonttools-4.49.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ea329dafb9670ffbdf4dbc3b0e5c264104abcd8441d56de77f06967f032943cb"}, + {file = "fonttools-4.49.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c076a9e548521ecc13d944b1d261ff3d7825048c338722a4bd126d22316087b7"}, + {file = "fonttools-4.49.0-cp312-cp312-win32.whl", hash = "sha256:b607ea1e96768d13be26d2b400d10d3ebd1456343eb5eaddd2f47d1c4bd00880"}, + {file = "fonttools-4.49.0-cp312-cp312-win_amd64.whl", hash = "sha256:a974c49a981e187381b9cc2c07c6b902d0079b88ff01aed34695ec5360767034"}, + {file = "fonttools-4.49.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b85ec0bdd7bdaa5c1946398cbb541e90a6dfc51df76dfa88e0aaa41b335940cb"}, + {file = "fonttools-4.49.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:af20acbe198a8a790618ee42db192eb128afcdcc4e96d99993aca0b60d1faeb4"}, + {file = "fonttools-4.49.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d418b1fee41a1d14931f7ab4b92dc0bc323b490e41d7a333eec82c9f1780c75"}, + {file = "fonttools-4.49.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b44a52b8e6244b6548851b03b2b377a9702b88ddc21dcaf56a15a0393d425cb9"}, + {file = "fonttools-4.49.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7c7125068e04a70739dad11857a4d47626f2b0bd54de39e8622e89701836eabd"}, + {file = "fonttools-4.49.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:29e89d0e1a7f18bc30f197cfadcbef5a13d99806447c7e245f5667579a808036"}, + {file = "fonttools-4.49.0-cp38-cp38-win32.whl", hash = "sha256:9d95fa0d22bf4f12d2fb7b07a46070cdfc19ef5a7b1c98bc172bfab5bf0d6844"}, + {file = "fonttools-4.49.0-cp38-cp38-win_amd64.whl", hash = "sha256:768947008b4dc552d02772e5ebd49e71430a466e2373008ce905f953afea755a"}, + {file = "fonttools-4.49.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:08877e355d3dde1c11973bb58d4acad1981e6d1140711230a4bfb40b2b937ccc"}, + {file = "fonttools-4.49.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fdb54b076f25d6b0f0298dc706acee5052de20c83530fa165b60d1f2e9cbe3cb"}, + {file = "fonttools-4.49.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0af65c720520710cc01c293f9c70bd69684365c6015cc3671db2b7d807fe51f2"}, + {file = "fonttools-4.49.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f255ce8ed7556658f6d23f6afd22a6d9bbc3edb9b96c96682124dc487e1bf42"}, + {file = "fonttools-4.49.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d00af0884c0e65f60dfaf9340e26658836b935052fdd0439952ae42e44fdd2be"}, + {file = "fonttools-4.49.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:263832fae27481d48dfafcc43174644b6706639661e242902ceb30553557e16c"}, + {file = "fonttools-4.49.0-cp39-cp39-win32.whl", hash = "sha256:0404faea044577a01bb82d47a8fa4bc7a54067fa7e324785dd65d200d6dd1133"}, + {file = "fonttools-4.49.0-cp39-cp39-win_amd64.whl", hash = "sha256:b050d362df50fc6e38ae3954d8c29bf2da52be384649ee8245fdb5186b620836"}, + {file = "fonttools-4.49.0-py3-none-any.whl", hash = "sha256:af281525e5dd7fa0b39fb1667b8d5ca0e2a9079967e14c4bfe90fd1cd13e0f18"}, + {file = "fonttools-4.49.0.tar.gz", hash = "sha256:ebf46e7f01b7af7861310417d7c49591a85d99146fc23a5ba82fdb28af156321"}, ] [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", "pycairo", "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)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["munkres", "pycairo", "scipy"] -lxml = ["lxml (>=4.0,<5)"] +lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] @@ -1334,13 +1339,13 @@ files = [ [[package]] name = "google-api-core" -version = "2.15.0" +version = "2.17.1" description = "Google API client core library" optional = false python-versions = ">=3.7" files = [ - {file = "google-api-core-2.15.0.tar.gz", hash = "sha256:abc978a72658f14a2df1e5e12532effe40f94f868f6e23d95133bd6abcca35ca"}, - {file = "google_api_core-2.15.0-py3-none-any.whl", hash = "sha256:2aa56d2be495551e66bbff7f729b790546f87d5c90e74781aa77233bcb395a8a"}, + {file = "google-api-core-2.17.1.tar.gz", hash = "sha256:9df18a1f87ee0df0bc4eea2770ebc4228392d8cc4066655b320e2cfccb15db95"}, + {file = "google_api_core-2.17.1-py3-none-any.whl", hash = "sha256:610c5b90092c360736baccf17bd3efbcb30dd380e7a6dc28a71059edb8bd0d8e"}, ] [package.dependencies] @@ -1364,13 +1369,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-auth" -version = "2.25.2" +version = "2.28.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google-auth-2.25.2.tar.gz", hash = "sha256:42f707937feb4f5e5a39e6c4f343a17300a459aaf03141457ba505812841cc40"}, - {file = "google_auth-2.25.2-py2.py3-none-any.whl", hash = "sha256:473a8dfd0135f75bb79d878436e568f2695dce456764bf3a02b6f8c540b1d256"}, + {file = "google-auth-2.28.0.tar.gz", hash = "sha256:3cfc1b6e4e64797584fb53fc9bd0b7afa9b7c0dba2004fa7dcc9349e58cc3195"}, + {file = "google_auth-2.28.0-py2.py3-none-any.whl", hash = "sha256:7634d29dcd1e101f5226a23cbc4a0c6cda6394253bf80e281d9c5c6797869c53"}, ] [package.dependencies] @@ -1387,13 +1392,13 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "google-auth-oauthlib" -version = "1.0.0" +version = "1.2.0" description = "Google Authentication Library" optional = false python-versions = ">=3.6" files = [ - {file = "google-auth-oauthlib-1.0.0.tar.gz", hash = "sha256:e375064964820b47221a7e1b7ee1fd77051b6323c3f9e3e19785f78ab67ecfc5"}, - {file = "google_auth_oauthlib-1.0.0-py2.py3-none-any.whl", hash = "sha256:95880ca704928c300f48194d1770cf5b1462835b6e49db61445a520f793fd5fb"}, + {file = "google-auth-oauthlib-1.2.0.tar.gz", hash = "sha256:292d2d3783349f2b0734a0a0207b1e1e322ac193c2c09d8f7c613fb7cc501ea8"}, + {file = "google_auth_oauthlib-1.2.0-py2.py3-none-any.whl", hash = "sha256:297c1ce4cb13a99b5834c74a1fe03252e1e499716718b190f56bcb9c4abc4faf"}, ] [package.dependencies] @@ -1437,84 +1442,84 @@ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] [[package]] name = "grpcio" -version = "1.60.0" +version = "1.60.1" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.7" files = [ - {file = "grpcio-1.60.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:d020cfa595d1f8f5c6b343530cd3ca16ae5aefdd1e832b777f9f0eb105f5b139"}, - {file = "grpcio-1.60.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:b98f43fcdb16172dec5f4b49f2fece4b16a99fd284d81c6bbac1b3b69fcbe0ff"}, - {file = "grpcio-1.60.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:20e7a4f7ded59097c84059d28230907cd97130fa74f4a8bfd1d8e5ba18c81491"}, - {file = "grpcio-1.60.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452ca5b4afed30e7274445dd9b441a35ece656ec1600b77fff8c216fdf07df43"}, - {file = "grpcio-1.60.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43e636dc2ce9ece583b3e2ca41df5c983f4302eabc6d5f9cd04f0562ee8ec1ae"}, - {file = "grpcio-1.60.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e306b97966369b889985a562ede9d99180def39ad42c8014628dd3cc343f508"}, - {file = "grpcio-1.60.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f897c3b127532e6befdcf961c415c97f320d45614daf84deba0a54e64ea2457b"}, - {file = "grpcio-1.60.0-cp310-cp310-win32.whl", hash = "sha256:b87efe4a380887425bb15f220079aa8336276398dc33fce38c64d278164f963d"}, - {file = "grpcio-1.60.0-cp310-cp310-win_amd64.whl", hash = "sha256:a9c7b71211f066908e518a2ef7a5e211670761651039f0d6a80d8d40054047df"}, - {file = "grpcio-1.60.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:fb464479934778d7cc5baf463d959d361954d6533ad34c3a4f1d267e86ee25fd"}, - {file = "grpcio-1.60.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:4b44d7e39964e808b071714666a812049765b26b3ea48c4434a3b317bac82f14"}, - {file = "grpcio-1.60.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:90bdd76b3f04bdb21de5398b8a7c629676c81dfac290f5f19883857e9371d28c"}, - {file = "grpcio-1.60.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91229d7203f1ef0ab420c9b53fe2ca5c1fbeb34f69b3bc1b5089466237a4a134"}, - {file = "grpcio-1.60.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b36a2c6d4920ba88fa98075fdd58ff94ebeb8acc1215ae07d01a418af4c0253"}, - {file = "grpcio-1.60.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:297eef542156d6b15174a1231c2493ea9ea54af8d016b8ca7d5d9cc65cfcc444"}, - {file = "grpcio-1.60.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:87c9224acba0ad8bacddf427a1c2772e17ce50b3042a789547af27099c5f751d"}, - {file = "grpcio-1.60.0-cp311-cp311-win32.whl", hash = "sha256:95ae3e8e2c1b9bf671817f86f155c5da7d49a2289c5cf27a319458c3e025c320"}, - {file = "grpcio-1.60.0-cp311-cp311-win_amd64.whl", hash = "sha256:467a7d31554892eed2aa6c2d47ded1079fc40ea0b9601d9f79204afa8902274b"}, - {file = "grpcio-1.60.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:a7152fa6e597c20cb97923407cf0934e14224af42c2b8d915f48bc3ad2d9ac18"}, - {file = "grpcio-1.60.0-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:7db16dd4ea1b05ada504f08d0dca1cd9b926bed3770f50e715d087c6f00ad748"}, - {file = "grpcio-1.60.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:b0571a5aef36ba9177e262dc88a9240c866d903a62799e44fd4aae3f9a2ec17e"}, - {file = "grpcio-1.60.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fd9584bf1bccdfff1512719316efa77be235469e1e3295dce64538c4773840b"}, - {file = "grpcio-1.60.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6a478581b1a1a8fdf3318ecb5f4d0cda41cacdffe2b527c23707c9c1b8fdb55"}, - {file = "grpcio-1.60.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:77c8a317f0fd5a0a2be8ed5cbe5341537d5c00bb79b3bb27ba7c5378ba77dbca"}, - {file = "grpcio-1.60.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1c30bb23a41df95109db130a6cc1b974844300ae2e5d68dd4947aacba5985aa5"}, - {file = "grpcio-1.60.0-cp312-cp312-win32.whl", hash = "sha256:2aef56e85901c2397bd557c5ba514f84de1f0ae5dd132f5d5fed042858115951"}, - {file = "grpcio-1.60.0-cp312-cp312-win_amd64.whl", hash = "sha256:e381fe0c2aa6c03b056ad8f52f8efca7be29fb4d9ae2f8873520843b6039612a"}, - {file = "grpcio-1.60.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:92f88ca1b956eb8427a11bb8b4a0c0b2b03377235fc5102cb05e533b8693a415"}, - {file = "grpcio-1.60.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:e278eafb406f7e1b1b637c2cf51d3ad45883bb5bd1ca56bc05e4fc135dfdaa65"}, - {file = "grpcio-1.60.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:a48edde788b99214613e440fce495bbe2b1e142a7f214cce9e0832146c41e324"}, - {file = "grpcio-1.60.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de2ad69c9a094bf37c1102b5744c9aec6cf74d2b635558b779085d0263166454"}, - {file = "grpcio-1.60.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:073f959c6f570797272f4ee9464a9997eaf1e98c27cb680225b82b53390d61e6"}, - {file = "grpcio-1.60.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c826f93050c73e7769806f92e601e0efdb83ec8d7c76ddf45d514fee54e8e619"}, - {file = "grpcio-1.60.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9e30be89a75ee66aec7f9e60086fadb37ff8c0ba49a022887c28c134341f7179"}, - {file = "grpcio-1.60.0-cp37-cp37m-win_amd64.whl", hash = "sha256:b0fb2d4801546598ac5cd18e3ec79c1a9af8b8f2a86283c55a5337c5aeca4b1b"}, - {file = "grpcio-1.60.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:9073513ec380434eb8d21970e1ab3161041de121f4018bbed3146839451a6d8e"}, - {file = "grpcio-1.60.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:74d7d9fa97809c5b892449b28a65ec2bfa458a4735ddad46074f9f7d9550ad13"}, - {file = "grpcio-1.60.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:1434ca77d6fed4ea312901122dc8da6c4389738bf5788f43efb19a838ac03ead"}, - {file = "grpcio-1.60.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e61e76020e0c332a98290323ecfec721c9544f5b739fab925b6e8cbe1944cf19"}, - {file = "grpcio-1.60.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675997222f2e2f22928fbba640824aebd43791116034f62006e19730715166c0"}, - {file = "grpcio-1.60.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5208a57eae445ae84a219dfd8b56e04313445d146873117b5fa75f3245bc1390"}, - {file = "grpcio-1.60.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:428d699c8553c27e98f4d29fdc0f0edc50e9a8a7590bfd294d2edb0da7be3629"}, - {file = "grpcio-1.60.0-cp38-cp38-win32.whl", hash = "sha256:83f2292ae292ed5a47cdcb9821039ca8e88902923198f2193f13959360c01860"}, - {file = "grpcio-1.60.0-cp38-cp38-win_amd64.whl", hash = "sha256:705a68a973c4c76db5d369ed573fec3367d7d196673fa86614b33d8c8e9ebb08"}, - {file = "grpcio-1.60.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:c193109ca4070cdcaa6eff00fdb5a56233dc7610216d58fb81638f89f02e4968"}, - {file = "grpcio-1.60.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:676e4a44e740deaba0f4d95ba1d8c5c89a2fcc43d02c39f69450b1fa19d39590"}, - {file = "grpcio-1.60.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5ff21e000ff2f658430bde5288cb1ac440ff15c0d7d18b5fb222f941b46cb0d2"}, - {file = "grpcio-1.60.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c86343cf9ff7b2514dd229bdd88ebba760bd8973dac192ae687ff75e39ebfab"}, - {file = "grpcio-1.60.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fd3b3968ffe7643144580f260f04d39d869fcc2cddb745deef078b09fd2b328"}, - {file = "grpcio-1.60.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:30943b9530fe3620e3b195c03130396cd0ee3a0d10a66c1bee715d1819001eaf"}, - {file = "grpcio-1.60.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b10241250cb77657ab315270b064a6c7f1add58af94befa20687e7c8d8603ae6"}, - {file = "grpcio-1.60.0-cp39-cp39-win32.whl", hash = "sha256:79a050889eb8d57a93ed21d9585bb63fca881666fc709f5d9f7f9372f5e7fd03"}, - {file = "grpcio-1.60.0-cp39-cp39-win_amd64.whl", hash = "sha256:8a97a681e82bc11a42d4372fe57898d270a2707f36c45c6676e49ce0d5c41353"}, - {file = "grpcio-1.60.0.tar.gz", hash = "sha256:2199165a1affb666aa24adf0c97436686d0a61bc5fc113c037701fb7c7fceb96"}, + {file = "grpcio-1.60.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:14e8f2c84c0832773fb3958240c69def72357bc11392571f87b2d7b91e0bb092"}, + {file = "grpcio-1.60.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:33aed0a431f5befeffd9d346b0fa44b2c01aa4aeae5ea5b2c03d3e25e0071216"}, + {file = "grpcio-1.60.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:fead980fbc68512dfd4e0c7b1f5754c2a8e5015a04dea454b9cada54a8423525"}, + {file = "grpcio-1.60.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:082081e6a36b6eb5cf0fd9a897fe777dbb3802176ffd08e3ec6567edd85bc104"}, + {file = "grpcio-1.60.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55ccb7db5a665079d68b5c7c86359ebd5ebf31a19bc1a91c982fd622f1e31ff2"}, + {file = "grpcio-1.60.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9b54577032d4f235452f77a83169b6527bf4b77d73aeada97d45b2aaf1bf5ce0"}, + {file = "grpcio-1.60.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7d142bcd604166417929b071cd396aa13c565749a4c840d6c702727a59d835eb"}, + {file = "grpcio-1.60.1-cp310-cp310-win32.whl", hash = "sha256:2a6087f234cb570008a6041c8ffd1b7d657b397fdd6d26e83d72283dae3527b1"}, + {file = "grpcio-1.60.1-cp310-cp310-win_amd64.whl", hash = "sha256:f2212796593ad1d0235068c79836861f2201fc7137a99aa2fea7beeb3b101177"}, + {file = "grpcio-1.60.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:79ae0dc785504cb1e1788758c588c711f4e4a0195d70dff53db203c95a0bd303"}, + {file = "grpcio-1.60.1-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:4eec8b8c1c2c9b7125508ff7c89d5701bf933c99d3910e446ed531cd16ad5d87"}, + {file = "grpcio-1.60.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:8c9554ca8e26241dabe7951aa1fa03a1ba0856688ecd7e7bdbdd286ebc272e4c"}, + {file = "grpcio-1.60.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91422ba785a8e7a18725b1dc40fbd88f08a5bb4c7f1b3e8739cab24b04fa8a03"}, + {file = "grpcio-1.60.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cba6209c96828711cb7c8fcb45ecef8c8859238baf15119daa1bef0f6c84bfe7"}, + {file = "grpcio-1.60.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c71be3f86d67d8d1311c6076a4ba3b75ba5703c0b856b4e691c9097f9b1e8bd2"}, + {file = "grpcio-1.60.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:af5ef6cfaf0d023c00002ba25d0751e5995fa0e4c9eec6cd263c30352662cbce"}, + {file = "grpcio-1.60.1-cp311-cp311-win32.whl", hash = "sha256:a09506eb48fa5493c58f946c46754ef22f3ec0df64f2b5149373ff31fb67f3dd"}, + {file = "grpcio-1.60.1-cp311-cp311-win_amd64.whl", hash = "sha256:49c9b6a510e3ed8df5f6f4f3c34d7fbf2d2cae048ee90a45cd7415abab72912c"}, + {file = "grpcio-1.60.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:b58b855d0071575ea9c7bc0d84a06d2edfbfccec52e9657864386381a7ce1ae9"}, + {file = "grpcio-1.60.1-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:a731ac5cffc34dac62053e0da90f0c0b8560396a19f69d9703e88240c8f05858"}, + {file = "grpcio-1.60.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:cf77f8cf2a651fbd869fbdcb4a1931464189cd210abc4cfad357f1cacc8642a6"}, + {file = "grpcio-1.60.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c557e94e91a983e5b1e9c60076a8fd79fea1e7e06848eb2e48d0ccfb30f6e073"}, + {file = "grpcio-1.60.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:069fe2aeee02dfd2135d562d0663fe70fbb69d5eed6eb3389042a7e963b54de8"}, + {file = "grpcio-1.60.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb0af13433dbbd1c806e671d81ec75bd324af6ef75171fd7815ca3074fe32bfe"}, + {file = "grpcio-1.60.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2f44c32aef186bbba254129cea1df08a20be414144ac3bdf0e84b24e3f3b2e05"}, + {file = "grpcio-1.60.1-cp312-cp312-win32.whl", hash = "sha256:a212e5dea1a4182e40cd3e4067ee46be9d10418092ce3627475e995cca95de21"}, + {file = "grpcio-1.60.1-cp312-cp312-win_amd64.whl", hash = "sha256:6e490fa5f7f5326222cb9f0b78f207a2b218a14edf39602e083d5f617354306f"}, + {file = "grpcio-1.60.1-cp37-cp37m-linux_armv7l.whl", hash = "sha256:4216e67ad9a4769117433814956031cb300f85edc855252a645a9a724b3b6594"}, + {file = "grpcio-1.60.1-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:73e14acd3d4247169955fae8fb103a2b900cfad21d0c35f0dcd0fdd54cd60367"}, + {file = "grpcio-1.60.1-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:6ecf21d20d02d1733e9c820fb5c114c749d888704a7ec824b545c12e78734d1c"}, + {file = "grpcio-1.60.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33bdea30dcfd4f87b045d404388469eb48a48c33a6195a043d116ed1b9a0196c"}, + {file = "grpcio-1.60.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53b69e79d00f78c81eecfb38f4516080dc7f36a198b6b37b928f1c13b3c063e9"}, + {file = "grpcio-1.60.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:39aa848794b887120b1d35b1b994e445cc028ff602ef267f87c38122c1add50d"}, + {file = "grpcio-1.60.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:72153a0d2e425f45b884540a61c6639436ddafa1829a42056aa5764b84108b8e"}, + {file = "grpcio-1.60.1-cp37-cp37m-win_amd64.whl", hash = "sha256:50d56280b482875d1f9128ce596e59031a226a8b84bec88cb2bf76c289f5d0de"}, + {file = "grpcio-1.60.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:6d140bdeb26cad8b93c1455fa00573c05592793c32053d6e0016ce05ba267549"}, + {file = "grpcio-1.60.1-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:bc808924470643b82b14fe121923c30ec211d8c693e747eba8a7414bc4351a23"}, + {file = "grpcio-1.60.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:70c83bb530572917be20c21f3b6be92cd86b9aecb44b0c18b1d3b2cc3ae47df0"}, + {file = "grpcio-1.60.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9b106bc52e7f28170e624ba61cc7dc6829566e535a6ec68528f8e1afbed1c41f"}, + {file = "grpcio-1.60.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30e980cd6db1088c144b92fe376747328d5554bc7960ce583ec7b7d81cd47287"}, + {file = "grpcio-1.60.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0c5807e9152eff15f1d48f6b9ad3749196f79a4a050469d99eecb679be592acc"}, + {file = "grpcio-1.60.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f1c3dc536b3ee124e8b24feb7533e5c70b9f2ef833e3b2e5513b2897fd46763a"}, + {file = "grpcio-1.60.1-cp38-cp38-win32.whl", hash = "sha256:d7404cebcdb11bb5bd40bf94131faf7e9a7c10a6c60358580fe83913f360f929"}, + {file = "grpcio-1.60.1-cp38-cp38-win_amd64.whl", hash = "sha256:c8754c75f55781515a3005063d9a05878b2cfb3cb7e41d5401ad0cf19de14872"}, + {file = "grpcio-1.60.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:0250a7a70b14000fa311de04b169cc7480be6c1a769b190769d347939d3232a8"}, + {file = "grpcio-1.60.1-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:660fc6b9c2a9ea3bb2a7e64ba878c98339abaf1811edca904ac85e9e662f1d73"}, + {file = "grpcio-1.60.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:76eaaba891083fcbe167aa0f03363311a9f12da975b025d30e94b93ac7a765fc"}, + {file = "grpcio-1.60.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d97c65ea7e097056f3d1ead77040ebc236feaf7f71489383d20f3b4c28412a"}, + {file = "grpcio-1.60.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb2a2911b028f01c8c64d126f6b632fcd8a9ac975aa1b3855766c94e4107180"}, + {file = "grpcio-1.60.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:5a1ebbae7e2214f51b1f23b57bf98eeed2cf1ba84e4d523c48c36d5b2f8829ff"}, + {file = "grpcio-1.60.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a66f4d2a005bc78e61d805ed95dedfcb35efa84b7bba0403c6d60d13a3de2d6"}, + {file = "grpcio-1.60.1-cp39-cp39-win32.whl", hash = "sha256:8d488fbdbf04283f0d20742b64968d44825617aa6717b07c006168ed16488804"}, + {file = "grpcio-1.60.1-cp39-cp39-win_amd64.whl", hash = "sha256:61b7199cd2a55e62e45bfb629a35b71fc2c0cb88f686a047f25b1112d3810904"}, + {file = "grpcio-1.60.1.tar.gz", hash = "sha256:dd1d3a8d1d2e50ad9b59e10aa7f07c7d1be2b367f3f2d33c5fade96ed5460962"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.60.0)"] +protobuf = ["grpcio-tools (>=1.60.1)"] [[package]] name = "grpcio-status" -version = "1.60.0" +version = "1.60.1" description = "Status proto mapping for gRPC" optional = false python-versions = ">=3.6" files = [ - {file = "grpcio-status-1.60.0.tar.gz", hash = "sha256:f10e0b6db3adc0fdc244b71962814ee982996ef06186446b5695b9fa635aa1ab"}, - {file = "grpcio_status-1.60.0-py3-none-any.whl", hash = "sha256:7d383fa36e59c1e61d380d91350badd4d12ac56e4de2c2b831b050362c3c572e"}, + {file = "grpcio-status-1.60.1.tar.gz", hash = "sha256:61b5aab8989498e8aa142c20b88829ea5d90d18c18c853b9f9e6d407d37bf8b4"}, + {file = "grpcio_status-1.60.1-py3-none-any.whl", hash = "sha256:3034fdb239185b6e0f3169d08c268c4507481e4b8a434c21311a03d9eb5889a0"}, ] [package.dependencies] googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.60.0" +grpcio = ">=1.60.1" protobuf = ">=4.21.6" [[package]] @@ -1660,13 +1665,13 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.0.0" +version = "7.0.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.0.0-py3-none-any.whl", hash = "sha256:d97503976bb81f40a193d41ee6570868479c69d5068651eb039c40d850c59d67"}, - {file = "importlib_metadata-7.0.0.tar.gz", hash = "sha256:7fc841f8b8332803464e5dc1c63a2e59121f46ca186c0e2e182e80bf8c1319f7"}, + {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, + {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, ] [package.dependencies] @@ -1745,21 +1750,21 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pa [[package]] name = "ipywidgets" -version = "8.1.1" +version = "8.1.2" 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"}, + {file = "ipywidgets-8.1.2-py3-none-any.whl", hash = "sha256:bbe43850d79fb5e906b14801d6c01402857996864d1e5b6fa62dd2ee35559f60"}, + {file = "ipywidgets-8.1.2.tar.gz", hash = "sha256:d0b9b41e49bae926a866e613a39b0f0097745d2b9f1f3dd406641b4a57ec42c9"}, ] [package.dependencies] comm = ">=0.1.3" ipython = ">=6.1.0" -jupyterlab-widgets = ">=3.0.9,<3.1.0" +jupyterlab-widgets = ">=3.0.10,<3.1.0" traitlets = ">=4.3.1" -widgetsnbextension = ">=4.0.9,<4.1.0" +widgetsnbextension = ">=4.0.10,<4.1.0" [package.extras] test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] @@ -1880,13 +1885,13 @@ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pyt [[package]] name = "jupyter-core" -version = "5.5.1" +version = "5.7.1" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_core-5.5.1-py3-none-any.whl", hash = "sha256:220dfb00c45f0d780ce132bb7976b58263f81a3ada6e90a9b6823785a424f739"}, - {file = "jupyter_core-5.5.1.tar.gz", hash = "sha256:1553311a97ccd12936037f36b9ab4d6ae8ceea6ad2d5c90d94a909e752178e40"}, + {file = "jupyter_core-5.7.1-py3-none-any.whl", hash = "sha256:c65c82126453a723a2804aa52409930434598fd9d35091d63dfb919d2b765bb7"}, + {file = "jupyter_core-5.7.1.tar.gz", hash = "sha256:de61a9d7fc71240f688b2fb5ab659fbb56979458dc66a71decd098e03c79e218"}, ] [package.dependencies] @@ -1911,24 +1916,24 @@ files = [ [[package]] name = "jupyterlab-widgets" -version = "3.0.9" +version = "3.0.10" 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"}, + {file = "jupyterlab_widgets-3.0.10-py3-none-any.whl", hash = "sha256:dd61f3ae7a5a7f80299e14585ce6cf3d6925a96c9103c978eda293197730cb64"}, + {file = "jupyterlab_widgets-3.0.10.tar.gz", hash = "sha256:04f2ac04976727e4f9d0fa91cdc2f1ab860f965e504c29dbd6a65c882c9d04c0"}, ] [[package]] name = "keras" -version = "2.14.0" +version = "2.15.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.15.0-py3-none-any.whl", hash = "sha256:2dcc6d2e30cf9c951064b63c1f4c404b966c59caf09e01f3549138ec8ee0dd1f"}, + {file = "keras-2.15.0.tar.gz", hash = "sha256:81871d298c064dc4ac6b58440fdae67bfcf47c8d7ad28580fab401834c06a575"}, ] [[package]] @@ -2095,46 +2100,43 @@ files = [ [[package]] name = "llvmlite" -version = "0.41.1" +version = "0.42.0" description = "lightweight wrapper around basic LLVM functionality" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "llvmlite-0.41.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c1e1029d47ee66d3a0c4d6088641882f75b93db82bd0e6178f7bd744ebce42b9"}, - {file = "llvmlite-0.41.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:150d0bc275a8ac664a705135e639178883293cf08c1a38de3bbaa2f693a0a867"}, - {file = "llvmlite-0.41.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1eee5cf17ec2b4198b509272cf300ee6577229d237c98cc6e63861b08463ddc6"}, - {file = "llvmlite-0.41.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dd0338da625346538f1173a17cabf21d1e315cf387ca21b294ff209d176e244"}, - {file = "llvmlite-0.41.1-cp310-cp310-win32.whl", hash = "sha256:fa1469901a2e100c17eb8fe2678e34bd4255a3576d1a543421356e9c14d6e2ae"}, - {file = "llvmlite-0.41.1-cp310-cp310-win_amd64.whl", hash = "sha256:2b76acee82ea0e9304be6be9d4b3840208d050ea0dcad75b1635fa06e949a0ae"}, - {file = "llvmlite-0.41.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:210e458723436b2469d61b54b453474e09e12a94453c97ea3fbb0742ba5a83d8"}, - {file = "llvmlite-0.41.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:855f280e781d49e0640aef4c4af586831ade8f1a6c4df483fb901cbe1a48d127"}, - {file = "llvmlite-0.41.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b67340c62c93a11fae482910dc29163a50dff3dfa88bc874872d28ee604a83be"}, - {file = "llvmlite-0.41.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2181bb63ef3c607e6403813421b46982c3ac6bfc1f11fa16a13eaafb46f578e6"}, - {file = "llvmlite-0.41.1-cp311-cp311-win_amd64.whl", hash = "sha256:9564c19b31a0434f01d2025b06b44c7ed422f51e719ab5d24ff03b7560066c9a"}, - {file = "llvmlite-0.41.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5940bc901fb0325970415dbede82c0b7f3e35c2d5fd1d5e0047134c2c46b3281"}, - {file = "llvmlite-0.41.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8b0a9a47c28f67a269bb62f6256e63cef28d3c5f13cbae4fab587c3ad506778b"}, - {file = "llvmlite-0.41.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8afdfa6da33f0b4226af8e64cfc2b28986e005528fbf944d0a24a72acfc9432"}, - {file = "llvmlite-0.41.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8454c1133ef701e8c050a59edd85d238ee18bb9a0eb95faf2fca8b909ee3c89a"}, - {file = "llvmlite-0.41.1-cp38-cp38-win32.whl", hash = "sha256:2d92c51e6e9394d503033ffe3292f5bef1566ab73029ec853861f60ad5c925d0"}, - {file = "llvmlite-0.41.1-cp38-cp38-win_amd64.whl", hash = "sha256:df75594e5a4702b032684d5481db3af990b69c249ccb1d32687b8501f0689432"}, - {file = "llvmlite-0.41.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:04725975e5b2af416d685ea0769f4ecc33f97be541e301054c9f741003085802"}, - {file = "llvmlite-0.41.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bf14aa0eb22b58c231243dccf7e7f42f7beec48970f2549b3a6acc737d1a4ba4"}, - {file = "llvmlite-0.41.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92c32356f669e036eb01016e883b22add883c60739bc1ebee3a1cc0249a50828"}, - {file = "llvmlite-0.41.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24091a6b31242bcdd56ae2dbea40007f462260bc9bdf947953acc39dffd54f8f"}, - {file = "llvmlite-0.41.1-cp39-cp39-win32.whl", hash = "sha256:880cb57ca49e862e1cd077104375b9d1dfdc0622596dfa22105f470d7bacb309"}, - {file = "llvmlite-0.41.1-cp39-cp39-win_amd64.whl", hash = "sha256:92f093986ab92e71c9ffe334c002f96defc7986efda18397d0f08534f3ebdc4d"}, - {file = "llvmlite-0.41.1.tar.gz", hash = "sha256:f19f767a018e6ec89608e1f6b13348fa2fcde657151137cb64e56d48598a92db"}, + {file = "llvmlite-0.42.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3366938e1bf63d26c34fbfb4c8e8d2ded57d11e0567d5bb243d89aab1eb56098"}, + {file = "llvmlite-0.42.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c35da49666a21185d21b551fc3caf46a935d54d66969d32d72af109b5e7d2b6f"}, + {file = "llvmlite-0.42.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70f44ccc3c6220bd23e0ba698a63ec2a7d3205da0d848804807f37fc243e3f77"}, + {file = "llvmlite-0.42.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763f8d8717a9073b9e0246998de89929071d15b47f254c10eef2310b9aac033d"}, + {file = "llvmlite-0.42.0-cp310-cp310-win_amd64.whl", hash = "sha256:8d90edf400b4ceb3a0e776b6c6e4656d05c7187c439587e06f86afceb66d2be5"}, + {file = "llvmlite-0.42.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ae511caed28beaf1252dbaf5f40e663f533b79ceb408c874c01754cafabb9cbf"}, + {file = "llvmlite-0.42.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81e674c2fe85576e6c4474e8c7e7aba7901ac0196e864fe7985492b737dbab65"}, + {file = "llvmlite-0.42.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb3975787f13eb97629052edb5017f6c170eebc1c14a0433e8089e5db43bcce6"}, + {file = "llvmlite-0.42.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5bece0cdf77f22379f19b1959ccd7aee518afa4afbd3656c6365865f84903f9"}, + {file = "llvmlite-0.42.0-cp311-cp311-win_amd64.whl", hash = "sha256:7e0c4c11c8c2aa9b0701f91b799cb9134a6a6de51444eff5a9087fc7c1384275"}, + {file = "llvmlite-0.42.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:08fa9ab02b0d0179c688a4216b8939138266519aaa0aa94f1195a8542faedb56"}, + {file = "llvmlite-0.42.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b2fce7d355068494d1e42202c7aff25d50c462584233013eb4470c33b995e3ee"}, + {file = "llvmlite-0.42.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebe66a86dc44634b59a3bc860c7b20d26d9aaffcd30364ebe8ba79161a9121f4"}, + {file = "llvmlite-0.42.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d47494552559e00d81bfb836cf1c4d5a5062e54102cc5767d5aa1e77ccd2505c"}, + {file = "llvmlite-0.42.0-cp312-cp312-win_amd64.whl", hash = "sha256:05cb7e9b6ce69165ce4d1b994fbdedca0c62492e537b0cc86141b6e2c78d5888"}, + {file = "llvmlite-0.42.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bdd3888544538a94d7ec99e7c62a0cdd8833609c85f0c23fcb6c5c591aec60ad"}, + {file = "llvmlite-0.42.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d0936c2067a67fb8816c908d5457d63eba3e2b17e515c5fe00e5ee2bace06040"}, + {file = "llvmlite-0.42.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a78ab89f1924fc11482209f6799a7a3fc74ddc80425a7a3e0e8174af0e9e2301"}, + {file = "llvmlite-0.42.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7599b65c7af7abbc978dbf345712c60fd596aa5670496561cc10e8a71cebfb2"}, + {file = "llvmlite-0.42.0-cp39-cp39-win_amd64.whl", hash = "sha256:43d65cc4e206c2e902c1004dd5418417c4efa6c1d04df05c6c5675a27e8ca90e"}, + {file = "llvmlite-0.42.0.tar.gz", hash = "sha256:f92b09243c0cc3f457da8b983f67bd8e1295d0f5b3746c7a1861d7a99403854a"}, ] [[package]] name = "markdown" -version = "3.5.1" +version = "3.5.2" 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.2-py3-none-any.whl", hash = "sha256:d43323865d89fc0cb9b20c75fc8ad313af307cc087e84b657d9eec768eddeadd"}, + {file = "Markdown-3.5.2.tar.gz", hash = "sha256:e1ac7b3dc550ee80e602e71c1d168002f062e49f1b11e26a36264dafd4df2ef8"}, ] [package.dependencies] @@ -2146,108 +2148,108 @@ testing = ["coverage", "pyyaml"] [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {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"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] [[package]] name = "matplotlib" -version = "3.8.2" +version = "3.8.3" description = "Python plotting package" optional = false python-versions = ">=3.9" files = [ - {file = "matplotlib-3.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:09796f89fb71a0c0e1e2f4bdaf63fb2cefc84446bb963ecdeb40dfee7dfa98c7"}, - {file = "matplotlib-3.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9c6976748a25e8b9be51ea028df49b8e561eed7809146da7a47dbecebab367"}, - {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78e4f2cedf303869b782071b55fdde5987fda3038e9d09e58c91cc261b5ad18"}, - {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e208f46cf6576a7624195aa047cb344a7f802e113bb1a06cfd4bee431de5e31"}, - {file = "matplotlib-3.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46a569130ff53798ea5f50afce7406e91fdc471ca1e0e26ba976a8c734c9427a"}, - {file = "matplotlib-3.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:830f00640c965c5b7f6bc32f0d4ce0c36dfe0379f7dd65b07a00c801713ec40a"}, - {file = "matplotlib-3.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d86593ccf546223eb75a39b44c32788e6f6440d13cfc4750c1c15d0fcb850b63"}, - {file = "matplotlib-3.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a5430836811b7652991939012f43d2808a2db9b64ee240387e8c43e2e5578c8"}, - {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9576723858a78751d5aacd2497b8aef29ffea6d1c95981505877f7ac28215c6"}, - {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ba9cbd8ac6cf422f3102622b20f8552d601bf8837e49a3afed188d560152788"}, - {file = "matplotlib-3.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:03f9d160a29e0b65c0790bb07f4f45d6a181b1ac33eb1bb0dd225986450148f0"}, - {file = "matplotlib-3.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:3773002da767f0a9323ba1a9b9b5d00d6257dbd2a93107233167cfb581f64717"}, - {file = "matplotlib-3.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4c318c1e95e2f5926fba326f68177dee364aa791d6df022ceb91b8221bd0a627"}, - {file = "matplotlib-3.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:091275d18d942cf1ee9609c830a1bc36610607d8223b1b981c37d5c9fc3e46a4"}, - {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b0f3b8ea0e99e233a4bcc44590f01604840d833c280ebb8fe5554fd3e6cfe8d"}, - {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b1704a530395aaf73912be741c04d181f82ca78084fbd80bc737be04848331"}, - {file = "matplotlib-3.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533b0e3b0c6768eef8cbe4b583731ce25a91ab54a22f830db2b031e83cca9213"}, - {file = "matplotlib-3.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:0f4fc5d72b75e2c18e55eb32292659cf731d9d5b312a6eb036506304f4675630"}, - {file = "matplotlib-3.8.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:deaed9ad4da0b1aea77fe0aa0cebb9ef611c70b3177be936a95e5d01fa05094f"}, - {file = "matplotlib-3.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:172f4d0fbac3383d39164c6caafd3255ce6fa58f08fc392513a0b1d3b89c4f89"}, - {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7d36c2209d9136cd8e02fab1c0ddc185ce79bc914c45054a9f514e44c787917"}, - {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5864bdd7da445e4e5e011b199bb67168cdad10b501750367c496420f2ad00843"}, - {file = "matplotlib-3.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ef8345b48e95cee45ff25192ed1f4857273117917a4dcd48e3905619bcd9c9b8"}, - {file = "matplotlib-3.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:7c48d9e221b637c017232e3760ed30b4e8d5dfd081daf327e829bf2a72c731b4"}, - {file = "matplotlib-3.8.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:aa11b3c6928a1e496c1a79917d51d4cd5d04f8a2e75f21df4949eeefdf697f4b"}, - {file = "matplotlib-3.8.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1095fecf99eeb7384dabad4bf44b965f929a5f6079654b681193edf7169ec20"}, - {file = "matplotlib-3.8.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:bddfb1db89bfaa855912261c805bd0e10218923cc262b9159a49c29a7a1c1afa"}, - {file = "matplotlib-3.8.2.tar.gz", hash = "sha256:01a978b871b881ee76017152f1f1a0cbf6bd5f7b8ff8c96df0df1bd57d8755a1"}, + {file = "matplotlib-3.8.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:cf60138ccc8004f117ab2a2bad513cc4d122e55864b4fe7adf4db20ca68a078f"}, + {file = "matplotlib-3.8.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f557156f7116be3340cdeef7f128fa99b0d5d287d5f41a16e169819dcf22357"}, + {file = "matplotlib-3.8.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f386cf162b059809ecfac3bcc491a9ea17da69fa35c8ded8ad154cd4b933d5ec"}, + {file = "matplotlib-3.8.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3c5f96f57b0369c288bf6f9b5274ba45787f7e0589a34d24bdbaf6d3344632f"}, + {file = "matplotlib-3.8.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:83e0f72e2c116ca7e571c57aa29b0fe697d4c6425c4e87c6e994159e0c008635"}, + {file = "matplotlib-3.8.3-cp310-cp310-win_amd64.whl", hash = "sha256:1c5c8290074ba31a41db1dc332dc2b62def469ff33766cbe325d32a3ee291aea"}, + {file = "matplotlib-3.8.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5184e07c7e1d6d1481862ee361905b7059f7fe065fc837f7c3dc11eeb3f2f900"}, + {file = "matplotlib-3.8.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d7e7e0993d0758933b1a241a432b42c2db22dfa37d4108342ab4afb9557cbe3e"}, + {file = "matplotlib-3.8.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04b36ad07eac9740fc76c2aa16edf94e50b297d6eb4c081e3add863de4bb19a7"}, + {file = "matplotlib-3.8.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c42dae72a62f14982f1474f7e5c9959fc4bc70c9de11cc5244c6e766200ba65"}, + {file = "matplotlib-3.8.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bf5932eee0d428192c40b7eac1399d608f5d995f975cdb9d1e6b48539a5ad8d0"}, + {file = "matplotlib-3.8.3-cp311-cp311-win_amd64.whl", hash = "sha256:40321634e3a05ed02abf7c7b47a50be50b53ef3eaa3a573847431a545585b407"}, + {file = "matplotlib-3.8.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:09074f8057917d17ab52c242fdf4916f30e99959c1908958b1fc6032e2d0f6d4"}, + {file = "matplotlib-3.8.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5745f6d0fb5acfabbb2790318db03809a253096e98c91b9a31969df28ee604aa"}, + {file = "matplotlib-3.8.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b97653d869a71721b639714b42d87cda4cfee0ee74b47c569e4874c7590c55c5"}, + {file = "matplotlib-3.8.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:242489efdb75b690c9c2e70bb5c6550727058c8a614e4c7716f363c27e10bba1"}, + {file = "matplotlib-3.8.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:83c0653c64b73926730bd9ea14aa0f50f202ba187c307a881673bad4985967b7"}, + {file = "matplotlib-3.8.3-cp312-cp312-win_amd64.whl", hash = "sha256:ef6c1025a570354297d6c15f7d0f296d95f88bd3850066b7f1e7b4f2f4c13a39"}, + {file = "matplotlib-3.8.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c4af3f7317f8a1009bbb2d0bf23dfaba859eb7dd4ccbd604eba146dccaaaf0a4"}, + {file = "matplotlib-3.8.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4c6e00a65d017d26009bac6808f637b75ceade3e1ff91a138576f6b3065eeeba"}, + {file = "matplotlib-3.8.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7b49ab49a3bea17802df6872f8d44f664ba8f9be0632a60c99b20b6db2165b7"}, + {file = "matplotlib-3.8.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6728dde0a3997396b053602dbd907a9bd64ec7d5cf99e728b404083698d3ca01"}, + {file = "matplotlib-3.8.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:813925d08fb86aba139f2d31864928d67511f64e5945ca909ad5bc09a96189bb"}, + {file = "matplotlib-3.8.3-cp39-cp39-win_amd64.whl", hash = "sha256:cd3a0c2be76f4e7be03d34a14d49ded6acf22ef61f88da600a18a5cd8b3c5f3c"}, + {file = "matplotlib-3.8.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fa93695d5c08544f4a0dfd0965f378e7afc410d8672816aff1e81be1f45dbf2e"}, + {file = "matplotlib-3.8.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9764df0e8778f06414b9d281a75235c1e85071f64bb5d71564b97c1306a2afc"}, + {file = "matplotlib-3.8.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5e431a09e6fab4012b01fc155db0ce6dccacdbabe8198197f523a4ef4805eb26"}, + {file = "matplotlib-3.8.3.tar.gz", hash = "sha256:7b416239e9ae38be54b028abbf9048aff5054a9aba5416bef0bd17f9162ce161"}, ] [package.dependencies] @@ -2440,13 +2442,13 @@ test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>= [[package]] name = "nbconvert" -version = "7.13.0" +version = "7.16.0" description = "Converting Jupyter Notebooks" optional = false python-versions = ">=3.8" files = [ - {file = "nbconvert-7.13.0-py3-none-any.whl", hash = "sha256:22521cfcc10ba5755e44acb6a70d2bd8a891ce7aed6746481e10cd548b169e19"}, - {file = "nbconvert-7.13.0.tar.gz", hash = "sha256:c6f61c86fca5b28bd17f4f9a308248e59fa2b54919e1589f6cc3575c5dfec2bd"}, + {file = "nbconvert-7.16.0-py3-none-any.whl", hash = "sha256:ad3dc865ea6e2768d31b7eb6c7ab3be014927216a5ece3ef276748dd809054c7"}, + {file = "nbconvert-7.16.0.tar.gz", hash = "sha256:813e6553796362489ae572e39ba1bff978536192fb518e10826b0e8cadf03ec8"}, ] [package.dependencies] @@ -2536,81 +2538,81 @@ test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] name = "numba" -version = "0.58.1" +version = "0.59.0" description = "compiling Python code using LLVM" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "numba-0.58.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:07f2fa7e7144aa6f275f27260e73ce0d808d3c62b30cff8906ad1dec12d87bbe"}, - {file = "numba-0.58.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7bf1ddd4f7b9c2306de0384bf3854cac3edd7b4d8dffae2ec1b925e4c436233f"}, - {file = "numba-0.58.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bc2d904d0319d7a5857bd65062340bed627f5bfe9ae4a495aef342f072880d50"}, - {file = "numba-0.58.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4e79b6cc0d2bf064a955934a2e02bf676bc7995ab2db929dbbc62e4c16551be6"}, - {file = "numba-0.58.1-cp310-cp310-win_amd64.whl", hash = "sha256:81fe5b51532478149b5081311b0fd4206959174e660c372b94ed5364cfb37c82"}, - {file = "numba-0.58.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bcecd3fb9df36554b342140a4d77d938a549be635d64caf8bd9ef6c47a47f8aa"}, - {file = "numba-0.58.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1eaa744f518bbd60e1f7ccddfb8002b3d06bd865b94a5d7eac25028efe0e0ff"}, - {file = "numba-0.58.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bf68df9c307fb0aa81cacd33faccd6e419496fdc621e83f1efce35cdc5e79cac"}, - {file = "numba-0.58.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:55a01e1881120e86d54efdff1be08381886fe9f04fc3006af309c602a72bc44d"}, - {file = "numba-0.58.1-cp311-cp311-win_amd64.whl", hash = "sha256:811305d5dc40ae43c3ace5b192c670c358a89a4d2ae4f86d1665003798ea7a1a"}, - {file = "numba-0.58.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ea5bfcf7d641d351c6a80e8e1826eb4a145d619870016eeaf20bbd71ef5caa22"}, - {file = "numba-0.58.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e63d6aacaae1ba4ef3695f1c2122b30fa3d8ba039c8f517784668075856d79e2"}, - {file = "numba-0.58.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6fe7a9d8e3bd996fbe5eac0683227ccef26cba98dae6e5cee2c1894d4b9f16c1"}, - {file = "numba-0.58.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:898af055b03f09d33a587e9425500e5be84fc90cd2f80b3fb71c6a4a17a7e354"}, - {file = "numba-0.58.1-cp38-cp38-win_amd64.whl", hash = "sha256:d3e2fe81fe9a59fcd99cc572002101119059d64d31eb6324995ee8b0f144a306"}, - {file = "numba-0.58.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c765aef472a9406a97ea9782116335ad4f9ef5c9f93fc05fd44aab0db486954"}, - {file = "numba-0.58.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e9356e943617f5e35a74bf56ff6e7cc83e6b1865d5e13cee535d79bf2cae954"}, - {file = "numba-0.58.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:240e7a1ae80eb6b14061dc91263b99dc8d6af9ea45d310751b780888097c1aaa"}, - {file = "numba-0.58.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:45698b995914003f890ad839cfc909eeb9c74921849c712a05405d1a79c50f68"}, - {file = "numba-0.58.1-cp39-cp39-win_amd64.whl", hash = "sha256:bd3dda77955be03ff366eebbfdb39919ce7c2620d86c906203bed92124989032"}, - {file = "numba-0.58.1.tar.gz", hash = "sha256:487ded0633efccd9ca3a46364b40006dbdaca0f95e99b8b83e778d1195ebcbaa"}, + {file = "numba-0.59.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8d061d800473fb8fef76a455221f4ad649a53f5e0f96e3f6c8b8553ee6fa98fa"}, + {file = "numba-0.59.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c086a434e7d3891ce5dfd3d1e7ee8102ac1e733962098578b507864120559ceb"}, + {file = "numba-0.59.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9e20736bf62e61f8353fb71b0d3a1efba636c7a303d511600fc57648b55823ed"}, + {file = "numba-0.59.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e86e6786aec31d2002122199486e10bbc0dc40f78d76364cded375912b13614c"}, + {file = "numba-0.59.0-cp310-cp310-win_amd64.whl", hash = "sha256:0307ee91b24500bb7e64d8a109848baf3a3905df48ce142b8ac60aaa406a0400"}, + {file = "numba-0.59.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d540f69a8245fb714419c2209e9af6104e568eb97623adc8943642e61f5d6d8e"}, + {file = "numba-0.59.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1192d6b2906bf3ff72b1d97458724d98860ab86a91abdd4cfd9328432b661e31"}, + {file = "numba-0.59.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:90efb436d3413809fcd15298c6d395cb7d98184350472588356ccf19db9e37c8"}, + {file = "numba-0.59.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cd3dac45e25d927dcb65d44fb3a973994f5add2b15add13337844afe669dd1ba"}, + {file = "numba-0.59.0-cp311-cp311-win_amd64.whl", hash = "sha256:753dc601a159861808cc3207bad5c17724d3b69552fd22768fddbf302a817a4c"}, + {file = "numba-0.59.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ce62bc0e6dd5264e7ff7f34f41786889fa81a6b860662f824aa7532537a7bee0"}, + {file = "numba-0.59.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8cbef55b73741b5eea2dbaf1b0590b14977ca95a13a07d200b794f8f6833a01c"}, + {file = "numba-0.59.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:70d26ba589f764be45ea8c272caa467dbe882b9676f6749fe6f42678091f5f21"}, + {file = "numba-0.59.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e125f7d69968118c28ec0eed9fbedd75440e64214b8d2eac033c22c04db48492"}, + {file = "numba-0.59.0-cp312-cp312-win_amd64.whl", hash = "sha256:4981659220b61a03c1e557654027d271f56f3087448967a55c79a0e5f926de62"}, + {file = "numba-0.59.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe4d7562d1eed754a7511ed7ba962067f198f86909741c5c6e18c4f1819b1f47"}, + {file = "numba-0.59.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6feb1504bb432280f900deaf4b1dadcee68812209500ed3f81c375cbceab24dc"}, + {file = "numba-0.59.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:944faad25ee23ea9dda582bfb0189fb9f4fc232359a80ab2a028b94c14ce2b1d"}, + {file = "numba-0.59.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5516a469514bfae52a9d7989db4940653a5cbfac106f44cb9c50133b7ad6224b"}, + {file = "numba-0.59.0-cp39-cp39-win_amd64.whl", hash = "sha256:32bd0a41525ec0b1b853da244808f4e5333867df3c43c30c33f89cf20b9c2b63"}, + {file = "numba-0.59.0.tar.gz", hash = "sha256:12b9b064a3e4ad00e2371fc5212ef0396c80f41caec9b5ec391c8b04b6eaf2a8"}, ] [package.dependencies] -llvmlite = "==0.41.*" +llvmlite = "==0.42.*" numpy = ">=1.22,<1.27" [[package]] name = "numpy" -version = "1.26.2" +version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.26.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3703fc9258a4a122d17043e57b35e5ef1c5a5837c3db8be396c82e04c1cf9b0f"}, - {file = "numpy-1.26.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc392fdcbd21d4be6ae1bb4475a03ce3b025cd49a9be5345d76d7585aea69440"}, - {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36340109af8da8805d8851ef1d74761b3b88e81a9bd80b290bbfed61bd2b4f75"}, - {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc008217145b3d77abd3e4d5ef586e3bdfba8fe17940769f8aa09b99e856c00"}, - {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ced40d4e9e18242f70dd02d739e44698df3dcb010d31f495ff00a31ef6014fe"}, - {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b272d4cecc32c9e19911891446b72e986157e6a1809b7b56518b4f3755267523"}, - {file = "numpy-1.26.2-cp310-cp310-win32.whl", hash = "sha256:22f8fc02fdbc829e7a8c578dd8d2e15a9074b630d4da29cda483337e300e3ee9"}, - {file = "numpy-1.26.2-cp310-cp310-win_amd64.whl", hash = "sha256:26c9d33f8e8b846d5a65dd068c14e04018d05533b348d9eaeef6c1bd787f9919"}, - {file = "numpy-1.26.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b96e7b9c624ef3ae2ae0e04fa9b460f6b9f17ad8b4bec6d7756510f1f6c0c841"}, - {file = "numpy-1.26.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aa18428111fb9a591d7a9cc1b48150097ba6a7e8299fb56bdf574df650e7d1f1"}, - {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06fa1ed84aa60ea6ef9f91ba57b5ed963c3729534e6e54055fc151fad0423f0a"}, - {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96ca5482c3dbdd051bcd1fce8034603d6ebfc125a7bd59f55b40d8f5d246832b"}, - {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:854ab91a2906ef29dc3925a064fcd365c7b4da743f84b123002f6139bcb3f8a7"}, - {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f43740ab089277d403aa07567be138fc2a89d4d9892d113b76153e0e412409f8"}, - {file = "numpy-1.26.2-cp311-cp311-win32.whl", hash = "sha256:a2bbc29fcb1771cd7b7425f98b05307776a6baf43035d3b80c4b0f29e9545186"}, - {file = "numpy-1.26.2-cp311-cp311-win_amd64.whl", hash = "sha256:2b3fca8a5b00184828d12b073af4d0fc5fdd94b1632c2477526f6bd7842d700d"}, - {file = "numpy-1.26.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a4cd6ed4a339c21f1d1b0fdf13426cb3b284555c27ac2f156dfdaaa7e16bfab0"}, - {file = "numpy-1.26.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d5244aabd6ed7f312268b9247be47343a654ebea52a60f002dc70c769048e75"}, - {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a3cdb4d9c70e6b8c0814239ead47da00934666f668426fc6e94cce869e13fd7"}, - {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa317b2325f7aa0a9471663e6093c210cb2ae9c0ad824732b307d2c51983d5b6"}, - {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:174a8880739c16c925799c018f3f55b8130c1f7c8e75ab0a6fa9d41cab092fd6"}, - {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f79b231bf5c16b1f39c7f4875e1ded36abee1591e98742b05d8a0fb55d8a3eec"}, - {file = "numpy-1.26.2-cp312-cp312-win32.whl", hash = "sha256:4a06263321dfd3598cacb252f51e521a8cb4b6df471bb12a7ee5cbab20ea9167"}, - {file = "numpy-1.26.2-cp312-cp312-win_amd64.whl", hash = "sha256:b04f5dc6b3efdaab541f7857351aac359e6ae3c126e2edb376929bd3b7f92d7e"}, - {file = "numpy-1.26.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4eb8df4bf8d3d90d091e0146f6c28492b0be84da3e409ebef54349f71ed271ef"}, - {file = "numpy-1.26.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1a13860fdcd95de7cf58bd6f8bc5a5ef81c0b0625eb2c9a783948847abbef2c2"}, - {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64308ebc366a8ed63fd0bf426b6a9468060962f1a4339ab1074c228fa6ade8e3"}, - {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baf8aab04a2c0e859da118f0b38617e5ee65d75b83795055fb66c0d5e9e9b818"}, - {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d73a3abcac238250091b11caef9ad12413dab01669511779bc9b29261dd50210"}, - {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b361d369fc7e5e1714cf827b731ca32bff8d411212fccd29ad98ad622449cc36"}, - {file = "numpy-1.26.2-cp39-cp39-win32.whl", hash = "sha256:bd3f0091e845164a20bd5a326860c840fe2af79fa12e0469a12768a3ec578d80"}, - {file = "numpy-1.26.2-cp39-cp39-win_amd64.whl", hash = "sha256:2beef57fb031dcc0dc8fa4fe297a742027b954949cabb52a2a376c144e5e6060"}, - {file = "numpy-1.26.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1cc3d5029a30fb5f06704ad6b23b35e11309491c999838c31f124fee32107c79"}, - {file = "numpy-1.26.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94cc3c222bb9fb5a12e334d0479b97bb2df446fbe622b470928f5284ffca3f8d"}, - {file = "numpy-1.26.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe6b44fb8fcdf7eda4ef4461b97b3f63c466b27ab151bec2366db8b197387841"}, - {file = "numpy-1.26.2.tar.gz", hash = "sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] [[package]] @@ -2649,42 +2651,46 @@ tests = ["pytest", "pytest-cov", "pytest-pep8"] [[package]] name = "osqp" -version = "0.6.3" +version = "0.6.5" description = "OSQP: The Operator Splitting QP Solver" optional = false python-versions = "*" files = [ - {file = "osqp-0.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6b7d923c836f1d07115057e595245ccc1694ecae730a1affda78fc6f3c8d239"}, - {file = "osqp-0.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dfda08c38c3521012740a73ef782f97dfc54a41deae4b0bc4afd18d0e74da0"}, - {file = "osqp-0.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7eafa3f3e82dd36c52f3f4ef19a95142405c807c272c4b53c5971c53535d7804"}, - {file = "osqp-0.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:3cbb6efdaffb7387dc0037dfe3259d4803e5ad7217e6f20fb605c92953214b9d"}, - {file = "osqp-0.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1b2049b2c42565dcaa63ddca1c4028b1fb20aab141453f5d77e8ff5b1a99a2cf"}, - {file = "osqp-0.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:146b89f2cfbf59eaeb2c47e3a312f2034138df78d80ce052364810dc0ef70fc4"}, - {file = "osqp-0.6.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0084e3d733c75687d68bc133bc380ce471dfe6f7724af2718a43491782eec8d6"}, - {file = "osqp-0.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:1b573fe1cd0e82239a279c58817c1d365187ef862e928b2b9c828c3c516ad3c2"}, - {file = "osqp-0.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c3951ef505177b858c6cd34de980346014cae3d2234c93db960b12c5885f9a2"}, - {file = "osqp-0.6.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc18f87c9549032c163ce590a5e32079df94ee656c8fb357ba607aa9d78fab81"}, - {file = "osqp-0.6.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07b1a4b538aab629b0fae69f644b7e76f81f94d65230014d482e296dacd046b"}, - {file = "osqp-0.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:60abec3593870990b16f00bd5017096a7091fb00b68d0db3383fc048ca8e55c9"}, - {file = "osqp-0.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b73bdd9589901841af83c5ed6a4092b4fac5a0beff9e32682d8526d1f16a728c"}, - {file = "osqp-0.6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71d9f611823af4a8b241c86805920e5382cd65c7f94fd3615b4eef999ed94c7c"}, - {file = "osqp-0.6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30fbc3b3c028c06a6c5f1e66be7b7106ad48a29e0dc5bd82393f82dd68235ef8"}, - {file = "osqp-0.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fe57e4bde071b388518ecb068f26319506dd9cb107363d3d80c12d2e59fc1e81"}, - {file = "osqp-0.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:41f304d1d7f91af07d8f0b01e5af29ec3bb8824f0102c7fd8b13b497be120da4"}, - {file = "osqp-0.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea7d8c92bcdf4fef98d777f13d39060d425ef2e8778ed487c96a6fa10848cdea"}, - {file = "osqp-0.6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f3a3c6d2708868e5e3fe2da300d6523cbf68a3d8734ce9c5043db37391969f5"}, - {file = "osqp-0.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:1c548a0b3691850e7e22f3624a128d8af33416d70a9b5976a47d4d832028dcd8"}, - {file = "osqp-0.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:387e7abd737dfe32c9ec00ad74af25328cdd0d0f634d79530655c040a5cb9590"}, - {file = "osqp-0.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1445e10a94e01698e13c87a7debf6ac1a15f3acd1f8f6340cb1ad945db4732b"}, - {file = "osqp-0.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0441c10f7fe5f46692a9b44a57138977bb112ae3f8127151671968c5d9ec5dbb"}, - {file = "osqp-0.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:b15e65a307fbbabf60248bb9bc204e61d5d4ae64e00427a69e2dad9622f4c29d"}, - {file = "osqp-0.6.3.tar.gz", hash = "sha256:03e460e683ec2ce0f839353ddfa3c4c8ffa509ab8cf6a2b2afbb586fa453e180"}, + {file = "osqp-0.6.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e8024dba07281111af39e71bff6449fb22a37bf3358aa0c7fd1daa6bca692c99"}, + {file = "osqp-0.6.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a68e247f2bbb53e87f1c1ca80ff3fc86b781f771d6da2a2ecd2f6e7492c802f3"}, + {file = "osqp-0.6.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e81e299637eb2342e30eb2df0ec45dc243683af0a71676c9b45b9337bb05da97"}, + {file = "osqp-0.6.5-cp310-cp310-win_amd64.whl", hash = "sha256:42425632927d983cbe935067783b944ebd4959e9eb6611da8401007b66a0c841"}, + {file = "osqp-0.6.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a7b180db09be1c3e3cb4109396b894f481ca9c6e160a530acd71f1769610f96c"}, + {file = "osqp-0.6.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:648f4beff10c16620f3b95e86dee702052d587b847ddbd5d8f71ad39ac36db3a"}, + {file = "osqp-0.6.5-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7649d56d775662e0a5d1665ed220d585f904d14a49cc6931bf27725bb9c4b2e0"}, + {file = "osqp-0.6.5-cp311-cp311-win_amd64.whl", hash = "sha256:b033b7aec973a655cfec4558e0c4fc92ee9f914bcb0a669e0156398d8ddbef8f"}, + {file = "osqp-0.6.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5c344619465e625aac6d13812d442dd31d4a9ab243e39abb5938c3f6116409b0"}, + {file = "osqp-0.6.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:000ad48aa071ecc4c75ebc39d1291752fe3a9937a30d00fff5dc61663ec67eeb"}, + {file = "osqp-0.6.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a36a40df69db5195fba613341663db2c7dcf977eb75b9578a8fd7682bbe02324"}, + {file = "osqp-0.6.5-cp312-cp312-win_amd64.whl", hash = "sha256:3d8212db7c55af1961ccce4a32fd382bfe34e2198664ea3f81cc47eef8d0f288"}, + {file = "osqp-0.6.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ca7d80c0767b1350cd74e4f1446ec51661152690d38b1382ceccdfccd757afce"}, + {file = "osqp-0.6.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b15e2b96d4d9b2eff37a05405372c69cf17ada3d1e42c5e28cbdbd053189ab5"}, + {file = "osqp-0.6.5-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a41600e34ece7156606fd3620987fdf224b0a35c857540cb5bf45072f5c022b"}, + {file = "osqp-0.6.5-cp36-cp36m-win_amd64.whl", hash = "sha256:8c38574b35a3ddfb794aafee9bc5a74635160b9fc52bbc89ae6164fe207556de"}, + {file = "osqp-0.6.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d06f614e3be1b1f3cd68569b2dc3628c2fdef1e7c4b992672fe05efb1add9801"}, + {file = "osqp-0.6.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a6b995e0a022bd1c33d20d8846d9a068df89cec288b905b5cdfdb98a2ffae8"}, + {file = "osqp-0.6.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09de9b53e7513ee4ade3024ce9f36ef993d916118d0927cce740d086882ea92c"}, + {file = "osqp-0.6.5-cp37-cp37m-win_amd64.whl", hash = "sha256:1f80f85d515ef29b90fb34f137857e75d4fcf21a715d644f54d2cf9494567fab"}, + {file = "osqp-0.6.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:de9b9e96001e8f0b2e474106ac75e220fd9279e1635b107b836a6035795e8d07"}, + {file = "osqp-0.6.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fe545d7a87a46cfc57dfb9f0aa2788d2f29e0c71dc1ac57e92f9c9d93064753"}, + {file = "osqp-0.6.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49ab020b5fd7abb5da99e01e47bf81f817ba1df6895e3d3ba4893722cc24d9b6"}, + {file = "osqp-0.6.5-cp38-cp38-win_amd64.whl", hash = "sha256:5d1b5ed6fc4faea94117a0abe140fefe980449b29d3907bd2e6ec1c18eca3d43"}, + {file = "osqp-0.6.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dca127b7a333ce53fb430fc441b2e0aee2df619693d967277a8f8fd095e95007"}, + {file = "osqp-0.6.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ec902844defedf7c5a5ed482b93286d1735a65b71bb27c93e18c929f313c93d"}, + {file = "osqp-0.6.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25a9e1e8f1db38094dc7ee544e603e31fe7bf1b2a3fc75c78c1d39a727e2540"}, + {file = "osqp-0.6.5-cp39-cp39-win_amd64.whl", hash = "sha256:6dce90d8c4ad551489a452573ea819e089e1e1c3b23bbd8f155bb6059ce8ef36"}, + {file = "osqp-0.6.5.tar.gz", hash = "sha256:b2810aee7be2373add8b6c0be5ad99b810288774abca421751cb032d6a5aedef"}, ] [package.dependencies] numpy = ">=1.7" qdldl = "*" -scipy = ">=0.13.2" +scipy = ">=0.13.2,<1.12.0" [[package]] name = "packaging" @@ -2699,36 +2705,40 @@ files = [ [[package]] name = "pandas" -version = "2.1.4" +version = "2.2.0" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.9" files = [ - {file = "pandas-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bdec823dc6ec53f7a6339a0e34c68b144a7a1fd28d80c260534c39c62c5bf8c9"}, - {file = "pandas-2.1.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:294d96cfaf28d688f30c918a765ea2ae2e0e71d3536754f4b6de0ea4a496d034"}, - {file = "pandas-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b728fb8deba8905b319f96447a27033969f3ea1fea09d07d296c9030ab2ed1d"}, - {file = "pandas-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00028e6737c594feac3c2df15636d73ace46b8314d236100b57ed7e4b9ebe8d9"}, - {file = "pandas-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:426dc0f1b187523c4db06f96fb5c8d1a845e259c99bda74f7de97bd8a3bb3139"}, - {file = "pandas-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:f237e6ca6421265643608813ce9793610ad09b40154a3344a088159590469e46"}, - {file = "pandas-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b7d852d16c270e4331f6f59b3e9aa23f935f5c4b0ed2d0bc77637a8890a5d092"}, - {file = "pandas-2.1.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7d5f2f54f78164b3d7a40f33bf79a74cdee72c31affec86bfcabe7e0789821"}, - {file = "pandas-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0aa6e92e639da0d6e2017d9ccff563222f4eb31e4b2c3cf32a2a392fc3103c0d"}, - {file = "pandas-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d797591b6846b9db79e65dc2d0d48e61f7db8d10b2a9480b4e3faaddc421a171"}, - {file = "pandas-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d2d3e7b00f703aea3945995ee63375c61b2e6aa5aa7871c5d622870e5e137623"}, - {file = "pandas-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:dc9bf7ade01143cddc0074aa6995edd05323974e6e40d9dbde081021ded8510e"}, - {file = "pandas-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:482d5076e1791777e1571f2e2d789e940dedd927325cc3cb6d0800c6304082f6"}, - {file = "pandas-2.1.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8a706cfe7955c4ca59af8c7a0517370eafbd98593155b48f10f9811da440248b"}, - {file = "pandas-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0513a132a15977b4a5b89aabd304647919bc2169eac4c8536afb29c07c23540"}, - {file = "pandas-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9f17f2b6fc076b2a0078862547595d66244db0f41bf79fc5f64a5c4d635bead"}, - {file = "pandas-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:45d63d2a9b1b37fa6c84a68ba2422dc9ed018bdaa668c7f47566a01188ceeec1"}, - {file = "pandas-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:f69b0c9bb174a2342818d3e2778584e18c740d56857fc5cdb944ec8bbe4082cf"}, - {file = "pandas-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3f06bda01a143020bad20f7a85dd5f4a1600112145f126bc9e3e42077c24ef34"}, - {file = "pandas-2.1.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab5796839eb1fd62a39eec2916d3e979ec3130509930fea17fe6f81e18108f6a"}, - {file = "pandas-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edbaf9e8d3a63a9276d707b4d25930a262341bca9874fcb22eff5e3da5394732"}, - {file = "pandas-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ebfd771110b50055712b3b711b51bee5d50135429364d0498e1213a7adc2be8"}, - {file = "pandas-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8ea107e0be2aba1da619cc6ba3f999b2bfc9669a83554b1904ce3dd9507f0860"}, - {file = "pandas-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:d65148b14788b3758daf57bf42725caa536575da2b64df9964c563b015230984"}, - {file = "pandas-2.1.4.tar.gz", hash = "sha256:fcb68203c833cc735321512e13861358079a96c174a61f5116a1de89c58c0ef7"}, + {file = "pandas-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8108ee1712bb4fa2c16981fba7e68b3f6ea330277f5ca34fa8d557e986a11670"}, + {file = "pandas-2.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:736da9ad4033aeab51d067fc3bd69a0ba36f5a60f66a527b3d72e2030e63280a"}, + {file = "pandas-2.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38e0b4fc3ddceb56ec8a287313bc22abe17ab0eb184069f08fc6a9352a769b18"}, + {file = "pandas-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20404d2adefe92aed3b38da41d0847a143a09be982a31b85bc7dd565bdba0f4e"}, + {file = "pandas-2.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ea3ee3f125032bfcade3a4cf85131ed064b4f8dd23e5ce6fa16473e48ebcaf5"}, + {file = "pandas-2.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9670b3ac00a387620489dfc1bca66db47a787f4e55911f1293063a78b108df1"}, + {file = "pandas-2.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:5a946f210383c7e6d16312d30b238fd508d80d927014f3b33fb5b15c2f895430"}, + {file = "pandas-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a1b438fa26b208005c997e78672f1aa8138f67002e833312e6230f3e57fa87d5"}, + {file = "pandas-2.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ce2fbc8d9bf303ce54a476116165220a1fedf15985b09656b4b4275300e920b"}, + {file = "pandas-2.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2707514a7bec41a4ab81f2ccce8b382961a29fbe9492eab1305bb075b2b1ff4f"}, + {file = "pandas-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85793cbdc2d5bc32620dc8ffa715423f0c680dacacf55056ba13454a5be5de88"}, + {file = "pandas-2.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cfd6c2491dc821b10c716ad6776e7ab311f7df5d16038d0b7458bc0b67dc10f3"}, + {file = "pandas-2.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a146b9dcacc3123aa2b399df1a284de5f46287a4ab4fbfc237eac98a92ebcb71"}, + {file = "pandas-2.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbc1b53c0e1fdf16388c33c3cca160f798d38aea2978004dd3f4d3dec56454c9"}, + {file = "pandas-2.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a41d06f308a024981dcaa6c41f2f2be46a6b186b902c94c2674e8cb5c42985bc"}, + {file = "pandas-2.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:159205c99d7a5ce89ecfc37cb08ed179de7783737cea403b295b5eda8e9c56d1"}, + {file = "pandas-2.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1e1f3861ea9132b32f2133788f3b14911b68102d562715d71bd0013bc45440"}, + {file = "pandas-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:761cb99b42a69005dec2b08854fb1d4888fdf7b05db23a8c5a099e4b886a2106"}, + {file = "pandas-2.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a20628faaf444da122b2a64b1e5360cde100ee6283ae8effa0d8745153809a2e"}, + {file = "pandas-2.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f5be5d03ea2073627e7111f61b9f1f0d9625dc3c4d8dda72cc827b0c58a1d042"}, + {file = "pandas-2.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:a626795722d893ed6aacb64d2401d017ddc8a2341b49e0384ab9bf7112bdec30"}, + {file = "pandas-2.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9f66419d4a41132eb7e9a73dcec9486cf5019f52d90dd35547af11bc58f8637d"}, + {file = "pandas-2.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:57abcaeda83fb80d447f28ab0cc7b32b13978f6f733875ebd1ed14f8fbc0f4ab"}, + {file = "pandas-2.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e60f1f7dba3c2d5ca159e18c46a34e7ca7247a73b5dd1a22b6d59707ed6b899a"}, + {file = "pandas-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb61dc8567b798b969bcc1fc964788f5a68214d333cade8319c7ab33e2b5d88a"}, + {file = "pandas-2.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:52826b5f4ed658fa2b729264d63f6732b8b29949c7fd234510d57c61dbeadfcd"}, + {file = "pandas-2.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bde2bc699dbd80d7bc7f9cab1e23a95c4375de615860ca089f34e7c64f4a8de7"}, + {file = "pandas-2.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:3de918a754bbf2da2381e8a3dcc45eede8cd7775b047b923f9006d5f876802ae"}, + {file = "pandas-2.2.0.tar.gz", hash = "sha256:30b83f7c3eb217fb4d1b494a57a2fda5444f17834f5df2de6b2ffff68dc3c8e2"}, ] [package.dependencies] @@ -2738,41 +2748,41 @@ numpy = [ ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" -tzdata = ">=2022.1" +tzdata = ">=2022.7" [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-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)"] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.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)"] -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)"] -parquet = ["pyarrow (>=7.0.0)"] -performance = ["bottleneck (>=1.3.4)", "numba (>=0.55.2)", "numexpr (>=2.8.0)"] -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)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] -xml = ["lxml (>=4.8.0)"] +xml = ["lxml (>=4.9.2)"] [[package]] name = "pandocfilters" -version = "1.5.0" +version = "1.5.1" description = "Utilities for writing pandoc filters in python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, - {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, + {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, + {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, ] [[package]] @@ -2911,28 +2921,28 @@ xmp = ["defusedxml"] [[package]] name = "platformdirs" -version = "4.1.0" +version = "4.2.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, - {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, + {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, + {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, ] [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] [[package]] name = "pluggy" -version = "1.3.0" +version = "1.4.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, + {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, + {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, ] [package.extras] @@ -2983,47 +2993,47 @@ testing = ["google-api-core[grpc] (>=1.31.5)"] [[package]] name = "protobuf" -version = "4.25.1" +version = "4.25.3" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-4.25.1-cp310-abi3-win32.whl", hash = "sha256:193f50a6ab78a970c9b4f148e7c750cfde64f59815e86f686c22e26b4fe01ce7"}, - {file = "protobuf-4.25.1-cp310-abi3-win_amd64.whl", hash = "sha256:3497c1af9f2526962f09329fd61a36566305e6c72da2590ae0d7d1322818843b"}, - {file = "protobuf-4.25.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:0bf384e75b92c42830c0a679b0cd4d6e2b36ae0cf3dbb1e1dfdda48a244f4bcd"}, - {file = "protobuf-4.25.1-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:0f881b589ff449bf0b931a711926e9ddaad3b35089cc039ce1af50b21a4ae8cb"}, - {file = "protobuf-4.25.1-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:ca37bf6a6d0046272c152eea90d2e4ef34593aaa32e8873fc14c16440f22d4b7"}, - {file = "protobuf-4.25.1-cp38-cp38-win32.whl", hash = "sha256:abc0525ae2689a8000837729eef7883b9391cd6aa7950249dcf5a4ede230d5dd"}, - {file = "protobuf-4.25.1-cp38-cp38-win_amd64.whl", hash = "sha256:1484f9e692091450e7edf418c939e15bfc8fc68856e36ce399aed6889dae8bb0"}, - {file = "protobuf-4.25.1-cp39-cp39-win32.whl", hash = "sha256:8bdbeaddaac52d15c6dce38c71b03038ef7772b977847eb6d374fc86636fa510"}, - {file = "protobuf-4.25.1-cp39-cp39-win_amd64.whl", hash = "sha256:becc576b7e6b553d22cbdf418686ee4daa443d7217999125c045ad56322dda10"}, - {file = "protobuf-4.25.1-py3-none-any.whl", hash = "sha256:a19731d5e83ae4737bb2a089605e636077ac001d18781b3cf489b9546c7c80d6"}, - {file = "protobuf-4.25.1.tar.gz", hash = "sha256:57d65074b4f5baa4ab5da1605c02be90ac20c8b40fb137d6a8df9f416b0d0ce2"}, + {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, + {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, + {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, + {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, + {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, + {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, + {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, + {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, + {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, ] [[package]] name = "psutil" -version = "5.9.7" +version = "5.9.8" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "psutil-5.9.7-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0bd41bf2d1463dfa535942b2a8f0e958acf6607ac0be52265ab31f7923bcd5e6"}, - {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:5794944462509e49d4d458f4dbfb92c47539e7d8d15c796f141f474010084056"}, - {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:fe361f743cb3389b8efda21980d93eb55c1f1e3898269bc9a2a1d0bb7b1f6508"}, - {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:e469990e28f1ad738f65a42dcfc17adaed9d0f325d55047593cb9033a0ab63df"}, - {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:3c4747a3e2ead1589e647e64aad601981f01b68f9398ddf94d01e3dc0d1e57c7"}, - {file = "psutil-5.9.7-cp27-none-win32.whl", hash = "sha256:1d4bc4a0148fdd7fd8f38e0498639ae128e64538faa507df25a20f8f7fb2341c"}, - {file = "psutil-5.9.7-cp27-none-win_amd64.whl", hash = "sha256:4c03362e280d06bbbfcd52f29acd79c733e0af33d707c54255d21029b8b32ba6"}, - {file = "psutil-5.9.7-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ea36cc62e69a13ec52b2f625c27527f6e4479bca2b340b7a452af55b34fcbe2e"}, - {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1132704b876e58d277168cd729d64750633d5ff0183acf5b3c986b8466cd0284"}, - {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8b7f07948f1304497ce4f4684881250cd859b16d06a1dc4d7941eeb6233bfe"}, - {file = "psutil-5.9.7-cp36-cp36m-win32.whl", hash = "sha256:b27f8fdb190c8c03914f908a4555159327d7481dac2f01008d483137ef3311a9"}, - {file = "psutil-5.9.7-cp36-cp36m-win_amd64.whl", hash = "sha256:44969859757f4d8f2a9bd5b76eba8c3099a2c8cf3992ff62144061e39ba8568e"}, - {file = "psutil-5.9.7-cp37-abi3-win32.whl", hash = "sha256:c727ca5a9b2dd5193b8644b9f0c883d54f1248310023b5ad3e92036c5e2ada68"}, - {file = "psutil-5.9.7-cp37-abi3-win_amd64.whl", hash = "sha256:f37f87e4d73b79e6c5e749440c3113b81d1ee7d26f21c19c47371ddea834f414"}, - {file = "psutil-5.9.7-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:032f4f2c909818c86cea4fe2cc407f1c0f0cde8e6c6d702b28b8ce0c0d143340"}, - {file = "psutil-5.9.7.tar.gz", hash = "sha256:3f02134e82cfb5d089fddf20bb2e03fd5cd52395321d1c8458a9e58500ff417c"}, + {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, + {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, + {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, + {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, + {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, + {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, + {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, + {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, + {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, + {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, ] [package.extras] @@ -3151,47 +3161,47 @@ files = [ [[package]] name = "pydantic" -version = "1.10.13" +version = "1.10.14" description = "Data validation and settings management using python type hints" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic-1.10.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:efff03cc7a4f29d9009d1c96ceb1e7a70a65cfe86e89d34e4a5f2ab1e5693737"}, - {file = "pydantic-1.10.13-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ecea2b9d80e5333303eeb77e180b90e95eea8f765d08c3d278cd56b00345d01"}, - {file = "pydantic-1.10.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1740068fd8e2ef6eb27a20e5651df000978edce6da6803c2bef0bc74540f9548"}, - {file = "pydantic-1.10.13-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84bafe2e60b5e78bc64a2941b4c071a4b7404c5c907f5f5a99b0139781e69ed8"}, - {file = "pydantic-1.10.13-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bc0898c12f8e9c97f6cd44c0ed70d55749eaf783716896960b4ecce2edfd2d69"}, - {file = "pydantic-1.10.13-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:654db58ae399fe6434e55325a2c3e959836bd17a6f6a0b6ca8107ea0571d2e17"}, - {file = "pydantic-1.10.13-cp310-cp310-win_amd64.whl", hash = "sha256:75ac15385a3534d887a99c713aa3da88a30fbd6204a5cd0dc4dab3d770b9bd2f"}, - {file = "pydantic-1.10.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c553f6a156deb868ba38a23cf0df886c63492e9257f60a79c0fd8e7173537653"}, - {file = "pydantic-1.10.13-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5e08865bc6464df8c7d61439ef4439829e3ab62ab1669cddea8dd00cd74b9ffe"}, - {file = "pydantic-1.10.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e31647d85a2013d926ce60b84f9dd5300d44535a9941fe825dc349ae1f760df9"}, - {file = "pydantic-1.10.13-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:210ce042e8f6f7c01168b2d84d4c9eb2b009fe7bf572c2266e235edf14bacd80"}, - {file = "pydantic-1.10.13-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8ae5dd6b721459bfa30805f4c25880e0dd78fc5b5879f9f7a692196ddcb5a580"}, - {file = "pydantic-1.10.13-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f8e81fc5fb17dae698f52bdd1c4f18b6ca674d7068242b2aff075f588301bbb0"}, - {file = "pydantic-1.10.13-cp311-cp311-win_amd64.whl", hash = "sha256:61d9dce220447fb74f45e73d7ff3b530e25db30192ad8d425166d43c5deb6df0"}, - {file = "pydantic-1.10.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4b03e42ec20286f052490423682016fd80fda830d8e4119f8ab13ec7464c0132"}, - {file = "pydantic-1.10.13-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f59ef915cac80275245824e9d771ee939133be38215555e9dc90c6cb148aaeb5"}, - {file = "pydantic-1.10.13-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a1f9f747851338933942db7af7b6ee8268568ef2ed86c4185c6ef4402e80ba8"}, - {file = "pydantic-1.10.13-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:97cce3ae7341f7620a0ba5ef6cf043975cd9d2b81f3aa5f4ea37928269bc1b87"}, - {file = "pydantic-1.10.13-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854223752ba81e3abf663d685f105c64150873cc6f5d0c01d3e3220bcff7d36f"}, - {file = "pydantic-1.10.13-cp37-cp37m-win_amd64.whl", hash = "sha256:b97c1fac8c49be29486df85968682b0afa77e1b809aff74b83081cc115e52f33"}, - {file = "pydantic-1.10.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c958d053453a1c4b1c2062b05cd42d9d5c8eb67537b8d5a7e3c3032943ecd261"}, - {file = "pydantic-1.10.13-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4c5370a7edaac06daee3af1c8b1192e305bc102abcbf2a92374b5bc793818599"}, - {file = "pydantic-1.10.13-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d6f6e7305244bddb4414ba7094ce910560c907bdfa3501e9db1a7fd7eaea127"}, - {file = "pydantic-1.10.13-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3a3c792a58e1622667a2837512099eac62490cdfd63bd407993aaf200a4cf1f"}, - {file = "pydantic-1.10.13-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c636925f38b8db208e09d344c7aa4f29a86bb9947495dd6b6d376ad10334fb78"}, - {file = "pydantic-1.10.13-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:678bcf5591b63cc917100dc50ab6caebe597ac67e8c9ccb75e698f66038ea953"}, - {file = "pydantic-1.10.13-cp38-cp38-win_amd64.whl", hash = "sha256:6cf25c1a65c27923a17b3da28a0bdb99f62ee04230c931d83e888012851f4e7f"}, - {file = "pydantic-1.10.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8ef467901d7a41fa0ca6db9ae3ec0021e3f657ce2c208e98cd511f3161c762c6"}, - {file = "pydantic-1.10.13-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:968ac42970f57b8344ee08837b62f6ee6f53c33f603547a55571c954a4225691"}, - {file = "pydantic-1.10.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9849f031cf8a2f0a928fe885e5a04b08006d6d41876b8bbd2fc68a18f9f2e3fd"}, - {file = "pydantic-1.10.13-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56e3ff861c3b9c6857579de282ce8baabf443f42ffba355bf070770ed63e11e1"}, - {file = "pydantic-1.10.13-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f00790179497767aae6bcdc36355792c79e7bbb20b145ff449700eb076c5f96"}, - {file = "pydantic-1.10.13-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:75b297827b59bc229cac1a23a2f7a4ac0031068e5be0ce385be1462e7e17a35d"}, - {file = "pydantic-1.10.13-cp39-cp39-win_amd64.whl", hash = "sha256:e70ca129d2053fb8b728ee7d1af8e553a928d7e301a311094b8a0501adc8763d"}, - {file = "pydantic-1.10.13-py3-none-any.whl", hash = "sha256:b87326822e71bd5f313e7d3bfdc77ac3247035ac10b0c0618bd99dcf95b1e687"}, - {file = "pydantic-1.10.13.tar.gz", hash = "sha256:32c8b48dcd3b2ac4e78b0ba4af3a2c2eb6048cb75202f0ea7b34feb740efc340"}, + {file = "pydantic-1.10.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f4fcec873f90537c382840f330b90f4715eebc2bc9925f04cb92de593eae054"}, + {file = "pydantic-1.10.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e3a76f571970fcd3c43ad982daf936ae39b3e90b8a2e96c04113a369869dc87"}, + {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d886bd3c3fbeaa963692ef6b643159ccb4b4cefaf7ff1617720cbead04fd1d"}, + {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:798a3d05ee3b71967844a1164fd5bdb8c22c6d674f26274e78b9f29d81770c4e"}, + {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:23d47a4b57a38e8652bcab15a658fdb13c785b9ce217cc3a729504ab4e1d6bc9"}, + {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9f674b5c3bebc2eba401de64f29948ae1e646ba2735f884d1594c5f675d6f2a"}, + {file = "pydantic-1.10.14-cp310-cp310-win_amd64.whl", hash = "sha256:24a7679fab2e0eeedb5a8924fc4a694b3bcaac7d305aeeac72dd7d4e05ecbebf"}, + {file = "pydantic-1.10.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d578ac4bf7fdf10ce14caba6f734c178379bd35c486c6deb6f49006e1ba78a7"}, + {file = "pydantic-1.10.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa7790e94c60f809c95602a26d906eba01a0abee9cc24150e4ce2189352deb1b"}, + {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad4e10efa5474ed1a611b6d7f0d130f4aafadceb73c11d9e72823e8f508e663"}, + {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1245f4f61f467cb3dfeced2b119afef3db386aec3d24a22a1de08c65038b255f"}, + {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:21efacc678a11114c765eb52ec0db62edffa89e9a562a94cbf8fa10b5db5c046"}, + {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:412ab4a3f6dbd2bf18aefa9f79c7cca23744846b31f1d6555c2ee2b05a2e14ca"}, + {file = "pydantic-1.10.14-cp311-cp311-win_amd64.whl", hash = "sha256:e897c9f35281f7889873a3e6d6b69aa1447ceb024e8495a5f0d02ecd17742a7f"}, + {file = "pydantic-1.10.14-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d604be0f0b44d473e54fdcb12302495fe0467c56509a2f80483476f3ba92b33c"}, + {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42c7d17706911199798d4c464b352e640cab4351efe69c2267823d619a937e5"}, + {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:596f12a1085e38dbda5cbb874d0973303e34227b400b6414782bf205cc14940c"}, + {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bfb113860e9288d0886e3b9e49d9cf4a9d48b441f52ded7d96db7819028514cc"}, + {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bc3ed06ab13660b565eed80887fcfbc0070f0aa0691fbb351657041d3e874efe"}, + {file = "pydantic-1.10.14-cp37-cp37m-win_amd64.whl", hash = "sha256:ad8c2bc677ae5f6dbd3cf92f2c7dc613507eafe8f71719727cbc0a7dec9a8c01"}, + {file = "pydantic-1.10.14-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c37c28449752bb1f47975d22ef2882d70513c546f8f37201e0fec3a97b816eee"}, + {file = "pydantic-1.10.14-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49a46a0994dd551ec051986806122767cf144b9702e31d47f6d493c336462597"}, + {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53e3819bd20a42470d6dd0fe7fc1c121c92247bca104ce608e609b59bc7a77ee"}, + {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbb503bbbbab0c588ed3cd21975a1d0d4163b87e360fec17a792f7d8c4ff29f"}, + {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:336709883c15c050b9c55a63d6c7ff09be883dbc17805d2b063395dd9d9d0022"}, + {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4ae57b4d8e3312d486e2498d42aed3ece7b51848336964e43abbf9671584e67f"}, + {file = "pydantic-1.10.14-cp38-cp38-win_amd64.whl", hash = "sha256:dba49d52500c35cfec0b28aa8b3ea5c37c9df183ffc7210b10ff2a415c125c4a"}, + {file = "pydantic-1.10.14-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c66609e138c31cba607d8e2a7b6a5dc38979a06c900815495b2d90ce6ded35b4"}, + {file = "pydantic-1.10.14-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d986e115e0b39604b9eee3507987368ff8148222da213cd38c359f6f57b3b347"}, + {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:646b2b12df4295b4c3148850c85bff29ef6d0d9621a8d091e98094871a62e5c7"}, + {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282613a5969c47c83a8710cc8bfd1e70c9223feb76566f74683af889faadc0ea"}, + {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:466669501d08ad8eb3c4fecd991c5e793c4e0bbd62299d05111d4f827cded64f"}, + {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:13e86a19dca96373dcf3190fcb8797d40a6f12f154a244a8d1e8e03b8f280593"}, + {file = "pydantic-1.10.14-cp39-cp39-win_amd64.whl", hash = "sha256:08b6ec0917c30861e3fe71a93be1648a2aa4f62f866142ba21670b24444d7fd8"}, + {file = "pydantic-1.10.14-py3-none-any.whl", hash = "sha256:8ee853cd12ac2ddbf0ecbac1c289f95882b2d4482258048079d13be700aa114c"}, + {file = "pydantic-1.10.14.tar.gz", hash = "sha256:46f17b832fe27de7850896f3afee50ea682220dd218f7e9c88d436788419dca6"}, ] [package.dependencies] @@ -3367,13 +3377,13 @@ files = [ [[package]] name = "pytest" -version = "7.4.3" +version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"}, - {file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"}, + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, ] [package.dependencies] @@ -3491,13 +3501,13 @@ files = [ [[package]] name = "pytz" -version = "2023.3.post1" +version = "2024.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, - {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, ] [[package]] @@ -3535,7 +3545,6 @@ 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"}, @@ -3543,16 +3552,8 @@ 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_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {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"}, @@ -3569,7 +3570,6 @@ 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"}, @@ -3577,7 +3577,6 @@ 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"}, @@ -3761,7 +3760,7 @@ scipy = "^1.10.1" type = "git" url = "https://github.com/qiboteam/qibojit.git" reference = "HEAD" -resolved_reference = "b32f503452127ac915b20af773e29694b5b64dd4" +resolved_reference = "c34ba49a5b0e4efd0ca3b28add8d9d1da97f78b8" [[package]] name = "recommonmark" @@ -3892,13 +3891,13 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruamel-yaml" -version = "0.18.5" +version = "0.18.6" 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" 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.6-py3-none-any.whl", hash = "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636"}, + {file = "ruamel.yaml-0.18.6.tar.gz", hash = "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b"}, ] [package.dependencies] @@ -3917,24 +3916,24 @@ 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-manylinux_2_24_aarch64.whl", hash = "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f"}, {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-manylinux_2_24_aarch64.whl", hash = "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe"}, {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-manylinux_2_24_aarch64.whl", hash = "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62"}, {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"}, @@ -3942,7 +3941,7 @@ files = [ {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-manylinux_2_24_aarch64.whl", hash = "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6"}, + {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"}, @@ -3950,7 +3949,7 @@ files = [ {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-manylinux_2_24_aarch64.whl", hash = "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1"}, + {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"}, @@ -3958,7 +3957,7 @@ files = [ {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-manylinux_2_24_aarch64.whl", hash = "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c"}, + {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"}, @@ -3969,50 +3968,65 @@ files = [ [[package]] name = "scikit-learn" -version = "1.3.2" +version = "1.4.0" description = "A set of python modules for machine learning and data mining" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "scikit-learn-1.3.2.tar.gz", hash = "sha256:a2f54c76accc15a34bfb9066e6c7a56c1e7235dda5762b990792330b52ccfb05"}, - {file = "scikit_learn-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e326c0eb5cf4d6ba40f93776a20e9a7a69524c4db0757e7ce24ba222471ee8a1"}, - {file = "scikit_learn-1.3.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:535805c2a01ccb40ca4ab7d081d771aea67e535153e35a1fd99418fcedd1648a"}, - {file = "scikit_learn-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1215e5e58e9880b554b01187b8c9390bf4dc4692eedeaf542d3273f4785e342c"}, - {file = "scikit_learn-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ee107923a623b9f517754ea2f69ea3b62fc898a3641766cb7deb2f2ce450161"}, - {file = "scikit_learn-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:35a22e8015048c628ad099da9df5ab3004cdbf81edc75b396fd0cff8699ac58c"}, - {file = "scikit_learn-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6fb6bc98f234fda43163ddbe36df8bcde1d13ee176c6dc9b92bb7d3fc842eb66"}, - {file = "scikit_learn-1.3.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:18424efee518a1cde7b0b53a422cde2f6625197de6af36da0b57ec502f126157"}, - {file = "scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3271552a5eb16f208a6f7f617b8cc6d1f137b52c8a1ef8edf547db0259b2c9fb"}, - {file = "scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4144a5004a676d5022b798d9e573b05139e77f271253a4703eed295bde0433"}, - {file = "scikit_learn-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:67f37d708f042a9b8d59551cf94d30431e01374e00dc2645fa186059c6c5d78b"}, - {file = "scikit_learn-1.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8db94cd8a2e038b37a80a04df8783e09caac77cbe052146432e67800e430c028"}, - {file = "scikit_learn-1.3.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:61a6efd384258789aa89415a410dcdb39a50e19d3d8410bd29be365bcdd512d5"}, - {file = "scikit_learn-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb06f8dce3f5ddc5dee1715a9b9f19f20d295bed8e3cd4fa51e1d050347de525"}, - {file = "scikit_learn-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b2de18d86f630d68fe1f87af690d451388bb186480afc719e5f770590c2ef6c"}, - {file = "scikit_learn-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:0402638c9a7c219ee52c94cbebc8fcb5eb9fe9c773717965c1f4185588ad3107"}, - {file = "scikit_learn-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a19f90f95ba93c1a7f7924906d0576a84da7f3b2282ac3bfb7a08a32801add93"}, - {file = "scikit_learn-1.3.2-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:b8692e395a03a60cd927125eef3a8e3424d86dde9b2370d544f0ea35f78a8073"}, - {file = "scikit_learn-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15e1e94cc23d04d39da797ee34236ce2375ddea158b10bee3c343647d615581d"}, - {file = "scikit_learn-1.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:785a2213086b7b1abf037aeadbbd6d67159feb3e30263434139c98425e3dcfcf"}, - {file = "scikit_learn-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:64381066f8aa63c2710e6b56edc9f0894cc7bf59bd71b8ce5613a4559b6145e0"}, - {file = "scikit_learn-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6c43290337f7a4b969d207e620658372ba3c1ffb611f8bc2b6f031dc5c6d1d03"}, - {file = "scikit_learn-1.3.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:dc9002fc200bed597d5d34e90c752b74df516d592db162f756cc52836b38fe0e"}, - {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d08ada33e955c54355d909b9c06a4789a729977f165b8bae6f225ff0a60ec4a"}, - {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763f0ae4b79b0ff9cca0bf3716bcc9915bdacff3cebea15ec79652d1cc4fa5c9"}, - {file = "scikit_learn-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:ed932ea780517b00dae7431e031faae6b49b20eb6950918eb83bd043237950e0"}, + {file = "scikit-learn-1.4.0.tar.gz", hash = "sha256:d4373c984eba20e393216edd51a3e3eede56cbe93d4247516d205643c3b93121"}, + {file = "scikit_learn-1.4.0-1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fce93a7473e2f4ee4cc280210968288d6a7d7ad8dc6fa7bb7892145e407085f9"}, + {file = "scikit_learn-1.4.0-1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d77df3d1e15fc37a9329999979fa7868ba8655dbab21fe97fc7ddabac9e08cc7"}, + {file = "scikit_learn-1.4.0-1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2404659fedec40eeafa310cd14d613e564d13dbf8f3c752d31c095195ec05de6"}, + {file = "scikit_learn-1.4.0-1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e98632da8f6410e6fb6bf66937712c949b4010600ccd3f22a5388a83e610cc3c"}, + {file = "scikit_learn-1.4.0-1-cp310-cp310-win_amd64.whl", hash = "sha256:11b3b140f70fbc9f6a08884631ae8dd60a4bb2d7d6d1de92738ea42b740d8992"}, + {file = "scikit_learn-1.4.0-1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8341eabdc754d5ab91641a7763243845e96b6d68e03e472531e88a4f1b09f21"}, + {file = "scikit_learn-1.4.0-1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d1f6bce875ac2bb6b52514f67c185c564ccd299a05b65b7bab091a4c13dde12d"}, + {file = "scikit_learn-1.4.0-1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c408b46b2fd61952d519ea1af2f8f0a7a703e1433923ab1704c4131520b2083b"}, + {file = "scikit_learn-1.4.0-1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b465dd1dcd237b7b1dcd1a9048ccbf70a98c659474324fa708464c3a2533fad"}, + {file = "scikit_learn-1.4.0-1-cp311-cp311-win_amd64.whl", hash = "sha256:0db8e22c42f7980fe5eb22069b1f84c48966f3e0d23a01afde5999e3987a2501"}, + {file = "scikit_learn-1.4.0-1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7eef6ea2ed289af40e88c0be9f7704ca8b5de18508a06897c3fe21e0905efdf"}, + {file = "scikit_learn-1.4.0-1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:349669b01435bc4dbf25c6410b0892073befdaec52637d1a1d1ff53865dc8db3"}, + {file = "scikit_learn-1.4.0-1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d439c584e58434d0350701bd33f6c10b309e851fccaf41c121aed55f6851d8cf"}, + {file = "scikit_learn-1.4.0-1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0e2427d9ef46477625ab9b55c1882844fe6fc500f418c3f8e650200182457bc"}, + {file = "scikit_learn-1.4.0-1-cp312-cp312-win_amd64.whl", hash = "sha256:d3d75343940e7bf9b85c830c93d34039fa015eeb341c5c0b4cd7a90dadfe00d4"}, + {file = "scikit_learn-1.4.0-1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:76986d22e884ab062b1beecdd92379656e9d3789ecc1f9870923c178de55f9fe"}, + {file = "scikit_learn-1.4.0-1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:e22446ad89f1cb7657f0d849dcdc345b48e2d10afa3daf2925fdb740f85b714c"}, + {file = "scikit_learn-1.4.0-1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74812c9eabb265be69d738a8ea8d4884917a59637fcbf88a5f0e9020498bc6b3"}, + {file = "scikit_learn-1.4.0-1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad2a63e0dd386b92da3270887a29b308af4d7c750d8c4995dfd9a4798691bcc"}, + {file = "scikit_learn-1.4.0-1-cp39-cp39-win_amd64.whl", hash = "sha256:53b9e29177897c37e2ff9d4ba6ca12fdb156e22523e463db05def303f5c72b5c"}, + {file = "scikit_learn-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cb8f044a8f5962613ce1feb4351d66f8d784bd072d36393582f351859b065f7d"}, + {file = "scikit_learn-1.4.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:a6372c90bbf302387792108379f1ec77719c1618d88496d0df30cb8e370b4661"}, + {file = "scikit_learn-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:785ce3c352bf697adfda357c3922c94517a9376002971bc5ea50896144bc8916"}, + {file = "scikit_learn-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0aba2a20d89936d6e72d95d05e3bf1db55bca5c5920926ad7b92c34f5e7d3bbe"}, + {file = "scikit_learn-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:2bac5d56b992f8f06816f2cd321eb86071c6f6d44bb4b1cb3d626525820d754b"}, + {file = "scikit_learn-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27ae4b0f1b2c77107c096a7e05b33458354107b47775428d1f11b23e30a73e8a"}, + {file = "scikit_learn-1.4.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5c5c62ffb52c3ffb755eb21fa74cc2cbf2c521bd53f5c04eaa10011dbecf5f80"}, + {file = "scikit_learn-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f0d2018ac6fa055dab65fe8a485967990d33c672d55bc254c56c35287b02fab"}, + {file = "scikit_learn-1.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91a8918c415c4b4bf1d60c38d32958849a9191c2428ab35d30b78354085c7c7a"}, + {file = "scikit_learn-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:80a21de63275f8bcd7877b3e781679d2ff1eddfed515a599f95b2502a3283d42"}, + {file = "scikit_learn-1.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0f33bbafb310c26b81c4d41ecaebdbc1f63498a3f13461d50ed9a2e8f24d28e4"}, + {file = "scikit_learn-1.4.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:8b6ac1442ec714b4911e5aef8afd82c691b5c88b525ea58299d455acc4e8dcec"}, + {file = "scikit_learn-1.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05fc5915b716c6cc60a438c250108e9a9445b522975ed37e416d5ea4f9a63381"}, + {file = "scikit_learn-1.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:842b7d6989f3c574685e18da6f91223eb32301d0f93903dd399894250835a6f7"}, + {file = "scikit_learn-1.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:88bcb586fdff865372df1bc6be88bb7e6f9e0aa080dab9f54f5cac7eca8e2b6b"}, + {file = "scikit_learn-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f77674647dd31f56cb12ed13ed25b6ed43a056fffef051715022d2ebffd7a7d1"}, + {file = "scikit_learn-1.4.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:833999872e2920ce00f3a50839946bdac7539454e200eb6db54898a41f4bfd43"}, + {file = "scikit_learn-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:970ec697accaef10fb4f51763f3a7b1250f9f0553cf05514d0e94905322a0172"}, + {file = "scikit_learn-1.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:923d778f378ebacca2c672ab1740e5a413e437fb45ab45ab02578f8b689e5d43"}, + {file = "scikit_learn-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:1d041bc95006b545b59e458399e3175ab11ca7a03dc9a74a573ac891f5df1489"}, ] [package.dependencies] -joblib = ">=1.1.1" -numpy = ">=1.17.3,<2.0" -scipy = ">=1.5.0" +joblib = ">=1.2.0" +numpy = ">=1.19.5" +scipy = ">=1.6.0" threadpoolctl = ">=2.0.0" [package.extras] -benchmark = ["matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "pandas (>=1.0.5)"] -docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.10.1)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] -examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"] -tests = ["black (>=23.3.0)", "matplotlib (>=3.1.3)", "mypy (>=1.3)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.0.272)", "scikit-image (>=0.16.2)"] +benchmark = ["matplotlib (>=3.3.4)", "memory-profiler (>=0.57.0)", "pandas (>=1.1.5)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.15.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] +tests = ["black (>=23.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.3)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.19.12)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.0.272)", "scikit-image (>=0.17.2)"] [[package]] name = "scipy" @@ -4112,18 +4126,18 @@ stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] [[package]] name = "setuptools" -version = "69.0.2" +version = "69.1.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.0.2-py3-none-any.whl", hash = "sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2"}, - {file = "setuptools-69.0.2.tar.gz", hash = "sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6"}, + {file = "setuptools-69.1.0-py3-none-any.whl", hash = "sha256:c054629b81b946d63a9c6e732bc8b2513a7c3ea645f11d0139a2191d735c60c6"}, + {file = "setuptools-69.1.0.tar.gz", hash = "sha256:850894c4195f09c4ed30dba56213bf7c3f21d86ed6bdaafb5df5972593bfc401"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -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 = ["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-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "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]] @@ -4267,20 +4281,18 @@ markdown = ">=3.4" [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.7" +version = "1.0.8" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = false python-versions = ">=3.9" 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.8-py3-none-any.whl", hash = "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4"}, + {file = "sphinxcontrib_applehelp-1.0.8.tar.gz", hash = "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] @@ -4303,38 +4315,34 @@ Sphinx = ">=2.1" [[package]] name = "sphinxcontrib-devhelp" -version = "1.0.5" +version = "1.0.6" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = false python-versions = ">=3.9" 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.6-py3-none-any.whl", hash = "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f"}, + {file = "sphinxcontrib_devhelp-1.0.6.tar.gz", hash = "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.4" +version = "2.0.5" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = false python-versions = ">=3.9" 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.5-py3-none-any.whl", hash = "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04"}, + {file = "sphinxcontrib_htmlhelp-2.0.5.tar.gz", hash = "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["html5lib", "pytest"] [[package]] @@ -4353,38 +4361,34 @@ test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" -version = "1.0.6" +version = "1.0.7" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = false python-versions = ">=3.9" 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.7-py3-none-any.whl", hash = "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182"}, + {file = "sphinxcontrib_qthelp-1.0.7.tar.gz", hash = "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-serializinghtml" -version = "1.1.9" +version = "1.1.10" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_serializinghtml-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.10-py3-none-any.whl", hash = "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7"}, + {file = "sphinxcontrib_serializinghtml-1.1.10.tar.gz", hash = "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] @@ -4450,22 +4454,22 @@ doc = ["reno", "sphinx", "tornado (>=4.5)"] [[package]] name = "tensorboard" -version = "2.14.1" +version = "2.15.2" description = "TensorBoard lets you watch Tensors Flow" optional = false python-versions = ">=3.9" files = [ - {file = "tensorboard-2.14.1-py3-none-any.whl", hash = "sha256:3db108fb58f023b6439880e177743c5f1e703e9eeb5fb7d597871f949f85fd58"}, + {file = "tensorboard-2.15.2-py3-none-any.whl", hash = "sha256:a6f6443728064d962caea6d34653e220e34ef8df764cb06a8212c17e1a8f0622"}, ] [package.dependencies] absl-py = ">=0.4" google-auth = ">=1.6.3,<3" -google-auth-oauthlib = ">=0.5,<1.1" +google-auth-oauthlib = ">=0.5,<2" grpcio = ">=1.48.2" markdown = ">=2.6.8" numpy = ">=1.12.0" -protobuf = ">=3.19.6" +protobuf = ">=3.19.6,<4.24.0 || >4.24.0" requests = ">=2.21.0,<3" setuptools = ">=41.0.0" six = ">1.9" @@ -4486,26 +4490,26 @@ files = [ [[package]] name = "tensorflow" -version = "2.14.1" +version = "2.15.0" description = "TensorFlow is an open source machine learning framework for everyone." optional = false python-versions = ">=3.9" files = [ - {file = "tensorflow-2.14.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:f6e9ac1e53db30f1759148f731f87b9d12da5ce0f153fc49406824efd486aae7"}, - {file = "tensorflow-2.14.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:7156bf1f7311dada7dba5345b526a38e6f4e4f4b8509bee162a24342bf6571b2"}, - {file = "tensorflow-2.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5781aadad5b46e2de4e373b0ca15a852b90d58982270a6db02ec52e4986316d"}, - {file = "tensorflow-2.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a955c42164eff4d751732c1274ca4bf059db60c9e2362098ce1eed7177c3fe9"}, - {file = "tensorflow-2.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:4be5f4327a6e854f64b4dcfd08a51c5fc7cc3fea8c76c5bf5c0c3deb002d5221"}, - {file = "tensorflow-2.14.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:597dd6665a91b3d4b881f0d40277eb55b65b04567553206a46e7db9cfa067310"}, - {file = "tensorflow-2.14.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:9833e61423ad2726f81e3fc770558b81d5f0a454bdb2dad717c5474ea837ce91"}, - {file = "tensorflow-2.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14a48a087954722d9e73086e8ce28a14b1f9f889ea5845c7c0bf30d8747ab6e2"}, - {file = "tensorflow-2.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9aa05a98450fa5bc4efd529383b7d15c10ec12b0238a6744baa1508c4bfa4d5"}, - {file = "tensorflow-2.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:11958d12e39d44a9f5fc753fc312dd1726a8506f2d2606e01421ca4ee9dc5c55"}, - {file = "tensorflow-2.14.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:d95404f78a8d5e3d2481383dbe2d2286341ccf9bc5cbb19d857c646494d860c6"}, - {file = "tensorflow-2.14.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:511c4c5bfb2af17c6ca22663f98a7267c4386bf5486fbe78ee2d21482a6fa822"}, - {file = "tensorflow-2.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f66d2990157cf27f80c730878cb8befa8ed9716223494037d31c80fbe5f64370"}, - {file = "tensorflow-2.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9ab2747f75aba0327bfe6092b963694f1001781e5d2c0d251dfeed02b0c3bba"}, - {file = "tensorflow-2.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:7f5c9215bc00ba88f1cde1399f8160a5cb865c20ad71a1d5a6869f9fad62d9a5"}, + {file = "tensorflow-2.15.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:9b248e0f4316b3a3c54cd1f83edfb7a761d473060c1972a8ea31a90d5de3aa72"}, + {file = "tensorflow-2.15.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:eaf420d8b8ec1d4bd75859be7d7545d8e7052726eed8456fdbba63718e7e07ea"}, + {file = "tensorflow-2.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e98aab454fc73ff1900314821e5bafbf20840ada2004c8caccf4d92e0e12a628"}, + {file = "tensorflow-2.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed601b43df9b7d9bed0203b34bcb9356efd4f671eaaac1046b7166a2afee0cf8"}, + {file = "tensorflow-2.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:2d88f8b71f4a8d9ab9dc7c8e42b14ca0f53d1daab0f989b8f2918907c2891f41"}, + {file = "tensorflow-2.15.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:1e0716622ed7af867d8b1997b00a2940f1a1587dee923ff53efa2ee506992f32"}, + {file = "tensorflow-2.15.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:124930e7d4f5d74c61a5c80d642a26c22fe0c42fdd383fe9ee5803c3ac9ed4ce"}, + {file = "tensorflow-2.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:852efeb4d18beedac0120c4f2d4f4dccf4c090bb6740c5199d395ff609e85e98"}, + {file = "tensorflow-2.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee8ec2b2c6c942ae65d25746e53cdc475e82d5fcbbb3009ce47f5963d69ebfc"}, + {file = "tensorflow-2.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:e05a48006930e4e9e68468e7affed3bbce8a1c7fe6df86500496ad1558804a78"}, + {file = "tensorflow-2.15.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:2cfcdde1ff3c01be617e99ce9783c49cb11da5796ce32a31855412bd092c0bcf"}, + {file = "tensorflow-2.15.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:896bda03f722700a9918d144aee5152a75f1be5e6c5045fd0683b8318a3fc9d9"}, + {file = "tensorflow-2.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7697b005ce48fec8b2ee8cf25bcbd138f16b5e17f99f7c01a6ea3f2429f86c6"}, + {file = "tensorflow-2.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fa865956d96b7614f247c36e4c22b1543ba5ce656fbe8e4f6266ae7a4917132"}, + {file = "tensorflow-2.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:01108746e1bbfcd48dfabf7f51ddca7693b91ea6821f6f62a27b5a5ebf0817c5"}, ] [package.dependencies] @@ -4516,60 +4520,63 @@ gast = ">=0.2.1,<0.5.0 || >0.5.0,<0.5.1 || >0.5.1,<0.5.2 || >0.5.2" google-pasta = ">=0.1.1" grpcio = ">=1.24.3,<2.0" h5py = ">=2.9.0" -keras = ">=2.14.0,<2.15" +keras = ">=2.15.0,<2.16" libclang = ">=13.0.0" -ml-dtypes = "0.2.0" +ml-dtypes = ">=0.2.0,<0.3.0" numpy = ">=1.23.5,<2.0.0" 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" +tensorboard = ">=2.15,<2.16" +tensorflow-estimator = ">=2.15.0,<2.16" tensorflow-io-gcs-filesystem = ">=0.23.1" 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)"] +and-cuda = ["nvidia-cublas-cu12 (==12.2.5.6)", "nvidia-cuda-cupti-cu12 (==12.2.142)", "nvidia-cuda-nvcc-cu12 (==12.2.140)", "nvidia-cuda-nvrtc-cu12 (==12.2.140)", "nvidia-cuda-runtime-cu12 (==12.2.140)", "nvidia-cudnn-cu12 (==8.9.4.25)", "nvidia-cufft-cu12 (==11.0.8.103)", "nvidia-curand-cu12 (==10.3.3.141)", "nvidia-cusolver-cu12 (==11.5.2.141)", "nvidia-cusparse-cu12 (==12.1.2.141)", "nvidia-nccl-cu12 (==2.16.5)", "nvidia-nvjitlink-cu12 (==12.2.140)", "tensorrt (==8.6.1.post1)", "tensorrt-bindings (==8.6.1)", "tensorrt-libs (==8.6.1)"] [[package]] name = "tensorflow-estimator" -version = "2.14.0" +version = "2.15.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.15.0-py2.py3-none-any.whl", hash = "sha256:aedf21eec7fb2dc91150fc91a1ce12bc44dbb72278a08b58e79ff87c9e28f153"}, ] [[package]] name = "tensorflow-io-gcs-filesystem" -version = "0.35.0" +version = "0.36.0" description = "TensorFlow IO" optional = false python-versions = ">=3.7, <3.12" files = [ - {file = "tensorflow_io_gcs_filesystem-0.35.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:5521721b38105496d4b43a4ffb0af5b04cc4873d464f26fbceddf8d63815ce98"}, - {file = "tensorflow_io_gcs_filesystem-0.35.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd8f30908bf8b7b2a017d6b145720d105aff7f998422671b71729708ec7b2fe4"}, - {file = "tensorflow_io_gcs_filesystem-0.35.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac8f1de60fdf9c734aea967b98555e366ac8743f77bca15c49eff023f587076b"}, - {file = "tensorflow_io_gcs_filesystem-0.35.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:35b6eca7225c815d962254327195f191d88c3c9c2278a5ab23e0ac834acbadbb"}, - {file = "tensorflow_io_gcs_filesystem-0.35.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e997389bfe008210cbd97c0c738d64282a2f03ad4d0536013bb0a9efde0c283"}, - {file = "tensorflow_io_gcs_filesystem-0.35.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8fb3402fb1457482c386ea19371bc76383412ae9ea4396edb1e8adb4ba76f21"}, - {file = "tensorflow_io_gcs_filesystem-0.35.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb6bf8f5b40207ecb17e7fdc3b4fc824a8361267c14e9528c1688e16de135cb7"}, - {file = "tensorflow_io_gcs_filesystem-0.35.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:c4f786eebd98d401565374722f2e67f3878675b0d87489cbaa13c70ee6ac370a"}, - {file = "tensorflow_io_gcs_filesystem-0.35.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fce1466bdb91096b6d22e7df17358ba228bcb92db5cff83f2f9f1c68eb26788"}, - {file = "tensorflow_io_gcs_filesystem-0.35.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1856fe321fdb75f3386d92109c60db6ef097f610b450f9cc69d76444fb9980d1"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:702c6df62b38095ff613c433546d9424d4f33902a5ab26b00fd26457e27a99fa"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e9b8aaca2789af356c42afda0f52380f82e5abb2f3c0b85087833fcfe03875d8"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c477aed96864ceae77d7051c3b687f28813aba7320fc5dd552164fad6ec8d1a1"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be1ff92559dfa23048b01179a1827081947583f5c6f9986ccac471df8a29322a"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:72c3ca4b8c0d8dbdd970699d05a100107cf200317ad8e6a8373e2c37225cd552"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:848e8e89a0f49258c7782189c938d8d1162d989da1a80c79f95c7af3ef6006c8"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d72db1ab03edb65fa1e98d06e504ccbc64282d38ab3589afb6db66dc448d1c1"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd4d946b5fa23220daa473a80e511a5fb27493d7e49d17dff0bb43bb0a31f32"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa346fd1dd9f57848b73874007440504f060fadd689fa1cc29cc49817d0eeaf3"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:0a4437824424a4423cf86162cb8b21b1bec24698194332748b50bb952e62ab9f"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:31806bd7ac2db789161bc720747de22947063265561a4c17be54698fd9780b03"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc0e57976c1aa035af6281f0330cfb8dd50eee2f63412ecc84d60ff5075d29b7"}, + {file = "tensorflow_io_gcs_filesystem-0.36.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e97ff5c280eb10f699098ae21057be2b146d39e8a906cd5db91f2ea6c34e47d0"}, ] [package.extras] -tensorflow = ["tensorflow (>=2.14.0,<2.15.0)"] -tensorflow-aarch64 = ["tensorflow-aarch64 (>=2.14.0,<2.15.0)"] -tensorflow-cpu = ["tensorflow-cpu (>=2.14.0,<2.15.0)"] -tensorflow-gpu = ["tensorflow-gpu (>=2.14.0,<2.15.0)"] -tensorflow-rocm = ["tensorflow-rocm (>=2.14.0,<2.15.0)"] +tensorflow = ["tensorflow (>=2.15.0,<2.16.0)"] +tensorflow-aarch64 = ["tensorflow-aarch64 (>=2.15.0,<2.16.0)"] +tensorflow-cpu = ["tensorflow-cpu (>=2.15.0,<2.16.0)"] +tensorflow-gpu = ["tensorflow-gpu (>=2.15.0,<2.16.0)"] +tensorflow-rocm = ["tensorflow-rocm (>=2.15.0,<2.16.0)"] [[package]] name = "termcolor" @@ -4587,13 +4594,13 @@ tests = ["pytest", "pytest-cov"] [[package]] name = "threadpoolctl" -version = "3.2.0" +version = "3.3.0" description = "threadpoolctl" optional = false python-versions = ">=3.8" files = [ - {file = "threadpoolctl-3.2.0-py3-none-any.whl", hash = "sha256:2b7818516e423bdaebb97c723f86a7c6b0a83d3f3b0970328d66f4d9104dc032"}, - {file = "threadpoolctl-3.2.0.tar.gz", hash = "sha256:c96a0ba3bdddeaca37dc4cc7344aafad41cdb8c313f74fdfe387a867bba93355"}, + {file = "threadpoolctl-3.3.0-py3-none-any.whl", hash = "sha256:6155be1f4a39f31a18ea70f94a77e0ccd57dced08122ea61109e7da89883781e"}, + {file = "threadpoolctl-3.3.0.tar.gz", hash = "sha256:5dac632b4fa2d43f42130267929af3ba01399ef4bd1882918e92dbc30365d30c"}, ] [[package]] @@ -4669,13 +4676,13 @@ files = [ [[package]] name = "tqdm" -version = "4.66.1" +version = "4.66.2" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, - {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, + {file = "tqdm-4.66.2-py3-none-any.whl", hash = "sha256:1ee4f8a893eb9bef51c6e35730cebf234d5d0b6bd112b0271e10ed7c24a02bd9"}, + {file = "tqdm-4.66.2.tar.gz", hash = "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"}, ] [package.dependencies] @@ -4689,13 +4696,13 @@ telegram = ["requests"] [[package]] name = "traitlets" -version = "5.14.0" +version = "5.14.1" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" files = [ - {file = "traitlets-5.14.0-py3-none-any.whl", hash = "sha256:f14949d23829023013c47df20b4a76ccd1a85effb786dc060f34de7948361b33"}, - {file = "traitlets-5.14.0.tar.gz", hash = "sha256:fcdaa8ac49c04dfa0ed3ee3384ef6dfdb5d6f3741502be247279407679296772"}, + {file = "traitlets-5.14.1-py3-none-any.whl", hash = "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74"}, + {file = "traitlets-5.14.1.tar.gz", hash = "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e"}, ] [package.extras] @@ -4704,24 +4711,24 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "types-deprecated" -version = "1.2.9.3" +version = "1.2.9.20240106" description = "Typing stubs for Deprecated" optional = false -python-versions = "*" +python-versions = ">=3.8" 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"}, + {file = "types-Deprecated-1.2.9.20240106.tar.gz", hash = "sha256:afeb819e9a03d0a5795f18c88fe6207c48ed13c639e93281bd9d9b7bb6d34310"}, + {file = "types_Deprecated-1.2.9.20240106-py3-none-any.whl", hash = "sha256:9dcb258493b5be407574ee21e50ddac9e429072d39b576126bf1ac00764fb9a8"}, ] [[package]] name = "types-python-dateutil" -version = "2.8.19.14" +version = "2.8.19.20240106" description = "Typing stubs for python-dateutil" optional = false -python-versions = "*" +python-versions = ">=3.8" 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"}, + {file = "types-python-dateutil-2.8.19.20240106.tar.gz", hash = "sha256:1f8db221c3b98e6ca02ea83a58371b22c374f42ae5bbdf186db9c9a76581459f"}, + {file = "types_python_dateutil-2.8.19.20240106-py3-none-any.whl", hash = "sha256:efbbdc54590d0f16152fa103c9879c7d4a00e82078f6e2cf01769042165acaa2"}, ] [[package]] @@ -4748,40 +4755,41 @@ files = [ [[package]] name = "tzdata" -version = "2023.3" +version = "2024.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, - {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, ] [[package]] name = "urllib3" -version = "2.1.0" +version = "2.2.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, - {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, + {file = "urllib3-2.2.0-py3-none-any.whl", hash = "sha256:ce3711610ddce217e6d113a2732fafad960a03fd0318c91faa79481e35c11224"}, + {file = "urllib3-2.2.0.tar.gz", hash = "sha256:051d961ad0c62a94e50ecf1af379c3aba230c66c710493493560c0c223c49f20"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "wcwidth" -version = "0.2.12" +version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.12-py2.py3-none-any.whl", hash = "sha256:f26ec43d96c8cbfed76a5075dac87680124fa84e0855195a6184da9c187f133c"}, - {file = "wcwidth-0.2.12.tar.gz", hash = "sha256:f01c104efdf57971bcb756f054dd58ddec5204dd15fa31d6503ea57947d97c02"}, + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] [[package]] @@ -4828,13 +4836,13 @@ test = ["pytest (>=6.0.0)", "setuptools (>=65)"] [[package]] name = "widgetsnbextension" -version = "4.0.9" +version = "4.0.10" 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"}, + {file = "widgetsnbextension-4.0.10-py3-none-any.whl", hash = "sha256:d37c3724ec32d8c48400a435ecfa7d3e259995201fbefa37163124a9fcb393cc"}, + {file = "widgetsnbextension-4.0.10.tar.gz", hash = "sha256:64196c5ff3b9a9183a8e699a4227fb0b7002f252c814098e66c4d1cd0644688f"}, ] [[package]] @@ -4937,6 +4945,85 @@ files = [ {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, ] +[[package]] +name = "wrapt" +version = "1.16.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.6" +files = [ + {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, + {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, + {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, + {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, + {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, + {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, + {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, + {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, + {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, + {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, + {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, + {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, + {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, + {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, + {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, + {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, + {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, +] + [[package]] name = "zipp" version = "3.17.0" @@ -4955,4 +5042,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "fb9a22edabc2aa704e5ba3bcbf60123f4b6c5e929a248b717b962f78c64c49f1" +content-hash = "32240d5c176ef55b4c88f63adf9489e3b0cffeb430b9b40ca1c53dc08291ac1c" diff --git a/pyproject.toml b/pyproject.toml index bb2b539695..da2ee7a8d4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,10 @@ cma = "^3.3.0" joblib = "^1.2.0" hyperopt = "^0.2.7" tabulate = "^0.9.0" +numpy = "^1.26.4" +networkx = "^3.2.1" +cvxpy = {version = "^1.4.2", optional = true} +tensorflow = { version = "^2.14.1", markers = "sys_platform == 'linux' or sys_platform == 'darwin'", optional = true} [tool.poetry.group.dev] optional = true diff --git a/src/qibo/backends/__init__.py b/src/qibo/backends/__init__.py index 09e1fe1a54..e329c3c8c2 100644 --- a/src/qibo/backends/__init__.py +++ b/src/qibo/backends/__init__.py @@ -115,6 +115,7 @@ def create(self, dtype): self.SWAP = self.matrices.SWAP self.iSWAP = self.matrices.iSWAP self.SiSWAP = self.matrices.SiSWAP + self.SiSWAPDG = self.matrices.SiSWAPDG self.FSWAP = self.matrices.FSWAP self.ECR = self.matrices.ECR self.SYC = self.matrices.SYC @@ -167,3 +168,10 @@ def set_threads(nthreads): if nthreads < 1: raise_error(ValueError, "Number of threads must be positive.") GlobalBackend().set_threads(nthreads) + + +def _check_backend(backend): + if backend is None: + return GlobalBackend() + + return backend diff --git a/src/qibo/backends/clifford.py b/src/qibo/backends/clifford.py index 9141ca2fd9..8189287f82 100644 --- a/src/qibo/backends/clifford.py +++ b/src/qibo/backends/clifford.py @@ -538,10 +538,9 @@ class CliffordBackend(NumpyBackend): def __init__(self, engine=None): super().__init__() - if engine is None: - from qibo.backends import GlobalBackend + from qibo.backends import _check_backend - engine = GlobalBackend() + engine = _check_backend(engine) if isinstance(engine, TensorflowBackend): raise_error( diff --git a/src/qibo/backends/npmatrices.py b/src/qibo/backends/npmatrices.py index 364845c514..4f180ef4c3 100644 --- a/src/qibo/backends/npmatrices.py +++ b/src/qibo/backends/npmatrices.py @@ -12,53 +12,58 @@ def __init__(self, dtype): self.dtype = dtype self.np = np + def _cast(self, x, dtype): + return self.np.array(x, dtype=dtype) + @cached_property def H(self): - return self.np.array([[1, 1], [1, -1]], dtype=self.dtype) / self.np.sqrt(2) + return self._cast([[1, 1], [1, -1]], dtype=self.dtype) / self.np.sqrt(2) @cached_property def X(self): - return self.np.array([[0, 1], [1, 0]], dtype=self.dtype) + return self._cast([[0, 1], [1, 0]], dtype=self.dtype) @cached_property def Y(self): - return self.np.array([[0, -1j], [1j, 0]], dtype=self.dtype) + return self._cast([[0j, -1j], [1j, 0j]], dtype=self.dtype) @cached_property def Z(self): - return self.np.array([[1, 0], [0, -1]], dtype=self.dtype) + return self._cast([[1, 0], [0, -1]], dtype=self.dtype) @cached_property def SX(self): - return self.np.array([[1 + 1j, 1 - 1j], [1 - 1j, 1 + 1j]], dtype=self.dtype) / 2 + return self._cast([[1 + 1j, 1 - 1j], [1 - 1j, 1 + 1j]], dtype=self.dtype) / 2 @cached_property def SXDG(self): - return self.np.transpose(self.np.conj(self.SX)) + return self._cast([[1 - 1j, 1 + 1j], [1 + 1j, 1 - 1j]], dtype=self.dtype) / 2 @cached_property def S(self): - return self.np.array([[1, 0], [0, 1j]], dtype=self.dtype) + return self._cast([[1 + 0j, 0j], [0j, 1j]], dtype=self.dtype) @cached_property def SDG(self): - return self.np.conj(self.S) + return self._cast([[1 + 0j, 0j], [0j, -1j]], dtype=self.dtype) @cached_property def T(self): - return self.np.array( + return self._cast( [[1, 0], [0, self.np.exp(1j * self.np.pi / 4.0)]], dtype=self.dtype ) @cached_property def TDG(self): - return self.np.conj(self.T) + return self._cast( + [[1, 0], [0, self.np.exp(-1j * self.np.pi / 4.0)]], dtype=self.dtype + ) def I(self, n=2): - return self.np.eye(n, dtype=self.dtype) + return self._cast(self.np.eye(n, dtype=self.dtype), dtype=self.dtype) def Align(self, n=2): - return self.I(n) + return self._cast(self.I(n), dtype=self.dtype) def M(self): # pragma: no cover raise_error(NotImplementedError) @@ -66,45 +71,46 @@ def M(self): # pragma: no cover def RX(self, theta): cos = self.np.cos(theta / 2.0) + 0j isin = -1j * self.np.sin(theta / 2.0) - return self.np.array([[cos, isin], [isin, cos]], dtype=self.dtype) + return self._cast([[cos, isin], [isin, cos]], dtype=self.dtype) def RY(self, theta): cos = self.np.cos(theta / 2.0) + 0j - sin = self.np.sin(theta / 2.0) - return self.np.array([[cos, -sin], [sin, cos]], dtype=self.dtype) + sin = self.np.sin(theta / 2.0) + 0j + return self._cast([[cos, -sin], [sin, cos]], dtype=self.dtype) def RZ(self, theta): phase = self.np.exp(0.5j * theta) - return self.np.array([[self.np.conj(phase), 0], [0, phase]], dtype=self.dtype) + return self._cast([[self.np.conj(phase), 0], [0, phase]], dtype=self.dtype) def GPI(self, phi): phase = self.np.exp(1.0j * phi) - return self.np.array([[0, self.np.conj(phase)], [phase, 0]], dtype=self.dtype) + return self._cast([[0, self.np.conj(phase)], [phase, 0]], dtype=self.dtype) def GPI2(self, phi): phase = self.np.exp(1.0j * phi) - return self.np.array( + return self._cast( [[1, -1.0j * self.np.conj(phase)], [-1.0j * phase, 1]], dtype=self.dtype ) / self.np.sqrt(2) def U1(self, theta): phase = self.np.exp(1j * theta) - return self.np.array([[1, 0], [0, phase]], dtype=self.dtype) + return self._cast([[1, 0], [0, phase]], dtype=self.dtype) def U2(self, phi, lam): eplus = self.np.exp(1j * (phi + lam) / 2.0) eminus = self.np.exp(1j * (phi - lam) / 2.0) - return self.np.array( - [[self.np.conj(eplus), -self.np.conj(eminus)], [eminus, eplus]], + return self._cast( + [[self.np.conj(eplus), -self.np.conj(eminus)], [eminus, eplus]] + / self.np.sqrt(2), dtype=self.dtype, - ) / self.np.sqrt(2) + ) def U3(self, theta, phi, lam): cost = self.np.cos(theta / 2) sint = self.np.sin(theta / 2) eplus = self.np.exp(1j * (phi + lam) / 2.0) eminus = self.np.exp(1j * (phi - lam) / 2.0) - return self.np.array( + return self._cast( [ [self.np.conj(eplus) * cost, -self.np.conj(eminus) * sint], [eminus * sint, eplus * cost], @@ -113,24 +119,31 @@ def U3(self, theta, phi, lam): ) def U1q(self, theta, phi): - return self.U3(theta, phi - self.np.pi / 2, self.np.pi / 2 - phi) + return self._cast( + self.U3(theta, phi - self.np.pi / 2, self.np.pi / 2 - phi), dtype=self.dtype + ) @cached_property def CNOT(self): - return self.np.array( + return self._cast( [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0]], dtype=self.dtype ) @cached_property def CY(self): - return self.np.array( - [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, -1j], [0, 0, 1j, 0]], + return self._cast( + [ + [1 + 0j, 0j, 0j, 0j], + [0j, 1 + 0j, 0j, 0j], + [0j, 0j, 0j, -1j], + [0j, 0j, 1j, 0j], + ], dtype=self.dtype, ) @cached_property def CZ(self): - return self.np.array( + return self._cast( [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, -1]], dtype=self.dtype ) @@ -138,7 +151,7 @@ def CZ(self): def CSX(self): a = (1 + 1j) / 2 b = self.np.conj(a) - return self.np.array( + return self._cast( [ [1, 0, 0, 0], [0, 1, 0, 0], @@ -150,65 +163,124 @@ def CSX(self): @cached_property def CSXDG(self): - return self.np.transpose(self.np.conj(self.CSX)) + a = (1 - 1j) / 2 + b = self.np.conj(a) + return self._cast( + [ + [1, 0, 0, 0], + [0, 1, 0, 0], + [0, 0, a, b], + [0, 0, b, a], + ], + dtype=self.dtype, + ) def CRX(self, theta): - m = self.np.eye(4, dtype=self.dtype) - m[2:, 2:] = self.RX(theta) - return m + cos = self.np.cos(theta / 2.0) + 0j + isin = -1j * self.np.sin(theta / 2.0) + matrix = [ + [1, 0, 0, 0], + [0, 1, 0, 0], + [0, 0, cos, isin], + [0, 0, isin, cos], + ] + return self._cast(matrix, dtype=self.dtype) def CRY(self, theta): - m = self.np.eye(4, dtype=self.dtype) - m[2:, 2:] = self.RY(theta) - return m + cos = self.np.cos(theta / 2.0) + 0j + sin = self.np.sin(theta / 2.0) + 0j + matrix = [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, cos, -sin], [0, 0, sin, cos]] + return self._cast(matrix, dtype=self.dtype) def CRZ(self, theta): - m = self.np.eye(4, dtype=self.dtype) - m[2:, 2:] = self.RZ(theta) - return m + phase = self.np.exp(0.5j * theta) + matrix = [ + [1, 0, 0, 0], + [0, 1, 0, 0], + [0, 0, self.np.conj(phase), 0], + [0, 0, 0, phase], + ] + return self._cast(matrix, dtype=self.dtype) def CU1(self, theta): - m = self.np.eye(4, dtype=self.dtype) - m[2:, 2:] = self.U1(theta) - return m + phase = self.np.exp(1j * theta) + matrix = [ + [1, 0, 0, 0], + [0, 1, 0, 0], + [0, 0, 1, 0], + [0, 0, 0, phase], + ] + return self._cast(matrix, dtype=self.dtype) def CU2(self, phi, lam): - m = self.np.eye(4, dtype=self.dtype) - m[2:, 2:] = self.U2(phi, lam) - return m + eplus = self.np.exp(1j * (phi + lam) / 2.0) / self.np.sqrt(2) + eminus = self.np.exp(1j * (phi - lam) / 2.0) / self.np.sqrt(2) + matrix = [ + [1, 0, 0, 0], + [0, 1, 0, 0], + [0, 0, self.np.conj(eplus), -self.np.conj(eminus)], + [0, 0, eminus, eplus], + ] + return self._cast(matrix, dtype=self.dtype) def CU3(self, theta, phi, lam): - m = self.np.eye(4, dtype=self.dtype) - m[2:, 2:] = self.U3(theta, phi, lam) - return m + cost = self.np.cos(theta / 2) + sint = self.np.sin(theta / 2) + eplus = self.np.exp(1j * (phi + lam) / 2.0) + eminus = self.np.exp(1j * (phi - lam) / 2.0) + matrix = [ + [1, 0, 0, 0], + [0, 1, 0, 0], + [0, 0, self.np.conj(eplus) * cost, -self.np.conj(eminus) * sint], + [0, 0, eminus * sint, eplus * cost], + ] + return self._cast(matrix, dtype=self.dtype) @cached_property def SWAP(self): - return self.np.array( + return self._cast( [[1, 0, 0, 0], [0, 0, 1, 0], [0, 1, 0, 0], [0, 0, 0, 1]], dtype=self.dtype ) @cached_property def iSWAP(self): - return self.np.array( - [[1, 0, 0, 0], [0, 0, 1j, 0], [0, 1j, 0, 0], [0, 0, 0, 1]], dtype=self.dtype + return self._cast( + [ + [1 + 0j, 0j, 0j, 0j], + [0j, 0j, 1j, 0j], + [0j, 1j, 0j, 0j], + [0j, 0j, 0j, 1 + 0j], + ], + dtype=self.dtype, ) @cached_property def SiSWAP(self): - return self.np.array( + return self._cast( [ - [1, 0, 0, 0], - [0, 1 / self.np.sqrt(2), 1j / self.np.sqrt(2), 0], - [0, 1j / self.np.sqrt(2), 1 / self.np.sqrt(2), 0], - [0, 0, 0, 1], + [1 + 0j, 0j, 0j, 0j], + [0j, 1 / self.np.sqrt(2) + 0j, 1j / self.np.sqrt(2), 0j], + [0j, 1j / self.np.sqrt(2), 1 / self.np.sqrt(2) + 0j, 0j], + [0j, 0j, 0j, 1 + 0j], + ], + dtype=self.dtype, + ) + + @cached_property + def SiSWAPDG(self): + return self._cast( + [ + [1 + 0j, 0j, 0j, 0j], + [0j, 1 / self.np.sqrt(2) + 0j, -1j / self.np.sqrt(2), 0j], + [0j, -1j / self.np.sqrt(2), 1 / self.np.sqrt(2) + 0j, 0j], + [0j, 0j, 0j, 1 + 0j], ], dtype=self.dtype, ) @cached_property def FSWAP(self): - return self.np.array( + return self._cast( [[1, 0, 0, 0], [0, 0, 1, 0], [0, 1, 0, 0], [0, 0, 0, -1]], dtype=self.dtype ) @@ -216,7 +288,7 @@ def fSim(self, theta, phi): cost = self.np.cos(theta) + 0j isint = -1j * self.np.sin(theta) phase = self.np.exp(-1j * phi) - return self.np.array( + return self._cast( [ [1, 0, 0, 0], [0, cost, isint, 0], @@ -231,7 +303,7 @@ def SYC(self): cost = self.np.cos(self.np.pi / 2) + 0j isint = -1j * self.np.sin(self.np.pi / 2) phase = self.np.exp(-1j * self.np.pi / 6) - return self.np.array( + return self._cast( [ [1, 0, 0, 0], [0, cost, isint, 0], @@ -243,7 +315,7 @@ def SYC(self): def GeneralizedfSim(self, u, phi): phase = self.np.exp(-1j * phi) - return self.np.array( + return self._cast( [ [1, 0, 0, 0], [0, complex(u[0, 0]), complex(u[0, 1]), 0], @@ -256,7 +328,7 @@ def GeneralizedfSim(self, u, phi): def RXX(self, theta): cos = self.np.cos(theta / 2.0) + 0j isin = -1j * self.np.sin(theta / 2.0) - return self.np.array( + return self._cast( [ [cos, 0, 0, isin], [0, cos, isin, 0], @@ -269,7 +341,7 @@ def RXX(self, theta): def RYY(self, theta): cos = self.np.cos(theta / 2.0) + 0j isin = -1j * self.np.sin(theta / 2.0) - return self.np.array( + return self._cast( [ [cos, 0, 0, -isin], [0, cos, isin, 0], @@ -281,7 +353,7 @@ def RYY(self, theta): def RZZ(self, theta): phase = self.np.exp(0.5j * theta) - return self.np.array( + return self._cast( [ [self.np.conj(phase), 0, 0, 0], [0, phase, 0, 0], @@ -292,8 +364,8 @@ def RZZ(self, theta): ) def RZX(self, theta): - cos, sin = self.np.cos(theta / 2), self.np.sin(theta / 2) - return self.np.array( + cos, sin = self.np.cos(theta / 2) + 0j, self.np.sin(theta / 2) + 0j + return self._cast( [ [cos, -1j * sin, 0, 0], [-1j * sin, cos, 0, 0], @@ -304,8 +376,8 @@ def RZX(self, theta): ) def RXXYY(self, theta): - cos, sin = self.np.cos(theta / 2), self.np.sin(theta / 2) - return self.np.array( + cos, sin = self.np.cos(theta / 2) + 0j, self.np.sin(theta / 2) + 0j + return self._cast( [ [1, 0, 0, 0], [0, cos, -1j * sin, 0], @@ -318,29 +390,20 @@ def RXXYY(self, theta): def MS(self, phi0, phi1, theta): plus = self.np.exp(1.0j * (phi0 + phi1)) minus = self.np.exp(1.0j * (phi0 - phi1)) - - return self.np.array( + cos = self.np.cos(theta / 2) + 0j + sin = self.np.sin(theta / 2) + 0j + return self._cast( [ - [ - self.np.cos(theta / 2), - 0, - 0, - -1.0j * self.np.conj(plus) * self.np.sin(theta / 2), - ], - [ - 0, - self.np.cos(theta / 2), - -1.0j * self.np.conj(minus) * self.np.sin(theta / 2), - 0, - ], - [0, -1.0j * minus * self.np.sin(theta / 2), self.np.cos(theta / 2), 0], - [-1.0j * plus * self.np.sin(theta / 2), 0, 0, self.np.cos(theta / 2)], + [cos, 0, 0, -1.0j * self.np.conj(plus) * sin], + [0, cos, -1.0j * self.np.conj(minus) * sin, 0], + [0, -1.0j * minus * sin, cos, 0], + [-1.0j * plus * sin, 0, 0, cos], ], dtype=self.dtype, ) def GIVENS(self, theta): - return self.np.array( + return self._cast( [ [1, 0, 0, 0], [0, self.np.cos(theta), -self.np.sin(theta), 0], @@ -355,14 +418,19 @@ def RBS(self, theta): @cached_property def ECR(self): - return self.np.array( - [[0, 0, 1, 1j], [0, 0, 1j, 1], [1, -1j, 0, 0], [-1j, 1, 0, 0]], + return self._cast( + [ + [0j, 0j, 1 + 0j, 1j], + [0j, 0j, 1j, 1 + 0j], + [1 + 0j, -1j, 0j, 0j], + [-1j, 1 + 0j, 0j, 0j], + ], dtype=self.dtype, ) / self.np.sqrt(2) @cached_property def TOFFOLI(self): - return self.np.array( + return self._cast( [ [1, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], @@ -372,13 +440,14 @@ def TOFFOLI(self): [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 1, 0], - ] + ], + dtype=self.dtype, ) def DEUTSCH(self, theta): sin = self.np.sin(theta) + 0j # 0j necessary for right tensorflow dtype - cos = self.np.cos(theta) - return self.np.array( + cos = self.np.cos(theta) + 0j + return self._cast( [ [1, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], diff --git a/src/qibo/backends/tensorflow.py b/src/qibo/backends/tensorflow.py index cc2a9a9bb0..6490b37d9e 100644 --- a/src/qibo/backends/tensorflow.py +++ b/src/qibo/backends/tensorflow.py @@ -20,145 +20,11 @@ def __init__(self, dtype): self.tf = tf self.np = tnp - def RX(self, theta): - cos = self.np.cos(theta / 2.0) + 0j - isin = -1j * self.np.sin(theta / 2.0) - return self.tf.cast([[cos, isin], [isin, cos]], dtype=self.dtype) - - def RY(self, theta): - cos = self.np.cos(theta / 2.0) + 0j - sin = self.np.sin(theta / 2.0) + 0j - return self.tf.cast([[cos, -sin], [sin, cos]], dtype=self.dtype) - - def RZ(self, theta): - phase = self.np.exp(0.5j * theta) - return self.tf.cast([[self.np.conj(phase), 0], [0, phase]], dtype=self.dtype) - - def U1(self, theta): - phase = self.np.exp(1j * theta) - return self.tf.cast([[1, 0], [0, phase]], dtype=self.dtype) - - def U2(self, phi, lam): - eplus = self.np.exp(1j * (phi + lam) / 2.0) - eminus = self.np.exp(1j * (phi - lam) / 2.0) - return self.tf.cast( - [[self.np.conj(eplus), -self.np.conj(eminus)], [eminus, eplus]], - dtype=self.dtype, - ) / self.np.sqrt(2) - - def U3(self, theta, phi, lam): - cost = self.np.cos(theta / 2) - sint = self.np.sin(theta / 2) - eplus = self.np.exp(1j * (phi + lam) / 2.0) - eminus = self.np.exp(1j * (phi - lam) / 2.0) - return self.tf.cast( - [ - [self.np.conj(eplus) * cost, -self.np.conj(eminus) * sint], - [eminus * sint, eplus * cost], - ], - dtype=self.dtype, - ) - - def CRX(self, theta): - r = self.RX(theta) - return self.tf.cast( - [ - [1, 0, 0, 0], - [0, 1, 0, 0], - [0, 0, r[0, 0], r[0, 1]], - [0, 0, r[1, 0], r[1, 1]], - ], - dtype=self.dtype, - ) - - def CRY(self, theta): - r = self.RY(theta) - return self.tf.cast( - [ - [1, 0, 0, 0], - [0, 1, 0, 0], - [0, 0, r[0, 0], r[0, 1]], - [0, 0, r[1, 0], r[1, 1]], - ], - dtype=self.dtype, - ) - - def CRZ(self, theta): - r = self.RZ(theta) - return self.tf.cast( - [ - [1, 0, 0, 0], - [0, 1, 0, 0], - [0, 0, r[0, 0], r[0, 1]], - [0, 0, r[1, 0], r[1, 1]], - ], - dtype=self.dtype, - ) - - def CU1(self, theta): - r = self.U1(theta) - return self.tf.cast( - [ - [1, 0, 0, 0], - [0, 1, 0, 0], - [0, 0, r[0, 0], r[0, 1]], - [0, 0, r[1, 0], r[1, 1]], - ], - dtype=self.dtype, - ) - - def CU2(self, phi, lam): - r = self.U2(phi, lam) - return self.tf.cast( - [ - [1, 0, 0, 0], - [0, 1, 0, 0], - [0, 0, r[0, 0], r[0, 1]], - [0, 0, r[1, 0], r[1, 1]], - ], - dtype=self.dtype, - ) - - def CU3(self, theta, phi, lam): - r = self.U3(theta, phi, lam) - return self.tf.cast( - [ - [1, 0, 0, 0], - [0, 1, 0, 0], - [0, 0, r[0, 0], r[0, 1]], - [0, 0, r[1, 0], r[1, 1]], - ], - dtype=self.dtype, - ) - - def fSim(self, theta, phi): - cost = self.np.cos(theta) + 0j - isint = -1j * self.np.sin(theta) - phase = self.np.exp(-1j * phi) - return self.tf.cast( - [ - [1, 0, 0, 0], - [0, cost, isint, 0], - [0, isint, cost, 0], - [0, 0, 0, phase], - ], - dtype=self.dtype, - ) - - def GeneralizedfSim(self, u, phi): - phase = self.np.exp(-1j * phi) - return self.tf.cast( - [ - [1, 0, 0, 0], - [0, u[0, 0], u[0, 1], 0], - [0, u[1, 0], u[1, 1], 0], - [0, 0, 0, phase], - ], - dtype=self.dtype, - ) + def _cast(self, x, dtype): + return self.tf.cast(x, dtype=dtype) def Unitary(self, u): - return self.tf.cast(u, dtype=self.dtype) + return self._cast(u, dtype=self.dtype) class TensorflowBackend(NumpyBackend): diff --git a/src/qibo/callbacks.py b/src/qibo/callbacks.py index 16d88d712a..77114ed42a 100644 --- a/src/qibo/callbacks.py +++ b/src/qibo/callbacks.py @@ -125,7 +125,7 @@ def nqubits(self, n: int): ] def apply(self, backend, state): - from qibo.quantum_info.metrics import entanglement_entropy + from qibo.quantum_info.entropies import entanglement_entropy entropy, spectrum = entanglement_entropy( state, diff --git a/src/qibo/gates/abstract.py b/src/qibo/gates/abstract.py index d9f49f6a5e..a9b4ef0c2c 100644 --- a/src/qibo/gates/abstract.py +++ b/src/qibo/gates/abstract.py @@ -4,7 +4,7 @@ import sympy -from qibo.backends import CliffordBackend, GlobalBackend +from qibo.backends import _check_backend from qibo.config import raise_error REQUIRED_FIELDS = [ @@ -361,8 +361,7 @@ def matrix(self, backend=None): ``Gate.matrix`` was defined as an atribute in ``qibo`` versions prior to ``0.2.0``. From ``0.2.0`` on, it has been converted into a method and has replaced the ``asmatrix`` method. """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) return backend.matrix(self) @@ -481,7 +480,6 @@ def substitute_symbols(self): self.parameters = tuple(params) def matrix(self, backend=None): - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) return backend.matrix_parametrized(self) diff --git a/src/qibo/gates/channels.py b/src/qibo/gates/channels.py index c620738da8..9616c59974 100644 --- a/src/qibo/gates/channels.py +++ b/src/qibo/gates/channels.py @@ -6,7 +6,7 @@ import numpy as np -from qibo.backends import GlobalBackend +from qibo.backends import _check_backend from qibo.config import PRECISION_TOL, raise_error from qibo.gates.abstract import Gate from qibo.gates.gates import I, Unitary, X, Y, Z @@ -80,8 +80,7 @@ def to_choi(self, nqubits: Optional[int] = None, order: str = "row", backend=Non vectorization, ) - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) nqubits = 1 + max(self.target_qubits) if nqubits is None else nqubits @@ -128,8 +127,7 @@ def to_liouville(self, nqubits: int = None, order: str = "row", backend=None): choi_to_liouville, ) - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) super_op = self.to_choi(nqubits=nqubits, order=order, backend=backend) super_op = choi_to_liouville(super_op, order=order, backend=backend) @@ -166,8 +164,7 @@ def to_pauli_liouville( from qibo.quantum_info.basis import comp_basis_to_pauli # pylint: disable=C0415 - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) super_op = self.to_liouville(nqubits=nqubits, backend=backend) diff --git a/src/qibo/gates/gates.py b/src/qibo/gates/gates.py index aa0e0d5ede..ae56a2723b 100644 --- a/src/qibo/gates/gates.py +++ b/src/qibo/gates/gates.py @@ -271,7 +271,11 @@ def decompose(self): being the :class:`qibo.gates.RX` gate. More precisely, :math:`\\sqrt{X} = e^{i \\pi / 4} \\, \\text{RX}(\\pi / 2)`. """ - return [RX(self.init_args[0], np.pi / 2, trainable=False)] + from qibo.transpiler.decompositions import ( # pylint: disable=C0415 + standard_decompositions, + ) + + return standard_decompositions(self) def _dagger(self): """""" @@ -314,7 +318,11 @@ def decompose(self): being the :class:`qibo.gates.RX` gate. More precisely, :math:`(\\sqrt{X})^{\\dagger} = e^{-i \\pi / 4} \\, \\text{RX}(-\\pi / 2)`. """ - return [RX(self.init_args[0], -np.pi / 2, trainable=False)] + from qibo.transpiler.decompositions import ( # pylint: disable=C0415 + standard_decompositions, + ) + + return standard_decompositions(self) def _dagger(self): """""" @@ -892,14 +900,11 @@ def decompose(self) -> List[Gate]: where :math:`\\text{RZ}` and :math:`\\sqrt{X}` are, respectively, :class:`qibo.gates.RZ` and :class`qibo.gates.SX`. """ - q = self.init_args[0] - return [ - RZ(q, self.init_kwargs["lam"]), - SX(q), - RZ(q, self.init_kwargs["theta"] + math.pi), - SX(q), - RZ(q, self.init_kwargs["phi"] + math.pi), - ] + from qibo.transpiler.decompositions import ( # pylint: disable=C0415 + standard_decompositions, + ) + + return standard_decompositions(self) class U1q(_Un_): @@ -1020,8 +1025,11 @@ def decompose(self) -> List[Gate]: the target qubit, followed by :class:`qibo.gates.CNOT`, followed by a :class:`qibo.gates.S` in the target qubit. """ - q0, q1 = self.init_args - return [SDG(q1), CNOT(q0, q1), S(q1)] + from qibo.transpiler.decompositions import ( # pylint: disable=C0415 + standard_decompositions, + ) + + return standard_decompositions(self) class CZ(Gate): @@ -1063,8 +1071,11 @@ def decompose(self) -> List[Gate]: the target qubit, followed by :class:`qibo.gates.CNOT`, followed by another :class:`qibo.gates.H` in the target qubit """ - q0, q1 = self.init_args - return [H(q1), CNOT(q0, q1), H(q1)] + from qibo.transpiler.decompositions import ( # pylint: disable=C0415 + standard_decompositions, + ) + + return standard_decompositions(self) class CSX(Gate): @@ -1100,8 +1111,11 @@ def qasm_label(self): def decompose(self, *free, use_toffolis: bool = True) -> List[Gate]: """""" - q0, q1 = self.init_args - return [H(q1), CU1(q0, q1, np.pi / 2), H(q1)] + from qibo.transpiler.decompositions import ( # pylint: disable=C0415 + standard_decompositions, + ) + + return standard_decompositions(self) def _dagger(self): """""" @@ -1141,8 +1155,11 @@ def qasm_label(self): def decompose(self, *free, use_toffolis: bool = True) -> List[Gate]: """""" - q0, q1 = self.init_args - return [H(q1), CU1(q0, q1, -np.pi / 2), H(q1)] + from qibo.transpiler.decompositions import ( # pylint: disable=C0415 + standard_decompositions, + ) + + return standard_decompositions(self) def _dagger(self): """""" @@ -1508,7 +1525,7 @@ def qasm_label(self): class SiSWAP(Gate): - """The :math:`\\sqrt{\\text{iSWAP}}}` gate. + """The :math:`\\sqrt{\\text{iSWAP}}` gate. Corresponds to the following unitary matrix @@ -1533,6 +1550,39 @@ def __init__(self, q0, q1): self.init_args = [q0, q1] self.unitary = True + def _dagger(self) -> "Gate": + return SiSWAPDG(*self.qubits) + + +class SiSWAPDG(Gate): + """The :math:`\\left(\\sqrt{\\text{iSWAP}}\\right)^{\\dagger}` gate. + + Corresponds to the following unitary matrix + + .. math:: + \\begin{pmatrix} + 1 & 0 & 0 & 0 \\\\ + 0 & 1/\\sqrt{2} & -i/\\sqrt{2} & 0 \\\\ + 0 & -i/\\sqrt{2} & 1/\\sqrt{2} & 0 \\\\ + 0 & 0 & 0 & 1 \\\\ + \\end{pmatrix} + + Args: + q0 (int): the first qubit to be swapped id number. + q1 (int): the second qubit to be swapped id number. + """ + + def __init__(self, q0, q1): + super().__init__() + self.name = "siswapdg" + self.draw_label = "sidg" + self.target_qubits = (q0, q1) + self.init_args = [q0, q1] + self.unitary = True + + def _dagger(self) -> "Gate": + return SiSWAP(*self.qubits) + class FSWAP(Gate): """The fermionic swap gate. @@ -1868,9 +1918,11 @@ def __init__(self, q0, q1, theta, trainable=True): def decompose(self, *free, use_toffolis: bool = True) -> List[Gate]: """""" - q0, q1 = self.target_qubits - theta = self.init_kwargs["theta"] - return [H(q1), CNOT(q0, q1), RZ(q1, theta), CNOT(q0, q1), H(q1)] + from qibo.transpiler.decompositions import ( # pylint: disable=C0415 + standard_decompositions, + ) + + return standard_decompositions(self) class RXXYY(_Rnn_): @@ -1909,22 +1961,11 @@ def decompose(self, *free, use_toffolis: bool = True) -> List[Gate]: the original gate due to a phase difference in :math:`\\left(\\sqrt{X}\\right)^{\\dagger}`. """ - q0, q1 = self.target_qubits - theta = self.init_kwargs["theta"] - return [ - RZ(q1, -np.pi / 2), - S(q0), - SX(q1), - RZ(q1, np.pi / 2), - CNOT(q1, q0), - RY(q0, -theta / 2), - RY(q1, -theta / 2), - CNOT(q1, q0), - SDG(q0), - RZ(q1, -np.pi / 2), - SX(q1).dagger(), - RZ(q1, np.pi / 2), - ] + from qibo.transpiler.decompositions import ( # pylint: disable=C0415 + standard_decompositions, + ) + + return standard_decompositions(self) class MS(ParametrizedGate): @@ -2029,18 +2070,13 @@ def _dagger(self) -> "Gate": return self.__class__(*self.target_qubits, -self.parameters[0]) def decompose(self, *free, use_toffolis: bool = True) -> List[Gate]: - """Decomposition of Givens gate according to `ArXiv:2106.13839 - `_.""" - q0, q1 = self.target_qubits - theta = self.init_kwargs["theta"] - return [ - CNOT(q0, q1), - RY(q0, theta), - CNOT(q1, q0), - RY(q0, -theta), - CNOT(q1, q0), - CNOT(q0, q1), - ] + """Decomposition of RBS gate according to `ArXiv:2109.09685 + `_.""" + from qibo.transpiler.decompositions import ( # pylint: disable=C0415 + standard_decompositions, + ) + + return standard_decompositions(self) class RBS(ParametrizedGate): @@ -2090,18 +2126,11 @@ def _dagger(self) -> "Gate": def decompose(self, *free, use_toffolis: bool = True) -> List[Gate]: """Decomposition of RBS gate according to `ArXiv:2109.09685 `_.""" - q0, q1 = self.target_qubits - theta = self.init_kwargs["theta"] - return [ - H(q0), - CNOT(q0, q1), - H(q1), - RY(q0, theta), - RY(q1, -theta), - H(q1), - CNOT(q0, q1), - H(q0), - ] + from qibo.transpiler.decompositions import ( # pylint: disable=C0415 + standard_decompositions, + ) + + return standard_decompositions(self) class ECR(Gate): @@ -2142,9 +2171,11 @@ def decompose(self, *free, use_toffolis: bool = True) -> List[Gate]: \\textup{ECR} = e^{i 7 \\pi / 4} \\, S(q_{0}) \\, \\sqrt{X}(q_{1}) \\, \\textup{CNOT}(q_{0}, q_{1}) \\, X(q_{0}) """ + from qibo.transpiler.decompositions import ( # pylint: disable=C0415 + standard_decompositions, + ) - q0, q1 = self.target_qubits - return [S(q0), SX(q1), CNOT(q0, q1), X(q0)] + return standard_decompositions(self) class TOFFOLI(Gate): diff --git a/src/qibo/gates/special.py b/src/qibo/gates/special.py index 5243b9fa52..3824f3672c 100644 --- a/src/qibo/gates/special.py +++ b/src/qibo/gates/special.py @@ -1,4 +1,4 @@ -from qibo.backends import GlobalBackend +from qibo.backends import _check_backend from qibo.gates.abstract import SpecialGate from qibo.gates.measurements import M @@ -104,8 +104,7 @@ def matrix(self, backend=None): Returns: ndarray: Matrix representation of special gate. """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) return backend.matrix_fused(self) diff --git a/src/qibo/hamiltonians/hamiltonians.py b/src/qibo/hamiltonians/hamiltonians.py index 6354bf316b..10b9419580 100644 --- a/src/qibo/hamiltonians/hamiltonians.py +++ b/src/qibo/hamiltonians/hamiltonians.py @@ -24,14 +24,9 @@ class Hamiltonian(AbstractHamiltonian): """ def __init__(self, nqubits, matrix=None, backend=None): - if backend is None: # pragma: no cover - from qibo.backends import ( # pylint: disable=import-outside-toplevel - GlobalBackend, - ) + from qibo.backends import _check_backend - self.backend = GlobalBackend() - else: - self.backend = backend + self.backend = _check_backend(backend) if not ( isinstance(matrix, self.backend.tensor_types) @@ -355,14 +350,11 @@ def __init__(self, form=None, nqubits=None, symbol_map={}, backend=None): from qibo.symbols import Symbol # pylint: disable=import-outside-toplevel self._qiboSymbol = Symbol # also used in ``self._get_symbol_matrix`` - if backend is None: # pragma: no cover - from qibo.backends import ( # pylint: disable=import-outside-toplevel - GlobalBackend, - ) - self.backend = GlobalBackend() - else: - self.backend = backend + from qibo.backends import _check_backend + + self.backend = _check_backend(backend) + if form is not None: self.form = form if nqubits is not None: diff --git a/src/qibo/models/circuit.py b/src/qibo/models/circuit.py index 419f5635d2..e15223f9ef 100644 --- a/src/qibo/models/circuit.py +++ b/src/qibo/models/circuit.py @@ -1000,14 +1000,13 @@ def fuse(self, max_qubits=2): def unitary(self, backend=None): """Creates the unitary matrix corresponding to all circuit gates. - This is a ``(2 ** nqubits, 2 ** nqubits)`` matrix obtained by - multiplying all circuit gates. + This is a :math:`2^{n} \\times 2^{n}`` matrix obtained by + multiplying all circuit gates, where :math:`n` is ``nqubits``. """ - if backend is None: - from qibo.backends import GlobalBackend + from qibo.backends import _check_backend - backend = GlobalBackend() + backend = _check_backend(backend) fgate = gates.FusedGate(*range(self.nqubits)) for gate in self.queue: @@ -1050,10 +1049,10 @@ def compile(self, backend=None): NotImplementedError, "Circuit compilation is not available with callbacks.", ) - if backend is None: - from qibo.backends import GlobalBackend - backend = GlobalBackend() + from qibo.backends import _check_backend + + backend = _check_backend(backend) from qibo.result import CircuitResult, QuantumState diff --git a/src/qibo/models/encodings.py b/src/qibo/models/encodings.py index a85024ad3c..8d37bb8922 100644 --- a/src/qibo/models/encodings.py +++ b/src/qibo/models/encodings.py @@ -70,28 +70,52 @@ def comp_basis_encoder( return circuit -def unary_encoder(data, architecture: str = "tree"): - """Creates circuit that performs the unary encoding of ``data``. +def phase_encoder(data, rotation: str = "RY"): + """Creates circuit that performs the phase encoding of ``data``. - Given a classical ``data`` array :math:`\\mathbf{x} \\in \\mathbb{R}^{d}` such that + Args: + data (ndarray or list): :math:`1`-dimensional array of phases to be loaded. + rotation (str, optional): If ``"RX"``, uses :class:`qibo.gates.gates.RX` as rotation. + If ``"RY"``, uses :class:`qibo.gates.gates.RY` as rotation. + If ``"RZ"``, uses :class:`qibo.gates.gates.RZ` as rotation. + Defaults to ``"RY"``. - .. math:: - \\mathbf{x} = (x_{1}, x_{2}, \\dots, x_{d}) \\, , + Returns: + :class:`qibo.models.circuit.Circuit`: circuit that loads ``data`` in phase encoding. + """ + if isinstance(data, list): + data = np.array(data) + + if len(data.shape) != 1: + raise_error( + TypeError, + f"``data`` must be a 1-dimensional array, but it has dimensions {data.shape}.", + ) + + if not isinstance(rotation, str): + raise_error( + TypeError, + f"``rotation`` must be type str, but it is type {type(rotation)}.", + ) - this function generate the circuit that prepares the following quantum state - :math:`\\ket{\\psi} \\in \\mathcal{H}`: + if rotation not in ["RX", "RY", "RZ"]: + raise_error(ValueError, f"``rotation`` {rotation} not found.") + + nqubits = len(data) + gate = getattr(gates, rotation.upper()) + + circuit = Circuit(nqubits) + circuit.add(gate(qubit, 0.0) for qubit in range(nqubits)) + circuit.set_parameters(data) + + return circuit - .. math:: - \\ket{\\psi} = \\frac{1}{\\|\\mathbf{x}\\|_{\\textup{HS}}} \\, - \\sum_{k=1}^{d} \\, x_{k} \\, \\ket{k} \\, , - with :math:`\\mathcal{H} \\cong \\mathbb{C}^{d}` being a :math:`d`-qubit Hilbert space, - and :math:`\\|\\cdot\\|_{\\textup{HS}}` being the Hilbert-Schmidt norm. - Here, :math:`\\ket{k}` is a unary representation of the number :math:`1` through - :math:`d`. +def unary_encoder(data, architecture: str = "tree"): + """Creates circuit that performs the (deterministic) unary encoding of ``data``. Args: - data (ndarray, optional): :math:`1`-dimensional array of data to be loaded. + data (ndarray): :math:`1`-dimensional array of data to be loaded. architecture(str, optional): circuit architecture used for the unary loader. If ``diagonal``, uses a ladder-like structure. If ``tree``, uses a binary-tree-based structure. @@ -99,11 +123,10 @@ def unary_encoder(data, architecture: str = "tree"): Returns: :class:`qibo.models.circuit.Circuit`: circuit that loads ``data`` in unary representation. - - References: - 1. S. Johri *et al.*, *Nearest Centroid Classification on a Trapped Ion Quantum Computer*. - `arXiv:2012.04145v2 [quant-ph] `_. """ + if isinstance(data, list): + data = np.array(data) + if len(data.shape) != 1: raise_error( TypeError, @@ -143,26 +166,12 @@ def unary_encoder(data, architecture: str = "tree"): def unary_encoder_random_gaussian(nqubits: int, architecture: str = "tree", seed=None): """Creates a circuit that performs the unary encoding of a random Gaussian state. - Given :math:`d` qubits, encodes the quantum state - :math:`\\ket{\\psi} \\in \\mathcal{H}` such that - - - .. math:: - \\ket{\\psi} = \\frac{1}{\\|\\mathbf{x}\\|_{\\textup{HS}}} \\, - \\sum_{k=1}^{d} \\, x_{k} \\, \\ket{k} - - where :math:`x_{k}` are independent Gaussian random variables, - :math:`\\mathcal{H} \\cong \\mathbb{C}^{d}` is a :math:`d`-qubit Hilbert space, - and :math:`\\|\\cdot\\|_{\\textup{HS}}` being the Hilbert-Schmidt norm. - Here, :math:`\\ket{k}` is a unary representation of the number :math:`1` through - :math:`d`. - - At depth :math:`h`, the angles :math:`\\theta_{k} \\in [0, 2\\pi]` of the the + At depth :math:`h` of the tree architecture, the angles :math:`\\theta_{k} \\in [0, 2\\pi]` of the the gates :math:`RBS(\\theta_{k})` are sampled from the following probability density function: .. math:: - p_{h}(\\theta) = \\frac{1}{2} \\, \\frac{\\Gamma(2^{h-1})}{\\Gamma^{2}(2^{h-2})} - \\abs{\\sin(\\theta) \\, \\cos(\\theta)}^{2^{h-1} - 1} \\, , + p_{h}(\\theta) = \\frac{1}{2} \\, \\frac{\\Gamma(2^{h-1})}{\\Gamma^{2}(2^{h-2})} \\, + \\left|\\sin(\\theta) \\, \\cos(\\theta)\\right|^{2^{h-1} - 1} \\, , where :math:`\\Gamma(\\cdot)` is the `Gamma function `_. diff --git a/src/qibo/models/error_mitigation.py b/src/qibo/models/error_mitigation.py index 2e2d577d2e..9af448c564 100644 --- a/src/qibo/models/error_mitigation.py +++ b/src/qibo/models/error_mitigation.py @@ -6,7 +6,7 @@ from scipy.optimize import curve_fit from qibo import gates -from qibo.backends import GlobalBackend +from qibo.backends import GlobalBackend, _check_backend from qibo.config import raise_error @@ -148,8 +148,8 @@ def ZNE( 1. K. Temme, S. Bravyi et al, *Error mitigation for short-depth quantum circuits*. `arXiv:1612.02058 [quant-ph] `_. """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) + if readout is None: readout = {} @@ -197,8 +197,7 @@ def sample_training_circuit_cdr( Returns: :class:`qibo.models.Circuit`: The sampled circuit. """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) if replacement_gates is None: replacement_gates = [(gates.RZ, {"theta": n * np.pi / 2}) for n in range(4)] @@ -303,8 +302,8 @@ def CDR( 1. P. Czarnik, A. Arrasmith et al, *Error mitigation with Clifford quantum-circuit data*. `arXiv:2005.10189 [quant-ph] `_. """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) + if readout is None: readout = {} @@ -314,7 +313,8 @@ def CDR( train_val = {"noise-free": [], "noisy": []} for circ in training_circuits: - val = circ(nshots=nshots).expectation_from_samples(observable) + result = backend.execute_circuit(circ, nshots=nshots) + val = result.expectation_from_samples(observable) train_val["noise-free"].append(val) val = get_expectation_val_with_readout_mitigation( circ, observable, noise_model, nshots, readout, qubit_map, backend=backend @@ -389,8 +389,8 @@ def vnCDR( 1. A. Lowe, MH. Gordon et al, *Unified approach to data-driven quantum error mitigation*. `arXiv:2011.01157 [quant-ph] `_. """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) + if readout is None: readout = {} @@ -400,7 +400,8 @@ def vnCDR( train_val = {"noise-free": [], "noisy": []} for circ in training_circuits: - val = circ(nshots=nshots).expectation_from_samples(observable) + result = backend.execute_circuit(circ, nshots=nshots) + val = result.expectation_from_samples(observable) train_val["noise-free"].append(val) for level in noise_levels: noisy_c = get_noisy_circuit(circ, level, insertion_gate=insertion_gate) @@ -493,8 +494,7 @@ def get_response_matrix( """ from qibo import Circuit # pylint: disable=import-outside-toplevel - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) response_matrix = np.zeros((2**nqubits, 2**nqubits)) @@ -597,8 +597,7 @@ def apply_randomized_readout_mitigation( random_pauli, ) - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) meas_qubits = circuit.measurements[0].qubits nshots_r = int(nshots / ncircuits) @@ -670,8 +669,8 @@ def get_expectation_val_with_readout_mitigation( Returns: float: the mitigated expectation value of the observable. """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) + if readout is None: # pragma: no cover readout = {} @@ -717,8 +716,7 @@ def sample_clifford_training_circuit( random_clifford, ) - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) non_clifford_gates_indices = [ i @@ -781,8 +779,7 @@ def error_sensitive_circuit(circuit, observable, backend=None): vectorization, ) - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) sampled_circuit = sample_clifford_training_circuit(circuit, backend=backend) unitary_matrix = sampled_circuit.unitary(backend=backend) @@ -880,8 +877,8 @@ def ICS( 1. Dayue Qin, Yanzhu Chen et al, *Error statistics and scalability of quantum error mitigation formulas*. `arXiv:2112.06255 [quant-ph] `_. """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) + if readout is None: readout = {} @@ -897,7 +894,7 @@ def ICS( lambda_list = [] for training_circuit in training_circuits: - circuit_result = training_circuit(nshots=nshots) + circuit_result = backend.execute_circuit(training_circuit, nshots=nshots) expectation = observable.expectation_from_samples(circuit_result.frequencies()) noisy_expectation = get_expectation_val_with_readout_mitigation( diff --git a/src/qibo/models/grover.py b/src/qibo/models/grover.py index 2da268aa97..c18fab512e 100644 --- a/src/qibo/models/grover.py +++ b/src/qibo/models/grover.py @@ -188,10 +188,9 @@ def iterative_grover(self, lamda_value=6 / 5, backend=None): measured (str): bitstring measured and checked as a valid solution. total_iterations (int): number of times the oracle has been called. """ - if backend is None: # pragma: no cover - from qibo.backends import GlobalBackend + from qibo.backends import _check_backend - backend = GlobalBackend() + backend = _check_backend(backend) k = 1 lamda = lamda_value @@ -225,10 +224,9 @@ def execute(self, nshots=100, freq=False, logs=False, backend=None): solution (str): bitstring (or list of bitstrings) measured as solution of the search. iterations (int): number of oracle calls done to reach a solution. """ - if backend is None: # pragma: no cover - from qibo.backends import GlobalBackend + from qibo.backends import _check_backend - backend = GlobalBackend() + backend = _check_backend(backend) if (self.num_sol or self.targ_a) and not self.iterative: if self.targ_a: diff --git a/src/qibo/models/hep.py b/src/qibo/models/hep.py index 13466cab4e..e03429136e 100644 --- a/src/qibo/models/hep.py +++ b/src/qibo/models/hep.py @@ -41,12 +41,9 @@ def __init__(self, ansatz, layers, nqubits, multi_output=False, backend=None): self.circuit, self.rotation, self.nparams = ansatz_function(layers, nqubits) # load backend - if backend is None: # pragma: no cover - from qibo.backends import GlobalBackend + from qibo.backends import _check_backend - self.backend = GlobalBackend() - else: - self.backend = backend + self.backend = _check_backend(backend) # load hamiltonian if multi_output: diff --git a/src/qibo/models/iqae.py b/src/qibo/models/iqae.py index 081c787a1a..caf28e72b7 100644 --- a/src/qibo/models/iqae.py +++ b/src/qibo/models/iqae.py @@ -264,10 +264,10 @@ def execute(self, backend=None): Returns: A :class:`qibo.models.iqae.IterativeAmplitudeEstimationResult` results object. """ - if backend is None: - from qibo.backends import GlobalBackend + from qibo.backends import _check_backend + + backend = _check_backend(backend) - backend = GlobalBackend() # Initializing all parameters k = [0] # uppercase_k=4k+2 diff --git a/src/qibo/models/qcnn.py b/src/qibo/models/qcnn.py index 5d569facac..f56ed804cf 100644 --- a/src/qibo/models/qcnn.py +++ b/src/qibo/models/qcnn.py @@ -1,6 +1,7 @@ import numpy as np -from qibo import Circuit, gates +from qibo import gates, get_backend +from qibo.models import Circuit class QuantumCNN: @@ -16,14 +17,16 @@ class QuantumCNN: nclasses (int): number of classes to be classified. Default setting of 2 (phases). params: initial list of variational parameters. If not provided, all parameters will be initialized to zero. + twoqubitansatz (:class:`qibo.models.Circuit`): a two qubit ansatz that can be input by the user to form the two qubit ansatz used in the convolutional circuit. Example: .. testcode:: - import qibo - from qibo.models.qcnn import QuantumCNN + import math - import qibo import numpy as np import random + import qibo + from qibo.models.qcnn import QuantumCNN + qibo.set_backend("numpy") data = np.random.rand(16) @@ -42,12 +45,31 @@ class QuantumCNN: """ - def __init__(self, nqubits, nlayers, nclasses=2, params=None): + def __init__( + self, + nqubits, + nlayers, + nclasses=2, + params=None, + twoqubitansatz=None, + copy_init_state=None, + ): self.nclasses = nclasses self.nqubits = nqubits self.nlayers = nlayers + self.twoqubitansatz = twoqubitansatz + + if copy_init_state is None: + if "qibojit" in get_backend(): + self.copy_init_state = True + else: + self.copy_init_state = False + + if self.twoqubitansatz == None: + self.nparams_conv = 15 + else: + self.nparams_conv = len(self.twoqubitansatz.get_parameters()) - self.nparams_conv = 15 self.nparams_pool = 6 self.nparams_layer = self.nparams_conv + self.nparams_pool self.measured_qubits = int(np.ceil(np.log2(self.nclasses))) @@ -161,15 +183,21 @@ def two_qubit_unitary(self, bits, symbols): Circuit containing the unitaries added to the specified qubits. """ - c = Circuit(self.nqubits) - c += self.one_qubit_unitary(bits[0], symbols[0:3]) - c += self.one_qubit_unitary(bits[1], symbols[3:6]) - c.add(gates.RZZ(bits[0], bits[1], symbols[6])) - c.add(gates.RYY(bits[0], bits[1], symbols[7])) - c.add(gates.RXX(bits[0], bits[1], symbols[8])) + if self.twoqubitansatz is None: + c = Circuit(self.nqubits) + c += self.one_qubit_unitary(bits[0], symbols[0:3]) + c += self.one_qubit_unitary(bits[1], symbols[3:6]) + c.add(gates.RZZ(bits[0], bits[1], symbols[6])) + c.add(gates.RYY(bits[0], bits[1], symbols[7])) + c.add(gates.RXX(bits[0], bits[1], symbols[8])) - c += self.one_qubit_unitary(bits[0], symbols[9:12]) - c += self.one_qubit_unitary(bits[1], symbols[12:]) + c += self.one_qubit_unitary(bits[0], symbols[9:12]) + c += self.one_qubit_unitary(bits[1], symbols[12:]) + + else: + c = Circuit(self.nqubits) + c.add(self.twoqubitansatz.on_qubits(bits[0], bits[1])) + c.set_parameters(symbols[0 : self.nparams_conv]) return c @@ -251,7 +279,11 @@ def Predictions(self, circuit, theta, init_state, nshots=10000): numpy.array() with predictions for each qubit, for the initial state. """ bias = np.array(theta[0 : self.measured_qubits]) - circuit_exec = circuit(init_state, nshots) + if self.copy_init_state: + init_state_copy = init_state.copy() + else: + init_state_copy = init_state + circuit_exec = circuit(init_state_copy, nshots) result = circuit_exec.frequencies(binary=False) prediction = np.zeros(self.measured_qubits) @@ -309,17 +341,15 @@ def minimize( data: the training data to be used in the minimization. labels: the corresponding ground truth for the training data. nshots: int number of runs of the circuit during the sampling process (default=10000). - method: str 'classical optimizer for the minimization'. All methods from scipy.optimize.minmize are suported (default='Powell'). + method: str 'classical optimizer for the minimization'. All methods from qibo.optimizers.optimize are suported (default='Powell'). Returns: numpy.float64 with value of the minimum found, numpy.ndarray with the optimal angles. """ - from scipy.optimize import minimize + from qibo.optimizers import optimize - result = minimize( + loss, optimal_angles, result = optimize( self.Cost_function, init_theta, args=(data, labels, nshots), method=method ) - loss = result.fun - optimal_angles = result.x self._optimal_angles = optimal_angles diff --git a/src/qibo/models/tsp.py b/src/qibo/models/tsp.py index 3db11f818e..250360aa84 100644 --- a/src/qibo/models/tsp.py +++ b/src/qibo/models/tsp.py @@ -135,12 +135,10 @@ def qaoa_function_of_layer(layer, distance_matrix): """ def __init__(self, distance_matrix, backend=None): - if backend is None: # pragma: no cover - from qibo.backends import GlobalBackend + from qibo.backends import _check_backend + + self.backend = _check_backend(backend) - self.backend = GlobalBackend() - else: - self.backend = backend self.distance_matrix = distance_matrix self.num_cities = distance_matrix.shape[0] self.two_to_one = calculate_two_to_one(self.num_cities) diff --git a/src/qibo/noise_model.py b/src/qibo/noise_model.py index 892eb48743..44311c2661 100644 --- a/src/qibo/noise_model.py +++ b/src/qibo/noise_model.py @@ -341,10 +341,9 @@ def fit( from scipy.optimize import Bounds, direct - if backend == None: # pragma: no cover - from qibo.backends import GlobalBackend + from qibo.backends import _check_backend - backend = GlobalBackend() + backend = _check_backend(backend) nshots = target_result.nshots target_prob = freq_to_prob(target_result.frequencies()) diff --git a/src/qibo/optimizers.py b/src/qibo/optimizers.py index 92eed2fbeb..0b5c46c778 100644 --- a/src/qibo/optimizers.py +++ b/src/qibo/optimizers.py @@ -86,16 +86,16 @@ def myloss(parameters, circuit): ) return cmaes(loss, initial_parameters, args, options) elif method == "sgd": - if backend is None: - from qibo.backends import GlobalBackend + from qibo.backends import _check_backend + + backend = _check_backend(backend) - backend = GlobalBackend() return sgd(loss, initial_parameters, args, options, compile, backend) else: - if backend is None: - from qibo.backends import GlobalBackend + from qibo.backends import _check_backend + + backend = _check_backend(backend) - backend = GlobalBackend() return newtonian( loss, initial_parameters, diff --git a/src/qibo/parallel.py b/src/qibo/parallel.py index 0bbf84f055..22a65fafe7 100644 --- a/src/qibo/parallel.py +++ b/src/qibo/parallel.py @@ -6,7 +6,7 @@ from joblib import Parallel, delayed -from qibo.backends import GlobalBackend, set_threads +from qibo.backends import _check_backend from qibo.config import raise_error @@ -39,8 +39,7 @@ def parallel_execution(circuit, states, processes=None, backend=None): Returns: Circuit evaluation for input states. """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) if states is None or not isinstance(states, list): # pragma: no cover raise_error(TypeError, "states must be a list.") @@ -88,8 +87,7 @@ def parallel_circuits_execution( Returns: Circuit evaluation for input states. """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) if not isinstance(circuits, Iterable): # pragma: no cover raise_error(TypeError, "circuits must be iterable.") @@ -165,8 +163,7 @@ def parallel_parametrized_execution( Returns: Circuit evaluation for input parameters. """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) if not isinstance(parameters, list): # pragma: no cover raise_error(TypeError, "parameters must be a list.") diff --git a/src/qibo/quantum_info/__init__.py b/src/qibo/quantum_info/__init__.py index 27e3edb046..8d9400104e 100644 --- a/src/qibo/quantum_info/__init__.py +++ b/src/qibo/quantum_info/__init__.py @@ -1,5 +1,7 @@ from qibo.quantum_info.basis import * from qibo.quantum_info.clifford import * +from qibo.quantum_info.entanglement import * +from qibo.quantum_info.entropies import * from qibo.quantum_info.metrics import * from qibo.quantum_info.quantum_networks import * from qibo.quantum_info.random_ensembles import * diff --git a/src/qibo/quantum_info/basis.py b/src/qibo/quantum_info/basis.py index 119cf78380..dcb5d7ab84 100644 --- a/src/qibo/quantum_info/basis.py +++ b/src/qibo/quantum_info/basis.py @@ -5,7 +5,7 @@ import numpy as np from qibo import matrices -from qibo.backends import GlobalBackend +from qibo.backends import _check_backend from qibo.config import raise_error from qibo.quantum_info.superoperator_transformations import vectorization @@ -89,8 +89,7 @@ def pauli_basis( "sparse representation is not implemented for unvectorized Pauli basis.", ) - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) pauli_labels = {"I": matrices.I, "X": matrices.X, "Y": matrices.Y, "Z": matrices.Z} basis_single = [pauli_labels[label] for label in pauli_order] @@ -187,8 +186,7 @@ def comp_basis_to_pauli( array with their row-wise indexes. """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) if sparse: elements, indexes = pauli_basis( @@ -258,8 +256,7 @@ def pauli_to_comp_basis( tuple is composed of array of non-zero elements and an array with their row-wise indexes. """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) unitary = pauli_basis( nqubits, diff --git a/src/qibo/quantum_info/entanglement.py b/src/qibo/quantum_info/entanglement.py new file mode 100644 index 0000000000..28cbb70305 --- /dev/null +++ b/src/qibo/quantum_info/entanglement.py @@ -0,0 +1,293 @@ +"""Submodules with entanglement measures.""" + +import numpy as np + +from qibo.backends import _check_backend +from qibo.config import PRECISION_TOL, raise_error +from qibo.quantum_info.metrics import fidelity, purity + + +def concurrence(state, bipartition, check_purity: bool = True, backend=None): + """Calculates concurrence of a pure bipartite quantum state + :math:`\\rho \\in \\mathcal{H}_{A} \\otimes \\mathcal{H}_{B}` as + + .. math:: + C(\\rho) = \\sqrt{2 \\, (\\text{tr}^{2}(\\rho) - \\text{tr}(\\rho_{A}^{2}))} \\, , + + where :math:`\\rho_{A} = \\text{tr}_{B}(\\rho)` is the reduced density operator + obtained by tracing out the qubits in the ``bipartition`` :math:`B`. + + Args: + state (ndarray): statevector or density matrix. + bipartition (list or tuple or ndarray): qubits in the subsystem to be traced out. + check_purity (bool, optional): if ``True``, checks if ``state`` is pure. If ``False``, + it assumes ``state`` is pure . Defaults to ``True``. + backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be used + in the execution. If ``None``, it uses :class:`qibo.backends.GlobalBackend`. + Defaults to ``None``. + + Returns: + float: Concurrence of :math:`\\rho`. + """ + backend = _check_backend(backend) + + if ( + (len(state.shape) not in [1, 2]) + or (len(state) == 0) + or (len(state.shape) == 2 and state.shape[0] != state.shape[1]) + ): + raise_error( + TypeError, + f"state must have dims either (k,) or (k,k), but have dims {state.shape}.", + ) + + if not isinstance(check_purity, bool): + raise_error( + TypeError, + f"check_purity must be type bool, but it is type {type(check_purity)}.", + ) + + nqubits = int(np.log2(state.shape[0])) + + if check_purity is True: + purity_total_system = purity(state) + + mixed = bool(abs(purity_total_system - 1.0) > PRECISION_TOL) + if mixed is True: + raise_error( + NotImplementedError, + "concurrence only implemented for pure quantum states.", + ) + + reduced_density_matrix = ( + backend.partial_trace(state, bipartition, nqubits) + if len(state.shape) == 1 + else backend.partial_trace_density_matrix(state, bipartition, nqubits) + ) + + purity_reduced = purity(reduced_density_matrix) + if purity_reduced - 1.0 > 0.0: + purity_reduced = round(purity_reduced, 7) + + concur = np.sqrt(2 * (1 - purity_reduced)) + + return concur + + +def entanglement_of_formation( + state, bipartition, base: float = 2, check_purity: bool = True, backend=None +): + """Calculates the entanglement of formation :math:`E_{f}` of a pure bipartite + quantum state :math:`\\rho`, which is given by + + .. math:: + E_{f} = H([1 - x, x]) \\, , + + where + + .. math:: + x = \\frac{1 + \\sqrt{1 - C^{2}(\\rho)}}{2} \\, , + + :math:`C(\\rho)` is the :func:`qibo.quantum_info.concurrence` of :math:`\\rho`, + and :math:`H` is the :func:`qibo.quantum_info.entropies.shannon_entropy`. + + Args: + state (ndarray): statevector or density matrix. + bipartition (list or tuple or ndarray): qubits in the subsystem to be traced out. + base (float): the base of the log in :func:`qibo.quantum_info.entropies.shannon_entropy`. + Defaults to :math:`2`. + check_purity (bool, optional): if ``True``, checks if ``state`` is pure. If ``False``, + it assumes ``state`` is pure . Default: ``True``. + backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be used + in the execution. If ``None``, it uses :class:`qibo.backends.GlobalBackend`. + Defaults to ``None``. + + + Returns: + float: entanglement of formation of state :math:`\\rho`. + """ + from qibo.quantum_info.entropies import shannon_entropy # pylint: disable=C0415 + + backend = _check_backend(backend) + + concur = concurrence( + state, bipartition=bipartition, check_purity=check_purity, backend=backend + ) + concur = (1 + np.sqrt(1 - concur**2)) / 2 + probabilities = [1 - concur, concur] + + ent_of_form = shannon_entropy(probabilities, base=base, backend=backend) + + return ent_of_form + + +def entanglement_fidelity( + channel, nqubits: int, state=None, check_hermitian: bool = False, backend=None +): + """Entanglement fidelity :math:`F_{\\mathcal{E}}` of a ``channel`` :math:`\\mathcal{E}` + on ``state`` :math:`\\rho` is given by + + .. math:: + F_{\\mathcal{E}}(\\rho) = F(\\rho_{f}, \\rho) + + where :math:`F` is the :func:`qibo.quantum_info.fidelity` function for states, + and :math:`\\rho_{f} = \\mathcal{E}_{A} \\otimes I_{B}(\\rho)` + is the state after the channel :math:`\\mathcal{E}` was applied to + partition :math:`A`. + + Args: + channel (:class:`qibo.gates.channels.Channel`): quantum channel + acting on partition :math:`A`. + nqubits (int): total number of qubits in ``state``. + state (ndarray, optional): statevector or density matrix to be evolved + by ``channel``. If ``None``, defaults to the maximally entangled state + :math:`\\frac{1}{2^{n}} \\, \\sum_{k} \\, \\ket{k}\\ket{k}`, where + :math:`n` is ``nqubits``. Defaults to ``None``. + check_hermitian (bool, optional): if ``True``, checks if the final state + :math:`\\rho_{f}` is Hermitian. If ``False``, it assumes it is Hermitian. + Defaults to ``False``. + backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be used + in the execution. If ``None``, it uses :class:`qibo.backends.GlobalBackend`. + Defaults to ``None``. + + Returns: + float: Entanglement fidelity :math:`F_{\\mathcal{E}}`. + """ + if not isinstance(nqubits, int): + raise_error( + TypeError, f"nqubits must be type int, but it is type {type(nqubits)}." + ) + + if nqubits <= 0: + raise_error( + ValueError, f"nqubits must be a positive integer, but it is {nqubits}." + ) + + if state is not None and ( + (len(state.shape) not in [1, 2]) + or (len(state) == 0) + or (len(state.shape) == 2 and state.shape[0] != state.shape[1]) + ): + raise_error( + TypeError, + f"state must have dims either (k,) or (k,k), but have dims {state.shape}.", + ) + + if not isinstance(check_hermitian, bool): + raise_error( + TypeError, + f"check_hermitian must be type bool, but it is type {type(check_hermitian)}.", + ) + + backend = _check_backend(backend) + + if state is None: + state = backend.plus_density_matrix(nqubits) + + # necessary because this function do support repeated execution, + # so it has to default to density matrices + if len(state.shape) == 1: + state = np.outer(state, np.conj(state)) + + state_final = backend.apply_channel_density_matrix(channel, state, nqubits) + + entang_fidelity = fidelity( + state_final, state, check_hermitian=check_hermitian, backend=backend + ) + + return entang_fidelity + + +def meyer_wallach_entanglement(circuit, backend=None): + """Computes the Meyer-Wallach entanglement Q of the `circuit`, + + .. math:: + Q(\\theta) = 1 - \\frac{1}{N} \\, \\sum_{k} \\, + \\text{tr}\\left(\\rho_{k^{2}}(\\theta)\\right) \\, . + + Args: + circuit (:class:`qibo.models.Circuit`): Parametrized circuit. + backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be used + in the execution. If ``None``, it uses :class:`qibo.backends.GlobalBackend`. + Defaults to ``None``. + + Returns: + float: Meyer-Wallach entanglement. + """ + + backend = _check_backend(backend) + + circuit.density_matrix = True + nqubits = circuit.nqubits + + rho = backend.execute_circuit(circuit).state() + + ent = 0 + for j in range(nqubits): + trace_q = list(range(nqubits)) + trace_q.pop(j) + + rho_r = backend.partial_trace_density_matrix(rho, trace_q, nqubits) + + trace = purity(rho_r) + + ent += trace + + entanglement = 1 - ent / nqubits + + return entanglement + + +def entangling_capability(circuit, samples: int, seed=None, backend=None): + """Returns the entangling capability :math:`\\text{Ent}` of a parametrized + circuit, which is average Meyer-Wallach entanglement Q of the circuit, i.e. + + .. math:: + \\text{Ent} = \\frac{2}{S}\\sum_{k}Q_k \\, , + + where :math:`S` is the number of samples. + + Args: + circuit (:class:`qibo.models.Circuit`): Parametrized circuit. + samples (int): number of samples to estimate the integral. + seed (int or :class:`numpy.random.Generator`, optional): Either a generator of random + numbers or a fixed seed to initialize a generator. If ``None``, initializes + a generator with a random seed. Default: ``None``. + backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be used + in the execution. If ``None``, it uses :class:`qibo.backends.GlobalBackend`. + Defaults to ``None``. + + Returns: + float: Entangling capability. + """ + + if not isinstance(samples, int): + raise_error( + TypeError, f"samples must be type int, but it is type {type(samples)}." + ) + + if ( + seed is not None + and not isinstance(seed, int) + and not isinstance(seed, np.random.Generator) + ): + raise_error( + TypeError, "seed must be either type int or numpy.random.Generator." + ) + + backend = _check_backend(backend) + + local_state = ( + np.random.default_rng(seed) if seed is None or isinstance(seed, int) else seed + ) + + res = [] + for _ in range(samples): + params = local_state.uniform(-np.pi, np.pi, circuit.trainable_gates.nparams) + circuit.set_parameters(params) + entanglement = meyer_wallach_entanglement(circuit, backend=backend) + res.append(entanglement) + + capability = 2 * np.real(np.sum(res)) / samples + + return capability diff --git a/src/qibo/quantum_info/entropies.py b/src/qibo/quantum_info/entropies.py new file mode 100644 index 0000000000..716bdda3fd --- /dev/null +++ b/src/qibo/quantum_info/entropies.py @@ -0,0 +1,876 @@ +"""Submodule with entropy measures.""" + +from typing import Union + +import numpy as np +from scipy.linalg import fractional_matrix_power + +from qibo.backends import _check_backend +from qibo.config import PRECISION_TOL, raise_error +from qibo.quantum_info.metrics import _check_hermitian_or_not_gpu, purity + + +def shannon_entropy(prob_dist, base: float = 2, backend=None): + """Calculate the Shannon entropy of a probability array :math:`\\mathbf{p}`, which is given by + + .. math:: + H(\\mathbf{p}) = - \\sum_{k = 0}^{d^{2} - 1} \\, p_{k} \\, \\log_{b}(p_{k}) \\, , + + where :math:`d = \\text{dim}(\\mathcal{H})` is the dimension of the + Hilbert space :math:`\\mathcal{H}`, :math:`b` is the log base (default 2), + and :math:`0 \\log_{b}(0) \\equiv 0`. + + Args: + prob_dist (ndarray or list): a probability array :math:`\\mathbf{p}`. + base (float): the base of the log. Defaults to :math:`2`. + backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be used + in the execution. If ``None``, it uses :class:`qibo.backends.GlobalBackend`. + Defaults to ``None``. + + Returns: + (float): Shannon entropy :math:`H(\\mathcal{p})`. + """ + backend = _check_backend(backend) + + if isinstance(prob_dist, list): + # np.float64 is necessary instead of native float because of tensorflow + prob_dist = backend.cast(prob_dist, dtype=np.float64) + + if base <= 0: + raise_error(ValueError, "log base must be non-negative.") + + if len(prob_dist.shape) != 1: + raise_error( + TypeError, + f"Probability array must have dims (k,) but it has {prob_dist.shape}.", + ) + + if len(prob_dist) == 0: + raise_error(TypeError, "Empty array.") + + if any(prob_dist < 0) or any(prob_dist > 1.0): + raise_error( + ValueError, + "All elements of the probability array must be between 0. and 1..", + ) + + if np.abs(np.sum(prob_dist) - 1.0) > PRECISION_TOL: + raise_error(ValueError, "Probability array must sum to 1.") + + log_prob = np.where(prob_dist != 0, np.log2(prob_dist) / np.log2(base), 0.0) + + shan_entropy = -np.sum(prob_dist * log_prob) + + # absolute value if entropy == 0.0 to avoid returning -0.0 + shan_entropy = np.abs(shan_entropy) if shan_entropy == 0.0 else shan_entropy + + return complex(shan_entropy).real + + +def classical_relative_entropy(prob_dist_p, prob_dist_q, base: float = 2, backend=None): + """Calculates the relative entropy between two discrete probability distributions. + + For probabilities :math:`\\mathbf{p}` and :math:`\\mathbf{q}`, it is defined as + + ..math:: + D(\\mathbf{p} \\, \\| \\, \\mathbf{q}) = \\sum_{x} \\, \\mathbf{p}(x) \\, + \\log\\left( \\frac{\\mathbf{p}(x)}{\\mathbf{q}(x)} \\right) \\, . + + The classical relative entropy is also known as the + `Kullback-Leibler (KL) divergence `_. + + Args: + prob_dist_p (ndarray or list): discrete probability distribution :math:`p`. + prob_dist_q (ndarray or list): discrete probability distribution :math:`q`. + base (float): the base of the log. Defaults to :math:`2`. + backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be + used in the execution. If ``None``, it uses + :class:`qibo.backends.GlobalBackend`. Defaults to ``None``. + + Returns: + float: Classical relative entropy between :math:`\\mathbf{p}` and :math:`\\mathbf{q}`. + """ + backend = _check_backend(backend) + + if isinstance(prob_dist_p, list): + # np.float64 is necessary instead of native float because of tensorflow + prob_dist_p = backend.cast(prob_dist_p, dtype=np.float64) + if isinstance(prob_dist_q, list): + # np.float64 is necessary instead of native float because of tensorflow + prob_dist_q = backend.cast(prob_dist_q, dtype=np.float64) + + if (len(prob_dist_p.shape) != 1) or (len(prob_dist_q.shape) != 1): + raise_error( + TypeError, + "Probability arrays must have dims (k,) but have " + + f"dims {prob_dist_p.shape} and {prob_dist_q.shape}.", + ) + + if (len(prob_dist_p) == 0) or (len(prob_dist_q) == 0): + raise_error(TypeError, "At least one of the arrays is empty.") + + if base <= 0: + raise_error(ValueError, "log base must be non-negative.") + + if (any(prob_dist_p < 0) or any(prob_dist_p > 1.0)) or ( + any(prob_dist_q < 0) or any(prob_dist_q > 1.0) + ): + raise_error( + ValueError, + "All elements of the probability array must be between 0. and 1..", + ) + if np.abs(np.sum(prob_dist_p) - 1.0) > PRECISION_TOL: + raise_error(ValueError, "First probability array must sum to 1.") + + if np.abs(np.sum(prob_dist_q) - 1.0) > PRECISION_TOL: + raise_error(ValueError, "Second probability array must sum to 1.") + + entropy_p = -1 * shannon_entropy(prob_dist_p, base=base, backend=backend) + + log_prob_q = np.where( + prob_dist_q != 0.0, np.log2(prob_dist_q) / np.log2(base), -np.inf + ) + + log_prob = np.where(prob_dist_p != 0.0, log_prob_q, 0.0) + + relative = np.sum(prob_dist_p * log_prob) + + return entropy_p - relative + + +def classical_renyi_entropy( + prob_dist, alpha: Union[float, int], base: float = 2, backend=None +): + """Calculates the classical Rényi entropy :math:`H_{\\alpha}` of a discrete probability distribution. + + For :math:`\\alpha \\in (0, \\, 1) \\cup (1, \\, \\infty)` and probability distribution + :math:`\\mathbf{p}`, the classical Rényi entropy is defined as + + .. math:: + H_{\\alpha}(\\mathbf{p}) = \\frac{1}{1 - \\alpha} \\, \\log\\left( \\sum_{x} + \\, \\mathbf{p}^{\\alpha}(x) \\right) \\, . + + A special case is the limit :math:`\\alpha \\to 1`, in which the classical Rényi entropy + coincides with the :func:`qibo.quantum_info.entropies.shannon_entropy`. + + Another special case is the limit :math:`\\alpha \\to 0`, where the function is + reduced to :math:`\\log\\left(|\\mathbf{p}|\\right)`, with :math:`|\\mathbf{p}|` + being the support of :math:`\\mathbf{p}`. + This is known as the `Hartley entropy `_ + (also known as *Hartley function* or *max-entropy*). + + In the limit :math:`\\alpha \\to \\infty`, the function reduces to + :math:`-\\log(\\max_{x}(\\mathbf{p}(x)))`, which is called the + `min-entropy `_. + + Args: + prob_dist (ndarray): discrete probability distribution. + alpha (float or int): order of the Rényi entropy. + base (float): the base of the log. Defaults to :math:`2`. + backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be + used in the execution. If ``None``, it uses + :class:`qibo.backends.GlobalBackend`. Defaults to ``None``. + + Returns: + float: Classical Rényi entropy :math:`H_{\\alpha}`. + """ + backend = _check_backend(backend) + + if isinstance(prob_dist, list): + # np.float64 is necessary instead of native float because of tensorflow + prob_dist = backend.cast(prob_dist, dtype=np.float64) + + if not isinstance(alpha, (float, int)): + raise_error( + TypeError, f"alpha must be type float, but it is type {type(alpha)}." + ) + + if alpha < 0.0: + raise_error(ValueError, "alpha must a non-negative float.") + + if base <= 0: + raise_error(ValueError, "log base must be non-negative.") + + if len(prob_dist.shape) != 1: + raise_error( + TypeError, + f"Probability array must have dims (k,) but it has {prob_dist.shape}.", + ) + + if len(prob_dist) == 0: + raise_error(TypeError, "Empty array.") + + if any(prob_dist < 0) or any(prob_dist > 1.0): + raise_error( + ValueError, + "All elements of the probability array must be between 0. and 1..", + ) + + if np.abs(np.sum(prob_dist) - 1.0) > PRECISION_TOL: + raise_error(ValueError, "Probability array must sum to 1.") + + if alpha == 0.0: + return np.log2(len(prob_dist)) / np.log2(base) + + if alpha == 1.0: + return shannon_entropy(prob_dist, base=base, backend=backend) + + if alpha == np.inf: + return -1 * np.log2(max(prob_dist)) / np.log2(base) + + renyi_ent = (1 / (1 - alpha)) * np.log2(np.sum(prob_dist**alpha)) / np.log2(base) + + return renyi_ent + + +def classical_relative_renyi_entropy( + prob_dist_p, prob_dist_q, alpha: Union[float, int], base: float = 2, backend=None +): + """Calculates the classical relative Rényi entropy between two discrete probability distributions. + + This function is also known as + `Rényi divergence `_. + + For :math:`\\alpha \\in (0, \\, 1) \\cup (1, \\, \\infty)` and probability distributions + :math:`\\mathbf{p}` and :math:`\\mathbf{q}`, the classical relative Rényi entropy is defined as + + .. math:: + H_{\\alpha}(\\mathbf{p} \\, \\| \\, \\mathbf{q}) = \\frac{1}{\\alpha - 1} \\, + \\log\\left( \\sum_{x} \\, \\frac{\\mathbf{p}^{\\alpha}(x)} + {\\mathbf{q}^{\\alpha - 1}(x)} \\right) \\, . + + A special case is the limit :math:`\\alpha \\to 1`, in which the classical Rényi divergence + coincides with the :func:`qibo.quantum_info.entropies.classical_relative_entropy`. + + Another special case is the limit :math:`\\alpha \\to 1/2`, where the function is + reduced to :math:`-2 \\log\\left(\\sum_{x} \\, \\sqrt{\\mathbf{p}(x) \\, \\mathbf{q}(x)} \\right)`. + The sum inside the :math:`\\log` is known as the + `Bhattacharyya coefficient `_. + + In the limit :math:`\\alpha \\to \\infty`, the function reduces to + :math:`\\log(\\max_{x}(\\mathbf{p}(x) \\, \\mathbf{q}(x))`. + + Args: + prob_dist_p (ndarray or list): discrete probability distribution :math:`p`. + prob_dist_q (ndarray or list): discrete probability distribution :math:`q`. + alpha (float or int): order of the Rényi entropy. + base (float): the base of the log. Defaults to :math:`2`. + backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be + used in the execution. If ``None``, it uses + :class:`qibo.backends.GlobalBackend`. Defaults to ``None``. + + Returns: + float: Classical relative Rényi entropy :math:`H_{\\alpha}(\\mathbf{p} \\, \\| \\, \\mathbf{q})`. + """ + backend = _check_backend(backend) + + if isinstance(prob_dist_p, list): + # np.float64 is necessary instead of native float because of tensorflow + prob_dist_p = backend.cast(prob_dist_p, dtype=np.float64) + if isinstance(prob_dist_q, list): + # np.float64 is necessary instead of native float because of tensorflow + prob_dist_q = backend.cast(prob_dist_q, dtype=np.float64) + + if (len(prob_dist_p.shape) != 1) or (len(prob_dist_q.shape) != 1): + raise_error( + TypeError, + "Probability arrays must have dims (k,) but have " + + f"dims {prob_dist_p.shape} and {prob_dist_q.shape}.", + ) + + if (len(prob_dist_p) == 0) or (len(prob_dist_q) == 0): + raise_error(TypeError, "At least one of the arrays is empty.") + + if not isinstance(alpha, (float, int)): + raise_error( + TypeError, f"alpha must be type float, but it is type {type(alpha)}." + ) + + if alpha < 0.0: + raise_error(ValueError, "alpha must a non-negative float.") + + if base <= 0: + raise_error(ValueError, "log base must be non-negative.") + + if (any(prob_dist_p < 0) or any(prob_dist_p > 1.0)) or ( + any(prob_dist_q < 0) or any(prob_dist_q > 1.0) + ): + raise_error( + ValueError, + "All elements of the probability array must be between 0. and 1..", + ) + if np.abs(np.sum(prob_dist_p) - 1.0) > PRECISION_TOL: + raise_error(ValueError, "First probability array must sum to 1.") + + if np.abs(np.sum(prob_dist_q) - 1.0) > PRECISION_TOL: + raise_error(ValueError, "Second probability array must sum to 1.") + + if alpha == 0.5: + return -2 * np.log2(np.sum(np.sqrt(prob_dist_p * prob_dist_q))) / np.log2(base) + + if alpha == 1.0: + return classical_relative_entropy( + prob_dist_p, prob_dist_q, base=base, backend=backend + ) + + if alpha == np.inf: + return np.log2(max(prob_dist_p / prob_dist_q)) / np.log2(base) + + prob_p = prob_dist_p**alpha + prob_q = prob_dist_q ** (1 - alpha) + + return (1 / (alpha - 1)) * np.log2(np.sum(prob_p * prob_q)) / np.log2(base) + + +def classical_tsallis_entropy(prob_dist, alpha: float, base: float = 2, backend=None): + """Calculates the classical Tsallis entropy for a discrete probability distribution. + + This is defined as + + .. math:: + S_{\\alpha}(\\mathbf{p}) = \\frac{1}{\\alpha - 1} \\, + \\left(1 - \\sum_{x} \\, \\mathbf{p}^{\\alpha}(x) \\right) + + Args: + prob_dist (ndarray): discrete probability distribution. + alpha (float or int): entropic index. + base (float): the base of the log. Used when ``alpha=1.0``. + Defaults to :math:`2`. + backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be + used in the execution. If ``None``, it uses + :class:`qibo.backends.GlobalBackend`. Defaults to ``None``. + + Returns: + float: Classical Tsallis entropy :math:`S_{\\alpha}(\\mathbf{p})`. + """ + backend = _check_backend(backend) + + if isinstance(prob_dist, list): + # np.float64 is necessary instead of native float because of tensorflow + prob_dist = backend.cast(prob_dist, dtype=np.float64) + + if not isinstance(alpha, (float, int)): + raise_error( + TypeError, f"alpha must be type float, but it is type {type(alpha)}." + ) + + if alpha < 0.0: + raise_error(ValueError, "alpha must a non-negative float.") + + if base <= 0: + raise_error(ValueError, "log base must be non-negative.") + + if len(prob_dist.shape) != 1: + raise_error( + TypeError, + f"Probability array must have dims (k,) but it has {prob_dist.shape}.", + ) + + if len(prob_dist) == 0: + raise_error(TypeError, "Empty array.") + + if any(prob_dist < 0) or any(prob_dist > 1.0): + raise_error( + ValueError, + "All elements of the probability array must be between 0. and 1..", + ) + + if np.abs(np.sum(prob_dist) - 1.0) > PRECISION_TOL: + raise_error(ValueError, "Probability array must sum to 1.") + + if alpha == 1.0: + return shannon_entropy(prob_dist, base=base, backend=backend) + + return (1 / (1 - alpha)) * (np.sum(prob_dist**alpha) - 1) + + +def von_neumann_entropy( + state, + base: float = 2, + check_hermitian: bool = False, + return_spectrum: bool = False, + backend=None, +): + """Calculates the von-Neumann entropy :math:`S(\\rho)` of a quantum ``state`` :math:`\\rho`. + + It is given by + + .. math:: + S(\\rho) = - \\text{tr}\\left[\\rho \\, \\log(\\rho)\\right] + + Args: + state (ndarray): statevector or density matrix. + base (float, optional): the base of the log. Defaults to :math:`2`. + check_hermitian (bool, optional): if ``True``, checks if ``state`` is Hermitian. + If ``False``, it assumes ``state`` is Hermitian . + Defaults to ``False``. + return_spectrum: if ``True``, returns ``entropy`` and + :math:`-\\log_{\\textup{b}}(\\textup{eigenvalues})`, where :math:`b` is ``base``. + If ``False``, returns only ``entropy``. Default is ``False``. + backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be used + in the execution. If ``None``, it uses + :class:`qibo.backends.GlobalBackend`. Defaults to ``None``. + + Returns: + float: The von-Neumann entropy :math:`S` of ``state`` :math:`\\rho`. + """ + backend = _check_backend(backend) + + if ( + (len(state.shape) >= 3) + or (len(state) == 0) + or (len(state.shape) == 2 and state.shape[0] != state.shape[1]) + ): + raise_error( + TypeError, + f"state must have dims either (k,) or (k,k), but have dims {state.shape}.", + ) + + if base <= 0.0: + raise_error(ValueError, "log base must be non-negative.") + + if not isinstance(check_hermitian, bool): + raise_error( + TypeError, + f"check_hermitian must be type bool, but it is type {type(check_hermitian)}.", + ) + + if purity(state) == 1.0: + if return_spectrum: + return 0.0, backend.cast([1.0], dtype=float) + + return 0.0 + + if not check_hermitian or _check_hermitian_or_not_gpu(state, backend=backend): + eigenvalues = np.linalg.eigvalsh(state) + else: + eigenvalues = np.linalg.eigvals(state) + + log_prob = np.where(eigenvalues > 0, np.log2(eigenvalues) / np.log2(base), 0.0) + + ent = -np.sum(eigenvalues * log_prob) + # absolute value if entropy == 0.0 to avoid returning -0.0 + ent = np.abs(ent) if ent == 0.0 else ent + + ent = float(ent) + + if return_spectrum: + log_prob = backend.cast(log_prob, dtype=log_prob.dtype) + return ent, -log_prob + + return ent + + +def relative_von_neumann_entropy( + state, target, base: float = 2, check_hermitian: bool = False, backend=None +): + """Calculates the relative entropy :math:`S(\\rho \\, \\| \\, \\sigma)` between ``state`` :math:`\\rho` and ``target`` :math:`\\sigma`. + + It is given by + + .. math:: + S(\\rho \\, \\| \\, \\sigma) = \\text{tr}\\left[\\rho \\, \\log(\\rho)\\right] + - \\text{tr}\\left[\\rho \\, \\log(\\sigma)\\right] + + Args: + state (ndarray): statevector or density matrix :math:`\\rho`. + target (ndarray): statevector or density matrix :math:`\\sigma`. + base (float, optional): the base of the log. Defaults to :math:`2`. + check_hermitian (bool, optional): If ``True``, checks if ``state`` is Hermitian. + If ``False``, it assumes ``state`` is Hermitian . + Defaults to ``False``. + backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be used + in the execution. If ``None``, it uses + :class:`qibo.backends.GlobalBackend`. Defaults to ``None``. + + Returns: + float: Relative (von-Neumann) entropy :math:`S(\\rho \\, \\| \\, \\sigma)`. + """ + backend = _check_backend(backend) + + if ( + (len(state.shape) >= 3) + or (len(state) == 0) + or (len(state.shape) == 2 and state.shape[0] != state.shape[1]) + ): + raise_error( + TypeError, + f"state must have dims either (k,) or (k,k), but have dims {state.shape}.", + ) + + if ( + (len(target.shape) >= 3) + or (len(target) == 0) + or (len(target.shape) == 2 and target.shape[0] != target.shape[1]) + ): + raise_error( + TypeError, + f"target must have dims either (k,) or (k,k), but have dims {target.shape}.", + ) + + if base <= 0.0: + raise_error(ValueError, "log base must be non-negative.") + + if not isinstance(check_hermitian, bool): + raise_error( + TypeError, + f"check_hermitian must be type bool, but it is type {type(check_hermitian)}.", + ) + + if purity(state) == 1.0 and purity(target) == 1.0: + return 0.0 + + if len(state.shape) == 1: + state = np.outer(state, np.conj(state)) + + if len(target.shape) == 1: + target = np.outer(target, np.conj(target)) + + if not check_hermitian or _check_hermitian_or_not_gpu(state, backend=backend): + eigenvalues_state = np.linalg.eigvalsh(state) + else: + eigenvalues_state = np.linalg.eigvals(state) + + if not check_hermitian or _check_hermitian_or_not_gpu(target, backend=backend): + eigenvalues_target = np.linalg.eigvalsh(target) + else: + eigenvalues_target = np.linalg.eigvals(target) + + log_state = np.where( + eigenvalues_state > 0, np.log2(eigenvalues_state) / np.log2(base), 0.0 + ) + log_target = np.where( + eigenvalues_target > 0, np.log2(eigenvalues_target) / np.log2(base), -np.inf + ) + + log_target = np.where(eigenvalues_state != 0.0, log_target, 0.0) + + entropy_state = np.sum(eigenvalues_state * log_state) + + relative = np.sum(eigenvalues_state * log_target) + + return float(entropy_state - relative) + + +def renyi_entropy(state, alpha: Union[float, int], base: float = 2, backend=None): + """Calculates the Rényi entropy :math:`H_{\\alpha}` of a quantum state :math:`\\rho`. + + For :math:`\\alpha \\in (0, \\, 1) \\cup (1, \\, \\infty)`, the Rényi entropy is defined as + + .. math:: + H_{\\alpha}(\\rho) = \\frac{1}{1 - \\alpha} \\, \\log\\left( \\rho^{\\alpha} \\right) \\, . + + A special case is the limit :math:`\\alpha \\to 1`, in which the Rényi entropy + coincides with the :func:`qibo.quantum_info.entropies.entropy`. + + Another special case is the limit :math:`\\alpha \\to 0`, where the function is + reduced to :math:`\\log\\left(d\\right)`, with :math:`d = 2^{n}` + being the dimension of the Hilbert space in which ``state`` :math:`\\rho` lives in. + This is known as the `Hartley entropy `_ + (also known as *Hartley function* or *max-entropy*). + + In the limit :math:`\\alpha \\to \\infty`, the function reduces to + :math:`-\\log(\\|\\rho\\|_{\\infty})`, with :math:`\\|\\cdot\\|_{\\infty}` + being the `spectral norm `_. + This is known as the `min-entropy `_. + + Args: + state (ndarray): statevector or density matrix. + alpha (float or int): order of the Rényi entropy. + base (float): the base of the log. Defaults to :math:`2`. + backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be + used in the execution. If ``None``, it uses + :class:`qibo.backends.GlobalBackend`. Defaults to ``None``. + + Returns: + float: Rényi entropy :math:`H_{\\alpha}`. + """ + backend = _check_backend(backend) + + if ( + (len(state.shape) >= 3) + or (len(state) == 0) + or (len(state.shape) == 2 and state.shape[0] != state.shape[1]) + ): + raise_error( + TypeError, + f"state must have dims either (k,) or (k,k), but have dims {state.shape}.", + ) + + if not isinstance(alpha, (float, int)): + raise_error( + TypeError, f"alpha must be type float, but it is type {type(alpha)}." + ) + + if alpha < 0.0: + raise_error(ValueError, "alpha must a non-negative float.") + + if base <= 0.0: + raise_error(ValueError, "log base must be non-negative.") + + if abs(purity(state) - 1.0) < PRECISION_TOL: + return 0.0 + + if alpha == 0.0: + return np.log2(len(state)) / np.log2(base) + + if alpha == 1.0: + return von_neumann_entropy(state, base=base, backend=backend) + + if alpha == np.inf: + return ( + -1 + * np.log2(backend.calculate_norm_density_matrix(state, order=2)) + / np.log2(base) + ) + + log = np.log2(np.trace(_matrix_power(state, alpha, backend))) + + return (1 / (1 - alpha)) * log / np.log2(base) + + +def relative_renyi_entropy( + state, target, alpha: Union[float, int], base: float = 2, backend=None +): + """Calculates the relative Rényi entropy between two quantum states. + + For :math:`\\alpha \\in (0, \\, 1) \\cup (1, \\, \\infty)` and quantum states + :math:`\\rho` and :math:`\\sigma`, the relative Rényi entropy is defined as + + .. math:: + H_{\\alpha}(\\rho \\, \\| \\, \\sigma) = \\frac{1}{\\alpha - 1} \\, + \\log\\left( \\textup{tr}\\left( \\rho^{\\alpha} \\, + \\sigma^{1 - \\alpha} \\right) \\right) \\, . + + A special case is the limit :math:`\\alpha \\to 1`, in which the Rényi entropy + coincides with the :func:`qibo.quantum_info.entropies.relative_entropy`. + + In the limit :math:`\\alpha \\to \\infty`, the function reduces to + :math:`-2 \\, \\log(\\|\\sqrt{\\rho} \\, \\sqrt{\\sigma}\\|_{1})`, + with :math:`\\|\\cdot\\|_{1}` being the + `Schatten 1-norm `_. + This is known as the `min-relative entropy `_. + + .. note:: + Function raises ``NotImplementedError`` when ``target`` :math:`sigma` + is a pure state and :math:`\\alpha > 1`. This is due to the fact that + it is not possible to calculate :math:`\\sigma^{1 - \\alpha}` when + :math:`\\alpha > 1` and :math:`\\sigma` is a projector, i.e. a singular matrix. + + Args: + state (ndarray): statevector or density matrix :math:`\\rho`. + target (ndarray): statevector or density matrix :math:`\\sigma`. + alpha (float or int): order of the Rényi entropy. + base (float): the base of the log. Defaults to :math:`2`. + backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be + used in the execution. If ``None``, it uses + :class:`qibo.backends.GlobalBackend`. Defaults to ``None``. + + Returns: + float: Relative Rényi entropy :math:`H_{\\alpha}(\\rho \\, \\| \\, \\sigma)`. + """ + backend = _check_backend(backend) + + if ( + (len(state.shape) >= 3) + or (len(state) == 0) + or (len(state.shape) == 2 and state.shape[0] != state.shape[1]) + ): + raise_error( + TypeError, + f"state must have dims either (k,) or (k,k), but have dims {state.shape}.", + ) + + if ( + (len(target.shape) >= 3) + or (len(target) == 0) + or (len(target.shape) == 2 and target.shape[0] != target.shape[1]) + ): + raise_error( + TypeError, + f"target must have dims either (k,) or (k,k), but have dims {target.shape}.", + ) + + if not isinstance(alpha, (float, int)): + raise_error( + TypeError, f"alpha must be type float, but it is type {type(alpha)}." + ) + + if alpha < 0.0: + raise_error(ValueError, "alpha must a non-negative float.") + + if base <= 0.0: + raise_error(ValueError, "log base must be non-negative.") + + purity_target = purity(target) + if ( + abs(purity(state) - 1.0) < PRECISION_TOL + and abs(purity_target - 1) < PRECISION_TOL + ): + return 0.0 + + if alpha > 1.0 and abs(purity_target - 1) < PRECISION_TOL: + raise_error( + NotImplementedError, + "It is not possible to invert a singular matrix. ``target`` is a pure state and alpha > 1.", + ) + + if len(state.shape) == 1: + state = np.outer(state, np.conj(state)) + + if alpha == 1.0: + return relative_von_neumann_entropy(state, target, base, backend=backend) + + if alpha == np.inf: + new_state = _matrix_power(state, 0.5, backend) + new_target = _matrix_power(target, 0.5, backend) + + log = np.log2( + backend.calculate_norm_density_matrix(new_state @ new_target, order=1) + ) + + return -2 * log / np.log2(base) + + log = _matrix_power(state, alpha, backend) + log = log @ _matrix_power(target, 1 - alpha, backend) + log = np.log2(np.trace(log)) + + return (1 / (alpha - 1)) * log / np.log2(base) + + +def tsallis_entropy(state, alpha: float, base: float = 2, backend=None): + """Calculates the Tsallis entropy of a quantum state. + + .. math:: + S_{\\alpha}(\\rho) = \\frac{1}{1 - \\alpha} \\, + \\left( \\text{tr}(\\rho^{\\alpha}) - 1 \\right) + + When :math:`\\alpha = 1`, the functions defaults to + :func:`qibo.quantum_info.entropies.entropy`. + + Args: + state (ndarray): statevector or density matrix. + alpha (float or int): entropic index. + base (float, optional): the base of the log. Used when ``alpha=1.0``. + Defaults to :math:`2`. + backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be used + in the execution. If ``None``, it uses + :class:`qibo.backends.GlobalBackend`. Defaults to ``None``. + + Returns: + float: Tsallis entropy :math:`S_{\\alpha}(\\rho)`. + """ + backend = _check_backend(backend) + + if ( + (len(state.shape) >= 3) + or (len(state) == 0) + or (len(state.shape) == 2 and state.shape[0] != state.shape[1]) + ): + raise_error( + TypeError, + f"state must have dims either (k,) or (k,k), but have dims {state.shape}.", + ) + + if not isinstance(alpha, (float, int)): + raise_error( + TypeError, f"alpha must be type float, but it is type {type(alpha)}." + ) + + if alpha < 0.0: + raise_error(ValueError, "alpha must a non-negative float.") + + if base <= 0.0: + raise_error(ValueError, "log base must be non-negative.") + + if abs(purity(state) - 1.0) < PRECISION_TOL: + return 0.0 + + if alpha == 1.0: + return von_neumann_entropy(state, base=base, backend=backend) + + return (1 / (1 - alpha)) * (np.trace(_matrix_power(state, alpha, backend)) - 1) + + +def entanglement_entropy( + state, + bipartition, + base: float = 2, + check_hermitian: bool = False, + return_spectrum: bool = False, + backend=None, +): + """Calculates the entanglement entropy :math:`S` of bipartition :math:`A` + of ``state`` :math:`\\rho`. This is given by + + .. math:: + S(\\rho_{A}) = -\\text{tr}(\\rho_{A} \\, \\log(\\rho_{A})) \\, , + + where :math:`\\rho_{A} = \\text{tr}_{B}(\\rho)` is the reduced density matrix calculated + by tracing out the ``bipartition`` :math:`B`. + + Args: + state (ndarray): statevector or density matrix. + bipartition (list or tuple or ndarray): qubits in the subsystem to be traced out. + base (float, optional): the base of the log. Defaults to :math: `2`. + check_hermitian (bool, optional): if ``True``, checks if :math:`\\rho_{A}` is Hermitian. + If ``False``, it assumes ``state`` is Hermitian . Default: ``False``. + return_spectrum: if ``True``, returns ``entropy`` and eigenvalues of ``state``. + If ``False``, returns only ``entropy``. Default is ``False``. + backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be used + in the execution. If ``None``, it uses + :class:`qibo.backends.GlobalBackend`. Defaults to ``None``. + + Returns: + float: Entanglement entropy :math:`S` of ``state`` :math:`\\rho`. + """ + backend = _check_backend(backend) + + if base <= 0.0: + raise_error(ValueError, "log base must be non-negative.") + + if ( + (len(state.shape) not in [1, 2]) + or (len(state) == 0) + or (len(state.shape) == 2 and state.shape[0] != state.shape[1]) + ): + raise_error( + TypeError, + f"state must have dims either (k,) or (k,k), but have dims {state.shape}.", + ) + + nqubits = int(np.log2(state.shape[0])) + + reduced_density_matrix = ( + backend.partial_trace(state, bipartition, nqubits) + if len(state.shape) == 1 + else backend.partial_trace_density_matrix(state, bipartition, nqubits) + ) + + entropy_entanglement = von_neumann_entropy( + reduced_density_matrix, + base=base, + check_hermitian=check_hermitian, + return_spectrum=return_spectrum, + backend=backend, + ) + + return entropy_entanglement + + +def _matrix_power(matrix, alpha, backend): + """Calculates ``matrix ** alpha`` according to backend.""" + if backend.__class__.__name__ in [ + "CupyBackend", + "CuQuantumBackend", + ]: # pragma: no cover + new_matrix = backend.to_numpy(matrix) + else: + new_matrix = np.copy(matrix) + + if len(new_matrix.shape) == 1: + new_matrix = np.outer(new_matrix, np.conj(new_matrix)) + + new_matrix = fractional_matrix_power(new_matrix, alpha) + + return backend.cast(new_matrix, dtype=new_matrix.dtype) diff --git a/src/qibo/quantum_info/metrics.py b/src/qibo/quantum_info/metrics.py index eb29f1b486..08dbf777af 100644 --- a/src/qibo/quantum_info/metrics.py +++ b/src/qibo/quantum_info/metrics.py @@ -5,7 +5,7 @@ import numpy as np from scipy import sparse -from qibo.backends import GlobalBackend +from qibo.backends import _check_backend from qibo.config import PRECISION_TOL, raise_error @@ -57,273 +57,6 @@ def impurity(state): return 1 - purity(state) -def concurrence(state, bipartition, check_purity: bool = True, backend=None): - """Calculates concurrence of a pure bipartite quantum state - :math:`\\rho \\in \\mathcal{H}_{A} \\otimes \\mathcal{H}_{B}` as - - .. math:: - C(\\rho) = \\sqrt{2 \\, (\\text{tr}^{2}(\\rho) - \\text{tr}(\\rho_{A}^{2}))} \\, , - - where :math:`\\rho_{A} = \\text{tr}_{B}(\\rho)` is the reduced density operator - obtained by tracing out the qubits in the ``bipartition`` :math:`B`. - - Args: - state (ndarray): statevector or density matrix. - bipartition (list or tuple or ndarray): qubits in the subsystem to be traced out. - check_purity (bool, optional): if ``True``, checks if ``state`` is pure. If ``False``, - it assumes ``state`` is pure . Defaults to ``True``. - backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be used - in the execution. If ``None``, it uses :class:`qibo.backends.GlobalBackend`. - Defaults to ``None``. - - Returns: - float: Concurrence of :math:`\\rho`. - """ - if backend is None: # pragma: no cover - backend = GlobalBackend() - - if ( - (len(state.shape) not in [1, 2]) - or (len(state) == 0) - or (len(state.shape) == 2 and state.shape[0] != state.shape[1]) - ): - raise_error( - TypeError, - f"state must have dims either (k,) or (k,k), but have dims {state.shape}.", - ) - - if isinstance(check_purity, bool) is False: - raise_error( - TypeError, - f"check_purity must be type bool, but it is type {type(check_purity)}.", - ) - - nqubits = int(np.log2(state.shape[0])) - - if check_purity is True: - purity_total_system = purity(state) - - mixed = bool(abs(purity_total_system - 1.0) > PRECISION_TOL) - if mixed is True: - raise_error( - NotImplementedError, - "concurrence only implemented for pure quantum states.", - ) - - reduced_density_matrix = ( - backend.partial_trace(state, bipartition, nqubits) - if len(state.shape) == 1 - else backend.partial_trace_density_matrix(state, bipartition, nqubits) - ) - - purity_reduced = purity(reduced_density_matrix) - if purity_reduced - 1.0 > 0.0: - purity_reduced = round(purity_reduced, 7) - - concur = np.sqrt(2 * (1 - purity_reduced)) - - return concur - - -def entanglement_of_formation( - state, bipartition, base: float = 2, check_purity: bool = True, backend=None -): - """Calculates the entanglement of formation :math:`E_{f}` of a pure bipartite - quantum state :math:`\\rho`, which is given by - - .. math:: - E_{f} = H([1 - x, x]) \\, , - - where - - .. math:: - x = \\frac{1 + \\sqrt{1 - C^{2}(\\rho)}}{2} \\, , - - :math:`C(\\rho)` is the :func:`qibo.quantum_info.concurrence` of :math:`\\rho`, - and :math:`H` is the :func:`qibo.quantum_info.shannon_entropy`. - - Args: - state (ndarray): statevector or density matrix. - bipartition (list or tuple or ndarray): qubits in the subsystem to be traced out. - base (float): the base of the log in :func:`qibo.quantum_info.shannon_entropy`. - Defaults to :math:`2`. - check_purity (bool, optional): if ``True``, checks if ``state`` is pure. If ``False``, - it assumes ``state`` is pure . Default: ``True``. - backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be used - in the execution. If ``None``, it uses :class:`qibo.backends.GlobalBackend`. - Defaults to ``None``. - - - Returns: - float: entanglement of formation of state :math:`\\rho`. - """ - if backend is None: # pragma: no cover - backend = GlobalBackend() - - from qibo.quantum_info.utils import shannon_entropy # pylint: disable=C0415 - - concur = concurrence( - state, bipartition=bipartition, check_purity=check_purity, backend=backend - ) - concur = (1 + np.sqrt(1 - concur**2)) / 2 - probabilities = [1 - concur, concur] - - ent_of_form = shannon_entropy(probabilities, base=base, backend=backend) - - return ent_of_form - - -def entropy( - state, - base: float = 2, - check_hermitian: bool = False, - return_spectrum: bool = False, - backend=None, -): - """The von-Neumann entropy :math:`S(\\rho)` of a quantum ``state`` :math:`\\rho`, which - is given by - - .. math:: - S(\\rho) = - \\text{tr}\\left[\\rho \\, \\log(\\rho)\\right] - - Args: - state (ndarray): statevector or density matrix. - base (float, optional): the base of the log. Defaults to :math:`2`. - check_hermitian (bool, optional): if ``True``, checks if ``state`` is Hermitian. - If ``False``, it assumes ``state`` is Hermitian . - Defaults to ``False``. - return_spectrum: if ``True``, returns ``entropy`` and - :math:`-\\log_{\\textup{b}}(\\textup{eigenvalues})`, where :math:`b` is ``base``. - If ``False``, returns only ``entropy``. Default is ``False``. - backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be used - in the execution. If ``None``, it uses - :class:`qibo.backends.GlobalBackend`. Defaults to ``None``. - - Returns: - float: The von-Neumann entropy :math:`S` of ``state`` :math:`\\rho`. - """ - if backend is None: # pragma: no cover - backend = GlobalBackend() - - if ( - (len(state.shape) >= 3) - or (len(state) == 0) - or (len(state.shape) == 2 and state.shape[0] != state.shape[1]) - ): - raise_error( - TypeError, - f"state must have dims either (k,) or (k,k), but have dims {state.shape}.", - ) - - if base <= 0.0: - raise_error(ValueError, "log base must be non-negative.") - - if isinstance(check_hermitian, bool) is False: - raise_error( - TypeError, - f"check_hermitian must be type bool, but it is type {type(check_hermitian)}.", - ) - - if purity(state) == 1.0: - if return_spectrum: - return 0.0, backend.cast([1.0], dtype=float) - - return 0.0 - - if check_hermitian is False or _check_hermitian_or_not_gpu(state, backend=backend): - eigenvalues = np.linalg.eigvalsh(state) - else: - eigenvalues = np.linalg.eigvals(state) - - if base == 2: - log_prob = np.where(eigenvalues > 0, np.log2(eigenvalues), 0.0) - elif base == 10: - log_prob = np.where(eigenvalues > 0, np.log10(eigenvalues), 0.0) - elif base == np.e: - log_prob = np.where(eigenvalues > 0, np.log(eigenvalues), 0.0) - else: - log_prob = np.where(eigenvalues > 0, np.log(eigenvalues) / np.log(base), 0.0) - - ent = -np.sum(eigenvalues * log_prob) - # absolute value if entropy == 0.0 to avoid returning -0.0 - ent = np.abs(ent) if ent == 0.0 else ent - - ent = float(ent) - - if return_spectrum: - log_prob = backend.cast(log_prob, dtype=log_prob.dtype) - return ent, -log_prob - - return ent - - -def entanglement_entropy( - state, - bipartition, - base: float = 2, - check_hermitian: bool = False, - return_spectrum: bool = False, - backend=None, -): - """Calculates the entanglement entropy :math:`S` of bipartition :math:`A` - of ``state`` :math:`\\rho`. This is given by - - .. math:: - S(\\rho_{A}) = -\\text{tr}(\\rho_{A} \\, \\log(\\rho_{A})) \\, , - - where :math:`\\rho_{A} = \\text{tr}_{B}(\\rho)` is the reduced density matrix calculated - by tracing out the ``bipartition`` :math:`B`. - - Args: - state (ndarray): statevector or density matrix. - bipartition (list or tuple or ndarray): qubits in the subsystem to be traced out. - base (float, optional): the base of the log. Defaults to :math: `2`. - check_hermitian (bool, optional): if ``True``, checks if :math:`\\rho_{A}` is Hermitian. - If ``False``, it assumes ``state`` is Hermitian . Default: ``False``. - return_spectrum: if ``True``, returns ``entropy`` and eigenvalues of ``state``. - If ``False``, returns only ``entropy``. Default is ``False``. - backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be used - in the execution. If ``None``, it uses - :class:`qibo.backends.GlobalBackend`. Defaults to ``None``. - - Returns: - float: Entanglement entropy :math:`S` of ``state`` :math:`\\rho`. - """ - if backend is None: # pragma: no cover - backend = GlobalBackend() - - if base <= 0.0: - raise_error(ValueError, "log base must be non-negative.") - - if ( - (len(state.shape) not in [1, 2]) - or (len(state) == 0) - or (len(state.shape) == 2 and state.shape[0] != state.shape[1]) - ): - raise_error( - TypeError, - f"state must have dims either (k,) or (k,k), but have dims {state.shape}.", - ) - - nqubits = int(np.log2(state.shape[0])) - - reduced_density_matrix = ( - backend.partial_trace(state, bipartition, nqubits) - if len(state.shape) == 1 - else backend.partial_trace_density_matrix(state, bipartition, nqubits) - ) - - entropy_entanglement = entropy( - reduced_density_matrix, - base=base, - check_hermitian=check_hermitian, - return_spectrum=return_spectrum, - backend=backend, - ) - - return entropy_entanglement - - def trace_distance(state, target, check_hermitian: bool = False, backend=None): """Trace distance between two quantum states, :math:`\\rho` and :math:`\\sigma`: @@ -348,8 +81,7 @@ def trace_distance(state, target, check_hermitian: bool = False, backend=None): Returns: float: Trace distance between ``state`` :math:`\\rho` and ``target`` :math:`\\sigma`. """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) if state.shape != target.shape: raise_error( @@ -470,8 +202,7 @@ def fidelity(state, target, check_hermitian: bool = False, backend=None): Returns: float: Fidelity between ``state`` :math:`\\rho` and ``target`` :math:`\\sigma`. """ - if backend is None: - backend = GlobalBackend() + backend = _check_backend(backend) if state.shape != target.shape: raise_error( @@ -634,84 +365,6 @@ def bures_distance(state, target, check_hermitian: bool = False, backend=None): return distance -def entanglement_fidelity( - channel, nqubits: int, state=None, check_hermitian: bool = False, backend=None -): - """Entanglement fidelity :math:`F_{\\mathcal{E}}` of a ``channel`` :math:`\\mathcal{E}` - on ``state`` :math:`\\rho` is given by - - .. math:: - F_{\\mathcal{E}}(\\rho) = F(\\rho_{f}, \\rho) - - where :math:`F` is the :func:`qibo.quantum_info.fidelity` function for states, - and :math:`\\rho_{f} = \\mathcal{E}_{A} \\otimes I_{B}(\\rho)` - is the state after the channel :math:`\\mathcal{E}` was applied to - partition :math:`A`. - - Args: - channel (:class:`qibo.gates.channels.Channel`): quantum channel - acting on partition :math:`A`. - nqubits (int): total number of qubits in ``state``. - state (ndarray, optional): statevector or density matrix to be evolved - by ``channel``. If ``None``, defaults to the maximally entangled state - :math:`\\frac{1}{2^{n}} \\, \\sum_{k} \\, \\ket{k}\\ket{k}`, where - :math:`n` is ``nqubits``. Defaults to ``None``. - check_hermitian (bool, optional): if ``True``, checks if the final state - :math:`\\rho_{f}` is Hermitian. If ``False``, it assumes it is Hermitian. - Defaults to ``False``. - backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be used - in the execution. If ``None``, it uses :class:`qibo.backends.GlobalBackend`. - Defaults to ``None``. - - Returns: - float: Entanglement fidelity :math:`F_{\\mathcal{E}}`. - """ - if backend is None: # pragma: no cover - backend = GlobalBackend() - - if isinstance(nqubits, int) is False: - raise_error( - TypeError, f"nqubits must be type int, but it is type {type(nqubits)}." - ) - - if nqubits <= 0: - raise_error( - ValueError, f"nqubits must be a positive integer, but it is {nqubits}." - ) - - if state is not None and ( - (len(state.shape) not in [1, 2]) - or (len(state) == 0) - or (len(state.shape) == 2 and state.shape[0] != state.shape[1]) - ): - raise_error( - TypeError, - f"state must have dims either (k,) or (k,k), but have dims {state.shape}.", - ) - - if isinstance(check_hermitian, bool) is False: - raise_error( - TypeError, - f"check_hermitian must be type bool, but it is type {type(check_hermitian)}.", - ) - - if state is None: - state = backend.plus_density_matrix(nqubits) - - # necessary because this function do support repeated execution, - # so it has to default to density matrices - if len(state.shape) == 1: - state = np.outer(state, np.conj(state)) - - state_final = backend.apply_channel_density_matrix(channel, state, nqubits) - - entang_fidelity = fidelity( - state_final, state, check_hermitian=check_hermitian, backend=backend - ) - - return entang_fidelity - - def process_fidelity(channel, target=None, check_unitary: bool = False, backend=None): """Process fidelity between a quantum ``channel`` :math:`\\mathcal{E}` and a ``target`` unitary channel :math:`U`. The process fidelity is defined as @@ -733,8 +386,7 @@ def process_fidelity(channel, target=None, check_unitary: bool = False, backend= Returns: float: Process fidelity between ``channel`` and ``target``. """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) if target is not None: if channel.shape != target.shape: @@ -938,8 +590,8 @@ def diamond_norm(channel, target=None, backend=None, **kwargs): # `CVXPY` only works with `numpy`, so this function has to # convert any channel to the `numpy` backend by default - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) + channel = backend.to_numpy(channel) channel = np.transpose(channel) @@ -1008,103 +660,6 @@ def diamond_norm(channel, target=None, backend=None, **kwargs): return solution -def meyer_wallach_entanglement(circuit, backend=None): - """Computes the Meyer-Wallach entanglement Q of the `circuit`, - - .. math:: - Q(\\theta) = 1 - \\frac{1}{N} \\, \\sum_{k} \\, - \\text{tr}\\left(\\rho_{k^{2}}(\\theta)\\right) \\, . - - Args: - circuit (:class:`qibo.models.Circuit`): Parametrized circuit. - backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be used - in the execution. If ``None``, it uses :class:`qibo.backends.GlobalBackend`. - Defaults to ``None``. - - Returns: - float: Meyer-Wallach entanglement. - """ - - if backend is None: # pragma: no cover - backend = GlobalBackend() - - circuit.density_matrix = True - nqubits = circuit.nqubits - - rho = backend.execute_circuit(circuit).state() - - ent = 0 - for j in range(nqubits): - trace_q = list(range(nqubits)) - trace_q.pop(j) - - rho_r = backend.partial_trace_density_matrix(rho, trace_q, nqubits) - - trace = purity(rho_r) - - ent += trace - - entanglement = 1 - ent / nqubits - - return entanglement - - -def entangling_capability(circuit, samples: int, seed=None, backend=None): - """Returns the entangling capability :math:`\\text{Ent}` of a parametrized - circuit, which is average Meyer-Wallach entanglement Q of the circuit, i.e. - - .. math:: - \\text{Ent} = \\frac{2}{S}\\sum_{k}Q_k \\, , - - where :math:`S` is the number of samples. - - Args: - circuit (:class:`qibo.models.Circuit`): Parametrized circuit. - samples (int): number of samples to estimate the integral. - seed (int or :class:`numpy.random.Generator`, optional): Either a generator of random - numbers or a fixed seed to initialize a generator. If ``None``, initializes - a generator with a random seed. Default: ``None``. - backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be used - in the execution. If ``None``, it uses :class:`qibo.backends.GlobalBackend`. - Defaults to ``None``. - - Returns: - float: Entangling capability. - """ - - if isinstance(samples, int) is False: - raise_error( - TypeError, f"samples must be type int, but it is type {type(samples)}." - ) - - if ( - seed is not None - and not isinstance(seed, int) - and not isinstance(seed, np.random.Generator) - ): - raise_error( - TypeError, "seed must be either type int or numpy.random.Generator." - ) - - if backend is None: # pragma: no cover - backend = GlobalBackend() - - local_state = ( - np.random.default_rng(seed) if seed is None or isinstance(seed, int) else seed - ) - - res = [] - for _ in range(samples): - params = local_state.uniform(-np.pi, np.pi, circuit.trainable_gates.nparams) - circuit.set_parameters(params) - entanglement = meyer_wallach_entanglement(circuit, backend=backend) - res.append(entanglement) - - capability = 2 * np.real(np.sum(res)) / samples - - return capability - - def expressibility( circuit, power_t: int, @@ -1151,8 +706,7 @@ def expressibility( pqc_integral, ) - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) deviation = haar_integral( circuit.nqubits, power_t, samples=None, backend=backend @@ -1214,8 +768,7 @@ def frame_potential( TypeError, f"samples must be type int, but it is type {type(samples)}." ) - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) nqubits = circuit.nqubits dim = 2**nqubits @@ -1259,8 +812,7 @@ def _check_hermitian_or_not_gpu(matrix, backend=None): `backend` is not :class:`qibojit.backends.CupyBackend` """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) norm = backend.calculate_norm_density_matrix( np.transpose(np.conj(matrix)) - matrix, order=2 diff --git a/src/qibo/quantum_info/quantum_networks.py b/src/qibo/quantum_info/quantum_networks.py index af549a46fa..8992169ae5 100644 --- a/src/qibo/quantum_info/quantum_networks.py +++ b/src/qibo/quantum_info/quantum_networks.py @@ -1,4 +1,4 @@ -"""Module defining the QuantumNetwork class and adjacent functions.""" +"""Module defining the `QuantumNetwork` class and adjacent functions.""" import re from functools import reduce @@ -7,12 +7,26 @@ import numpy as np -from qibo.backends import GlobalBackend +from qibo.backends import _check_backend from qibo.config import raise_error class QuantumNetwork: - """Quantum network object that holds a Choi operator as a tensor. + """This class stores the Choi operator of the quantum network as a tensor, + which is an unique representation of the quantum network. + + A minimum quantum network is a quantum channel, which is a quantum network of the form + :math:`J[n \\to m]`, where :math:`n` is the dimension of the input system , + and :math:`m` is the dimension of the output system. + A quantum state is a quantum network of the form :math:`J[1 \\to n]`, + such that the input system is trivial. + An observable is a quantum network of the form :math:`J[n \\to 1]`, + such that the output system is trivial. + + A quantum network may contain multiple input and output systems. + For example, a "quantum comb" is a quantum network of the form :math:`J[n', n \\to m, m']`, + which convert a quantum channel of the form :math:`J[n \\to m]` + to a quantum channel of the form :math:`J[n' \\to m']`. Args: matrix (ndarray): input Choi operator. @@ -21,8 +35,8 @@ class QuantumNetwork: Choi operator. If ``None``, defaults to ``(False,True,False,True,...)``, where ``len(system_output)=len(partition)``. Defaults to ``None``. - pure (bool, optional): ``True`` when ``matrix`` is a rank-:math:`1` operator, - ``False`` otherwise. Defaults to ``False``. + pure (bool, optional): ``True`` when ``matrix`` is a "pure" representation (e.g. a pure + state, a unitary operator, etc.), ``False`` otherwise. Defaults to ``False``. backend (:class:`qibo.backends.abstract.Backend`, optional): Backend to be used in calculations. If ``None``, defaults to :class:`qibo.backends.GlobalBackend`. Defaults to ``None``. @@ -64,11 +78,11 @@ def matrix(self, backend=None): return backend.cast(self._matrix, dtype=self._matrix.dtype) - def pure(self): + def is_pure(self): """Returns bool indicading if the Choi operator of the network is pure.""" return self._pure - def hermitian( + def is_hermitian( self, order: Optional[Union[int, str]] = None, precision_tol: float = 1e-8 ): """Returns bool indicating if the Choi operator :math:`\\mathcal{E}` of the network is Hermitian. @@ -114,7 +128,7 @@ def hermitian( return float(norm) <= precision_tol - def unital( + def is_unital( self, order: Optional[Union[int, str]] = None, precision_tol: float = 1e-8 ): """Returns bool indicating if the Choi operator :math:`\\mathcal{E}` of the network is unital. @@ -162,7 +176,7 @@ def unital( return float(norm) <= precision_tol - def causal( + def is_causal( self, order: Optional[Union[int, str]] = None, precision_tol: float = 1e-8 ): """Returns bool indicating if the Choi operator :math:`\\mathcal{E}` of the network satisfies the causal order condition. @@ -210,8 +224,8 @@ def causal( return float(norm) <= precision_tol - def positive_semidefinite(self, precision_tol: float = 1e-8): - """Returns bool indicating if Choi operator :math:`\\mathcal{E}` of the networn is positive-semidefinite. + def is_positive_semidefinite(self, precision_tol: float = 1e-8): + """Returns bool indicating if Choi operator :math:`\\mathcal{E}` of the network is positive-semidefinite. Args: precision_tol (float, optional): threshold value used to check if eigenvalues of @@ -228,7 +242,7 @@ def positive_semidefinite(self, precision_tol: float = 1e-8): reshaped = np.reshape(self._matrix, (self.dims, self.dims)) - if self.hermitian(): + if self.is_hermitian(): eigenvalues = np.linalg.eigvalsh(reshaped) else: if self._backend.__class__.__name__ in [ @@ -240,7 +254,7 @@ def positive_semidefinite(self, precision_tol: float = 1e-8): return all(eigenvalue >= -precision_tol for eigenvalue in eigenvalues) - def channel( + def is_channel( self, order: Optional[Union[int, str]] = None, precision_tol_causal: float = 1e-8, @@ -263,9 +277,9 @@ def channel( Returns: bool: Channel condition. """ - return self.causal(order, precision_tol_causal) and self.positive_semidefinite( - precision_tol_psd - ) + return self.is_causal( + order, precision_tol_causal + ) and self.is_positive_semidefinite(precision_tol_psd) def apply(self, state): """Apply the Choi operator :math:`\\mathcal{E}` to ``state`` :math:`\\varrho`. @@ -280,7 +294,7 @@ def apply(self, state): """ matrix = np.copy(self._matrix) - if self.pure(): + if self.is_pure(): return np.einsum("kj,ml,jl -> km", matrix, np.conj(matrix), state) return np.einsum("jklm,km -> jl", matrix, state) @@ -323,8 +337,8 @@ def link_product(self, second_network, subscripts: str = "ij,jk -> ik"): inv_subscripts = pattern_two and subscripts[0] == subscripts[4] super_subscripts = ( pattern_four - and subscripts[2] == subscripts[5] - and subscripts[3] == subscripts[6] + and subscripts[1] == subscripts[5] + and subscripts[2] == subscripts[6] ) if not channel_subscripts and not inv_subscripts and not super_subscripts: @@ -337,10 +351,10 @@ def link_product(self, second_network, subscripts: str = "ij,jk -> ik"): second_matrix = second_network._full() # pylint: disable=W0212 if super_subscripts: - cexpr = "jklmnopq,nopqrstu->jklmrstu" + cexpr = "jklmnopq,klop->jmnq" return QuantumNetwork( np.einsum(cexpr, first_matrix, second_matrix), - self.partition[:2] + second_network.partition[2:], + [self.partition[0] + self.partition[-1]], ) cexpr = "jkab,klbc->jlac" @@ -376,7 +390,7 @@ def to_full(self, backend=None): if backend is None: # pragma: no cover backend = self._backend - if self.pure(): + if self.is_pure(): self._matrix = self._full() self._pure = False @@ -426,6 +440,11 @@ def __add__(self, second_network): def __mul__(self, number: Union[float, int]): """Returns quantum network with its Choi operator multiplied by a scalar. + If the quantum network is pure and ``number > 0.0``, the method returns a pure quantum + network with its Choi operator multiplied by the square root of ``number``. + This is equivalent to multiplying `self.to_full()` by the ``number``. + Otherwise, this method will return a full quantum network. + Args: number (float or int): scalar to multiply the Choi operator of the network with. @@ -439,7 +458,7 @@ def __mul__(self, number: Union[float, int]): "It is not possible to multiply a ``QuantumNetwork`` by a non-scalar.", ) - if self.pure() and number > 0.0: + if self.is_pure() and number > 0.0: return QuantumNetwork( np.sqrt(number) * self.matrix(backend=self._backend), partition=self.partition, @@ -465,6 +484,11 @@ def __rmul__(self, number: Union[float, int]): def __truediv__(self, number: Union[float, int]): """Returns quantum network with its Choi operator divided by a scalar. + If the quantum network is pure and ``number > 0.0``, the method returns a pure quantum + network with its Choi operator divided by the square root of ``number``. + This is equivalent to dividing `self.to_full()` by the ``number``. + Otherwise, this method will return a full quantum network. + Args: number (float or int): scalar to divide the Choi operator of the network with. @@ -478,20 +502,13 @@ def __truediv__(self, number: Union[float, int]): "It is not possible to divide a ``QuantumNetwork`` by a non-scalar.", ) - if self.pure() and number > 0.0: - return QuantumNetwork( - self.matrix(backend=self._backend) / np.sqrt(number), - partition=self.partition, - system_output=self.system_output, - pure=True, - backend=self._backend, - ) + number = np.sqrt(number) if self.is_pure() and number > 0.0 else number return QuantumNetwork( self.matrix(backend=self._backend) / number, partition=self.partition, system_output=self.system_output, - pure=False, + pure=self.is_pure(), backend=self._backend, ) @@ -515,17 +532,38 @@ def __matmul__(self, second_network): + "``QuantumNetwork`` by a non-``QuantumNetwork``.", ) - if self.partition != second_network.partition: - raise_error( - ValueError, - "partitions of the networks do not match: " - + f"{self.partition} != {second_network.partition}.", - ) + if len(self.partition) == 2: # `self` is a channel + if len(second_network.partition) != 2: + raise_error( + ValueError, + f"`QuantumNetwork {second_network} is assumed to be a channel, but it is not. " + + "Use `link_product` method to specify the subscript.", + ) + if self.partition[1] != second_network.partition[0]: + raise_error( + ValueError, + "partitions of the networks do not match: " + + f"{self.partition[1]} != {second_network.partition[0]}.", + ) - if len(self.partition) == 2: subscripts = "jk,kl -> jl" - elif len(self.partition) == 4: - subscripts = "jklm,lmno -> jkno" + + elif len(self.partition) == 4: # `self` is a super-channel + if len(second_network.partition) != 2: + raise_error( + ValueError, + f"`QuantumNetwork {second_network} is assumed to be a channel, but it is not. " + + "Use `link_product` method to specify the subscript.", + ) + if self.partition[1] != second_network.partition[0]: + raise_error( + ValueError, + "Systems of the channel do not match the super-channel: " + + f"{self.partition[1], self.partition[2]} != " + + f"{second_network.partition[0],second_network.partition[1]}.", + ) + + subscripts = "jklm,kl -> jm" else: raise_error( NotImplementedError, @@ -593,8 +631,7 @@ def _run_checks(self, partition, system_output, pure): def _set_tensor_and_parameters(self): """Sets tensor based on inputs.""" - if self._backend is None: - self._backend = GlobalBackend() + self._backend = _check_backend(self._backend) if isinstance(self.partition, list): self.partition = tuple(self.partition) @@ -625,7 +662,7 @@ def _set_tensor_and_parameters(self): def _full(self): """Reshapes input matrix based on purity.""" matrix = np.copy(self._matrix) - if self.pure(): + if self.is_pure(): matrix = np.einsum("jk,lm -> kjml", matrix, np.conj(matrix)) return matrix @@ -636,7 +673,7 @@ def _check_subscript_pattern(self, subscripts: str): """Checks if input subscript match any implemented pattern.""" braket = "[a-z]" pattern_two = re.compile(braket * 2 + "," + braket * 2 + "->" + braket * 2) - pattern_four = re.compile(braket * 4 + "," + braket * 4 + "->" + braket * 4) + pattern_four = re.compile(braket * 4 + "," + braket * 2 + "->" + braket * 2) return bool(re.match(pattern_two, subscripts)), bool( re.match(pattern_four, subscripts) diff --git a/src/qibo/quantum_info/random_ensembles.py b/src/qibo/quantum_info/random_ensembles.py index 84cb79af48..94159cf1b2 100644 --- a/src/qibo/quantum_info/random_ensembles.py +++ b/src/qibo/quantum_info/random_ensembles.py @@ -7,7 +7,7 @@ from scipy.stats import rv_continuous from qibo import Circuit, gates -from qibo.backends import GlobalBackend, NumpyBackend +from qibo.backends import NumpyBackend, _check_backend from qibo.config import MAX_ITERATIONS, PRECISION_TOL, raise_error from qibo.quantum_info.basis import comp_basis_to_pauli from qibo.quantum_info.superoperator_transformations import ( @@ -32,10 +32,10 @@ def _ppf(self, theta: float): def uniform_sampling_U3(ngates: int, seed=None, backend=None): - """Samples parameters for Haar-random :math:`U_{3}`s (:class:`qibo.gates.U3`). + """Samples parameters for Haar-random :class:`qibo.gates.U3`. Args: - ngates (int): Total number of :math:`U_{3}`s to be sampled. + ngates (int): Total number of :math:`U_{3}` gates to be sampled. seed (int or :class:`numpy.random.Generator`, optional): Either a generator of random numbers or a fixed seed to initialize a generator. If ``None``, initializes a generator with a random seed. Default: ``None``. @@ -44,7 +44,7 @@ def uniform_sampling_U3(ngates: int, seed=None, backend=None): Defaults to ``None``. Returns: - (ndarray): array of shape (``ngates``, :math:`3`). + ndarray: array of shape (``ngates``, :math:`3`). """ if not isinstance(ngates, int): raise_error( @@ -384,7 +384,7 @@ def random_quantum_channel( return super_op -def random_statevector(dims: int, haar: bool = False, seed=None, backend=None): +def random_statevector(dims: int, seed=None, backend=None): """Creates a random statevector :math:`\\ket{\\psi}`. .. math:: @@ -396,10 +396,6 @@ def random_statevector(dims: int, haar: bool = False, seed=None, backend=None): Args: dims (int): dimension of the matrix. - haar (bool, optional): if ``True``, statevector is created by sampling a - Haar random unitary :math:`U_{\\text{haar}}` and acting with it on a - random computational basis state :math:`\\ket{k}`, i.e. - :math:`\\ket{\\psi} = U_{\\text{haar}} \\ket{k}`. Defaults to ``False``. seed (int or :class:`numpy.random.Generator`, optional): Either a generator of random numbers or a fixed seed to initialize a generator. If ``None``, initializes a generator with a random seed. Defaults to ``None``. @@ -414,9 +410,6 @@ def random_statevector(dims: int, haar: bool = False, seed=None, backend=None): if dims <= 0: raise_error(ValueError, "dim must be of type int and >= 1") - if not isinstance(haar, bool): - raise_error(TypeError, f"haar must be type bool, but it is type {type(haar)}.") - if ( seed is not None and not isinstance(seed, int) @@ -426,23 +419,12 @@ def random_statevector(dims: int, haar: bool = False, seed=None, backend=None): TypeError, "seed must be either type int or numpy.random.Generator." ) - if backend is None: # pragma: no cover - backend = GlobalBackend() - - local_state = ( - np.random.default_rng(seed) if seed is None or isinstance(seed, int) else seed - ) + backend, local_state = _set_backend_and_local_state(seed, backend) - if not haar: - # sample real and imag parts of complex amplitude in [-1, 1] - state = 1j * (2 * local_state.random(dims) - 1) - state += 2 * local_state.random(dims) - 1 - state /= np.linalg.norm(state) - state = backend.cast(state, dtype=state.dtype) - else: - # select a random column of a haar random unitary - k = local_state.integers(low=0, high=dims) - state = random_unitary(dims, measure="haar", seed=seed, backend=backend)[:, k] + state = local_state.standard_normal(dims).astype(complex) + state += 1.0j * local_state.standard_normal(dims) + state /= np.linalg.norm(state) + state = backend.cast(state, dtype=state.dtype) return state @@ -566,7 +548,7 @@ def random_density_matrix( random_gaussian_matrix(dims, rank, seed=local_state, backend=backend), ) state = np.dot(state, np.transpose(np.conj(state))) - state = state / np.trace(state) + state /= np.trace(state) state = backend.cast(state, dtype=state.dtype) @@ -597,7 +579,7 @@ def random_clifford( Args: nqubits (int): number of qubits. return_circuit (bool, optional): if ``True``, returns a :class:`qibo.models.Circuit` - object. If ``False``, returns an ``ndarray`` object. Defaults to ``False``. + object. If ``False``, returns an ``ndarray`` object. Defaults to ``True``. density_matrix (bool, optional): used when ``return_circuit=True``. If `True`, the circuit would evolve density matrices. Defaults to ``False``. seed (int or :class:`numpy.random.Generator`, optional): Either a generator of @@ -1219,8 +1201,7 @@ def _set_backend_and_local_state(seed, backend): TypeError, "seed must be either type int or numpy.random.Generator." ) - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) if seed is None or isinstance(seed, int): if backend.__class__.__name__ in [ diff --git a/src/qibo/quantum_info/superoperator_transformations.py b/src/qibo/quantum_info/superoperator_transformations.py index b91dadbeb1..c888ed5b18 100644 --- a/src/qibo/quantum_info/superoperator_transformations.py +++ b/src/qibo/quantum_info/superoperator_transformations.py @@ -6,7 +6,7 @@ import numpy as np from scipy.optimize import minimize -from qibo.backends import GlobalBackend +from qibo.backends import _check_backend from qibo.config import PRECISION_TOL, raise_error from qibo.gates.abstract import Gate from qibo.gates.gates import Unitary @@ -61,8 +61,7 @@ def vectorization(state, order: str = "row", backend=None): f"order must be either 'row' or 'column' or 'system', but it is {order}.", ) - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) if len(state.shape) == 1: state = np.outer(state, np.conj(state)) @@ -130,8 +129,7 @@ def unvectorization(state, order: str = "row", backend=None): f"order must be either 'row' or 'column' or 'system', but it is {order}.", ) - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) dim = int(np.sqrt(len(state))) @@ -449,8 +447,7 @@ def choi_to_kraus( f"validate_cp must be type bool, but it is type {type(validate_cp)}.", ) - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) if validate_cp: norm = float( @@ -652,8 +649,7 @@ def kraus_to_choi(kraus_ops, order: str = "row", backend=None): Returns: ndarray: Choi representation of the Kraus channel. """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) gates, target_qubits = _set_gate_and_target_qubits(kraus_ops) nqubits = 1 + max(target_qubits) @@ -782,8 +778,7 @@ def kraus_to_chi( """ from qibo.quantum_info.basis import comp_basis_to_pauli - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) gates, target_qubits = _set_gate_and_target_qubits(kraus_ops) nqubits = 1 + max(target_qubits) @@ -845,8 +840,7 @@ def kraus_to_stinespring( Returns: ndarray: Stinespring representation (restricted unitary) of the Kraus channel. """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) if initial_state_env is not None: if len(initial_state_env) != len(kraus_ops): @@ -963,8 +957,7 @@ def liouville_to_pauli( """ from qibo.quantum_info.basis import comp_basis_to_pauli - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) dim = int(np.sqrt(len(super_op))) nqubits = int(np.log2(dim)) @@ -1165,8 +1158,7 @@ def pauli_to_liouville( """ from qibo.quantum_info.basis import pauli_to_comp_basis - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) dim = int(np.sqrt(len(pauli_op))) nqubits = int(np.log2(dim)) @@ -1873,8 +1865,7 @@ def stinespring_to_kraus( Returns: ndarray: Kraus operators. """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) if isinstance(dim_env, int) is False: raise_error( @@ -2038,8 +2029,7 @@ def kraus_to_unitaries( if precision_tol < 0.0: raise_error(ValueError, "precision_tol must be non-negative.") - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) target_qubits = [q for q, _ in kraus_ops] nqubits = 1 + np.max(target_qubits) @@ -2148,8 +2138,7 @@ def _reshuffling(super_op, order: str = "row", backend=None): NotImplementedError, "reshuffling not implemented for system vectorization." ) - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) dim = np.sqrt(super_op.shape[0]) @@ -2215,8 +2204,7 @@ def _individual_kraus_to_liouville( to be used in :func:`qibo.quantum_info.kraus_to_unitaries`. In principle, this should be not be accessible to users. """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) gates, target_qubits = _set_gate_and_target_qubits(kraus_ops) nqubits = 1 + max(target_qubits) diff --git a/src/qibo/quantum_info/utils.py b/src/qibo/quantum_info/utils.py index 24a6998569..ec772168e0 100644 --- a/src/qibo/quantum_info/utils.py +++ b/src/qibo/quantum_info/utils.py @@ -9,7 +9,7 @@ import numpy as np from qibo import matrices -from qibo.backends import GlobalBackend +from qibo.backends import _check_backend from qibo.config import PRECISION_TOL, raise_error @@ -134,8 +134,7 @@ def hadamard_transform(array, implementation: str = "fast", backend=None): Returns: ndarray: (Fast) Hadamard Transform of ``array``. """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) if ( len(array.shape) not in [1, 2] @@ -190,134 +189,6 @@ def hadamard_transform(array, implementation: str = "fast", backend=None): return array -def shannon_entropy(probability_array, base: float = 2, backend=None): - """Calculates the Shannon entropy of a probability array :math:`\\mathbf{p}`, which is given by - - .. math:: - H(\\mathbf{p}) = - \\sum_{k = 0}^{d^{2} - 1} \\, p_{k} \\, \\log_{b}(p_{k}) \\, , - - where :math:`d = \\text{dim}(\\mathcal{H})` is the dimension of the - Hilbert space :math:`\\mathcal{H}`, :math:`b` is the log base (default 2), - and :math:`0 \\log_{b}(0) \\equiv 0`. - - Args: - probability_array (ndarray or list): a probability array :math:`\\mathbf{p}`. - base (float): the base of the log. Defaults to :math:`2`. - backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be used - in the execution. If ``None``, it uses :class:`qibo.backends.GlobalBackend`. - Defaults to ``None``. - - Returns: - (float): The Shannon entropy :math:`H(\\mathcal{p})`. - """ - if backend is None: # pragma: no cover - backend = GlobalBackend() - - if isinstance(probability_array, list): - probability_array = backend.cast(probability_array, dtype=np.float64) - - if base <= 0: - raise_error(ValueError, "log base must be non-negative.") - - if len(probability_array.shape) != 1: - raise_error( - TypeError, - f"Probability array must have dims (k,) but it has {probability_array.shape}.", - ) - - if len(probability_array) == 0: - raise_error(TypeError, "Empty array.") - - if any(probability_array < 0) or any(probability_array > 1.0): - raise_error( - ValueError, - "All elements of the probability array must be between 0. and 1..", - ) - - if np.abs(np.sum(probability_array) - 1.0) > PRECISION_TOL: - raise_error(ValueError, "Probability array must sum to 1.") - - if base == 2: - log_prob = np.where(probability_array != 0.0, np.log2(probability_array), 0.0) - elif base == 10: - log_prob = np.where(probability_array != 0, np.log10(probability_array), 0.0) - elif base == np.e: - log_prob = np.where(probability_array != 0, np.log(probability_array), 0.0) - else: - log_prob = np.where( - probability_array != 0, np.log(probability_array) / np.log(base), 0.0 - ) - - entropy = -np.sum(probability_array * log_prob) - - # absolute value if entropy == 0.0 to avoid returning -0.0 - entropy = np.abs(entropy) if entropy == 0.0 else entropy - - return complex(entropy).real - - -def total_variation_distance( - prob_dist_p, prob_dist_q, validate: bool = False, backend=None -): - """Calculates the Total Variation (TV) distance between two discrete probability distributions. - - For probabilities :math:`\\mathbf{p}` and :math:`\\mathbf{q}`, it is defined as - - .. math:: - d_{\\text{TV}}(\\mathbf{p} \\, , \\, \\mathbf{q}) = \\frac{1}{2} - \\, \\| \\mathbf{p} - \\mathbf{q} \\|_{1} \\, , - - where :math:`\\| \\cdot \\|_{1}` is the :math:`\\mathcal{l}_{1}`-norm. - - Args: - prob_dist_p (ndarray or list): discrete probability distribution :math:`p`. - prob_dist_q (ndarray or list): discrete probability distribution :math:`q`. - validate (bool, optional): If ``True``, checks if :math:`p` and :math:`q` are proper - probability distributions. Defaults to ``False``. - backend (:class:`qibo.backends.abstract.Backend`, optional): backend to be - used in the execution. If ``None``, it uses - :class:`qibo.backends.GlobalBackend`. Defaults to ``None``. - - Returns: - float: Total variation distance between :math:`\\mathbf{p}` and :math:`\\mathbf{q}`. - """ - if backend is None: # pragma: no cover - backend = GlobalBackend() - - if isinstance(prob_dist_p, list): - prob_dist_p = backend.cast(prob_dist_p, dtype=np.float64) - if isinstance(prob_dist_q, list): - prob_dist_q = backend.cast(prob_dist_q, dtype=np.float64) - - if (len(prob_dist_p.shape) != 1) or (len(prob_dist_q.shape) != 1): - raise_error( - TypeError, - "Probability arrays must have dims (k,) but have " - + f"dims {prob_dist_p.shape} and {prob_dist_q.shape}.", - ) - - if (len(prob_dist_p) == 0) or (len(prob_dist_q) == 0): - raise_error(TypeError, "At least one of the arrays is empty.") - - if validate: - if (any(prob_dist_p < 0) or any(prob_dist_p > 1.0)) or ( - any(prob_dist_q < 0) or any(prob_dist_q > 1.0) - ): - raise_error( - ValueError, - "All elements of the probability array must be between 0. and 1..", - ) - if np.abs(np.sum(prob_dist_p) - 1.0) > PRECISION_TOL: - raise_error(ValueError, "First probability array must sum to 1.") - - if np.abs(np.sum(prob_dist_q) - 1.0) > PRECISION_TOL: - raise_error(ValueError, "Second probability array must sum to 1.") - - total_variation = 0.5 * np.sum(np.abs(prob_dist_p - prob_dist_q)) - - return total_variation - - def hellinger_distance(prob_dist_p, prob_dist_q, validate: bool = False, backend=None): """Calculates the Hellinger distance :math:`H` between two discrete probability distributions. @@ -341,8 +212,7 @@ def hellinger_distance(prob_dist_p, prob_dist_q, validate: bool = False, backend Returns: (float): Hellinger distance :math:`H(p, q)`. """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) if isinstance(prob_dist_p, list): prob_dist_p = backend.cast(prob_dist_p, dtype=np.float64) @@ -454,8 +324,7 @@ def haar_integral( TypeError, f"samples must be type int, but it is type {type(samples)}." ) - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) dim = 2**nqubits @@ -469,9 +338,7 @@ def haar_integral( rand_unit_density, dtype=rand_unit_density.dtype ) for _ in range(samples): - haar_state = np.reshape( - random_statevector(dim, haar=True, backend=backend), (-1, 1) - ) + haar_state = np.reshape(random_statevector(dim, backend=backend), (-1, 1)) rho = haar_state @ np.conj(np.transpose(haar_state)) @@ -531,8 +398,7 @@ def pqc_integral(circuit, power_t: int, samples: int, backend=None): TypeError, f"samples must be type int, but it is type {type(samples)}." ) - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) circuit.density_matrix = True dim = 2**circuit.nqubits diff --git a/src/qibo/result.py b/src/qibo/result.py index be095d5bfa..5d74157007 100644 --- a/src/qibo/result.py +++ b/src/qibo/result.py @@ -31,11 +31,9 @@ class QuantumState: """ def __init__(self, state, backend=None): - if backend is None: # pragma: no cover - from qibo.backends import GlobalBackend + from qibo.backends import _check_backend - backend = GlobalBackend() - self.backend = backend + self.backend = _check_backend(backend) self.density_matrix = len(state.shape) == 2 self.nqubits = int(np.log2(state.shape[0])) self._state = state diff --git a/src/qibo/transpiler/__init__.py b/src/qibo/transpiler/__init__.py index 3ed3779d69..bfe576776c 100644 --- a/src/qibo/transpiler/__init__.py +++ b/src/qibo/transpiler/__init__.py @@ -1,6 +1,12 @@ 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.placer import ( + Custom, + Random, + ReverseTraversal, + StarConnectivityPlacer, + Subgraph, + Trivial, +) +from qibo.transpiler.router import Sabre, ShortestPaths, StarConnectivityRouter from qibo.transpiler.unroller import NativeGates diff --git a/src/qibo/transpiler/blocks.py b/src/qibo/transpiler/blocks.py index 199979767e..6e2b1122a2 100644 --- a/src/qibo/transpiler/blocks.py +++ b/src/qibo/transpiler/blocks.py @@ -200,12 +200,11 @@ def block_decomposition(circuit: Circuit, fuse: bool = True): remove_list = [first_block] if len(initial_blocks[1:]) > 0: for second_block in initial_blocks[1:]: - try: + if second_block.qubits == first_block.qubits: first_block = first_block.fuse(second_block) remove_list.append(second_block) - except BlockingError: - if not first_block.commute(second_block): - break + elif not first_block.commute(second_block): + break blocks.append(first_block) _remove_gates(initial_blocks, remove_list) diff --git a/src/qibo/transpiler/decompositions.py b/src/qibo/transpiler/decompositions.py index cb106d423b..f559f0088a 100644 --- a/src/qibo/transpiler/decompositions.py +++ b/src/qibo/transpiler/decompositions.py @@ -116,7 +116,7 @@ def _u3_to_gpi2(t, p, l): # Decompose single qubit gates using U3 u3_dec = GateDecompositions() -u3_dec.add(gates.H, [gates.U3(0, 7 * np.pi / 2, np.pi, 0)]) +u3_dec.add(gates.H, [gates.U3(0, -np.pi / 2, np.pi, 0)]) u3_dec.add(gates.X, [gates.U3(0, np.pi, 0, np.pi)]) u3_dec.add(gates.Y, [gates.U3(0, np.pi, 0, 0)]) u3_dec.add(gates.Z, [gates.Z(0)]) @@ -159,28 +159,28 @@ def _u3_to_gpi2(t, p, l): gates.CNOT, [ gates.U3(0, 3 * np.pi / 2, np.pi, 0), - gates.U3(1, np.pi / 2, -np.pi, -np.pi), + 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.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(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.U3(0, -np.pi / 2, np.pi, 0), + gates.U3(1, -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.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), + 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, -np.pi / 2, np.pi, 0), ], ) iswap_dec.add( @@ -304,14 +304,14 @@ def _u3_to_gpi2(t, p, l): cz_dec.add( gates.FSWAP, [ - gates.U3(0, np.pi / 2, -np.pi / 2, -np.pi), + 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), + gates.U3(0, np.pi / 2, np.pi / 2, np.pi), + gates.U3(1, np.pi / 2, 0, np.pi), ], ) cz_dec.add( @@ -328,7 +328,7 @@ def _u3_to_gpi2(t, p, l): gates.RYY, lambda gate: [ gates.RX(0, np.pi / 2), - gates.U3(1, np.pi / 2, np.pi / 2, -np.pi), + 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), @@ -392,3 +392,76 @@ def _u3_to_gpi2(t, p, l): gates.H(1), ], ) + + +# standard gate decompositions used by :meth:`qibo.gates.gates.Gate.decompose` +standard_decompositions = GateDecompositions() +standard_decompositions.add(gates.SX, [gates.RX(0, np.pi / 2, trainable=False)]) +standard_decompositions.add(gates.SXDG, [gates.RX(0, -np.pi / 2, trainable=False)]) +standard_decompositions.add( + gates.U3, + lambda gate: [ + gates.RZ(0, gate.parameters[2]), + gates.SX(0), + gates.RZ(0, gate.parameters[0] + np.pi), + gates.SX(0), + gates.RZ(0, gate.parameters[1] + np.pi), + ], +) +standard_decompositions.add(gates.CY, [gates.SDG(1), gates.CNOT(0, 1), gates.S(1)]) +standard_decompositions.add(gates.CZ, [gates.H(1), gates.CNOT(0, 1), gates.H(1)]) +standard_decompositions.add( + gates.CSX, [gates.H(1), gates.CU1(0, 1, np.pi / 2), gates.H(1)] +) +standard_decompositions.add( + gates.CSXDG, [gates.H(1), gates.CU1(0, 1, -np.pi / 2), gates.H(1)] +) +standard_decompositions.add( + gates.RZX, + lambda gate: [ + gates.H(1), + gates.CNOT(0, 1), + gates.RZ(1, gate.parameters[0]), + gates.CNOT(0, 1), + gates.H(1), + ], +) +standard_decompositions.add( + gates.RXXYY, + lambda gate: [ + gates.RZ(1, -np.pi / 2), + gates.S(0), + gates.SX(1), + gates.RZ(1, np.pi / 2), + gates.CNOT(1, 0), + gates.RY(0, -gate.parameters[0] / 2), + gates.RY(1, -gate.parameters[0] / 2), + gates.CNOT(1, 0), + gates.SDG(0), + gates.RZ(1, -np.pi / 2), + gates.SX(1).dagger(), + gates.RZ(1, np.pi / 2), + ], +) +standard_decompositions.add( + gates.RBS, + lambda gate: [ + gates.H(0), + gates.CNOT(0, 1), + gates.H(1), + gates.RY(0, gate.parameters[0]), + gates.RY(1, -gate.parameters[0]), + gates.H(1), + gates.CNOT(0, 1), + gates.H(0), + ], +) +standard_decompositions.add( + gates.GIVENS, lambda gate: gates.RBS(0, 1, -gate.parameters[0]).decompose() +) +standard_decompositions.add( + gates.FSWAP, [gates.X(1)] + gates.GIVENS(0, 1, np.pi / 2).decompose() + [gates.X(0)] +) +standard_decompositions.add( + gates.ECR, [gates.S(0), gates.SX(1), gates.CNOT(0, 1), gates.X(0)] +) diff --git a/src/qibo/transpiler/pipeline.py b/src/qibo/transpiler/pipeline.py index d1bd6fdc6c..06b047d773 100644 --- a/src/qibo/transpiler/pipeline.py +++ b/src/qibo/transpiler/pipeline.py @@ -10,9 +10,12 @@ from qibo.transpiler._exceptions import TranspilerPipelineError from qibo.transpiler.abstract import Optimizer, Placer, Router 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.placer import StarConnectivityPlacer, Trivial, assert_placement +from qibo.transpiler.router import ( + ConnectivityError, + StarConnectivityRouter, + assert_connectivity, +) from qibo.transpiler.unroller import ( DecompositionError, NativeGates, @@ -203,9 +206,9 @@ def default(self): # preprocessing default_passes.append(Preprocessing(connectivity=self.connectivity)) # default placer pass - default_passes.append(Trivial(connectivity=self.connectivity)) + default_passes.append(StarConnectivityPlacer()) # default router pass - default_passes.append(StarConnectivity()) + default_passes.append(StarConnectivityRouter()) # default unroller pass default_passes.append(Unroller(native_gates=self.native_gates)) diff --git a/src/qibo/transpiler/placer.py b/src/qibo/transpiler/placer.py index 96c5ae04d0..d57cc95428 100644 --- a/src/qibo/transpiler/placer.py +++ b/src/qibo/transpiler/placer.py @@ -4,10 +4,11 @@ import networkx as nx from qibo import gates -from qibo.config import raise_error +from qibo.config import log, raise_error from qibo.models import Circuit from qibo.transpiler._exceptions import PlacementError from qibo.transpiler.abstract import Placer, Router +from qibo.transpiler.router import _find_connected_qubit def assert_placement( @@ -84,6 +85,66 @@ def _find_gates_qubits_pairs(circuit: Circuit): return gates_qubits_pairs +class StarConnectivityPlacer(Placer): + """Find an optimized qubit placement for the following connectivity: + + q + | + q -- q -- q + | + q + + 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 + if connectivity is not None: # pragma: no cover + log.warning( + "StarConnectivityRouter does not use the connectivity graph." + "The connectivity graph will be ignored." + ) + + def __call__(self, circuit: Circuit): + """Apply the transpiler transformation on a given circuit. + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): The original Qibo circuit to transform. + Only single qubit gates and two qubits gates are supported by the router. + + Returns: + (dict): physical to logical qubit mapping. + """ + + # find the number of qubits for hardware circuit + nqubits = max(circuit.nqubits, self.middle_qubit + 1) + hardware_qubits = list(range(nqubits)) + + for i, gate in enumerate(circuit.queue): + if len(gate.qubits) > 2: + raise_error( + PlacementError, + "Gates targeting more than 2 qubits are not supported", + ) + if len(gate.qubits) == 2: + if self.middle_qubit not in gate.qubits: + new_middle = _find_connected_qubit( + gate.qubits, + circuit.queue[i + 1 :], + hardware_qubits, + error=PlacementError, + ) + hardware_qubits[self.middle_qubit], hardware_qubits[new_middle] = ( + new_middle, + self.middle_qubit, + ) + break + + return dict(zip(["q" + str(i) for i in range(nqubits)], hardware_qubits)) + + class Trivial(Placer): """Place qubits according to the following notation: diff --git a/src/qibo/transpiler/router.py b/src/qibo/transpiler/router.py index 00e6a86da5..6023296d8c 100644 --- a/src/qibo/transpiler/router.py +++ b/src/qibo/transpiler/router.py @@ -5,7 +5,7 @@ import networkx as nx from qibo import gates -from qibo.config import raise_error +from qibo.config import log, raise_error from qibo.models import Circuit from qibo.transpiler._exceptions import ConnectivityError from qibo.transpiler.abstract import Router @@ -40,6 +40,119 @@ def assert_connectivity(connectivity: nx.Graph, circuit: Circuit): ) +class StarConnectivityRouter(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 + if connectivity is not None: # pragma: no cover + log.warning( + "StarConnectivityRouter does not use the connectivity graph." + "The connectivity graph will be ignored." + ) + + def __call__(self, circuit: Circuit, initial_layout: dict): + """Apply the transpiler transformation on a given circuit. + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): The original Qibo circuit to transform. + Only single qubit gates and two qubits gates are supported by the router. + initial_layout (dict): initial physical-to-logical qubit mapping, + use `qibo.transpiler.placer.StarConnectivityPlacer` for better performance. + + 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 + nqubits = max(circuit.nqubits, middle_qubit + 1) + # new circuit object that will be compatible with hardware connectivity + new = Circuit(nqubits) + # list to maps logical to hardware qubits + hardware_qubits = list(initial_layout.values()) + + 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 + new_middle = _find_connected_qubit( + qubits, + circuit.queue[i + 1 :], + hardware_qubits, + error=ConnectivityError, + ) + # update hardware qubits according to the swap + hardware_qubits[middle_qubit], hardware_qubits[new_middle] = ( + hardware_qubits[new_middle], + hardware_qubits[middle_qubit], + ) + 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)) + 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, error): + """Helper method for :meth:`qibo.transpiler.router.StarConnectivityRouter` + and :meth:`qibo.transpiler.router.StarConnectivityPlacer`. + + 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: + raise_error( + error, + "Gates targeting more than 2 qubits are not supported", + ) + if len(next_gate.qubits) == 2: + possible_qubits &= {hardware_qubits.index(q) for q in next_gate.qubits} + if not possible_qubits: + return qubits[0] + elif len(possible_qubits) == 1: + return possible_qubits.pop() + return qubits[0] + + class CircuitMap: """Class that stores the circuit and physical-logical mapping during routing. @@ -266,7 +379,9 @@ def __call__(self, circuit: Circuit, initial_layout: dict): else: self._find_new_mapping() - routed_circuit = self.circuit.routed_circuit(circuit_kwargs=circuit.init_kwargs) + circuit_kwargs = circuit.init_kwargs + circuit_kwargs["wire_names"] = list(initial_layout.keys()) + routed_circuit = self.circuit.routed_circuit(circuit_kwargs=circuit_kwargs) if self._final_measurements is not None: routed_circuit = self._append_final_measurements( routed_circuit=routed_circuit @@ -545,7 +660,9 @@ def __call__(self, circuit: Circuit, initial_layout: dict): else: self._find_new_mapping() - routed_circuit = self.circuit.routed_circuit(circuit_kwargs=circuit.init_kwargs) + circuit_kwargs = circuit.init_kwargs + circuit_kwargs["wire_names"] = list(initial_layout.keys()) + routed_circuit = self.circuit.routed_circuit(circuit_kwargs=circuit_kwargs) if self._final_measurements is not None: routed_circuit = self._append_final_measurements( routed_circuit=routed_circuit diff --git a/src/qibo/transpiler/star_connectivity.py b/src/qibo/transpiler/star_connectivity.py deleted file mode 100644 index 693df030c1..0000000000 --- a/src/qibo/transpiler/star_connectivity.py +++ /dev/null @@ -1,126 +0,0 @@ -from qibo import Circuit, gates -from qibo.transpiler.abstract import Router -from qibo.transpiler.router import ConnectivityError - - -# TODO: split into routing plus placer steps -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 - self.connectivity = connectivity - - 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 index e737ba649e..472347b0d4 100644 --- a/src/qibo/transpiler/unitary_decompositions.py +++ b/src/qibo/transpiler/unitary_decompositions.py @@ -1,7 +1,7 @@ import numpy as np from qibo import gates, matrices -from qibo.backends import GlobalBackend, NumpyBackend +from qibo.backends import NumpyBackend, _check_backend from qibo.config import raise_error magic_basis = np.array( @@ -50,8 +50,7 @@ def calculate_psi(unitary, magic_basis=magic_basis, backend=None): Returns: (ndarray) Eigenvectors in the computational basis and eigenvalues of :math:`U^{T} U`. """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) if backend.__class__.__name__ in [ "CupyBackend", @@ -154,9 +153,8 @@ def calculate_diagonal(unitary, ua, ub, 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.""" + backend = _check_backend(backend) 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) @@ -167,8 +165,7 @@ def magic_decomposition(unitary, backend=None): 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() + backend = _check_backend(backend) ud = backend.cast(ud) bell_basis = backend.cast(bell_basis, dtype=bell_basis.dtype) @@ -248,8 +245,7 @@ def two_qubit_decomposition(q0, q1, unitary, backend=None): Returns: (list): gates implementing decomposition (24) from arXiv:quant-ph/0307177 """ - if backend is None: # pragma: no cover - backend = GlobalBackend() + backend = _check_backend(backend) ud_diag = to_bell_diagonal(unitary, backend=backend) ud = None diff --git a/src/qibo/transpiler/unroller.py b/src/qibo/transpiler/unroller.py index c62ae4e273..6b8f3e9c60 100644 --- a/src/qibo/transpiler/unroller.py +++ b/src/qibo/transpiler/unroller.py @@ -85,7 +85,7 @@ def __call__(self, circuit: Circuit): Returns: (:class:`qibo.models.circuit.Circuit`): equivalent circuit with native gates. """ - translated_circuit = circuit.__class__(circuit.nqubits) + translated_circuit = Circuit(**circuit.init_kwargs) for gate in circuit.queue: translated_circuit.add( translate_gate( diff --git a/tests/test_gates_gates.py b/tests/test_gates_gates.py index e014031eac..caabc73e57 100644 --- a/tests/test_gates_gates.py +++ b/tests/test_gates_gates.py @@ -1546,6 +1546,8 @@ def test_controlled_unitary_matrix(backend): ("GIVENS", (0, 1, 0.1)), ("RBS", (0, 1, 0.2)), ("ECR", (0, 1)), + ("SiSWAP", (0, 1)), + ("SiSWAPDG", (0, 1)), ] diff --git a/tests/test_global_backend.py b/tests/test_global_backend.py index 27386ed812..9ad3a4b2f4 100644 --- a/tests/test_global_backend.py +++ b/tests/test_global_backend.py @@ -91,3 +91,20 @@ def test_gate_matrix(): qibo.set_backend("numpy") gate = qibo.gates.H(0) matrix = gate.matrix + + +def test_check_backend(backend): + # testing when backend is not None + test = qibo.backends._check_backend(backend) + + assert test.name == backend.name + assert test.__class__ == backend.__class__ + + # testing when backend is None + test = None + test = qibo.backends._check_backend(test) + + target = qibo.backends.GlobalBackend() + + assert test.name == target.name + assert test.__class__ == target.__class__ diff --git a/tests/test_models_encodings.py b/tests/test_models_encodings.py index b71faa5c97..63cae6836b 100644 --- a/tests/test_models_encodings.py +++ b/tests/test_models_encodings.py @@ -1,6 +1,7 @@ """Tests for qibo.models.encodings""" import math +from itertools import product import numpy as np import pytest @@ -8,6 +9,7 @@ from qibo.models.encodings import ( comp_basis_encoder, + phase_encoder, unary_encoder, unary_encoder_random_gaussian, ) @@ -48,9 +50,58 @@ def test_comp_basis_encoder(backend, basis_element): backend.assert_allclose(state, target) +@pytest.mark.parametrize("kind", [None, list]) +@pytest.mark.parametrize("rotation", ["RX", "RY", "RZ"]) +def test_phase_encoder(backend, rotation, kind): + sampler = np.random.default_rng(1) + + nqubits = 3 + dims = 2**nqubits + + with pytest.raises(TypeError): + data = sampler.random((nqubits, nqubits)) + data = backend.cast(data, dtype=data.dtype) + phase_encoder(data, rotation=rotation) + with pytest.raises(TypeError): + data = sampler.random(nqubits) + data = backend.cast(data, dtype=data.dtype) + phase_encoder(data, rotation=True) + with pytest.raises(ValueError): + data = sampler.random(nqubits) + data = backend.cast(data, dtype=data.dtype) + phase_encoder(data, rotation="rzz") + + phases = np.random.rand(nqubits) + + if rotation in ["RX", "RY"]: + functions = list(product([np.cos, np.sin], repeat=nqubits)) + target = [] + for row in functions: + elem = 1.0 + for phase, func in zip(phases, row): + elem *= func(phase / 2) + if rotation == "RX" and func.__name__ == "sin": + elem *= -1.0j + target.append(elem) + else: + target = [np.exp(-0.5j * sum(phases))] + [0.0] * (dims - 1) + + target = np.array(target, dtype=complex) + target = backend.cast(target, dtype=target.dtype) + + if kind is not None: + phases = kind(phases) + + state = phase_encoder(phases, rotation=rotation) + state = backend.execute_circuit(state).state() + + backend.assert_allclose(state, target) + + +@pytest.mark.parametrize("kind", [None, list]) @pytest.mark.parametrize("architecture", ["tree", "diagonal"]) @pytest.mark.parametrize("nqubits", [8]) -def test_unary_encoder(backend, nqubits, architecture): +def test_unary_encoder(backend, nqubits, architecture, kind): sampler = np.random.default_rng(1) with pytest.raises(TypeError): @@ -76,6 +127,9 @@ def test_unary_encoder(backend, nqubits, architecture): data = 2 * sampler.random(nqubits) - 1 data = backend.cast(data, dtype=data.dtype) + if kind is not None: + data = kind(data) + circuit = unary_encoder(data, architecture=architecture) state = backend.execute_circuit(circuit).state() indexes = np.flatnonzero(state) diff --git a/tests/test_models_qcnn.py b/tests/test_models_qcnn.py index 581641035c..ab8d98e2b3 100644 --- a/tests/test_models_qcnn.py +++ b/tests/test_models_qcnn.py @@ -1,9 +1,10 @@ import math import numpy as np -import pytest -from qibo import Circuit, gates +import qibo +from qibo import gates +from qibo.models import Circuit from qibo.models.qcnn import QuantumCNN num_angles = 21 @@ -291,13 +292,57 @@ def test_qcnn_training(): test_qcnn = QuantumCNN(nqubits=4, nlayers=1, nclasses=2, params=init_theta) testcircuit = test_qcnn._circuit result = test_qcnn.minimize( - init_theta, data=data, labels=labels, nshots=1000, method="Powell" + init_theta, data=data, labels=labels, nshots=10000, method="Powell" ) # test Predictions function predictions = [] for n in range(len(data)): - predictions.append(test_qcnn.predict(data[n], nshots=1000)[0]) + predictions.append(test_qcnn.predict(data[n], nshots=10000)[0]) + + # test Accuracy function + predictions.append(1) + labels = np.array([[1], [-1], [1]]) + test_qcnn.Accuracy(labels, predictions) + + +def test_two_qubit_ansatz(): + c = Circuit(2) + c.add(gates.H(0)) + c.add(gates.RX(0, 0)) + c.add(gates.CNOT(1, 0)) + test_qcnn = QuantumCNN(4, 2, 2, twoqubitansatz=c) + + +def test_two_qubit_ansatz_training(): + # test qibojit case (copy initial state as quick-fix for in-place update) + qibo.set_backend("qibojit") + + c = Circuit(2) + c.add(gates.H(0)) + c.add(gates.RX(0, 0)) + c.add(gates.CNOT(1, 0)) + test_qcnn = QuantumCNN(4, 2, 2, twoqubitansatz=c) + + data = np.zeros([2, 16]) + for i in range(2): + data_i = np.random.rand(16) + data[i] = data_i / np.linalg.norm(data_i) + labels = [[1], [-1]] + + totalNParams = test_qcnn.nparams_layer * 2 + init_theta = [ + 0 for i in range(totalNParams + 1) + ] # totalNParams+1 to account for bias parameter. + + result = test_qcnn.minimize( + init_theta, data=data, labels=labels, nshots=10000, method="Powell" + ) + + # test Predictions function + predictions = [] + for n in range(len(data)): + predictions.append(test_qcnn.predict(data[n], nshots=10000)[0]) # test Accuracy function predictions.append(1) diff --git a/tests/test_quantum_info_clifford.py b/tests/test_quantum_info_clifford.py index 3290aefc31..ebde9aff5c 100644 --- a/tests/test_quantum_info_clifford.py +++ b/tests/test_quantum_info_clifford.py @@ -62,13 +62,14 @@ def test_clifford_from_circuit(backend, measurement): backend.assert_allclose(obj.probabilities(), result.probabilities()) +@pytest.mark.parametrize("seed", [1, 10]) @pytest.mark.parametrize("algorithm", ["AG04", "BM20"]) @pytest.mark.parametrize("nqubits", [1, 2, 3, 10, 50]) -def test_clifford_to_circuit(backend, nqubits, algorithm): +def test_clifford_to_circuit(backend, nqubits, algorithm, seed): if backend.__class__.__name__ == "TensorflowBackend": pytest.skip("CliffordBackend not defined for Tensorflow engine.") - clifford = random_clifford(nqubits, backend=backend) + clifford = random_clifford(nqubits, seed=seed, backend=backend) symplectic_matrix_original = Clifford.from_circuit( clifford, engine=backend diff --git a/tests/test_quantum_info_entanglement.py b/tests/test_quantum_info_entanglement.py new file mode 100644 index 0000000000..a98cf1909b --- /dev/null +++ b/tests/test_quantum_info_entanglement.py @@ -0,0 +1,175 @@ +import numpy as np +import pytest + +from qibo import Circuit, gates +from qibo.config import PRECISION_TOL +from qibo.quantum_info.entanglement import ( + concurrence, + entanglement_fidelity, + entanglement_of_formation, + entangling_capability, + meyer_wallach_entanglement, +) +from qibo.quantum_info.random_ensembles import random_density_matrix, random_statevector + + +@pytest.mark.parametrize("check_purity", [True, False]) +@pytest.mark.parametrize("base", [2, 10, np.e, 5]) +@pytest.mark.parametrize("bipartition", [[0], [1]]) +def test_concurrence_and_formation(backend, bipartition, base, check_purity): + with pytest.raises(TypeError): + state = np.random.rand(2, 3) + state = backend.cast(state, dtype=state.dtype) + test = concurrence( + state, bipartition=bipartition, check_purity=check_purity, backend=backend + ) + with pytest.raises(TypeError): + state = random_statevector(4, backend=backend) + test = concurrence( + state, bipartition=bipartition, check_purity="True", backend=backend + ) + + if check_purity is True: + with pytest.raises(NotImplementedError): + state = backend.identity_density_matrix(2, normalize=False) + test = concurrence(state, bipartition=bipartition, backend=backend) + + nqubits = 2 + dim = 2**nqubits + state = random_statevector(dim, backend=backend) + concur = concurrence( + state, bipartition=bipartition, check_purity=check_purity, backend=backend + ) + ent_form = entanglement_of_formation( + state, + bipartition=bipartition, + base=base, + check_purity=check_purity, + backend=backend, + ) + backend.assert_allclose(0.0 <= concur <= np.sqrt(2), True) + backend.assert_allclose(0.0 <= ent_form <= 1.0, True) + + state = np.kron( + random_density_matrix(2, pure=True, backend=backend), + random_density_matrix(2, pure=True, backend=backend), + ) + concur = concurrence(state, bipartition, check_purity=check_purity, backend=backend) + ent_form = entanglement_of_formation( + state, + bipartition=bipartition, + base=base, + check_purity=check_purity, + backend=backend, + ) + backend.assert_allclose(concur, 0.0, atol=10 * PRECISION_TOL) + backend.assert_allclose(ent_form, 0.0, atol=PRECISION_TOL) + + +@pytest.mark.parametrize("check_hermitian", [False, True]) +@pytest.mark.parametrize("nqubits", [4, 6]) +@pytest.mark.parametrize("channel", [gates.DepolarizingChannel]) +def test_entanglement_fidelity(backend, channel, nqubits, check_hermitian): + with pytest.raises(TypeError): + test = entanglement_fidelity( + channel, nqubits=[0], check_hermitian=check_hermitian, backend=backend + ) + with pytest.raises(ValueError): + test = entanglement_fidelity( + channel, nqubits=0, check_hermitian=check_hermitian, backend=backend + ) + with pytest.raises(TypeError): + state = np.random.rand(2, 3, 2) + state = backend.cast(state, dtype=state.dtype) + test = entanglement_fidelity( + channel, + nqubits, + state=state, + check_hermitian=check_hermitian, + backend=backend, + ) + with pytest.raises(TypeError): + state = random_statevector(2, backend=backend) + test = entanglement_fidelity( + channel, nqubits, state=state, check_hermitian="False", backend=backend + ) + + channel = channel([0, 1], 0.5) + + # test on maximally entangled state + ent_fid = entanglement_fidelity( + channel, nqubits=nqubits, check_hermitian=check_hermitian, backend=backend + ) + backend.assert_allclose(ent_fid, 0.625, atol=PRECISION_TOL) + + # test with a state vector + state = backend.plus_state(nqubits) + ent_fid = entanglement_fidelity( + channel, + nqubits=nqubits, + state=state, + check_hermitian=check_hermitian, + backend=backend, + ) + backend.assert_allclose(ent_fid, 0.625, atol=PRECISION_TOL) + + # test on maximally mixed state + state = backend.identity_density_matrix(nqubits) + ent_fid = entanglement_fidelity( + channel, + nqubits=nqubits, + state=state, + check_hermitian=check_hermitian, + backend=backend, + ) + backend.assert_allclose(ent_fid, 1.0, atol=PRECISION_TOL) + + +def test_meyer_wallach_entanglement(backend): + nqubits = 2 + + circuit1 = Circuit(nqubits) + circuit1.add([gates.RX(0, np.pi / 4)] for _ in range(nqubits)) + + circuit2 = Circuit(nqubits) + circuit2.add([gates.RX(0, np.pi / 4)] for _ in range(nqubits)) + circuit2.add(gates.CNOT(0, 1)) + + backend.assert_allclose( + meyer_wallach_entanglement(circuit1, backend=backend), 0.0, atol=PRECISION_TOL + ) + + backend.assert_allclose( + meyer_wallach_entanglement(circuit2, backend=backend), 0.5, atol=PRECISION_TOL + ) + + +@pytest.mark.parametrize("seed", [None, 10, np.random.default_rng(10)]) +def test_entangling_capability(backend, seed): + with pytest.raises(TypeError): + circuit = Circuit(1) + samples = 0.5 + entangling_capability(circuit, samples, seed=seed, backend=backend) + with pytest.raises(TypeError): + circuit = Circuit(1) + entangling_capability(circuit, samples=10, seed="10", backend=backend) + + nqubits = 2 + samples = 100 + + c1 = Circuit(nqubits) + c1.add([gates.RX(q, 0, trainable=True) for q in range(nqubits)]) + c1.add(gates.CNOT(0, 1)) + c1.add([gates.RX(q, 0, trainable=True) for q in range(nqubits)]) + ent_mw1 = entangling_capability(c1, samples, seed=seed, backend=backend) + + c2 = Circuit(nqubits) + c2.add(gates.H(0)) + c2.add(gates.CNOT(0, 1)) + c2.add(gates.RX(0, 0, trainable=True)) + ent_mw2 = entangling_capability(c2, samples, seed=seed, backend=backend) + + c3 = Circuit(nqubits) + ent_mw3 = entangling_capability(c3, samples, seed=seed, backend=backend) + + backend.assert_allclose(ent_mw3 < ent_mw1 < ent_mw2, True) diff --git a/tests/test_quantum_info_entropies.py b/tests/test_quantum_info_entropies.py new file mode 100644 index 0000000000..3cf8b2d721 --- /dev/null +++ b/tests/test_quantum_info_entropies.py @@ -0,0 +1,736 @@ +import numpy as np +import pytest +from scipy.linalg import sqrtm + +from qibo.config import PRECISION_TOL +from qibo.quantum_info.entropies import ( + _matrix_power, + classical_relative_entropy, + classical_relative_renyi_entropy, + classical_renyi_entropy, + classical_tsallis_entropy, + entanglement_entropy, + relative_renyi_entropy, + relative_von_neumann_entropy, + renyi_entropy, + shannon_entropy, + tsallis_entropy, + von_neumann_entropy, +) +from qibo.quantum_info.random_ensembles import ( + random_density_matrix, + random_statevector, + random_unitary, +) + + +def test_shannon_entropy_errors(backend): + with pytest.raises(ValueError): + prob = np.array([1.0, 0.0]) + prob = backend.cast(prob, dtype=prob.dtype) + test = shannon_entropy(prob, -2, backend=backend) + with pytest.raises(TypeError): + prob = np.array([[1.0], [0.0]]) + prob = backend.cast(prob, dtype=prob.dtype) + test = shannon_entropy(prob, backend=backend) + with pytest.raises(TypeError): + prob = np.array([]) + prob = backend.cast(prob, dtype=prob.dtype) + test = shannon_entropy(prob, backend=backend) + with pytest.raises(ValueError): + prob = np.array([1.0, -1.0]) + prob = backend.cast(prob, dtype=prob.dtype) + test = shannon_entropy(prob, backend=backend) + with pytest.raises(ValueError): + prob = np.array([1.1, 0.0]) + prob = backend.cast(prob, dtype=prob.dtype) + test = shannon_entropy(prob, backend=backend) + with pytest.raises(ValueError): + prob = np.array([0.5, 0.4999999]) + prob = backend.cast(prob, dtype=prob.dtype) + test = shannon_entropy(prob, backend=backend) + + +@pytest.mark.parametrize("base", [2, 10, np.e, 5]) +def test_shannon_entropy(backend, base): + prob_array = [1.0, 0.0] + result = shannon_entropy(prob_array, base, backend=backend) + backend.assert_allclose(result, 0.0) + + if base == 2: + prob_array = np.array([0.5, 0.5]) + prob_array = backend.cast(prob_array, dtype=prob_array.dtype) + result = shannon_entropy(prob_array, base, backend=backend) + backend.assert_allclose(result, 1.0) + + +@pytest.mark.parametrize("kind", [None, list]) +@pytest.mark.parametrize("base", [2, 10, np.e, 5]) +def test_classical_relative_entropy(backend, base, kind): + with pytest.raises(TypeError): + prob = np.random.rand(1, 2) + prob_q = np.random.rand(1, 5) + prob = backend.cast(prob, dtype=prob.dtype) + prob_q = backend.cast(prob_q, dtype=prob_q.dtype) + test = classical_relative_entropy(prob, prob_q, backend=backend) + with pytest.raises(TypeError): + prob = np.random.rand(1, 2)[0] + prob_q = np.array([]) + prob = backend.cast(prob, dtype=prob.dtype) + prob_q = backend.cast(prob_q, dtype=prob_q.dtype) + test = classical_relative_entropy(prob, prob_q, backend=backend) + with pytest.raises(ValueError): + prob = np.array([-1, 2.0]) + prob_q = np.random.rand(1, 5)[0] + prob = backend.cast(prob, dtype=prob.dtype) + prob_q = backend.cast(prob_q, dtype=prob_q.dtype) + test = classical_relative_entropy(prob, prob_q, backend=backend) + with pytest.raises(ValueError): + prob = np.random.rand(1, 2)[0] + prob_q = np.array([1.0, 0.0]) + prob = backend.cast(prob, dtype=prob.dtype) + prob_q = backend.cast(prob_q, dtype=prob_q.dtype) + test = classical_relative_entropy(prob, prob_q, backend=backend) + with pytest.raises(ValueError): + prob = np.array([1.0, 0.0]) + prob_q = np.random.rand(1, 2)[0] + prob = backend.cast(prob, dtype=prob.dtype) + prob_q = backend.cast(prob_q, dtype=prob_q.dtype) + test = classical_relative_entropy(prob, prob_q, backend=backend) + with pytest.raises(ValueError): + prob = np.array([1.0, 0.0]) + prob_q = np.array([0.0, 1.0]) + prob = backend.cast(prob, dtype=prob.dtype) + prob_q = backend.cast(prob_q, dtype=prob_q.dtype) + test = classical_relative_entropy(prob, prob_q, base=-2, backend=backend) + + prob_p = np.random.rand(10) + prob_q = np.random.rand(10) + prob_p /= np.sum(prob_p) + prob_q /= np.sum(prob_q) + + target = np.sum(prob_p * np.log(prob_p) / np.log(base)) - np.sum( + prob_p * np.log(prob_q) / np.log(base) + ) + + if kind is not None: + prob_p, prob_q = kind(prob_p), kind(prob_q) + + divergence = classical_relative_entropy(prob_p, prob_q, base=base, backend=backend) + + backend.assert_allclose(divergence, target, atol=1e-5) + + +@pytest.mark.parametrize("kind", [None, list]) +@pytest.mark.parametrize("base", [2, 10, np.e, 5]) +@pytest.mark.parametrize("alpha", [0, 1, 2, 3, np.inf]) +def test_classical_renyi_entropy(backend, alpha, base, kind): + with pytest.raises(TypeError): + prob = np.array([1.0, 0.0]) + prob = backend.cast(prob, dtype=prob.dtype) + test = classical_renyi_entropy(prob, alpha="2", backend=backend) + with pytest.raises(ValueError): + prob = np.array([1.0, 0.0]) + prob = backend.cast(prob, dtype=prob.dtype) + test = classical_renyi_entropy(prob, alpha=-2, backend=backend) + with pytest.raises(TypeError): + prob = np.array([1.0, 0.0]) + prob = backend.cast(prob, dtype=prob.dtype) + test = classical_renyi_entropy(prob, alpha, base="2", backend=backend) + with pytest.raises(ValueError): + prob = np.array([1.0, 0.0]) + prob = backend.cast(prob, dtype=prob.dtype) + test = classical_renyi_entropy(prob, alpha, base=-2, backend=backend) + with pytest.raises(TypeError): + prob = np.array([[1.0], [0.0]]) + prob = backend.cast(prob, dtype=prob.dtype) + test = classical_renyi_entropy(prob, alpha, backend=backend) + with pytest.raises(TypeError): + prob = np.array([]) + prob = backend.cast(prob, dtype=prob.dtype) + test = classical_renyi_entropy(prob, alpha, backend=backend) + with pytest.raises(ValueError): + prob = np.array([1.0, -1.0]) + prob = backend.cast(prob, dtype=prob.dtype) + test = classical_renyi_entropy(prob, alpha, backend=backend) + with pytest.raises(ValueError): + prob = np.array([1.1, 0.0]) + prob = backend.cast(prob, dtype=prob.dtype) + test = classical_renyi_entropy(prob, alpha, backend=backend) + with pytest.raises(ValueError): + prob = np.array([0.5, 0.4999999]) + prob = backend.cast(prob, dtype=prob.dtype) + test = classical_renyi_entropy(prob, alpha, backend=backend) + + prob_dist = np.random.rand(10) + prob_dist /= np.sum(prob_dist) + + if alpha == 0.0: + target = np.log2(len(prob_dist)) / np.log2(base) + elif alpha == 1: + target = shannon_entropy(prob_dist, base=base, backend=backend) + elif alpha == 2: + target = -1 * np.log2(np.sum(prob_dist**2)) / np.log2(base) + elif alpha == np.inf: + target = -1 * np.log2(max(prob_dist)) / np.log2(base) + else: + target = (1 / (1 - alpha)) * np.log2(np.sum(prob_dist**alpha)) / np.log2(base) + + if kind is not None: + prob_dist = kind(prob_dist) + + renyi_ent = classical_renyi_entropy(prob_dist, alpha, base=base, backend=backend) + + backend.assert_allclose(renyi_ent, target, atol=1e-5) + + +@pytest.mark.parametrize("kind", [None, list]) +@pytest.mark.parametrize("base", [2, 10, np.e, 5]) +@pytest.mark.parametrize("alpha", [0, 1 / 2, 1, 2, 3, np.inf]) +def test_classical_relative_renyi_entropy(backend, alpha, base, kind): + with pytest.raises(TypeError): + prob = np.random.rand(1, 2) + prob_q = np.random.rand(1, 5) + prob = backend.cast(prob, dtype=prob.dtype) + prob_q = backend.cast(prob_q, dtype=prob_q.dtype) + test = classical_relative_renyi_entropy( + prob, prob_q, alpha, base, backend=backend + ) + with pytest.raises(TypeError): + prob = np.random.rand(1, 2)[0] + prob_q = np.array([]) + prob = backend.cast(prob, dtype=prob.dtype) + prob_q = backend.cast(prob_q, dtype=prob_q.dtype) + test = classical_relative_renyi_entropy( + prob, prob_q, alpha, base, backend=backend + ) + with pytest.raises(ValueError): + prob = np.array([-1, 2.0]) + prob_q = np.random.rand(1, 5)[0] + prob = backend.cast(prob, dtype=prob.dtype) + prob_q = backend.cast(prob_q, dtype=prob_q.dtype) + test = classical_relative_renyi_entropy( + prob, prob_q, alpha, base, backend=backend + ) + with pytest.raises(ValueError): + prob = np.random.rand(1, 2)[0] + prob_q = np.array([1.0, 0.0]) + prob = backend.cast(prob, dtype=prob.dtype) + prob_q = backend.cast(prob_q, dtype=prob_q.dtype) + test = classical_relative_renyi_entropy( + prob, prob_q, alpha, base, backend=backend + ) + with pytest.raises(ValueError): + prob = np.array([1.0, 0.0]) + prob_q = np.random.rand(1, 2)[0] + prob = backend.cast(prob, dtype=prob.dtype) + prob_q = backend.cast(prob_q, dtype=prob_q.dtype) + test = classical_relative_renyi_entropy( + prob, prob_q, alpha, base, backend=backend + ) + with pytest.raises(ValueError): + prob = np.array([1.0, 0.0]) + prob_q = np.array([0.0, 1.0]) + prob = backend.cast(prob, dtype=prob.dtype) + prob_q = backend.cast(prob_q, dtype=prob_q.dtype) + test = classical_relative_renyi_entropy( + prob, prob_q, alpha, base=-2, backend=backend + ) + with pytest.raises(TypeError): + prob = np.array([1.0, 0.0]) + prob_q = np.array([0.0, 1.0]) + prob = backend.cast(prob, dtype=prob.dtype) + prob_q = backend.cast(prob_q, dtype=prob_q.dtype) + test = classical_relative_renyi_entropy( + prob, prob_q, alpha="1", base=base, backend=backend + ) + with pytest.raises(ValueError): + prob = np.array([1.0, 0.0]) + prob_q = np.array([0.0, 1.0]) + prob = backend.cast(prob, dtype=prob.dtype) + prob_q = backend.cast(prob_q, dtype=prob_q.dtype) + test = classical_relative_renyi_entropy( + prob, prob_q, alpha=-2, base=base, backend=backend + ) + + prob_p = np.random.rand(10) + prob_q = np.random.rand(10) + prob_p /= np.sum(prob_p) + prob_q /= np.sum(prob_q) + + if alpha == 0.5: + target = -2 * np.log2(np.sum(np.sqrt(prob_p * prob_q))) / np.log2(base) + elif alpha == 1.0: + target = classical_relative_entropy(prob_p, prob_q, base=base, backend=backend) + elif alpha == np.inf: + target = np.log2(max(prob_p / prob_q)) / np.log2(base) + else: + target = ( + (1 / (alpha - 1)) + * np.log2(np.sum(prob_p**alpha * prob_q ** (1 - alpha))) + / np.log2(base) + ) + + if kind is not None: + prob_p, prob_q = kind(prob_p), kind(prob_q) + + divergence = classical_relative_renyi_entropy( + prob_p, prob_q, alpha=alpha, base=base, backend=backend + ) + + backend.assert_allclose(divergence, target, atol=1e-5) + + +@pytest.mark.parametrize("kind", [None, list]) +@pytest.mark.parametrize("base", [2, 10, np.e, 5]) +@pytest.mark.parametrize("alpha", [0, 1, 2, 3]) +def test_classical_tsallis_entropy(backend, alpha, base, kind): + with pytest.raises(TypeError): + prob = np.array([1.0, 0.0]) + prob = backend.cast(prob, dtype=prob.dtype) + test = classical_tsallis_entropy(prob, alpha="2", backend=backend) + with pytest.raises(ValueError): + prob = np.array([1.0, 0.0]) + prob = backend.cast(prob, dtype=prob.dtype) + test = classical_tsallis_entropy(prob, alpha=-2, backend=backend) + with pytest.raises(TypeError): + prob = np.array([1.0, 0.0]) + prob = backend.cast(prob, dtype=prob.dtype) + test = classical_tsallis_entropy(prob, alpha, base="2", backend=backend) + with pytest.raises(ValueError): + prob = np.array([1.0, 0.0]) + prob = backend.cast(prob, dtype=prob.dtype) + test = classical_tsallis_entropy(prob, alpha, base=-2, backend=backend) + with pytest.raises(TypeError): + prob = np.array([[1.0], [0.0]]) + prob = backend.cast(prob, dtype=prob.dtype) + test = classical_tsallis_entropy(prob, alpha, backend=backend) + with pytest.raises(TypeError): + prob = np.array([]) + prob = backend.cast(prob, dtype=prob.dtype) + test = classical_tsallis_entropy(prob, alpha, backend=backend) + with pytest.raises(ValueError): + prob = np.array([1.0, -1.0]) + prob = backend.cast(prob, dtype=prob.dtype) + test = classical_tsallis_entropy(prob, alpha, backend=backend) + with pytest.raises(ValueError): + prob = np.array([1.1, 0.0]) + prob = backend.cast(prob, dtype=prob.dtype) + test = classical_tsallis_entropy(prob, alpha, backend=backend) + with pytest.raises(ValueError): + prob = np.array([0.5, 0.4999999]) + prob = backend.cast(prob, dtype=prob.dtype) + test = classical_tsallis_entropy(prob, alpha, backend=backend) + + prob_dist = np.random.rand(10) + prob_dist /= np.sum(prob_dist) + + if alpha == 1.0: + target = shannon_entropy(prob_dist, base=base, backend=backend) + else: + target = (1 / (1 - alpha)) * (np.sum(prob_dist**alpha) - 1) + + if kind is not None: + prob_dist = kind(prob_dist) + + backend.assert_allclose( + classical_tsallis_entropy(prob_dist, alpha=alpha, base=base, backend=backend), + target, + atol=1e-5, + ) + + +@pytest.mark.parametrize("check_hermitian", [False, True]) +@pytest.mark.parametrize("base", [2, 10, np.e, 5]) +def test_von_neumann_entropy(backend, base, check_hermitian): + with pytest.raises(TypeError): + state = np.random.rand(2, 3) + state = backend.cast(state, dtype=state.dtype) + test = von_neumann_entropy( + state, base=base, check_hermitian=check_hermitian, backend=backend + ) + with pytest.raises(ValueError): + state = np.array([1.0, 0.0]) + state = backend.cast(state, dtype=state.dtype) + test = von_neumann_entropy( + state, base=0, check_hermitian=check_hermitian, backend=backend + ) + with pytest.raises(TypeError): + state = np.array([1.0, 0.0]) + state = backend.cast(state, dtype=state.dtype) + test = von_neumann_entropy( + state, base=base, check_hermitian="False", backend=backend + ) + + if backend.__class__.__name__ in ["CupyBackend", "CuQuantumBackend"]: + with pytest.raises(NotImplementedError): + state = random_unitary(4, backend=backend) + test = von_neumann_entropy( + state, base=base, check_hermitian=True, backend=backend + ) + else: + state = random_unitary(4, backend=backend) + test = von_neumann_entropy( + state, base=base, check_hermitian=True, backend=backend + ) + + state = np.array([1.0, 0.0]) + state = backend.cast(state, dtype=state.dtype) + backend.assert_allclose( + von_neumann_entropy(state, backend=backend), 0.0, atol=PRECISION_TOL + ) + + state = np.array([1.0, 0.0, 0.0, 0.0]) + state = np.outer(state, state) + state = backend.cast(state, dtype=state.dtype) + + nqubits = 2 + state = backend.identity_density_matrix(nqubits) + if base == 2: + test = 2.0 + elif base == 10: + test = 0.6020599913279624 + elif base == np.e: + test = 1.3862943611198906 + else: + test = 0.8613531161467861 + + backend.assert_allclose( + von_neumann_entropy( + state, base, check_hermitian=check_hermitian, backend=backend + ), + test, + ) + + +@pytest.mark.parametrize("check_hermitian", [False, True]) +@pytest.mark.parametrize("base", [2, 10, np.e, 5]) +def test_relative_entropy(backend, base, check_hermitian): + with pytest.raises(TypeError): + state = np.random.rand(2, 3) + state = backend.cast(state, dtype=state.dtype) + target = random_density_matrix(2, pure=True, backend=backend) + test = relative_von_neumann_entropy( + state, target, base=base, check_hermitian=check_hermitian, backend=backend + ) + with pytest.raises(TypeError): + target = np.random.rand(2, 3) + target = backend.cast(target, dtype=target.dtype) + state = random_density_matrix(2, pure=True, backend=backend) + test = relative_von_neumann_entropy( + state, target, base=base, check_hermitian=check_hermitian, backend=backend + ) + with pytest.raises(ValueError): + state = np.array([1.0, 0.0]) + state = backend.cast(state, dtype=state.dtype) + target = np.array([0.0, 1.0]) + target = backend.cast(target, dtype=target.dtype) + test = relative_von_neumann_entropy( + state, target, base=0, check_hermitian=check_hermitian, backend=backend + ) + with pytest.raises(TypeError): + state = np.array([1.0, 0.0]) + state = backend.cast(state, dtype=state.dtype) + target = np.array([0.0, 1.0]) + target = backend.cast(target, dtype=target.dtype) + test = relative_von_neumann_entropy( + state, target, base=base, check_hermitian="False", backend=backend + ) + + nqubits = 2 + dims = 2**nqubits + + state = random_density_matrix(dims, backend=backend) + target = backend.identity_density_matrix(nqubits, normalize=True) + + backend.assert_allclose( + relative_von_neumann_entropy(state, target, base, check_hermitian, backend), + np.log(dims) / np.log(base) + - von_neumann_entropy( + state, base=base, check_hermitian=check_hermitian, backend=backend + ), + atol=1e-5, + ) + + state = backend.cast([1.0, 0.0], dtype=np.float64) + target = backend.cast([0.0, 1.0], dtype=np.float64) + + assert relative_von_neumann_entropy(state, target, backend=backend) == 0.0 + + # for coverage when GPUs are present + if backend.__class__.__name__ in ["CupyBackend", "CuQuantumBackend"]: + with pytest.raises(NotImplementedError): + state = random_unitary(4, backend=backend) + target = random_density_matrix(4, backend=backend) + test = relative_von_neumann_entropy( + state, target, base=base, check_hermitian=True, backend=backend + ) + with pytest.raises(NotImplementedError): + target = random_unitary(4, backend=backend) + state = random_density_matrix(4, backend=backend) + test = relative_von_neumann_entropy( + state, target, base=base, check_hermitian=True, backend=backend + ) + else: + state = random_unitary(4, backend=backend) + target = random_unitary(4, backend=backend) + test = relative_von_neumann_entropy( + state, target, base=base, check_hermitian=True, backend=backend + ) + + +@pytest.mark.parametrize("base", [2, 10, np.e, 5]) +@pytest.mark.parametrize("alpha", [0, 1, 2, 3, np.inf]) +def test_renyi_entropy(backend, alpha, base): + with pytest.raises(TypeError): + state = np.random.rand(2, 3) + state = backend.cast(state, dtype=state.dtype) + test = renyi_entropy(state, alpha=alpha, base=base, backend=backend) + with pytest.raises(TypeError): + state = random_statevector(4, backend=backend) + test = renyi_entropy(state, alpha="2", base=base, backend=backend) + with pytest.raises(ValueError): + state = random_statevector(4, backend=backend) + test = renyi_entropy(state, alpha=-1, base=base, backend=backend) + with pytest.raises(ValueError): + state = random_statevector(4, backend=backend) + test = renyi_entropy(state, alpha=alpha, base=0, backend=backend) + + state = random_density_matrix(4, backend=backend) + + if alpha == 0.0: + target = np.log2(len(state)) / np.log2(base) + elif alpha == 1.0: + target = von_neumann_entropy(state, base=base, backend=backend) + elif alpha == np.inf: + target = backend.calculate_norm_density_matrix(state, order=2) + target = -1 * np.log2(target) / np.log2(base) + else: + target = np.log2(np.trace(np.linalg.matrix_power(state, alpha))) + target = (1 / (1 - alpha)) * target / np.log2(base) + + backend.assert_allclose( + renyi_entropy(state, alpha=alpha, base=base, backend=backend), target, atol=1e-5 + ) + + # test pure state + state = random_density_matrix(4, pure=True, backend=backend) + backend.assert_allclose( + renyi_entropy(state, alpha=alpha, base=base, backend=backend), 0.0, atol=1e-8 + ) + + +@pytest.mark.parametrize( + ["state_flag", "target_flag"], [[True, True], [False, True], [True, False]] +) +@pytest.mark.parametrize("base", [2, 10, np.e, 5]) +@pytest.mark.parametrize("alpha", [0, 1, 2, 3, 5.4, np.inf]) +def test_relative_renyi_entropy(backend, alpha, base, state_flag, target_flag): + with pytest.raises(TypeError): + state = np.random.rand(2, 3) + state = backend.cast(state, dtype=state.dtype) + target = random_density_matrix(4, backend=backend) + test = relative_renyi_entropy( + state, target, alpha=alpha, base=base, backend=backend + ) + with pytest.raises(TypeError): + target = np.random.rand(2, 3) + target = backend.cast(target, dtype=target.dtype) + state = random_density_matrix(4, backend=backend) + test = relative_renyi_entropy( + state, target, alpha=alpha, base=base, backend=backend + ) + with pytest.raises(TypeError): + state = random_statevector(4, backend=backend) + target = random_statevector(4, backend=backend) + test = relative_renyi_entropy( + state, target, alpha="2", base=base, backend=backend + ) + with pytest.raises(ValueError): + state = random_statevector(4, backend=backend) + target = random_statevector(4, backend=backend) + test = relative_renyi_entropy( + state, target, alpha=-1, base=base, backend=backend + ) + with pytest.raises(ValueError): + state = random_statevector(4, backend=backend) + target = random_statevector(4, backend=backend) + test = relative_renyi_entropy( + state, target, alpha=alpha, base=0, backend=backend + ) + + state = ( + random_statevector(4, backend=backend) + if state_flag + else random_density_matrix(4, backend=backend) + ) + target = ( + random_statevector(4, backend=backend) + if target_flag + else random_density_matrix(4, backend=backend) + ) + + if state_flag and target_flag: + backend.assert_allclose( + relative_renyi_entropy(state, target, alpha, base, backend), 0.0, atol=1e-5 + ) + else: + if target_flag and alpha > 1: + with pytest.raises(NotImplementedError): + relative_renyi_entropy(state, target, alpha, base, backend) + else: + if alpha == 1.0: + log = relative_von_neumann_entropy(state, target, base, backend=backend) + elif alpha == np.inf: + new_state = _matrix_power(state, 0.5, backend) + new_target = _matrix_power(target, 0.5, backend) + + log = np.log2( + backend.calculate_norm_density_matrix( + new_state @ new_target, order=1 + ) + ) + + log = -2 * log / np.log2(base) + else: + if len(state.shape) == 1: + state = np.outer(state, np.conj(state)) + + if len(target.shape) == 1: + target = np.outer(target, np.conj(target)) + + log = _matrix_power(state, alpha, backend) + log = log @ _matrix_power(target, 1 - alpha, backend) + log = np.log2(np.trace(log)) + + log = (1 / (alpha - 1)) * log / np.log2(base) + + backend.assert_allclose( + relative_renyi_entropy( + state, target, alpha=alpha, base=base, backend=backend + ), + log, + atol=1e-5, + ) + + # test pure states + state = random_density_matrix(4, pure=True, backend=backend) + target = random_density_matrix(4, pure=True, backend=backend) + backend.assert_allclose( + relative_renyi_entropy(state, target, alpha=alpha, base=base, backend=backend), + 0.0, + atol=1e-8, + ) + + +@pytest.mark.parametrize("base", [2, 10, np.e, 5]) +@pytest.mark.parametrize("alpha", [0, 1, 2, 3, 5.4]) +def test_tsallis_entropy(backend, alpha, base): + with pytest.raises(TypeError): + state = np.random.rand(2, 3) + state = backend.cast(state, dtype=state.dtype) + test = tsallis_entropy(state, alpha=alpha, base=base, backend=backend) + with pytest.raises(TypeError): + state = random_statevector(4, backend=backend) + test = tsallis_entropy(state, alpha="2", base=base, backend=backend) + with pytest.raises(ValueError): + state = random_statevector(4, backend=backend) + test = tsallis_entropy(state, alpha=-1, base=base, backend=backend) + with pytest.raises(ValueError): + state = random_statevector(4, backend=backend) + test = tsallis_entropy(state, alpha=alpha, base=0, backend=backend) + + state = random_density_matrix(4, backend=backend) + + if alpha == 1.0: + target = von_neumann_entropy(state, base=base, backend=backend) + else: + target = (1 / (1 - alpha)) * ( + np.trace(_matrix_power(state, alpha, backend)) - 1 + ) + + backend.assert_allclose( + tsallis_entropy(state, alpha=alpha, base=base, backend=backend), + target, + atol=1e-5, + ) + + # test pure state + state = random_density_matrix(4, pure=True, backend=backend) + backend.assert_allclose( + tsallis_entropy(state, alpha=alpha, base=base, backend=backend), 0.0, atol=1e-5 + ) + + +@pytest.mark.parametrize("check_hermitian", [False, True]) +@pytest.mark.parametrize("base", [2, 10, np.e, 5]) +@pytest.mark.parametrize("bipartition", [[0], [1]]) +def test_entanglement_entropy(backend, bipartition, base, check_hermitian): + with pytest.raises(TypeError): + state = np.random.rand(2, 3) + state = backend.cast(state, dtype=state.dtype) + test = entanglement_entropy( + state, + bipartition=bipartition, + base=base, + check_hermitian=check_hermitian, + backend=backend, + ) + with pytest.raises(ValueError): + state = np.array([1.0, 0.0]) + state = backend.cast(state, dtype=state.dtype) + test = entanglement_entropy( + state, + bipartition=bipartition, + base=0, + check_hermitian=check_hermitian, + backend=backend, + ) + if backend.__class__.__name__ == "CupyBackend": + with pytest.raises(NotImplementedError): + state = random_unitary(4, backend=backend) + test = entanglement_entropy( + state, + bipartition=bipartition, + base=base, + check_hermitian=True, + backend=backend, + ) + + # Bell state + state = np.array([1.0, 0.0, 0.0, 1.0]) / np.sqrt(2) + state = backend.cast(state, dtype=state.dtype) + + entang_entrop = entanglement_entropy( + state, + bipartition=bipartition, + base=base, + check_hermitian=check_hermitian, + backend=backend, + ) + + if base == 2: + test = 1.0 + elif base == 10: + test = 0.30102999566398125 + elif base == np.e: + test = 0.6931471805599454 + else: + test = 0.4306765580733931 + + backend.assert_allclose(entang_entrop, test, atol=PRECISION_TOL) + + # Product state + state = np.kron( + random_statevector(2, backend=backend), random_statevector(2, backend=backend) + ) + + entang_entrop = entanglement_entropy( + state, + bipartition=bipartition, + base=base, + check_hermitian=check_hermitian, + backend=backend, + ) + + backend.assert_allclose(entang_entrop, 0.0, atol=PRECISION_TOL) diff --git a/tests/test_quantum_info_metrics.py b/tests/test_quantum_info_metrics.py index 0e7b86f21b..793bb510a5 100644 --- a/tests/test_quantum_info_metrics.py +++ b/tests/test_quantum_info_metrics.py @@ -7,13 +7,7 @@ average_gate_fidelity, bures_angle, bures_distance, - concurrence, diamond_norm, - entanglement_entropy, - entanglement_fidelity, - entanglement_of_formation, - entangling_capability, - entropy, expressibility, fidelity, frame_potential, @@ -21,7 +15,6 @@ hilbert_schmidt_distance, impurity, infidelity, - meyer_wallach_entanglement, process_fidelity, process_infidelity, purity, @@ -30,7 +23,6 @@ from qibo.quantum_info.random_ensembles import ( random_density_matrix, random_hermitian, - random_statevector, random_unitary, ) from qibo.quantum_info.superoperator_transformations import to_choi @@ -59,183 +51,6 @@ def test_purity_and_impurity(backend): backend.assert_allclose(impurity(state), 1.0 - 1.0 / dim, atol=PRECISION_TOL) -@pytest.mark.parametrize("check_purity", [True, False]) -@pytest.mark.parametrize("base", [2, 10, np.e, 5]) -@pytest.mark.parametrize("bipartition", [[0], [1]]) -def test_concurrence_and_formation(backend, bipartition, base, check_purity): - with pytest.raises(TypeError): - state = np.random.rand(2, 3) - state = backend.cast(state, dtype=state.dtype) - test = concurrence( - state, bipartition=bipartition, check_purity=check_purity, backend=backend - ) - with pytest.raises(TypeError): - state = random_statevector(4, backend=backend) - test = concurrence( - state, bipartition=bipartition, check_purity="True", backend=backend - ) - - if check_purity is True: - with pytest.raises(NotImplementedError): - state = backend.identity_density_matrix(2, normalize=False) - test = concurrence(state, bipartition=bipartition, backend=backend) - - nqubits = 2 - dim = 2**nqubits - state = random_statevector(dim, backend=backend) - concur = concurrence( - state, bipartition=bipartition, check_purity=check_purity, backend=backend - ) - ent_form = entanglement_of_formation( - state, - bipartition=bipartition, - base=base, - check_purity=check_purity, - backend=backend, - ) - backend.assert_allclose(0.0 <= concur <= np.sqrt(2), True) - backend.assert_allclose(0.0 <= ent_form <= 1.0, True) - - state = np.kron( - random_density_matrix(2, pure=True, backend=backend), - random_density_matrix(2, pure=True, backend=backend), - ) - concur = concurrence(state, bipartition, check_purity=check_purity, backend=backend) - ent_form = entanglement_of_formation( - state, - bipartition=bipartition, - base=base, - check_purity=check_purity, - backend=backend, - ) - backend.assert_allclose(concur, 0.0, atol=10 * PRECISION_TOL) - backend.assert_allclose(ent_form, 0.0, atol=PRECISION_TOL) - - -@pytest.mark.parametrize("check_hermitian", [False, True]) -@pytest.mark.parametrize("base", [2, 10, np.e, 5]) -def test_entropy(backend, base, check_hermitian): - with pytest.raises(TypeError): - state = np.random.rand(2, 3) - state = backend.cast(state, dtype=state.dtype) - test = entropy( - state, base=base, check_hermitian=check_hermitian, backend=backend - ) - with pytest.raises(ValueError): - state = np.array([1.0, 0.0]) - state = backend.cast(state, dtype=state.dtype) - test = entropy(state, base=0, check_hermitian=check_hermitian, backend=backend) - with pytest.raises(TypeError): - state = np.array([1.0, 0.0]) - state = backend.cast(state, dtype=state.dtype) - test = entropy(state, base=base, check_hermitian="False", backend=backend) - - if backend.__class__.__name__ in ["CupyBackend", "CuQuantumBackend"]: - with pytest.raises(NotImplementedError): - state = random_unitary(4, backend=backend) - test = entropy(state, base=base, check_hermitian=True, backend=backend) - else: - state = random_unitary(4, backend=backend) - test = entropy(state, base=base, check_hermitian=True, backend=backend) - - state = np.array([1.0, 0.0]) - state = backend.cast(state, dtype=state.dtype) - backend.assert_allclose(entropy(state, backend=backend), 0.0, atol=PRECISION_TOL) - - state = np.array([1.0, 0.0, 0.0, 0.0]) - state = np.outer(state, state) - state = backend.cast(state, dtype=state.dtype) - - nqubits = 2 - state = backend.identity_density_matrix(nqubits) - if base == 2: - test = 2.0 - elif base == 10: - test = 0.6020599913279624 - elif base == np.e: - test = 1.3862943611198906 - else: - test = 0.8613531161467861 - - backend.assert_allclose( - entropy(state, base, check_hermitian=check_hermitian, backend=backend), test - ) - - -@pytest.mark.parametrize("check_hermitian", [False, True]) -@pytest.mark.parametrize("base", [2, 10, np.e, 5]) -@pytest.mark.parametrize("bipartition", [[0], [1]]) -def test_entanglement_entropy(backend, bipartition, base, check_hermitian): - with pytest.raises(TypeError): - state = np.random.rand(2, 3) - state = backend.cast(state, dtype=state.dtype) - test = entanglement_entropy( - state, - bipartition=bipartition, - base=base, - check_hermitian=check_hermitian, - backend=backend, - ) - with pytest.raises(ValueError): - state = np.array([1.0, 0.0]) - state = backend.cast(state, dtype=state.dtype) - test = entanglement_entropy( - state, - bipartition=bipartition, - base=0, - check_hermitian=check_hermitian, - backend=backend, - ) - if backend.__class__.__name__ == "CupyBackend": - with pytest.raises(NotImplementedError): - state = random_unitary(4, backend=backend) - test = entanglement_entropy( - state, - bipartition=bipartition, - base=base, - check_hermitian=True, - backend=backend, - ) - - # Bell state - state = np.array([1.0, 0.0, 0.0, 1.0]) / np.sqrt(2) - state = backend.cast(state, dtype=state.dtype) - - entang_entrop = entanglement_entropy( - state, - bipartition=bipartition, - base=base, - check_hermitian=check_hermitian, - backend=backend, - ) - - if base == 2: - test = 1.0 - elif base == 10: - test = 0.30102999566398125 - elif base == np.e: - test = 0.6931471805599454 - else: - test = 0.4306765580733931 - - backend.assert_allclose(entang_entrop, test, atol=PRECISION_TOL) - - # Product state - state = np.kron( - random_statevector(2, backend=backend), random_statevector(2, backend=backend) - ) - - entang_entrop = entanglement_entropy( - state, - bipartition=bipartition, - base=base, - check_hermitian=check_hermitian, - backend=backend, - ) - - backend.assert_allclose(entang_entrop, 0.0, atol=PRECISION_TOL) - - @pytest.mark.parametrize("check_hermitian", [False, True]) def test_trace_distance(backend, check_hermitian): with pytest.raises(TypeError): @@ -445,65 +260,6 @@ def test_fidelity_and_infidelity_and_bures(backend, check_hermitian): test = fidelity(state, target, check_hermitian=True, backend=backend) -@pytest.mark.parametrize("check_hermitian", [False, True]) -@pytest.mark.parametrize("nqubits", [4, 6]) -@pytest.mark.parametrize("channel", [gates.DepolarizingChannel]) -def test_entanglement_fidelity(backend, channel, nqubits, check_hermitian): - with pytest.raises(TypeError): - test = entanglement_fidelity( - channel, nqubits=[0], check_hermitian=check_hermitian, backend=backend - ) - with pytest.raises(ValueError): - test = entanglement_fidelity( - channel, nqubits=0, check_hermitian=check_hermitian, backend=backend - ) - with pytest.raises(TypeError): - state = np.random.rand(2, 3, 2) - state = backend.cast(state, dtype=state.dtype) - test = entanglement_fidelity( - channel, - nqubits, - state=state, - check_hermitian=check_hermitian, - backend=backend, - ) - with pytest.raises(TypeError): - state = random_statevector(2, backend=backend) - test = entanglement_fidelity( - channel, nqubits, state=state, check_hermitian="False", backend=backend - ) - - channel = channel([0, 1], 0.5) - - # test on maximally entangled state - ent_fid = entanglement_fidelity( - channel, nqubits=nqubits, check_hermitian=check_hermitian, backend=backend - ) - backend.assert_allclose(ent_fid, 0.625, atol=PRECISION_TOL) - - # test with a state vector - state = backend.plus_state(nqubits) - ent_fid = entanglement_fidelity( - channel, - nqubits=nqubits, - state=state, - check_hermitian=check_hermitian, - backend=backend, - ) - backend.assert_allclose(ent_fid, 0.625, atol=PRECISION_TOL) - - # test on maximally mixed state - state = backend.identity_density_matrix(nqubits) - ent_fid = entanglement_fidelity( - channel, - nqubits=nqubits, - state=state, - check_hermitian=check_hermitian, - backend=backend, - ) - backend.assert_allclose(ent_fid, 1.0, atol=PRECISION_TOL) - - def test_process_fidelity_and_infidelity(backend): d = 2 with pytest.raises(TypeError): @@ -572,56 +328,6 @@ def test_diamond_norm(backend, nqubits): backend.assert_allclose(dnorm, 0.0, atol=PRECISION_TOL) -def test_meyer_wallach_entanglement(backend): - nqubits = 2 - - circuit1 = Circuit(nqubits) - circuit1.add([gates.RX(0, np.pi / 4)] for _ in range(nqubits)) - - circuit2 = Circuit(nqubits) - circuit2.add([gates.RX(0, np.pi / 4)] for _ in range(nqubits)) - circuit2.add(gates.CNOT(0, 1)) - - backend.assert_allclose( - meyer_wallach_entanglement(circuit1, backend=backend), 0.0, atol=PRECISION_TOL - ) - - backend.assert_allclose( - meyer_wallach_entanglement(circuit2, backend=backend), 0.5, atol=PRECISION_TOL - ) - - -@pytest.mark.parametrize("seed", [None, 10, np.random.default_rng(10)]) -def test_entangling_capability(backend, seed): - with pytest.raises(TypeError): - circuit = Circuit(1) - samples = 0.5 - entangling_capability(circuit, samples, seed=seed, backend=backend) - with pytest.raises(TypeError): - circuit = Circuit(1) - entangling_capability(circuit, samples=10, seed="10", backend=backend) - - nqubits = 2 - samples = 100 - - c1 = Circuit(nqubits) - c1.add([gates.RX(q, 0, trainable=True) for q in range(nqubits)]) - c1.add(gates.CNOT(0, 1)) - c1.add([gates.RX(q, 0, trainable=True) for q in range(nqubits)]) - ent_mw1 = entangling_capability(c1, samples, seed=seed, backend=backend) - - c2 = Circuit(nqubits) - c2.add(gates.H(0)) - c2.add(gates.CNOT(0, 1)) - c2.add(gates.RX(0, 0, trainable=True)) - ent_mw2 = entangling_capability(c2, samples, seed=seed, backend=backend) - - c3 = Circuit(nqubits) - ent_mw3 = entangling_capability(c3, samples, seed=seed, backend=backend) - - backend.assert_allclose(ent_mw3 < ent_mw1 < ent_mw2, True) - - def test_expressibility(backend): with pytest.raises(TypeError): circuit = Circuit(1) diff --git a/tests/test_quantum_info_quantum_networks.py b/tests/test_quantum_info_quantum_networks.py index a84103ece5..1f20a97b45 100644 --- a/tests/test_quantum_info_quantum_networks.py +++ b/tests/test_quantum_info_quantum_networks.py @@ -28,6 +28,13 @@ def test_errors(backend): matrix = random_density_matrix(2**3, backend=backend) net = QuantumNetwork(matrix, (2,) * 3, backend=backend) + comb_partition = (2,) * 4 + comb_sys_out = (False, True) * 2 + comb = random_density_matrix(2**4, backend=backend) + comb_choi = QuantumNetwork( + comb, comb_partition, system_output=comb_sys_out, backend=backend + ) + with pytest.raises(TypeError): QuantumNetwork(channel.to_choi(backend=backend), partition=True) @@ -46,13 +53,13 @@ def test_errors(backend): QuantumNetwork(channel.to_choi(backend=backend), partition=(1, 2), pure="True") with pytest.raises(ValueError): - network.hermitian(precision_tol=-1e-8) + network.is_hermitian(precision_tol=-1e-8) with pytest.raises(ValueError): - network.unital(precision_tol=-1e-8) + network.is_unital(precision_tol=-1e-8) with pytest.raises(ValueError): - network.causal(precision_tol=-1e-8) + network.is_causal(precision_tol=-1e-8) with pytest.raises(TypeError): network + 1 @@ -88,9 +95,21 @@ def test_errors(backend): with pytest.raises(NotImplementedError): net @ net - with pytest.raises(ValueError): + with pytest.raises(NotImplementedError): net @ network + with pytest.raises(ValueError): + network @ net + + with pytest.raises(ValueError): + network @ QuantumNetwork(comb, (16, 16), pure=True, backend=backend) + + with pytest.raises(ValueError): + comb_choi @ QuantumNetwork(comb, (16, 16), pure=True, backend=backend) + + with pytest.raises(ValueError): + comb_choi @ net + with pytest.raises(ValueError): QuantumNetwork(matrix, (1, 2), backend=backend) @@ -155,11 +174,11 @@ def test_parameters(backend): backend.assert_allclose(network.partition, partition) backend.assert_allclose(network.system_output, (False, True)) - assert network.causal() - assert network.unital() - assert network.hermitian() - assert network.positive_semidefinite() - assert network.channel() + assert network.is_causal() + assert network.is_unital() + assert network.is_hermitian() + assert network.is_positive_semidefinite() + assert network.is_channel() def test_with_states(backend): @@ -186,8 +205,8 @@ def test_with_states(backend): state_output_link.matrix(backend=backend).reshape((dims, dims)), state_output ) - assert network_state.hermitian() - assert network_state.positive_semidefinite() + assert network_state.is_hermitian() + assert network_state.is_positive_semidefinite() @pytest.mark.parametrize("subscript", ["jk,kl->jl", "jk,lj->lk"]) @@ -223,25 +242,26 @@ def test_with_unitaries(backend, subscript): def test_with_comb(backend): - subscript = "jklm,lmno->jkno" - partition = (2,) * 4 - sys_out = (False, True) * 2 + subscript = "jklm,kl->jm" + comb_partition = (2,) * 4 + channel_partition = (2,) * 2 + comb_sys_out = (False, True) * 2 + channel_sys_out = (False, True) comb = random_density_matrix(2**4, backend=backend) - comb_2 = random_density_matrix(2**4, backend=backend) + channel = random_density_matrix(2**2, backend=backend) - comb_choi = QuantumNetwork(comb, partition, system_output=sys_out, backend=backend) - comb_choi_2 = QuantumNetwork( - comb_2, partition, system_output=sys_out, backend=backend + comb_choi = QuantumNetwork( + comb, comb_partition, system_output=comb_sys_out, backend=backend + ) + channel_choi = QuantumNetwork( + channel, channel_partition, system_output=channel_sys_out, backend=backend ) - comb_choi_3 = QuantumNetwork( - comb @ comb_2, partition, system_output=sys_out, backend=backend - ).to_full(backend) - test = comb_choi.link_product(comb_choi_2, subscript).to_full(backend) + test = comb_choi.link_product(channel_choi, subscript).to_full(backend) + channel_choi2 = comb_choi @ channel_choi - backend.assert_allclose(test, comb_choi_3, atol=1e-5) - backend.assert_allclose(test, (comb_choi @ comb_choi_2).to_full(backend), atol=1e-5) + backend.assert_allclose(test, channel_choi2.to_full(backend), atol=1e-5) def test_apply(backend): @@ -265,9 +285,9 @@ def test_non_hermitian_and_prints(backend): matrix = random_gaussian_matrix(dims**2, backend=backend) network = QuantumNetwork(matrix, (dims, dims), pure=False, backend=backend) - assert not network.hermitian() - assert not network.causal() - assert not network.positive_semidefinite() - assert not network.channel() + assert not network.is_hermitian() + assert not network.is_causal() + assert not network.is_positive_semidefinite() + assert not network.is_channel() assert network.__str__() == "J[4 -> 4]" diff --git a/tests/test_quantum_info_random.py b/tests/test_quantum_info_random.py index bafb4efa84..0749723637 100644 --- a/tests/test_quantum_info_random.py +++ b/tests/test_quantum_info_random.py @@ -223,27 +223,22 @@ def test_random_quantum_channel(backend, representation, measure, rank, order): ) -@pytest.mark.parametrize("haar", [False, True]) @pytest.mark.parametrize("seed", [None, 10, np.random.default_rng(10)]) -def test_random_statevector(backend, haar, seed): +def test_random_statevector(backend, seed): with pytest.raises(TypeError): dims = "10" random_statevector(dims, backend=backend) with pytest.raises(ValueError): dims = 0 random_statevector(dims, backend=backend) - with pytest.raises(TypeError): - dims = 2 - random_statevector(dims, haar=1, backend=backend) with pytest.raises(TypeError): dims = 2 random_statevector(dims, seed=0.1, backend=backend) # tests if random statevector is a pure state dims = 4 - state = random_statevector(dims, haar=haar, seed=seed, backend=backend) - backend.assert_allclose(purity(state) <= 1.0 + PRECISION_TOL, True) - backend.assert_allclose(purity(state) >= 1.0 - PRECISION_TOL, True) + state = random_statevector(dims, seed=seed, backend=backend) + backend.assert_allclose(abs(purity(state) - 1.0) < PRECISION_TOL, True) @pytest.mark.parametrize("normalize", [False, True]) diff --git a/tests/test_quantum_info_utils.py b/tests/test_quantum_info_utils.py index fa121d1eb5..049f800275 100644 --- a/tests/test_quantum_info_utils.py +++ b/tests/test_quantum_info_utils.py @@ -15,8 +15,6 @@ hellinger_distance, hellinger_fidelity, pqc_integral, - shannon_entropy, - total_variation_distance, ) @@ -124,95 +122,6 @@ def test_hadamard_transform(backend, nqubits, implementation, is_matrix): backend.assert_allclose(transformed, test_transformed, atol=PRECISION_TOL) -def test_shannon_entropy_errors(backend): - with pytest.raises(ValueError): - prob = np.array([1.0, 0.0]) - prob = backend.cast(prob, dtype=prob.dtype) - test = shannon_entropy(prob, -2, backend=backend) - with pytest.raises(TypeError): - prob = np.array([[1.0], [0.0]]) - prob = backend.cast(prob, dtype=prob.dtype) - test = shannon_entropy(prob, backend=backend) - with pytest.raises(TypeError): - prob = np.array([]) - prob = backend.cast(prob, dtype=prob.dtype) - test = shannon_entropy(prob, backend=backend) - with pytest.raises(ValueError): - prob = np.array([1.0, -1.0]) - prob = backend.cast(prob, dtype=prob.dtype) - test = shannon_entropy(prob, backend=backend) - with pytest.raises(ValueError): - prob = np.array([1.1, 0.0]) - prob = backend.cast(prob, dtype=prob.dtype) - test = shannon_entropy(prob, backend=backend) - with pytest.raises(ValueError): - prob = np.array([0.5, 0.4999999]) - prob = backend.cast(prob, dtype=prob.dtype) - test = shannon_entropy(prob, backend=backend) - - -@pytest.mark.parametrize("base", [2, 10, np.e, 5]) -def test_shannon_entropy(backend, base): - prob_array = [1.0, 0.0] - result = shannon_entropy(prob_array, base, backend=backend) - backend.assert_allclose(result, 0.0) - - if base == 2: - prob_array = np.array([0.5, 0.5]) - prob_array = backend.cast(prob_array, dtype=prob_array.dtype) - result = shannon_entropy(prob_array, base, backend=backend) - backend.assert_allclose(result, 1.0) - - -@pytest.mark.parametrize("kind", [None, list]) -@pytest.mark.parametrize("validate", [False, True]) -def test_total_variation_distance(backend, validate, kind): - with pytest.raises(TypeError): - prob = np.random.rand(1, 2) - prob_q = np.random.rand(1, 5) - prob = backend.cast(prob, dtype=prob.dtype) - prob_q = backend.cast(prob_q, dtype=prob_q.dtype) - test = total_variation_distance(prob, prob_q, backend=backend) - with pytest.raises(TypeError): - prob = np.random.rand(1, 2)[0] - prob_q = np.array([]) - prob = backend.cast(prob, dtype=prob.dtype) - prob_q = backend.cast(prob_q, dtype=prob_q.dtype) - test = total_variation_distance(prob, prob_q, backend=backend) - with pytest.raises(ValueError): - prob = np.array([-1, 2.0]) - prob_q = np.random.rand(1, 5)[0] - prob = backend.cast(prob, dtype=prob.dtype) - prob_q = backend.cast(prob_q, dtype=prob_q.dtype) - test = total_variation_distance(prob, prob_q, validate=True, backend=backend) - with pytest.raises(ValueError): - prob = np.random.rand(1, 2)[0] - prob_q = np.array([1.0, 0.0]) - prob = backend.cast(prob, dtype=prob.dtype) - prob_q = backend.cast(prob_q, dtype=prob_q.dtype) - test = total_variation_distance(prob, prob_q, validate=True, backend=backend) - with pytest.raises(ValueError): - prob = np.array([1.0, 0.0]) - prob_q = np.random.rand(1, 2)[0] - prob = backend.cast(prob, dtype=prob.dtype) - prob_q = backend.cast(prob_q, dtype=prob_q.dtype) - test = total_variation_distance(prob, prob_q, validate=True, backend=backend) - - prob_p = np.random.rand(10) - prob_q = np.random.rand(10) - prob_p /= np.sum(prob_p) - prob_q /= np.sum(prob_q) - - target = 0.5 * np.sum(np.abs(prob_p - prob_q)) - - if kind is not None: - prob_p, prob_q = kind(prob_p), kind(prob_q) - - distance = total_variation_distance(prob_p, prob_q, validate, backend=backend) - - backend.assert_allclose(distance, target, atol=1e-5) - - @pytest.mark.parametrize("kind", [None, list]) @pytest.mark.parametrize("validate", [False, True]) def test_hellinger(backend, validate, kind): diff --git a/tests/test_transpiler_pipeline.py b/tests/test_transpiler_pipeline.py index ce8afee66d..94d2c4b539 100644 --- a/tests/test_transpiler_pipeline.py +++ b/tests/test_transpiler_pipeline.py @@ -237,6 +237,7 @@ def test_custom_passes_restict(gates, placer, routing): final_layout=final_layout, native_gates=NativeGates.default(), ) + assert transpiled_circ.wire_names == ["q1", "q2", "q3"] def test_custom_passes_multiple_placer(): diff --git a/tests/test_transpiler_placer.py b/tests/test_transpiler_placer.py index 434037e7a4..801304bc31 100644 --- a/tests/test_transpiler_placer.py +++ b/tests/test_transpiler_placer.py @@ -9,6 +9,7 @@ Custom, Random, ReverseTraversal, + StarConnectivityPlacer, Subgraph, Trivial, _find_gates_qubits_pairs, @@ -321,3 +322,25 @@ def test_reverse_traversal_restricted(): assert_placement( circuit=circuit, layout=layout, connectivity=restricted_connectivity ) + + +def test_star_connectivity_placer(): + circ = Circuit(3) + circ.add(gates.CZ(0, 1)) + circ.add(gates.CZ(1, 2)) + circ.add(gates.CZ(0, 2)) + placer = StarConnectivityPlacer(middle_qubit=2) + layout = placer(circ) + assert_placement(circ, layout) + assert layout == {"q0": 0, "q1": 2, "q2": 1} + + +@pytest.mark.parametrize("first", [True, False]) +def test_star_connectivity_placer_error(first): + circ = Circuit(3) + if first: + circ.add(gates.CZ(0, 1)) + circ.add(gates.TOFFOLI(0, 1, 2)) + placer = StarConnectivityPlacer(middle_qubit=2) + with pytest.raises(PlacementError): + layout = placer(circ) diff --git a/tests/test_transpiler_router.py b/tests/test_transpiler_router.py index 716f0f02bd..7a7ef17583 100644 --- a/tests/test_transpiler_router.py +++ b/tests/test_transpiler_router.py @@ -1,24 +1,41 @@ +import itertools + import networkx as nx 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._exceptions import ConnectivityError from qibo.transpiler.optimizer import Preprocessing from qibo.transpiler.pipeline import ( assert_circuit_equivalence, restrict_connectivity_qubits, ) -from qibo.transpiler.placer import Custom, Random, Subgraph, Trivial, assert_placement -from qibo.transpiler.router import CircuitMap, Sabre, ShortestPaths, assert_connectivity +from qibo.transpiler.placer import ( + Custom, + Random, + StarConnectivityPlacer, + Subgraph, + Trivial, + assert_placement, +) +from qibo.transpiler.router import ( + CircuitMap, + Sabre, + ShortestPaths, + StarConnectivityRouter, + assert_connectivity, +) -def star_connectivity(): +def star_connectivity(middle_qubit=2): 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] + graph_list = [(Q[i], Q[middle_qubit]) for i in range(5) if i != middle_qubit] chip.add_edges_from(graph_list) return chip @@ -331,3 +348,55 @@ def test_restrict_qubits(router_algorithm): ) assert_connectivity(restricted_connectivity, routed_circ) assert_placement(routed_circ, final_layout, connectivity=restricted_connectivity) + assert routed_circ.wire_names == ["q0", "q2", "q3"] + + +def test_star_error_multi_qubit(): + circuit = Circuit(3) + circuit.add(gates.TOFFOLI(0, 1, 2)) + transpiler = StarConnectivityRouter(middle_qubit=2) + with pytest.raises(ConnectivityError): + transpiled, hardware_qubits = transpiler( + initial_layout={"q0": 0, "q1": 1, "q2": 2}, circuit=circuit + ) + + +@pytest.mark.parametrize("nqubits", [1, 3, 5]) +@pytest.mark.parametrize("middle_qubit", [0, 2, 4]) +@pytest.mark.parametrize("depth", [2, 10]) +@pytest.mark.parametrize("measurements", [True, False]) +@pytest.mark.parametrize("unitaries", [True, False]) +def test_star_router(nqubits, depth, middle_qubit, measurements, unitaries): + unitary_dim = min(2, nqubits) + connectivity = star_connectivity(middle_qubit) + if unitaries: + circuit = Circuit(nqubits) + pairs = list(itertools.combinations(range(nqubits), unitary_dim)) + for _ in range(depth): + qubits = pairs[int(np.random.randint(len(pairs)))] + circuit.add( + gates.Unitary( + random_unitary(2**unitary_dim, backend=NumpyBackend()), *qubits + ) + ) + else: + circuit = generate_random_circuit(nqubits, depth) + if measurements: + circuit.add(gates.M(0)) + transpiler = StarConnectivityRouter(middle_qubit=middle_qubit) + placer = StarConnectivityPlacer(middle_qubit=middle_qubit) + initial_layout = placer(circuit=circuit) + transpiled_circuit, final_qubit_map = transpiler( + circuit=circuit, initial_layout=initial_layout + ) + assert_connectivity(connectivity, transpiled_circuit) + assert_placement(transpiled_circuit, final_qubit_map) + matched_original = Circuit(max(circuit.nqubits, middle_qubit + 1)) + for gate in circuit.queue: + matched_original.add(gate) + assert_circuit_equivalence( + original_circuit=matched_original, + transpiled_circuit=transpiled_circuit, + final_map=final_qubit_map, + initial_map=initial_layout, + ) diff --git a/tests/test_transpiler_star_connectivity.py b/tests/test_transpiler_star_connectivity.py deleted file mode 100644 index 2330afd76c..0000000000 --- a/tests/test_transpiler_star_connectivity.py +++ /dev/null @@ -1,98 +0,0 @@ -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._exceptions import ConnectivityError -from qibo.transpiler.pipeline import _transpose_qubits -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)