From ca896b5e83f80988bfaee1d6d2ae17d51b7a84d5 Mon Sep 17 00:00:00 2001 From: Edoardo-Pedicillo Date: Mon, 16 Oct 2023 15:24:52 +0400 Subject: [PATCH 001/143] Implement double bracket flow --- src/qibo/hamiltonians/double_bracket.py | 138 ++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 src/qibo/hamiltonians/double_bracket.py diff --git a/src/qibo/hamiltonians/double_bracket.py b/src/qibo/hamiltonians/double_bracket.py new file mode 100644 index 0000000000..3d8caef8c1 --- /dev/null +++ b/src/qibo/hamiltonians/double_bracket.py @@ -0,0 +1,138 @@ +import matplotlib.pyplot as plt +import numpy as np +import numpy.typing as npt + +import qibo +from qibo.hamiltonians.hamiltonians import Hamiltonian + +FIGSIZE = (5, 5) + + +class DoubleBracket(Hamiltonian): + def __init__(self, nqubits: int, matrix: npt.DTypeLike = None, backend=None): + """ + Class implementing the Double Bracket flow algorithm. + For more details, see https://arxiv.org/pdf/2206.11772.pdf + + Args: + nqubits(int): Number of qubits. + matrix(npt.DTypeLike, Optional): Hamiltonian matrix. + backend(Optional): Qibo backend. + + Example: + .. code-block:: python + + import numpy as np + from qibo.hamiltonians.double_bracket import DoubleBracket + from qibo.hamiltonians.hamiltonians import Hamiltonian + + nqubits = 3 + + example_matrix = [[ 3., 0., 0., 1., 0., 0., 1., 0.], + [ 0., 1., 1., 0., 0., 0., 0., 1.], + [ 0., 1., 1., 0., 1., 0., 0., 0.], + [ 1., 0., 0., -1., 0., 1., 0., 0.], + [ 0., 0., 1., 0., 1., 0., 0., 1.], + [ 0., 0., 0., 1., 0., -1., 1., 0.], + [ 1., 0., 0., 0., 0., 1., -1., 0.], + [ 0., 1., 0., 0., 1., 0., 0., -3.]] + + example_matrix = np.array(example_matrix) + ham = Hamiltonian(nqubits, example_matrix) # implement an hamiltonian in hamiltonians + db = DoubleBracket(nqubits, matrix = ham.matrix) + + for _ in range(1000): + db.evolve( db.group_commutator( 1, Hamiltonian(nqubits,db.delta))) + + + db.plot_abs_matrix() + db.plot_norm() + """ + super().__init__(nqubits, matrix, backend) + self.history = [] + self.norm = [] + + @property + def delta(self): + """ + Hamiltonian diagonal restriction. + """ + return self.backend.cast(np.diag(self.matrix.diagonal())) + + @property + def sigma(self): + """ + Hamiltonian off-diagonal restriction. + """ + return self.matrix - self.delta + + def db_generator(self, step): + """Generator of the GWW flow.""" + w = Hamiltonian( + nqubits=self.nqubits, + matrix=self.delta @ self.sigma - self.sigma @ self.delta, + ) + return w.exp(step) + + def group_commutator(self, step: float, gen: Hamiltonian): + """ + Group commutator. + + Args: + step (float) + gen (Hamiltonian): Flow generator. + """ + return gen.exp(-1 * step) @ self.exp(-1 * step) @ gen.exp(step) @ self.exp(step) + + def evolve(self, evolution_op: Hamiltonian): + """ + Evolution of the Hamiltonian according to the group commutator generated by `gen`. + + Args: + gen (Hamiltonian): generator of the group commutator. + """ + self.history.append( + self.matrix + ) # TODO: Delete it, if we don't need to save the matrix evolution + self.matrix = ( + evolution_op + @ self.matrix + @ self.backend.cast(np.transpose(np.conjugate(evolution_op))) + ) + self.norm.append(np.linalg.norm(self.sigma)) + + def plot_abs_matrix(self, path: str = None): + """ + Plot the Hamiltonian absolute values. + + Args: + path (str, Optional): if a path is provided, the plot is dumped. + + """ + fig, ax = plt.subplots(figsize=FIGSIZE) + plot = plt.imshow(np.absolute(self.matrix), cmap="RdBu") + plt.xticks([]) + plt.yticks([]) + fig.colorbar(plot, ax=ax, extend="both") + if path: + plt.savefig(path) + else: + plt.show() + + def plot_norm(self, path: str = None): + """ + + Plot the evolution of the Hamiltonian off diagonal norm. + + Args: + path (str, Optional): if a path is provided, the plot is dumped. + + """ + + plt.plot(self.norm, "-o") + plt.title(r"Norm off-diagonal $\vert\vert\sigma(H_k)\vert\vert$") + plt.xlabel("epochs") + if path: + plt.savefig(path) + else: + plt.show() From 4096fee44abd367c64c519ae90becb260f0b11ea Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Tue, 24 Oct 2023 14:24:29 +0400 Subject: [PATCH 002/143] start `frame_potential` function --- src/qibo/quantum_info/metrics.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/qibo/quantum_info/metrics.py b/src/qibo/quantum_info/metrics.py index 65a11d7c44..f5608c7a66 100644 --- a/src/qibo/quantum_info/metrics.py +++ b/src/qibo/quantum_info/metrics.py @@ -1,5 +1,7 @@ """Submodule with distances, metrics, and measures for quantum states and channels.""" +from math import factorial + import numpy as np from scipy import sparse @@ -1117,6 +1119,28 @@ def expressibility(circuit, t: int, samples: int, backend=None): return fid +def frame_potential( + nqubits: int, + power_t: int, + haar: bool = True, + circuit=None, + samples: int = None, + backend=None, +): + if backend is None: # pragma: no cover + backend = GlobalBackend() + + if circuit is not None and nqubits != circuit.nqubits: + raise_error( + ValueError, f"nqubits ({nqubits}) != circuit.nqubits ({circuit.nqubits})" + ) + + dim = 2**nqubits + + if haar: + return factorial(power_t) * factorial(dim - 1) / factorial(power_t + dim - 1) + + def _check_hermitian_or_not_gpu(matrix, backend=None): """Checks if a given matrix is Hermitian and whether the backend is neither :class:`qibojit.backends.CupyBackend` From 7a1fbf40aca413b8cddb7b4568d0d3ce5ac483f4 Mon Sep 17 00:00:00 2001 From: Andrea Date: Fri, 3 Nov 2023 14:45:01 +0400 Subject: [PATCH 003/143] New implementation of DBF working --- src/qibo/hamiltonians/double_bracket.py | 138 ------------------------ src/qibo/models/double_bracket.py | 69 ++++++++++++ 2 files changed, 69 insertions(+), 138 deletions(-) delete mode 100644 src/qibo/hamiltonians/double_bracket.py create mode 100644 src/qibo/models/double_bracket.py diff --git a/src/qibo/hamiltonians/double_bracket.py b/src/qibo/hamiltonians/double_bracket.py deleted file mode 100644 index 3d8caef8c1..0000000000 --- a/src/qibo/hamiltonians/double_bracket.py +++ /dev/null @@ -1,138 +0,0 @@ -import matplotlib.pyplot as plt -import numpy as np -import numpy.typing as npt - -import qibo -from qibo.hamiltonians.hamiltonians import Hamiltonian - -FIGSIZE = (5, 5) - - -class DoubleBracket(Hamiltonian): - def __init__(self, nqubits: int, matrix: npt.DTypeLike = None, backend=None): - """ - Class implementing the Double Bracket flow algorithm. - For more details, see https://arxiv.org/pdf/2206.11772.pdf - - Args: - nqubits(int): Number of qubits. - matrix(npt.DTypeLike, Optional): Hamiltonian matrix. - backend(Optional): Qibo backend. - - Example: - .. code-block:: python - - import numpy as np - from qibo.hamiltonians.double_bracket import DoubleBracket - from qibo.hamiltonians.hamiltonians import Hamiltonian - - nqubits = 3 - - example_matrix = [[ 3., 0., 0., 1., 0., 0., 1., 0.], - [ 0., 1., 1., 0., 0., 0., 0., 1.], - [ 0., 1., 1., 0., 1., 0., 0., 0.], - [ 1., 0., 0., -1., 0., 1., 0., 0.], - [ 0., 0., 1., 0., 1., 0., 0., 1.], - [ 0., 0., 0., 1., 0., -1., 1., 0.], - [ 1., 0., 0., 0., 0., 1., -1., 0.], - [ 0., 1., 0., 0., 1., 0., 0., -3.]] - - example_matrix = np.array(example_matrix) - ham = Hamiltonian(nqubits, example_matrix) # implement an hamiltonian in hamiltonians - db = DoubleBracket(nqubits, matrix = ham.matrix) - - for _ in range(1000): - db.evolve( db.group_commutator( 1, Hamiltonian(nqubits,db.delta))) - - - db.plot_abs_matrix() - db.plot_norm() - """ - super().__init__(nqubits, matrix, backend) - self.history = [] - self.norm = [] - - @property - def delta(self): - """ - Hamiltonian diagonal restriction. - """ - return self.backend.cast(np.diag(self.matrix.diagonal())) - - @property - def sigma(self): - """ - Hamiltonian off-diagonal restriction. - """ - return self.matrix - self.delta - - def db_generator(self, step): - """Generator of the GWW flow.""" - w = Hamiltonian( - nqubits=self.nqubits, - matrix=self.delta @ self.sigma - self.sigma @ self.delta, - ) - return w.exp(step) - - def group_commutator(self, step: float, gen: Hamiltonian): - """ - Group commutator. - - Args: - step (float) - gen (Hamiltonian): Flow generator. - """ - return gen.exp(-1 * step) @ self.exp(-1 * step) @ gen.exp(step) @ self.exp(step) - - def evolve(self, evolution_op: Hamiltonian): - """ - Evolution of the Hamiltonian according to the group commutator generated by `gen`. - - Args: - gen (Hamiltonian): generator of the group commutator. - """ - self.history.append( - self.matrix - ) # TODO: Delete it, if we don't need to save the matrix evolution - self.matrix = ( - evolution_op - @ self.matrix - @ self.backend.cast(np.transpose(np.conjugate(evolution_op))) - ) - self.norm.append(np.linalg.norm(self.sigma)) - - def plot_abs_matrix(self, path: str = None): - """ - Plot the Hamiltonian absolute values. - - Args: - path (str, Optional): if a path is provided, the plot is dumped. - - """ - fig, ax = plt.subplots(figsize=FIGSIZE) - plot = plt.imshow(np.absolute(self.matrix), cmap="RdBu") - plt.xticks([]) - plt.yticks([]) - fig.colorbar(plot, ax=ax, extend="both") - if path: - plt.savefig(path) - else: - plt.show() - - def plot_norm(self, path: str = None): - """ - - Plot the evolution of the Hamiltonian off diagonal norm. - - Args: - path (str, Optional): if a path is provided, the plot is dumped. - - """ - - plt.plot(self.norm, "-o") - plt.title(r"Norm off-diagonal $\vert\vert\sigma(H_k)\vert\vert$") - plt.xlabel("epochs") - if path: - plt.savefig(path) - else: - plt.show() diff --git a/src/qibo/models/double_bracket.py b/src/qibo/models/double_bracket.py new file mode 100644 index 0000000000..859b80c6f0 --- /dev/null +++ b/src/qibo/models/double_bracket.py @@ -0,0 +1,69 @@ +from enum import Enum, auto + +import numpy as np +from scipy.linalg import expm + +from qibo.config import raise_error +from qibo.hamiltonians import Hamiltonian + + +class DoubleBracketFlowMode(Enum): + """Define DBF evolution.""" + + canonical = auto() + """Use canonical commutator.""" + group_commutator = auto() + """Use group commutator.""" + + +# TODO: provide backend agnostic implementation +class DoubleBracketFlow: + """ + Class implementing the Double Bracket flow algorithm. + For more details, see https://arxiv.org/pdf/2206.11772.pdf + + Args: + hamiltonian (Hamiltonian): Starting Hamiltonian + + Example: + .. code-block:: python + + import numpy as np + from qibo.models.double_bracket import DoubleBracketFlow, DoubleBracketFlowMode + from qibo.quantum_info import random_hermitian + + nqubits = 4 + h0 = random_hermitian(2**nqubits) + dbf = DoubleBracketFlow(Hamiltonian(nqubits=nqubits, matrix=h0)) + + # diagonalized matrix + dbf.h""" + + def __init__(self, hamiltonian: Hamiltonian): + # TODO: consider passing Mode here + self.h = self.h0 = hamiltonian + + def __call__(self, step: float, mode: DoubleBracketFlowMode, d: np.array = None): + if mode is DoubleBracketFlowMode.canonical: + operator = expm( + step + * ( + np.diag(np.diag(self.h.matrix)) @ self.h.matrix + - self.h.matrix @ np.diag(np.diag(self.h.matrix)) + ) + ) + elif mode is DoubleBracketFlowMode.group_commutator: + if d is None: + raise_error(ValueError, f"Cannot use group_commutator with matrix {d}") + operator = ( + expm(1j * self.h.matrix * step) + @ expm(1j * d * step) + @ expm(-1j * self.h.matrix * step) + @ expm(-1j * d * step) + ) + self.h.matrix = operator @ self.h.matrix @ np.matrix(operator).getH() + + @property + def off_diagonal_norm(self): + off_diag_h = self.h.matrix - np.diag(np.diag(self.h.matrix)) + return np.real(np.trace(np.matrix(off_diag_h).getH() @ off_diag_h)) From 5072fc8739b53697a5f40fbe8ff105ee8342bc18 Mon Sep 17 00:00:00 2001 From: Andrea Date: Fri, 3 Nov 2023 17:33:08 +0400 Subject: [PATCH 004/143] Backend agnostic implementation --- src/qibo/models/double_bracket.py | 49 +++++++++++++++++++------------ 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/src/qibo/models/double_bracket.py b/src/qibo/models/double_bracket.py index 859b80c6f0..0ef6412de6 100644 --- a/src/qibo/models/double_bracket.py +++ b/src/qibo/models/double_bracket.py @@ -1,10 +1,9 @@ from enum import Enum, auto import numpy as np -from scipy.linalg import expm -from qibo.config import raise_error -from qibo.hamiltonians import Hamiltonian +from ..config import raise_error +from ..hamiltonians import Hamiltonian class DoubleBracketFlowMode(Enum): @@ -16,7 +15,6 @@ class DoubleBracketFlowMode(Enum): """Use group commutator.""" -# TODO: provide backend agnostic implementation class DoubleBracketFlow: """ Class implementing the Double Bracket flow algorithm. @@ -37,7 +35,8 @@ class DoubleBracketFlow: dbf = DoubleBracketFlow(Hamiltonian(nqubits=nqubits, matrix=h0)) # diagonalized matrix - dbf.h""" + dbf.h + """ def __init__(self, hamiltonian: Hamiltonian): # TODO: consider passing Mode here @@ -45,25 +44,39 @@ def __init__(self, hamiltonian: Hamiltonian): def __call__(self, step: float, mode: DoubleBracketFlowMode, d: np.array = None): if mode is DoubleBracketFlowMode.canonical: - operator = expm( - step - * ( - np.diag(np.diag(self.h.matrix)) @ self.h.matrix - - self.h.matrix @ np.diag(np.diag(self.h.matrix)) - ) + operator = self.backend.calculate_matrix_exp( + 1.0j * step, + self.diagonal_h_matrix @ self.h.matrix + - self.h.matrix @ self.diagonal_h_matrix, ) elif mode is DoubleBracketFlowMode.group_commutator: if d is None: raise_error(ValueError, f"Cannot use group_commutator with matrix {d}") operator = ( - expm(1j * self.h.matrix * step) - @ expm(1j * d * step) - @ expm(-1j * self.h.matrix * step) - @ expm(-1j * d * step) + self.h.exp(-step) + @ self.backend.calculate_matrix_exp(-step, d) + @ self.h.exp(step) + @ self.backend.calculate_matrix_exp(step, d) ) - self.h.matrix = operator @ self.h.matrix @ np.matrix(operator).getH() + self.h.matrix = ( + operator @ self.h.matrix @ self.backend.cast(np.matrix(operator).getH()) + ) + + @property + def diagonal_h_matrix(self): + """Diagonal H matrix.""" + return self.backend.cast(np.diag(np.diag(self.backend.to_numpy(self.h.matrix)))) @property def off_diagonal_norm(self): - off_diag_h = self.h.matrix - np.diag(np.diag(self.h.matrix)) - return np.real(np.trace(np.matrix(off_diag_h).getH() @ off_diag_h)) + """Norm of off-diagonal part of H matrix.""" + off_diag_h = self.h.matrix - self.diagonal_h_matrix + # TODO: make this trace backend agnostic (test on GPU) + return np.real( + np.trace(self.backend.cast(np.matrix(off_diag_h).getH()) @ off_diag_h) + ) + + @property + def backend(self): + """Get Hamiltonian's backend.""" + return self.h0.backend From b7a8a2d74572a8cdb07d0ba7520e8d9cb46c9f15 Mon Sep 17 00:00:00 2001 From: Andrea Date: Fri, 3 Nov 2023 17:33:28 +0400 Subject: [PATCH 005/143] Add naive test --- tests/test_models_dbf.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 tests/test_models_dbf.py diff --git a/tests/test_models_dbf.py b/tests/test_models_dbf.py new file mode 100644 index 0000000000..469ba55d4f --- /dev/null +++ b/tests/test_models_dbf.py @@ -0,0 +1,37 @@ +"""Testing DoubleBracketFlow model""" +import numpy as np +import pytest + +from qibo.hamiltonians import Hamiltonian +from qibo.models.double_bracket import DoubleBracketFlow, DoubleBracketFlowMode +from qibo.quantum_info import random_hermitian + +NSTEPS = 100 +"""Number of steps for evolution.""" + + +@pytest.mark.parametrize("nqubits", [4, 5, 6]) +def test_double_bracket_flow_canonical(backend, nqubits): + h0 = random_hermitian(2**nqubits, backend=backend) + dbf = DoubleBracketFlow(Hamiltonian(nqubits, h0, backend=backend)) + initial_off_diagonal_norm = dbf.off_diagonal_norm + for _ in range(NSTEPS): + dbf(mode=DoubleBracketFlowMode.canonical, step=np.sqrt(0.01)) + + assert initial_off_diagonal_norm > dbf.off_diagonal_norm + + +@pytest.mark.parametrize("nqubits", [4, 5, 6]) +def test_double_bracket_flow_group_commutator(backend, nqubits): + h0 = random_hermitian(2**nqubits, backend=backend) + d = backend.cast(np.diag(np.diag(backend.to_numpy(h0)))) + dbf = DoubleBracketFlow(Hamiltonian(nqubits, h0, backend=backend)) + initial_off_diagonal_norm = dbf.off_diagonal_norm + + with pytest.raises(ValueError): + dbf(mode=DoubleBracketFlowMode.group_commutator, step=0.1) + + for _ in range(NSTEPS): + dbf(mode=DoubleBracketFlowMode.group_commutator, step=0.1, d=d) + + assert initial_off_diagonal_norm > dbf.off_diagonal_norm From 57141c46616e82b4971d64dd51f889233c129bec Mon Sep 17 00:00:00 2001 From: Andrea Date: Fri, 3 Nov 2023 18:57:28 +0400 Subject: [PATCH 006/143] Ease tests --- tests/test_models_dbf.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/test_models_dbf.py b/tests/test_models_dbf.py index 469ba55d4f..c89bc4b484 100644 --- a/tests/test_models_dbf.py +++ b/tests/test_models_dbf.py @@ -6,22 +6,22 @@ from qibo.models.double_bracket import DoubleBracketFlow, DoubleBracketFlowMode from qibo.quantum_info import random_hermitian -NSTEPS = 100 +NSTEPS = 50 """Number of steps for evolution.""" -@pytest.mark.parametrize("nqubits", [4, 5, 6]) +@pytest.mark.parametrize("nqubits", [3, 4, 5]) def test_double_bracket_flow_canonical(backend, nqubits): h0 = random_hermitian(2**nqubits, backend=backend) dbf = DoubleBracketFlow(Hamiltonian(nqubits, h0, backend=backend)) initial_off_diagonal_norm = dbf.off_diagonal_norm for _ in range(NSTEPS): - dbf(mode=DoubleBracketFlowMode.canonical, step=np.sqrt(0.01)) + dbf(mode=DoubleBracketFlowMode.canonical, step=np.sqrt(0.001)) assert initial_off_diagonal_norm > dbf.off_diagonal_norm -@pytest.mark.parametrize("nqubits", [4, 5, 6]) +@pytest.mark.parametrize("nqubits", [3, 4, 5]) def test_double_bracket_flow_group_commutator(backend, nqubits): h0 = random_hermitian(2**nqubits, backend=backend) d = backend.cast(np.diag(np.diag(backend.to_numpy(h0)))) @@ -29,9 +29,9 @@ def test_double_bracket_flow_group_commutator(backend, nqubits): initial_off_diagonal_norm = dbf.off_diagonal_norm with pytest.raises(ValueError): - dbf(mode=DoubleBracketFlowMode.group_commutator, step=0.1) + dbf(mode=DoubleBracketFlowMode.group_commutator, step=0.01) for _ in range(NSTEPS): - dbf(mode=DoubleBracketFlowMode.group_commutator, step=0.1, d=d) + dbf(mode=DoubleBracketFlowMode.group_commutator, step=0.01, d=d) assert initial_off_diagonal_norm > dbf.off_diagonal_norm From b0fc891545b2c09368967274f8fd6e71bf2c94dc Mon Sep 17 00:00:00 2001 From: Andrea Date: Fri, 3 Nov 2023 20:28:15 +0400 Subject: [PATCH 007/143] Rename mode into FlowGeneratorType and add single_commutator --- src/qibo/models/double_bracket.py | 29 +++++++++++++++++++++-------- tests/test_models_dbf.py | 24 ++++++++++++++++++++---- 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/qibo/models/double_bracket.py b/src/qibo/models/double_bracket.py index 0ef6412de6..7f456fbd1c 100644 --- a/src/qibo/models/double_bracket.py +++ b/src/qibo/models/double_bracket.py @@ -6,13 +6,16 @@ from ..hamiltonians import Hamiltonian -class DoubleBracketFlowMode(Enum): +class FlowGeneratorType(Enum): """Define DBF evolution.""" canonical = auto() """Use canonical commutator.""" + single_commutator = auto() + """Use single commutator.""" group_commutator = auto() - """Use group commutator.""" + """Use group commutator approximation""" + # TODO: add double commutator (does it converge?) class DoubleBracketFlow: @@ -27,7 +30,7 @@ class DoubleBracketFlow: .. code-block:: python import numpy as np - from qibo.models.double_bracket import DoubleBracketFlow, DoubleBracketFlowMode + from qibo.models.double_bracket import DoubleBracketFlow, FlowGeneratorType from qibo.quantum_info import random_hermitian nqubits = 4 @@ -42,14 +45,20 @@ def __init__(self, hamiltonian: Hamiltonian): # TODO: consider passing Mode here self.h = self.h0 = hamiltonian - def __call__(self, step: float, mode: DoubleBracketFlowMode, d: np.array = None): - if mode is DoubleBracketFlowMode.canonical: + def __call__(self, step: float, mode: FlowGeneratorType, d: np.array = None): + if mode is FlowGeneratorType.canonical: operator = self.backend.calculate_matrix_exp( 1.0j * step, - self.diagonal_h_matrix @ self.h.matrix - - self.h.matrix @ self.diagonal_h_matrix, + self.commutator(self.diagonal_h_matrix, self.h.matrix), ) - elif mode is DoubleBracketFlowMode.group_commutator: + elif mode is FlowGeneratorType.single_commutator: + if d is None: + raise_error(ValueError, f"Cannot use group_commutator with matrix {d}") + operator = self.backend.calculate_matrix_exp( + 1.0j * step, + self.commutator(d, self.h.matrix), + ) + elif mode is FlowGeneratorType.group_commutator: if d is None: raise_error(ValueError, f"Cannot use group_commutator with matrix {d}") operator = ( @@ -62,6 +71,10 @@ def __call__(self, step: float, mode: DoubleBracketFlowMode, d: np.array = None) operator @ self.h.matrix @ self.backend.cast(np.matrix(operator).getH()) ) + @staticmethod + def commutator(a, b): + return a @ b - b @ a + @property def diagonal_h_matrix(self): """Diagonal H matrix.""" diff --git a/tests/test_models_dbf.py b/tests/test_models_dbf.py index c89bc4b484..541fba16c6 100644 --- a/tests/test_models_dbf.py +++ b/tests/test_models_dbf.py @@ -3,7 +3,7 @@ import pytest from qibo.hamiltonians import Hamiltonian -from qibo.models.double_bracket import DoubleBracketFlow, DoubleBracketFlowMode +from qibo.models.double_bracket import DoubleBracketFlow, FlowGeneratorType from qibo.quantum_info import random_hermitian NSTEPS = 50 @@ -16,7 +16,7 @@ def test_double_bracket_flow_canonical(backend, nqubits): dbf = DoubleBracketFlow(Hamiltonian(nqubits, h0, backend=backend)) initial_off_diagonal_norm = dbf.off_diagonal_norm for _ in range(NSTEPS): - dbf(mode=DoubleBracketFlowMode.canonical, step=np.sqrt(0.001)) + dbf(mode=FlowGeneratorType.canonical, step=np.sqrt(0.001)) assert initial_off_diagonal_norm > dbf.off_diagonal_norm @@ -29,9 +29,25 @@ def test_double_bracket_flow_group_commutator(backend, nqubits): initial_off_diagonal_norm = dbf.off_diagonal_norm with pytest.raises(ValueError): - dbf(mode=DoubleBracketFlowMode.group_commutator, step=0.01) + dbf(mode=FlowGeneratorType.group_commutator, step=0.01) for _ in range(NSTEPS): - dbf(mode=DoubleBracketFlowMode.group_commutator, step=0.01, d=d) + dbf(mode=FlowGeneratorType.group_commutator, step=0.01, d=d) + + assert initial_off_diagonal_norm > dbf.off_diagonal_norm + + +@pytest.mark.parametrize("nqubits", [3, 4, 5]) +def test_double_bracket_flow_single_commutator(backend, nqubits): + h0 = random_hermitian(2**nqubits, backend=backend) + d = backend.cast(np.diag(np.diag(backend.to_numpy(h0)))) + dbf = DoubleBracketFlow(Hamiltonian(nqubits, h0, backend=backend)) + initial_off_diagonal_norm = dbf.off_diagonal_norm + + with pytest.raises(ValueError): + dbf(mode=FlowGeneratorType.single_commutator, step=0.01) + + for _ in range(NSTEPS): + dbf(mode=FlowGeneratorType.group_commutator, step=0.01, d=d) assert initial_off_diagonal_norm > dbf.off_diagonal_norm From 9244a24c99247c05ec43013fcd0970a9d5f4c537 Mon Sep 17 00:00:00 2001 From: Andrea Date: Fri, 3 Nov 2023 21:33:48 +0400 Subject: [PATCH 008/143] Fix coverage --- tests/test_models_dbf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_models_dbf.py b/tests/test_models_dbf.py index 541fba16c6..722de9df41 100644 --- a/tests/test_models_dbf.py +++ b/tests/test_models_dbf.py @@ -48,6 +48,6 @@ def test_double_bracket_flow_single_commutator(backend, nqubits): dbf(mode=FlowGeneratorType.single_commutator, step=0.01) for _ in range(NSTEPS): - dbf(mode=FlowGeneratorType.group_commutator, step=0.01, d=d) + dbf(mode=FlowGeneratorType.single_commutator, step=0.01, d=d) assert initial_off_diagonal_norm > dbf.off_diagonal_norm From 5935123dbe2169bd780d3c843b39baab88a29d7b Mon Sep 17 00:00:00 2001 From: Andrea Date: Sun, 5 Nov 2023 12:08:47 +0400 Subject: [PATCH 009/143] GPU compatibility --- src/qibo/models/double_bracket.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/qibo/models/double_bracket.py b/src/qibo/models/double_bracket.py index 7f456fbd1c..ca7cde912a 100644 --- a/src/qibo/models/double_bracket.py +++ b/src/qibo/models/double_bracket.py @@ -67,12 +67,14 @@ def __call__(self, step: float, mode: FlowGeneratorType, d: np.array = None): @ self.h.exp(step) @ self.backend.calculate_matrix_exp(step, d) ) - self.h.matrix = ( - operator @ self.h.matrix @ self.backend.cast(np.matrix(operator).getH()) + operator_dagger = self.backend.cast( + np.matrix(self.backend.to_numpy(operator)).getH() ) + self.h.matrix = operator @ self.h.matrix @ operator_dagger @staticmethod def commutator(a, b): + """Compute commutator between two arrays.""" return a @ b - b @ a @property @@ -84,10 +86,10 @@ def diagonal_h_matrix(self): def off_diagonal_norm(self): """Norm of off-diagonal part of H matrix.""" off_diag_h = self.h.matrix - self.diagonal_h_matrix - # TODO: make this trace backend agnostic (test on GPU) - return np.real( - np.trace(self.backend.cast(np.matrix(off_diag_h).getH()) @ off_diag_h) + off_diag_h_dag = self.backend.cast( + np.matrix(self.backend.to_numpy(off_diag_h)).getH() ) + return np.real(np.trace(self.backend.to_numpy(off_diag_h_dag @ off_diag_h))) @property def backend(self): From 540582db4e6b54ad2b1e400e0c577d15be85bdb2 Mon Sep 17 00:00:00 2001 From: Edoardo-Pedicillo Date: Tue, 7 Nov 2023 15:23:40 +0400 Subject: [PATCH 010/143] add off_diag property --- src/qibo/models/double_bracket.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/qibo/models/double_bracket.py b/src/qibo/models/double_bracket.py index ca7cde912a..2ddf5478f0 100644 --- a/src/qibo/models/double_bracket.py +++ b/src/qibo/models/double_bracket.py @@ -82,14 +82,19 @@ def diagonal_h_matrix(self): """Diagonal H matrix.""" return self.backend.cast(np.diag(np.diag(self.backend.to_numpy(self.h.matrix)))) + @property + def off_diag_h(self): + return self.h.matrix - self.diagonal_h_matrix + @property def off_diagonal_norm(self): """Norm of off-diagonal part of H matrix.""" - off_diag_h = self.h.matrix - self.diagonal_h_matrix off_diag_h_dag = self.backend.cast( - np.matrix(self.backend.to_numpy(off_diag_h)).getH() + np.matrix(self.backend.to_numpy(self.off_diag_h)).getH() + ) + return np.real( + np.trace(self.backend.to_numpy(off_diag_h_dag @ self.off_diag_h)) ) - return np.real(np.trace(self.backend.to_numpy(off_diag_h_dag @ off_diag_h))) @property def backend(self): From 0eb869310f2688723126340b636bf161de8805f0 Mon Sep 17 00:00:00 2001 From: Edoardo-Pedicillo Date: Tue, 7 Nov 2023 20:48:43 +0400 Subject: [PATCH 011/143] deploy energy fluctuations --- src/qibo/models/double_bracket.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/qibo/models/double_bracket.py b/src/qibo/models/double_bracket.py index 2ddf5478f0..eb09f98f98 100644 --- a/src/qibo/models/double_bracket.py +++ b/src/qibo/models/double_bracket.py @@ -100,3 +100,11 @@ def off_diagonal_norm(self): def backend(self): """Get Hamiltonian's backend.""" return self.h0.backend + + def energy_fluctuation(self, state): + """Evaluate energy fluctuations""" + energy = self.h.expectation(state) + h = self.h.matrix + h2 = self.backend.to_numpy(np.asarray(h @ h)) + average_h2 = self.backend.calculate_expectation_state(h2, state, normalize=True) + return np.sqrt(average_h2 - energy**2) From 6784d15845477464b720ed0d69c037df377041ff Mon Sep 17 00:00:00 2001 From: Edoardo-Pedicillo Date: Tue, 7 Nov 2023 22:22:43 +0400 Subject: [PATCH 012/143] fix bug to run cupy --- src/qibo/models/double_bracket.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/qibo/models/double_bracket.py b/src/qibo/models/double_bracket.py index eb09f98f98..f9a6ffac49 100644 --- a/src/qibo/models/double_bracket.py +++ b/src/qibo/models/double_bracket.py @@ -2,6 +2,8 @@ import numpy as np +from qibo.backends.numpy import NumpyBackend + from ..config import raise_error from ..hamiltonians import Hamiltonian @@ -105,6 +107,8 @@ def energy_fluctuation(self, state): """Evaluate energy fluctuations""" energy = self.h.expectation(state) h = self.h.matrix - h2 = self.backend.to_numpy(np.asarray(h @ h)) + h2 = h @ h + if self.backend.name == "numpy": + h2 = np.asarray(h2) average_h2 = self.backend.calculate_expectation_state(h2, state, normalize=True) return np.sqrt(average_h2 - energy**2) From 14e0fcac92d6e56494cc7321ae19b31971c443c3 Mon Sep 17 00:00:00 2001 From: Edoardo-Pedicillo Date: Tue, 7 Nov 2023 22:25:16 +0400 Subject: [PATCH 013/143] fix cupy with Andrea's suggestion --- src/qibo/models/double_bracket.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/qibo/models/double_bracket.py b/src/qibo/models/double_bracket.py index f9a6ffac49..8364583c44 100644 --- a/src/qibo/models/double_bracket.py +++ b/src/qibo/models/double_bracket.py @@ -107,8 +107,6 @@ def energy_fluctuation(self, state): """Evaluate energy fluctuations""" energy = self.h.expectation(state) h = self.h.matrix - h2 = h @ h - if self.backend.name == "numpy": - h2 = np.asarray(h2) + h2 = Hamiltonian(nqubits=self.h.nqubits, matrix=h @ h) average_h2 = self.backend.calculate_expectation_state(h2, state, normalize=True) return np.sqrt(average_h2 - energy**2) From 4f5e986cc5b8c7a607c9945e1c3c6157c4ba6653 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Tue, 7 Nov 2023 19:48:16 +0100 Subject: [PATCH 014/143] first implementation of step optimization --- src/qibo/models/double_bracket.py | 34 +++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/qibo/models/double_bracket.py b/src/qibo/models/double_bracket.py index 7f456fbd1c..4881a4db57 100644 --- a/src/qibo/models/double_bracket.py +++ b/src/qibo/models/double_bracket.py @@ -1,6 +1,8 @@ from enum import Enum, auto import numpy as np +import scipy +from hyperopt import fmin, hp, tpe from ..config import raise_error from ..hamiltonians import Hamiltonian @@ -67,6 +69,7 @@ def __call__(self, step: float, mode: FlowGeneratorType, d: np.array = None): @ self.h.exp(step) @ self.backend.calculate_matrix_exp(step, d) ) + self.h.matrix = ( operator @ self.h.matrix @ self.backend.cast(np.matrix(operator).getH()) ) @@ -93,3 +96,34 @@ def off_diagonal_norm(self): def backend(self): """Get Hamiltonian's backend.""" return self.h0.backend + + def optimize_step( + self, step_min: float = 0.0001, step_max: int = 0.5, max_evals: int = 1000 + ): + """Optimize step""" + + space = hp.uniform("step", step_min, step_max) + best = fmin( + fn=self.local_loss, + space=space, + algo=tpe.suggest, + max_evals=max_evals, + verbose=False, + ) + + return best["step"] + + def local_loss(self, step): + """Compute loss function distance between""" + # copy initial hamiltonian + h_copy = self.h + + # one flow step + old_loss = self.off_diagonal_norm + self.__call__(mode=FlowGeneratorType.canonical, step=step) + new_loss = self.off_diagonal_norm + + # set the initial configuration + self.h = h_copy + + return new_loss - old_loss From dcc68408a34f29785950a898e4df1e6ce1174303 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Tue, 7 Nov 2023 20:05:45 +0100 Subject: [PATCH 015/143] first implementation of step optimization --- src/qibo/models/double_bracket.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/qibo/models/double_bracket.py b/src/qibo/models/double_bracket.py index 4881a4db57..90f2ad08e6 100644 --- a/src/qibo/models/double_bracket.py +++ b/src/qibo/models/double_bracket.py @@ -98,9 +98,13 @@ def backend(self): return self.h0.backend def optimize_step( - self, step_min: float = 0.0001, step_max: int = 0.5, max_evals: int = 1000 + self, + step_min: float = 0.0001, + step_max: int = 0.5, + max_evals: int = 1000, + verbose: bool = False, ): - """Optimize step""" + """Optimize flow step.""" space = hp.uniform("step", step_min, step_max) best = fmin( @@ -108,7 +112,7 @@ def optimize_step( space=space, algo=tpe.suggest, max_evals=max_evals, - verbose=False, + verbose=verbose, ) return best["step"] From 50e2f439af2e817422d30c31df0431f6ade36bd8 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Tue, 7 Nov 2023 21:53:06 +0100 Subject: [PATCH 016/143] generalize hyperopt usage --- src/qibo/models/double_bracket.py | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/qibo/models/double_bracket.py b/src/qibo/models/double_bracket.py index 90f2ad08e6..f8b6e0140c 100644 --- a/src/qibo/models/double_bracket.py +++ b/src/qibo/models/double_bracket.py @@ -1,8 +1,8 @@ from enum import Enum, auto +import hyperopt import numpy as np import scipy -from hyperopt import fmin, hp, tpe from ..config import raise_error from ..hamiltonians import Hamiltonian @@ -100,17 +100,29 @@ def backend(self): def optimize_step( self, step_min: float = 0.0001, - step_max: int = 0.5, + step_max: float = 0.5, max_evals: int = 1000, + space: callable = hyperopt.hp.uniform, + optimizer: callable = hyperopt.tpe, verbose: bool = False, ): - """Optimize flow step.""" - - space = hp.uniform("step", step_min, step_max) - best = fmin( + """ + Optimize flow step. + + Args: + step_min: lower bound of the search grid; + step_max: upper bound of the search grid; + max_evals: maximum number of iterations done by the hyperoptimizer; + space: see hyperopt.hp possibilities; + optimizer: see hyperopt algorithms; + verbose: level of verbosity. + """ + + space = space("step", step_min, step_max) + best = hyperopt.fmin( fn=self.local_loss, space=space, - algo=tpe.suggest, + algo=optimizer.suggest, max_evals=max_evals, verbose=verbose, ) @@ -118,11 +130,11 @@ def optimize_step( return best["step"] def local_loss(self, step): - """Compute loss function distance between""" + """Compute loss function distance between steps.""" # copy initial hamiltonian h_copy = self.h - # one flow step + # TODO: involve a `look_ahead` variable in the hyperoptimization? old_loss = self.off_diagonal_norm self.__call__(mode=FlowGeneratorType.canonical, step=step) new_loss = self.off_diagonal_norm From 39d56d48323ed978875d44d64da3f11ce0d79914 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Tue, 7 Nov 2023 21:53:35 +0100 Subject: [PATCH 017/143] rename opt function --- src/qibo/models/double_bracket.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibo/models/double_bracket.py b/src/qibo/models/double_bracket.py index f8b6e0140c..29912fa40d 100644 --- a/src/qibo/models/double_bracket.py +++ b/src/qibo/models/double_bracket.py @@ -97,7 +97,7 @@ def backend(self): """Get Hamiltonian's backend.""" return self.h0.backend - def optimize_step( + def hyperopt_step( self, step_min: float = 0.0001, step_max: float = 0.5, From 3956f2db8606c5b6ac99adef93089a6545b8d2b3 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Tue, 7 Nov 2023 21:56:17 +0100 Subject: [PATCH 018/143] remove unused packages --- src/qibo/models/double_bracket.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/qibo/models/double_bracket.py b/src/qibo/models/double_bracket.py index 29912fa40d..1b513a9a30 100644 --- a/src/qibo/models/double_bracket.py +++ b/src/qibo/models/double_bracket.py @@ -2,7 +2,6 @@ import hyperopt import numpy as np -import scipy from ..config import raise_error from ..hamiltonians import Hamiltonian From 7fd24d2996b3dcb0107b347c1f916f46b7ddb154 Mon Sep 17 00:00:00 2001 From: Edoardo-Pedicillo Date: Wed, 8 Nov 2023 19:02:45 +0400 Subject: [PATCH 019/143] tests --- tests/test_models_dbf.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/test_models_dbf.py b/tests/test_models_dbf.py index 722de9df41..8c770163d3 100644 --- a/tests/test_models_dbf.py +++ b/tests/test_models_dbf.py @@ -2,6 +2,7 @@ import numpy as np import pytest +from qibo.backends import GlobalBackend from qibo.hamiltonians import Hamiltonian from qibo.models.double_bracket import DoubleBracketFlow, FlowGeneratorType from qibo.quantum_info import random_hermitian @@ -51,3 +52,11 @@ def test_double_bracket_flow_single_commutator(backend, nqubits): dbf(mode=FlowGeneratorType.single_commutator, step=0.01, d=d) assert initial_off_diagonal_norm > dbf.off_diagonal_norm + + +def test_energy_fluctuations(backend): + h0 = GlobalBackend().cast(np.array([[1, 0], [0, -1]])) + state = GlobalBackend().cast([1, 0]) + dbf = DoubleBracketFlow(Hamiltonian(1, matrix=h0, backend=backend)) + energy_fluctuation = dbf.energy_fluctuation(state=state) + assert energy_fluctuation == 0 From 2c01fb90eb417bcfa592aacb8393aef599b40b45 Mon Sep 17 00:00:00 2001 From: Edoardo-Pedicillo Date: Wed, 8 Nov 2023 19:51:31 +0400 Subject: [PATCH 020/143] fix test --- tests/test_models_dbf.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_models_dbf.py b/tests/test_models_dbf.py index 8c770163d3..58289509ca 100644 --- a/tests/test_models_dbf.py +++ b/tests/test_models_dbf.py @@ -55,8 +55,8 @@ def test_double_bracket_flow_single_commutator(backend, nqubits): def test_energy_fluctuations(backend): - h0 = GlobalBackend().cast(np.array([[1, 0], [0, -1]])) - state = GlobalBackend().cast([1, 0]) - dbf = DoubleBracketFlow(Hamiltonian(1, matrix=h0, backend=backend)) + h0 = np.array([[1, 0], [0, -1]]) + state = np.array([1, 0]) + dbf = DoubleBracketFlow(Hamiltonian(1, matrix=h0)) energy_fluctuation = dbf.energy_fluctuation(state=state) assert energy_fluctuation == 0 From bfcd960a963a864ebf94fcc871169082575ffff1 Mon Sep 17 00:00:00 2001 From: Edoardo Pedicillo Date: Mon, 13 Nov 2023 09:25:08 +0400 Subject: [PATCH 021/143] Update src/qibo/models/double_bracket.py Co-authored-by: Andrea Pasquale --- src/qibo/models/double_bracket.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibo/models/double_bracket.py b/src/qibo/models/double_bracket.py index 8364583c44..674575ae53 100644 --- a/src/qibo/models/double_bracket.py +++ b/src/qibo/models/double_bracket.py @@ -107,6 +107,6 @@ def energy_fluctuation(self, state): """Evaluate energy fluctuations""" energy = self.h.expectation(state) h = self.h.matrix - h2 = Hamiltonian(nqubits=self.h.nqubits, matrix=h @ h) + h2 = Hamiltonian(nqubits=self.h.nqubits, matrix=h @ h, backend=self.backend) average_h2 = self.backend.calculate_expectation_state(h2, state, normalize=True) return np.sqrt(average_h2 - energy**2) From ac5ff4addde662163911c58a967a1e422e35707f Mon Sep 17 00:00:00 2001 From: Edoardo Pedicillo Date: Mon, 13 Nov 2023 09:25:13 +0400 Subject: [PATCH 022/143] Update tests/test_models_dbf.py Co-authored-by: Andrea Pasquale --- tests/test_models_dbf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_models_dbf.py b/tests/test_models_dbf.py index 58289509ca..599ac16335 100644 --- a/tests/test_models_dbf.py +++ b/tests/test_models_dbf.py @@ -57,6 +57,6 @@ def test_double_bracket_flow_single_commutator(backend, nqubits): def test_energy_fluctuations(backend): h0 = np.array([[1, 0], [0, -1]]) state = np.array([1, 0]) - dbf = DoubleBracketFlow(Hamiltonian(1, matrix=h0)) + dbf = DoubleBracketFlow(Hamiltonian(1, matrix=h0, backend=backend)) energy_fluctuation = dbf.energy_fluctuation(state=state) assert energy_fluctuation == 0 From 33aa790c625877cee5637fb76934716f463444d9 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Mon, 13 Nov 2023 10:25:13 +0100 Subject: [PATCH 023/143] add hyperopt test --- tests/test_models_dbf.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tests/test_models_dbf.py b/tests/test_models_dbf.py index 722de9df41..90569037bf 100644 --- a/tests/test_models_dbf.py +++ b/tests/test_models_dbf.py @@ -1,4 +1,5 @@ """Testing DoubleBracketFlow model""" +import hyperopt import numpy as np import pytest @@ -51,3 +52,34 @@ def test_double_bracket_flow_single_commutator(backend, nqubits): dbf(mode=FlowGeneratorType.single_commutator, step=0.01, d=d) assert initial_off_diagonal_norm > dbf.off_diagonal_norm + + +@pytest.mark.parametrize("nqubits", [3, 4, 5]) +@pytest.mark.parametrize("look_ahead", [1, 2]) +def test_hyperopt_step(backend, nqubits, look_ahead): + h0 = random_hermitian(2**nqubits, backend=backend) + dbf = DoubleBracketFlow(Hamiltonian(nqubits, h0, backend=backend)) + + # find initial best step with look_ahead = 1 + initial_step = 0.01 + delta = 0.02 + + step = dbf.hyperopt_step( + step_min=initial_step - delta, step_max=initial_step + delta, max_evals=100 + ) + + assert step != initial_step + + # evolve following the optimized first step + dbf(mode=FlowGeneratorType.canonical, step=step) + + # find the following step size with look_ahead + step = dbf.hyperopt_step( + step_min=initial_step - delta, + step_max=initial_step + delta, + max_evals=100, + look_ahead=look_ahead, + ) + + for _ in range(NSTEPS): + dbf(mode=FlowGeneratorType.canonical, step=step) From f457a302931a734c0e56d6022c9265f19ca9a227 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Mon, 13 Nov 2023 10:25:50 +0100 Subject: [PATCH 024/143] add look_ahead feature to hyperopt --- src/qibo/models/double_bracket.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/qibo/models/double_bracket.py b/src/qibo/models/double_bracket.py index 1b513a9a30..f66adea5ab 100644 --- a/src/qibo/models/double_bracket.py +++ b/src/qibo/models/double_bracket.py @@ -1,4 +1,5 @@ from enum import Enum, auto +from functools import partial import hyperopt import numpy as np @@ -103,6 +104,7 @@ def hyperopt_step( max_evals: int = 1000, space: callable = hyperopt.hp.uniform, optimizer: callable = hyperopt.tpe, + look_ahead: int = 1, verbose: bool = False, ): """ @@ -114,12 +116,16 @@ def hyperopt_step( max_evals: maximum number of iterations done by the hyperoptimizer; space: see hyperopt.hp possibilities; optimizer: see hyperopt algorithms; + look_ahead: number of flow steps to compute the loss function; verbose: level of verbosity. + + Returns: + (float): optimized best flow step. """ space = space("step", step_min, step_max) best = hyperopt.fmin( - fn=self.local_loss, + fn=partial(self.loss, look_ahead=look_ahead), space=space, algo=optimizer.suggest, max_evals=max_evals, @@ -128,17 +134,27 @@ def hyperopt_step( return best["step"] - def local_loss(self, step): - """Compute loss function distance between steps.""" + def loss(self, step: float, look_ahead: int = 1): + """ + Compute loss function distance between `look_ahead` steps. + + Args: + step: flow step. + look_ahead: number of flow steps to compute the loss function; + """ # copy initial hamiltonian h_copy = self.h - # TODO: involve a `look_ahead` variable in the hyperoptimization? + # off_diagonal_norm's value before the steps old_loss = self.off_diagonal_norm - self.__call__(mode=FlowGeneratorType.canonical, step=step) + + for _ in range(look_ahead): + self.__call__(mode=FlowGeneratorType.canonical, step=step) + + # off_diagonal_norm's value after the steps new_loss = self.off_diagonal_norm - # set the initial configuration + # set back the initial configuration self.h = h_copy return new_loss - old_loss From 89acd980e9c3a58539f8fa7aed0b95421b64a2a1 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Mon, 13 Nov 2023 10:37:45 +0100 Subject: [PATCH 025/143] add hyperopt dependence --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 14bbab1fc7..c1b7a256eb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,6 +29,7 @@ joblib = "^1.2.0" matplotlib = "^3.7.0" psutil = "^5.9.4" tabulate = "^0.9.0" +hyperopt = "^0.2.7" [tool.poetry.group.docs] optional = true From c920e88cc2446789f810a9266e01ab805091b8fd Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Mon, 13 Nov 2023 10:48:57 +0100 Subject: [PATCH 026/143] fix deps --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index c1b7a256eb..7c08b1fbba 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,7 @@ joblib = "^1.2.0" matplotlib = "^3.7.0" psutil = "^5.9.4" tabulate = "^0.9.0" -hyperopt = "^0.2.7" +hyperopt = ">=0.2.6" [tool.poetry.group.docs] optional = true From 1ee02714548e9ce6ef5eb049aeadb33b42018537 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Mon, 13 Nov 2023 12:51:34 +0100 Subject: [PATCH 027/143] fix deps --- poetry.lock | 2914 ++++++++++++++++++++++++++---------------------- pyproject.toml | 2 +- 2 files changed, 1558 insertions(+), 1358 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3e88dd7c7d..865b114f8c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,14 +1,14 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. [[package]] name = "absl-py" -version = "1.4.0" +version = "2.0.0" description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "absl-py-1.4.0.tar.gz", hash = "sha256:d2c244d01048ba476e7c080bd2c6df5e141d211de80223460d5b3b8a2a58433d"}, - {file = "absl_py-1.4.0-py3-none-any.whl", hash = "sha256:0d3fe606adfa4f7db64792dd4c7aee4ee0c38ab75dfd353b7a83ed3e957fcb47"}, + {file = "absl-py-2.0.0.tar.gz", hash = "sha256:d9690211c5fcfefcdd1a45470ac2b5c5acd45241c3af71eed96bc5441746c0d5"}, + {file = "absl_py-2.0.0-py3-none-any.whl", hash = "sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3"}, ] [[package]] @@ -22,27 +22,6 @@ files = [ {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, ] -[[package]] -name = "anyio" -version = "3.7.1" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false -python-versions = ">=3.7" -files = [ - {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, - {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, -] - -[package.dependencies] -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} -idna = ">=2.8" -sniffio = ">=1.1" - -[package.extras] -doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] -test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (<0.22)"] - [[package]] name = "appnope" version = "0.1.3" @@ -56,13 +35,13 @@ files = [ [[package]] name = "astroid" -version = "2.15.6" +version = "2.15.8" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.7.2" files = [ - {file = "astroid-2.15.6-py3-none-any.whl", hash = "sha256:389656ca57b6108f939cf5d2f9a2a825a3be50ba9d589670f393236e0a03b91c"}, - {file = "astroid-2.15.6.tar.gz", hash = "sha256:903f024859b7c7687d7a7f3a3f73b17301f8e42dfd9cc9df9d4418172d3e2dbd"}, + {file = "astroid-2.15.8-py3-none-any.whl", hash = "sha256:1aa149fc5c6589e3d0ece885b4491acd80af4f087baafa3fb5203b113e68cd3c"}, + {file = "astroid-2.15.8.tar.gz", hash = "sha256:6c107453dffee9055899705de3c9ead36e74119cee151e5a9aaf7f0b0e020a6a"}, ] [package.dependencies] @@ -75,20 +54,21 @@ wrapt = [ [[package]] name = "asttokens" -version = "2.2.1" +version = "2.4.1" description = "Annotate AST trees with source code positions" optional = false python-versions = "*" files = [ - {file = "asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"}, - {file = "asttokens-2.2.1.tar.gz", hash = "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3"}, + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, ] [package.dependencies] -six = "*" +six = ">=1.12.0" [package.extras] -test = ["astroid", "pytest"] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] [[package]] name = "astunparse" @@ -107,35 +87,39 @@ wheel = ">=0.23.0,<1.0" [[package]] name = "attrs" -version = "21.4.0" +version = "23.1.0" description = "Classes Without Boilerplate" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" files = [ - {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, - {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, ] [package.extras] -dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "sphinx", "sphinx-notfound-page", "zope.interface"] -docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] -tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "zope.interface"] -tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] [[package]] name = "babel" -version = "2.12.1" +version = "2.13.1" description = "Internationalization utilities" optional = false python-versions = ">=3.7" files = [ - {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, - {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, + {file = "Babel-2.13.1-py3-none-any.whl", hash = "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed"}, + {file = "Babel-2.13.1.tar.gz", hash = "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900"}, ] [package.dependencies] pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + [[package]] name = "backcall" version = "0.2.0" @@ -167,13 +151,13 @@ lxml = ["lxml"] [[package]] name = "bleach" -version = "6.0.0" +version = "6.1.0" description = "An easy safelist-based HTML-sanitizing tool." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "bleach-6.0.0-py3-none-any.whl", hash = "sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4"}, - {file = "bleach-6.0.0.tar.gz", hash = "sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414"}, + {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"}, + {file = "bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe"}, ] [package.dependencies] @@ -181,17 +165,17 @@ six = ">=1.9.0" webencodings = "*" [package.extras] -css = ["tinycss2 (>=1.1.0,<1.2)"] +css = ["tinycss2 (>=1.1.0,<1.3)"] [[package]] name = "cachetools" -version = "5.3.1" +version = "5.3.2" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" files = [ - {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"}, - {file = "cachetools-5.3.1.tar.gz", hash = "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b"}, + {file = "cachetools-5.3.2-py3-none-any.whl", hash = "sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1"}, + {file = "cachetools-5.3.2.tar.gz", hash = "sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2"}, ] [[package]] @@ -207,75 +191,63 @@ files = [ [[package]] name = "cffi" -version = "1.15.1" +version = "1.16.0" description = "Foreign Function Interface for Python calling C code." optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, ] [package.dependencies] @@ -283,86 +255,101 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.2.0" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, - {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] @@ -497,6 +484,38 @@ files = [ [package.dependencies] cirq-core = "1.1.0" +[[package]] +name = "clarabel" +version = "0.6.0" +description = "Clarabel Conic Interior Point Solver for Rust / Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "clarabel-0.6.0-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:4f366de79b8bc66bef8dc170987840b672ccab9222e710c09536d78ef47f606d"}, + {file = "clarabel-0.6.0-cp37-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:edcebbfc14073cd32bfb664317fd2555716c96be8b2a54efdb2b728453582bea"}, + {file = "clarabel-0.6.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e737d2818b9ca10e92ccd3fa9ad1a805b039976016415a0c45adef3427d70792"}, + {file = "clarabel-0.6.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e0b1891d8e507eb0bfc7e0b981584c388b2ab28658056e600997dbbc23f1ab4"}, + {file = "clarabel-0.6.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9946d3b5db346421b6d839d868e7b1151b590f871344fe95113bfd55b5be2433"}, + {file = "clarabel-0.6.0-cp37-abi3-win32.whl", hash = "sha256:73ed408c975a8ea021c3d8262d5d023a18e1ac3f6bb59a37cd69a11dba8f86ed"}, + {file = "clarabel-0.6.0-cp37-abi3-win_amd64.whl", hash = "sha256:5a6be4df9fed98b6f73f034836def913a1ecd52e8b79ca230ddf7cd66ebcdee7"}, + {file = "clarabel-0.6.0.tar.gz", hash = "sha256:ef909a393e72981ca10b1d866d9cc7fb6295ece20ae035def764338894961184"}, +] + +[package.dependencies] +numpy = "*" +scipy = "*" + +[[package]] +name = "cloudpickle" +version = "3.0.0" +description = "Pickler class to extend the standard pickle.Pickler functionality" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cloudpickle-3.0.0-py3-none-any.whl", hash = "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7"}, + {file = "cloudpickle-3.0.0.tar.gz", hash = "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882"}, +] + [[package]] name = "cma" version = "3.3.0" @@ -542,133 +561,134 @@ test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] [[package]] name = "contourpy" -version = "1.1.0" +version = "1.1.1" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.8" files = [ - {file = "contourpy-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:89f06eff3ce2f4b3eb24c1055a26981bffe4e7264acd86f15b97e40530b794bc"}, - {file = "contourpy-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dffcc2ddec1782dd2f2ce1ef16f070861af4fb78c69862ce0aab801495dda6a3"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25ae46595e22f93592d39a7eac3d638cda552c3e1160255258b695f7b58e5655"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:17cfaf5ec9862bc93af1ec1f302457371c34e688fbd381f4035a06cd47324f48"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18a64814ae7bce73925131381603fff0116e2df25230dfc80d6d690aa6e20b37"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c81f22b4f572f8a2110b0b741bb64e5a6427e0a198b2cdc1fbaf85f352a3aa"}, - {file = "contourpy-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53cc3a40635abedbec7f1bde60f8c189c49e84ac180c665f2cd7c162cc454baa"}, - {file = "contourpy-1.1.0-cp310-cp310-win32.whl", hash = "sha256:9b2dd2ca3ac561aceef4c7c13ba654aaa404cf885b187427760d7f7d4c57cff8"}, - {file = "contourpy-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:1f795597073b09d631782e7245016a4323cf1cf0b4e06eef7ea6627e06a37ff2"}, - {file = "contourpy-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0b7b04ed0961647691cfe5d82115dd072af7ce8846d31a5fac6c142dcce8b882"}, - {file = "contourpy-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27bc79200c742f9746d7dd51a734ee326a292d77e7d94c8af6e08d1e6c15d545"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052cc634bf903c604ef1a00a5aa093c54f81a2612faedaa43295809ffdde885e"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9382a1c0bc46230fb881c36229bfa23d8c303b889b788b939365578d762b5c18"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5cec36c5090e75a9ac9dbd0ff4a8cf7cecd60f1b6dc23a374c7d980a1cd710e"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cbd657e9bde94cd0e33aa7df94fb73c1ab7799378d3b3f902eb8eb2e04a3a"}, - {file = "contourpy-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:181cbace49874f4358e2929aaf7ba84006acb76694102e88dd15af861996c16e"}, - {file = "contourpy-1.1.0-cp311-cp311-win32.whl", hash = "sha256:edb989d31065b1acef3828a3688f88b2abb799a7db891c9e282df5ec7e46221b"}, - {file = "contourpy-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fb3b7d9e6243bfa1efb93ccfe64ec610d85cfe5aec2c25f97fbbd2e58b531256"}, - {file = "contourpy-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bcb41692aa09aeb19c7c213411854402f29f6613845ad2453d30bf421fe68fed"}, - {file = "contourpy-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5d123a5bc63cd34c27ff9c7ac1cd978909e9c71da12e05be0231c608048bb2ae"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62013a2cf68abc80dadfd2307299bfa8f5aa0dcaec5b2954caeb5fa094171103"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b6616375d7de55797d7a66ee7d087efe27f03d336c27cf1f32c02b8c1a5ac70"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317267d915490d1e84577924bd61ba71bf8681a30e0d6c545f577363157e5e94"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d551f3a442655f3dcc1285723f9acd646ca5858834efeab4598d706206b09c9f"}, - {file = "contourpy-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7a117ce7df5a938fe035cad481b0189049e8d92433b4b33aa7fc609344aafa1"}, - {file = "contourpy-1.1.0-cp38-cp38-win32.whl", hash = "sha256:108dfb5b3e731046a96c60bdc46a1a0ebee0760418951abecbe0fc07b5b93b27"}, - {file = "contourpy-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4f26b25b4f86087e7d75e63212756c38546e70f2a92d2be44f80114826e1cd4"}, - {file = "contourpy-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc00bb4225d57bff7ebb634646c0ee2a1298402ec10a5fe7af79df9a51c1bfd9"}, - {file = "contourpy-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:189ceb1525eb0655ab8487a9a9c41f42a73ba52d6789754788d1883fb06b2d8a"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f2931ed4741f98f74b410b16e5213f71dcccee67518970c42f64153ea9313b9"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30f511c05fab7f12e0b1b7730ebdc2ec8deedcfb505bc27eb570ff47c51a8f15"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:143dde50520a9f90e4a2703f367cf8ec96a73042b72e68fcd184e1279962eb6f"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e94bef2580e25b5fdb183bf98a2faa2adc5b638736b2c0a4da98691da641316a"}, - {file = "contourpy-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ed614aea8462735e7d70141374bd7650afd1c3f3cb0c2dbbcbe44e14331bf002"}, - {file = "contourpy-1.1.0-cp39-cp39-win32.whl", hash = "sha256:71551f9520f008b2950bef5f16b0e3587506ef4f23c734b71ffb7b89f8721999"}, - {file = "contourpy-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:438ba416d02f82b692e371858143970ed2eb6337d9cdbbede0d8ad9f3d7dd17d"}, - {file = "contourpy-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a698c6a7a432789e587168573a864a7ea374c6be8d4f31f9d87c001d5a843493"}, - {file = "contourpy-1.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397b0ac8a12880412da3551a8cb5a187d3298a72802b45a3bd1805e204ad8439"}, - {file = "contourpy-1.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a67259c2b493b00e5a4d0f7bfae51fb4b3371395e47d079a4446e9b0f4d70e76"}, - {file = "contourpy-1.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2b836d22bd2c7bb2700348e4521b25e077255ebb6ab68e351ab5aa91ca27e027"}, - {file = "contourpy-1.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084eaa568400cfaf7179b847ac871582199b1b44d5699198e9602ecbbb5f6104"}, - {file = "contourpy-1.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:911ff4fd53e26b019f898f32db0d4956c9d227d51338fb3b03ec72ff0084ee5f"}, - {file = "contourpy-1.1.0.tar.gz", hash = "sha256:e53046c3863828d21d531cc3b53786e6580eb1ba02477e8681009b6aa0870b21"}, + {file = "contourpy-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b"}, + {file = "contourpy-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1"}, + {file = "contourpy-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d"}, + {file = "contourpy-1.1.1-cp310-cp310-win32.whl", hash = "sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431"}, + {file = "contourpy-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5"}, + {file = "contourpy-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62"}, + {file = "contourpy-1.1.1-cp311-cp311-win32.whl", hash = "sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33"}, + {file = "contourpy-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf"}, + {file = "contourpy-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d"}, + {file = "contourpy-1.1.1-cp312-cp312-win32.whl", hash = "sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6"}, + {file = "contourpy-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8"}, + {file = "contourpy-1.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251"}, + {file = "contourpy-1.1.1-cp38-cp38-win32.whl", hash = "sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7"}, + {file = "contourpy-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85"}, + {file = "contourpy-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e"}, + {file = "contourpy-1.1.1-cp39-cp39-win32.whl", hash = "sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0"}, + {file = "contourpy-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c"}, + {file = "contourpy-1.1.1.tar.gz", hash = "sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab"}, ] [package.dependencies] -numpy = ">=1.16" +numpy = {version = ">=1.16,<2.0", markers = "python_version <= \"3.11\""} [package.extras] bokeh = ["bokeh", "selenium"] -docs = ["furo", "sphinx-copybutton"] -mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.2.0)", "types-Pillow"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.4.1)", "types-Pillow"] test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] test-no-images = ["pytest", "pytest-cov", "wurlitzer"] [[package]] name = "coverage" -version = "7.2.7" +version = "7.3.2" description = "Code coverage measurement for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "coverage-7.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8"}, - {file = "coverage-7.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495"}, - {file = "coverage-7.2.7-cp310-cp310-win32.whl", hash = "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818"}, - {file = "coverage-7.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850"}, - {file = "coverage-7.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f"}, - {file = "coverage-7.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a"}, - {file = "coverage-7.2.7-cp311-cp311-win32.whl", hash = "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a"}, - {file = "coverage-7.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562"}, - {file = "coverage-7.2.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d"}, - {file = "coverage-7.2.7-cp312-cp312-win32.whl", hash = "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511"}, - {file = "coverage-7.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3"}, - {file = "coverage-7.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02"}, - {file = "coverage-7.2.7-cp37-cp37m-win32.whl", hash = "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f"}, - {file = "coverage-7.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0"}, - {file = "coverage-7.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5"}, - {file = "coverage-7.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f"}, - {file = "coverage-7.2.7-cp38-cp38-win32.whl", hash = "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e"}, - {file = "coverage-7.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c"}, - {file = "coverage-7.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9"}, - {file = "coverage-7.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2"}, - {file = "coverage-7.2.7-cp39-cp39-win32.whl", hash = "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb"}, - {file = "coverage-7.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27"}, - {file = "coverage-7.2.7-pp37.pp38.pp39-none-any.whl", hash = "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d"}, - {file = "coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59"}, + {file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"}, + {file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"}, + {file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"}, + {file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"}, + {file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"}, + {file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"}, + {file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"}, + {file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"}, + {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"}, + {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"}, + {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"}, + {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"}, + {file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"}, + {file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"}, + {file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"}, + {file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"}, + {file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"}, + {file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"}, + {file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"}, + {file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"}, + {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"}, + {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, ] [package.dependencies] @@ -783,24 +803,24 @@ numpy = "*" [[package]] name = "custatevec-cu11" -version = "1.4.1" +version = "1.5.0" description = "cuStateVec - a component of NVIDIA cuQuantum SDK" optional = false python-versions = "*" files = [ - {file = "custatevec_cu11-1.4.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0255a6a1001550b9b4d576f24f925f592fa52384e5533303657ca14d002e5b97"}, - {file = "custatevec_cu11-1.4.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:56a689c0caec1eaa46af657bfa7481fc60c4e5da2b585dc1599870fb6d932119"}, + {file = "custatevec_cu11-1.5.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:3e0cbbc487a0590d9f889ad70b9ac21d88c1f555f6fe01b18ba687a0d98d902f"}, + {file = "custatevec_cu11-1.5.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:be289f600e7361cac4acdeb8d12d443117d43ce745c9322f6b828292341b9f30"}, ] [[package]] name = "custatevec-cu12" -version = "1.4.1" +version = "1.5.0" description = "cuStateVec - a component of NVIDIA cuQuantum SDK" optional = false python-versions = "*" files = [ - {file = "custatevec_cu12-1.4.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:3be3c8989a8d2b75678517f19d935bc30889478a2668020d1029f433fb5e9de0"}, - {file = "custatevec_cu12-1.4.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:421ae6d15f4e2ac2e9514fe274dfae181e1ac039e79bafe2f30b448641ee8d42"}, + {file = "custatevec_cu12-1.5.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:e040c92e7ff8dacca74c7f122a1641f15e15a59f2b44c861517cd3515fa32986"}, + {file = "custatevec_cu12-1.5.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:b6202cf0ed3538956f15cffbbe5ec12e75ff5708846cba27c6ad5eb0323df8e6"}, ] [[package]] @@ -827,13 +847,13 @@ files = [ [[package]] name = "cutensornet-cu11" -version = "2.2.1" +version = "2.3.0" description = "cuTensorNet - a component of NVIDIA cuQuantum SDK" optional = false python-versions = "*" files = [ - {file = "cutensornet_cu11-2.2.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:79ab49bce2ba2b549332ff2a000bb0c4cc62466f2d5f7e8129f2eddd938abb63"}, - {file = "cutensornet_cu11-2.2.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:343fe02f81129c1ccc2414a72e6ff418a88027296d8bbc44819031674deb1563"}, + {file = "cutensornet_cu11-2.3.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:fd15b199b189f0501b3fdaa576ee70eedbdfec37b557f7fd56b97aaa5e618667"}, + {file = "cutensornet_cu11-2.3.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:dcb9ab26c3d6b51dfd1146c9ec28fe6768bfe539dca931d4ef462eea15205bf7"}, ] [package.dependencies] @@ -841,13 +861,13 @@ cutensor-cu11 = ">=1.6.1,<2" [[package]] name = "cutensornet-cu12" -version = "2.2.1" +version = "2.3.0" description = "cuTensorNet - a component of NVIDIA cuQuantum SDK" optional = false python-versions = "*" files = [ - {file = "cutensornet_cu12-2.2.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9983a01bee49ef96d265ecdfba71cd0b0ca7ea1ded000e125fa688a7917b98dc"}, - {file = "cutensornet_cu12-2.2.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:652f7449905ddf79de5b370269e90e0b4a73bb94bfd282231e235deac187df7e"}, + {file = "cutensornet_cu12-2.3.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:3c9d5938ab42d96de9ddf2585a0f2348172e8ef12efd082f515a2298bd35ba7a"}, + {file = "cutensornet_cu12-2.3.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:70c45762e9b5aa79be5e106ed8c2912d4fceb573eca9c918e9f7abae91eaa895"}, ] [package.dependencies] @@ -855,58 +875,56 @@ cutensor-cu12 = ">=1.6.1,<2" [[package]] name = "cvxpy" -version = "1.3.2" +version = "1.4.1" description = "A domain-specific language for modeling convex optimization problems in Python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "cvxpy-1.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bf60240f53441abe0f41f147383831345562c0f458e96e112ba55cb4d9030f27"}, - {file = "cvxpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d771ceba9195ebe3164c0b635fd038840577f009ffc12e910db5d1df44b30792"}, - {file = "cvxpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ff9c078919ff19e8297ff75be80262fd208d1ad014a3292baa3311c450f1de0"}, - {file = "cvxpy-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f372d8702b143f79bb097adcb102a0d5888cbb3e4e7e232fb4a101a04d97cc9b"}, - {file = "cvxpy-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:ba37dd5499014fde1da022bdea6efc0ef5e998b3f62c052751812c235a1a58cf"}, - {file = "cvxpy-1.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4bde3515840eb56c8448751d04847abcba074ddc1ebb2f47dbc2c85ad9b78b81"}, - {file = "cvxpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5c9b2b7474647483531ccd469bbfbb4589410d65ac4c28112751c8c56e14d2c3"}, - {file = "cvxpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3bb3db0f7ac49b8acb9a92d3bd5cf814920a6115a9275124bef1299770208c3"}, - {file = "cvxpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b39683655fa099e9b6e51b38bdad5353eaae86344c58dfc7616b33db661bcb0"}, - {file = "cvxpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:647ba8ced43c55241ca684fd9f5be58258e793e92e611abc802c1b540582cb8c"}, - {file = "cvxpy-1.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a70540d1ed93491b285f3f05451bd76df5f39c16e82c350c79dae31a0f8776c6"}, - {file = "cvxpy-1.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0046798fd869853dd9d8d111530da08621b35f16c7346ff6a4775071fa2b273"}, - {file = "cvxpy-1.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b6dde84f42c7d8fd1bf6867a77667ff73529ee5e1ea27892e45716077119e86"}, - {file = "cvxpy-1.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:843f6cd637c31f70ffcf817df86731b99bb15c847d4554a47cf3c0479571a26d"}, - {file = "cvxpy-1.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76c4e7b5a3bc540c09c8388302f5ed5033738454033a9d56a06eb78cfb303e11"}, - {file = "cvxpy-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:05430b56b28bc11edf8be287ce773c34b942335fac154a18ebc298ad6245383b"}, - {file = "cvxpy-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b423313e614a73bc55d7b8474039160ed5ae74e133a15cef51f58639ab210050"}, - {file = "cvxpy-1.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fc6d54393eb926693634134c5109ddd7a17cdb642e8c5a0ff613d8873c0cba3"}, - {file = "cvxpy-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:fadc5c9761ad3b2e3a28bfffb0635bdf6689d2c26721c6f3feeec08b638dd940"}, - {file = "cvxpy-1.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:646908a9afbd20deb2f7848c48521f6677916007170db4b31cf8b679c1e193e0"}, - {file = "cvxpy-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b1e8b7b609630788aabd7ddbfc7dd3d0436a30b814e1896cb45d20155cae8809"}, - {file = "cvxpy-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4765a1e2529bd4f095720143ddd7e55f1063b5a2793daf9d03ebf7f584f87553"}, - {file = "cvxpy-1.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:817d82d1e8b6dc5da244061ce6a63549eb7ef2e3a083c7d170ad578ce09f3071"}, - {file = "cvxpy-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:11e3d09592427eb62dd3268e0e186ef2a1a2587418589e65c264cfe82331de2e"}, - {file = "cvxpy-1.3.2.tar.gz", hash = "sha256:0b685e5040f199f3d703f30f5d22d1f865597623455153d1ddd770245aef0975"}, + {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"}, ] [package.dependencies] +clarabel = ">=0.5.0" ecos = ">=2" numpy = ">=1.15" -osqp = ">=0.4.1" +osqp = ">=0.6.2" +pybind11 = "*" scipy = ">=1.1.0" -scs = ">=1.1.6" -setuptools = ">65.5.1" +scs = ">=3.0" [package.extras] cbc = ["cylp (>=0.91.5)"] clarabel = ["clarabel"] cvxopt = ["cvxopt"] diffcp = ["diffcp"] -glop = ["ortools (>=9.3,<9.5)"] +glop = ["ortools (>=9.5,<9.8)"] glpk = ["cvxopt"] glpk-mi = ["cvxopt"] gurobi = ["gurobipy"] highs = ["scipy (>=1.6.1)"] mosek = ["Mosek"] -pdlp = ["ortools (>=9.3,<9.5)"] +pdlp = ["ortools (>=9.5,<9.8)"] +piqp = ["piqp"] proxqp = ["proxsuite"] scip = ["PySCIPOpt"] scipy = ["scipy"] @@ -915,15 +933,19 @@ xpress = ["xpress"] [[package]] name = "cycler" -version = "0.11.0" +version = "0.12.1" description = "Composable style cycles" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, - {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, ] +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + [[package]] name = "decorator" version = "5.1.1" @@ -1033,13 +1055,13 @@ scipy = ">=0.9" [[package]] name = "exceptiongroup" -version = "1.1.2" +version = "1.1.3" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, - {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, ] [package.extras] @@ -1047,27 +1069,27 @@ test = ["pytest (>=6)"] [[package]] name = "executing" -version = "1.2.0" +version = "2.0.1" description = "Get the currently executing AST node of a frame, and other information" optional = false -python-versions = "*" +python-versions = ">=3.5" files = [ - {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, - {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, ] [package.extras] -tests = ["asttokens", "littleutils", "pytest", "rich"] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] [[package]] name = "fastjsonschema" -version = "2.18.0" +version = "2.18.1" description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" files = [ - {file = "fastjsonschema-2.18.0-py3-none-any.whl", hash = "sha256:128039912a11a807068a7c87d0da36660afbfd7202780db26c4aa7153cfdc799"}, - {file = "fastjsonschema-2.18.0.tar.gz", hash = "sha256:e820349dd16f806e4bd1467a138dced9def4bc7d6213a34295272a6cac95b5bd"}, + {file = "fastjsonschema-2.18.1-py3-none-any.whl", hash = "sha256:aec6a19e9f66e9810ab371cc913ad5f4e9e479b63a7072a2cd060a9369e329a8"}, + {file = "fastjsonschema-2.18.1.tar.gz", hash = "sha256:06dc8680d937628e993fa0cd278f196d20449a1adc087640710846b324d422ea"}, ] [package.extras] @@ -1075,70 +1097,86 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "fastrlock" -version = "0.8.1" +version = "0.8.2" description = "Fast, re-entrant optimistic lock implemented in Cython" optional = false python-versions = "*" files = [ - {file = "fastrlock-0.8.1-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:e88ad64610f709daf6763fcb73b1640489d6cc3065761f0a9a42e83e0a0ce8da"}, - {file = "fastrlock-0.8.1-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:54bcea11203dd0af2b4d783487f12f4f977c098be74a56c4c4d7b60ec793e7b7"}, - {file = "fastrlock-0.8.1-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3068a7497bf3e58c71835c79c27b05b1726f45a1c5c8c333be56ce6643285e31"}, - {file = "fastrlock-0.8.1-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:62168061441c2656e440f401f6d8ebd0af94fac3e662782d12ade08b4c11e8e9"}, - {file = "fastrlock-0.8.1-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8d4e59933a81a62ed85e7df62991120eace969ea15e4ca3321264b4ab320b76a"}, - {file = "fastrlock-0.8.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:cf3e5703e60f88a85d615e36212e411f1fce6cabfad9cc84fe3b9877b133b3c2"}, - {file = "fastrlock-0.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:b84fb655c281bdd35376fc7bd35ff9eba647fe1d0fe770f62f6e64522f894f72"}, - {file = "fastrlock-0.8.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:f836adcdfe3d825e303aca6d26f6c58620fe6d50e86568df741ba96892c37a09"}, - {file = "fastrlock-0.8.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6c53abeae3f9a55b5c65824cec9df59159fa50e8fa800a5c6e8de42b2219c28"}, - {file = "fastrlock-0.8.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:77dd26848251efdf216779eb7581f7bdf99893b34f6e7e8989cc92b580f20189"}, - {file = "fastrlock-0.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0055ba81eb3c4c18345cd229eee9952315e4ecedd9d41793c077892a7823be8f"}, - {file = "fastrlock-0.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:b3c7738911053b418046b57fdc034a67d104fbc597b2391bee663a24f4299314"}, - {file = "fastrlock-0.8.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:fc92b5de2a5c1da603e545056b816f7b3db3d46beccfcffe8dc0d8f0df7cfc6e"}, - {file = "fastrlock-0.8.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:5c59b5de879bb2890a644dbe24c592467219bcf7c5c7388fb200e0022e3b741a"}, - {file = "fastrlock-0.8.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:d19841bf61a4ff671a761040815917880a153e8543d1f147537389af5cbc604a"}, - {file = "fastrlock-0.8.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e7c416807063cadaf9f3f64debf5791d943dcde9089ac71016e8ca010dabaa7f"}, - {file = "fastrlock-0.8.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:30311e09594ac0806aad517da6e0c06510f2c2fc3f8b3b2c1ae6172460fd4f6a"}, - {file = "fastrlock-0.8.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4d1322aa0ffe702e1cc3c002e302edea5f6b8a3af096a7b340b7f719a577669c"}, - {file = "fastrlock-0.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:e683e2eb35058d4ba8576f9180f133b2367723d6ea4c3d1a3559894c8b7c9f33"}, - {file = "fastrlock-0.8.1-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:826b7dbf89c4157134bc96c9df0ef2cc99f8fe2abb38bd080a0acc34172bf7df"}, - {file = "fastrlock-0.8.1-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0e6acadda18125c972b73c4787adbf688c5aa140015ea3632f38d9119cf09214"}, - {file = "fastrlock-0.8.1-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:65d77bfca60672e6ccafcac7b6533d275b626a060fefa6e297cf3430b8357427"}, - {file = "fastrlock-0.8.1-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:a2671b4c6fe6dff7eb83da7cf510894c83d88e4f5ca9a7515f70bc2daff31c4c"}, - {file = "fastrlock-0.8.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:551b70cd6aad03094f977f87c1ea5b19b6036eae340c2181164d15e5602e5fcb"}, - {file = "fastrlock-0.8.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:d0c97035aca21c4b56b4ecb15d006adc0e9277ee8479fe3d709bbc261ff7c8a9"}, - {file = "fastrlock-0.8.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:af58fc057de699dfcd9a3e16c3204696b5155ed931ccc2ec3e8e9123e56343f9"}, - {file = "fastrlock-0.8.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:bb7dfe068b9925cadabf14539e4201c3391da255a6bb2d7a42e2d8b6bb167329"}, - {file = "fastrlock-0.8.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cdba150ab6334f94055e54e3ebda03b9804fb09ad8ebd453af4bc47ad9ddfc17"}, - {file = "fastrlock-0.8.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:51c3200a11797986c85c48102c0ce35f6c53b709ef123b9ac1d07c3617307125"}, - {file = "fastrlock-0.8.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:ec258de18ad41b9e251173d64afe70da83f852b612cf5fc51e64ad0408a0a973"}, - {file = "fastrlock-0.8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:ed84c5d813abf02c809513fe286dac8a21cace71c0a4b6cb344b1aab0571a403"}, - {file = "fastrlock-0.8.1-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:3a7888ce976a6d0ad699c2bdca6571beec482f460cb917978abb8c60f8150219"}, - {file = "fastrlock-0.8.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:d67418209ed0f3a0ff5ca79a8b4a05d4d5711cedd99a45223858bd0826c9112d"}, - {file = "fastrlock-0.8.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:713158684a3c20134b55ee2442616dfba3e6bab9817dd7a8b230afecb331176e"}, - {file = "fastrlock-0.8.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a422bfdaaf896d8e7be6e082d7c59bfca56daa6fdd85023f4f63bfa088f7fd3f"}, - {file = "fastrlock-0.8.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f5b32366e63b5f150ce58efd0d64754310960b4cae81a2c45bf956284188271e"}, - {file = "fastrlock-0.8.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e88260af5a94afe3516e8819a3f77fe604fa4c71e7d4d7c96ae92f84408146e2"}, - {file = "fastrlock-0.8.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2d7bcbd5258d7d2dbe1c8719c3faf6b2f62e609b51c0c80216ea624d2c423357"}, - {file = "fastrlock-0.8.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:537423c21e3f582b044d6aa2da7a813785e80328054099a6913545f68474b088"}, - {file = "fastrlock-0.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cd55b2669a62f2a0eb3fa7bedc4bcca0663440ffa5401f3dc1bd2a3394fca766"}, - {file = "fastrlock-0.8.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:252cd40c2d8a412e238213d494e920d74439ae2d480ff83d72b23270cc218497"}, - {file = "fastrlock-0.8.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:b9bea96dfb18fd1fbd7e18f9e2ee6868691e1c99a3dc111c267a97e49acbecba"}, - {file = "fastrlock-0.8.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:4459f0743af5b4ad5ace4bbb65162e60ed320437dcf473bf60a9f4a9a188b5cd"}, - {file = "fastrlock-0.8.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1bccd6d2ae63995f3f0cd25770f39858f0802e45b95325f406d3fce19c41834d"}, - {file = "fastrlock-0.8.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:3e4c0ada1ce907a5616046eb219eb40ea0ff2bb27f4da703925c32af1537f43a"}, - {file = "fastrlock-0.8.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b864db14be48ff32d37aee0dcd61910274742f84fcced17a0f291f985e0abdca"}, - {file = "fastrlock-0.8.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f2db49fd0166fb61ab00e8d3fe55ae5cbb9d566df42ccf188ab482401fc7ac5d"}, - {file = "fastrlock-0.8.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d38943c3e015bd92ea6b8f155eb829000fc291edad21fc58ca0acbb8dd06788f"}, - {file = "fastrlock-0.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:c00c4e090ff5204830e49cccebb41372f800970466725b184089a40ca332c897"}, - {file = "fastrlock-0.8.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:187786a0bdb8c5c59d8ed6f82846306e63169c3c5437c847c548dfaf548ee958"}, - {file = "fastrlock-0.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:801bee6ef607c2020818d006677704e20997d61524cfa1f338e141a6f017b7dd"}, - {file = "fastrlock-0.8.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:73f1df1d1e141b0e2cedc40536ee745247f0bf968526535eb9e2e7acd85e7535"}, - {file = "fastrlock-0.8.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eb5bb4187880f6944b6213728e3e8617a4613fa9d1303fea84d0227cd81943af"}, - {file = "fastrlock-0.8.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:294b60ed41b746e99189260f7dc42a8c280c59c9aa9e152f89752fc102f2eefa"}, - {file = "fastrlock-0.8.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e5122103f38c9ebdb597304b2bed3b4c3b9f2c372d649eff2f7c3be70f8f7fc1"}, - {file = "fastrlock-0.8.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:625372f1e19c80fc90b83a167bedc785855ea63c0deb2e66aab922e346dd9517"}, - {file = "fastrlock-0.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:36fdc86df2cfa7f1692cdb035338dd7f952fa50e5ea8e39569e15ff4269a8e1a"}, - {file = "fastrlock-0.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:6e97a68d67bd4b19948bc119252dc2b473dbcb301aa319ae98246d86281d2b9d"}, - {file = "fastrlock-0.8.1.tar.gz", hash = "sha256:8a5f2f00021c4ac72e4dab910dc1863c0e008a2e7fb5c843933ae9bcfc3d0802"}, + {file = "fastrlock-0.8.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:94e348c72a1fd1f8191f25ea056448e4f5a87b8fbf005b39d290dcb0581a48cd"}, + {file = "fastrlock-0.8.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d5595903444c854b99c42122b87edfe8a37cd698a4eae32f4fd1d2a7b6c115d"}, + {file = "fastrlock-0.8.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e4bbde174a0aff5f6eeba75cf8c4c5d2a316316bc21f03a0bddca0fc3659a6f3"}, + {file = "fastrlock-0.8.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7a2ccaf88ac0db153e84305d1ef0aa138cea82c6a88309066f6eaa3bc98636cd"}, + {file = "fastrlock-0.8.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:31a27a2edf482df72b91fe6c6438314d2c65290aa7becc55589d156c9b91f0da"}, + {file = "fastrlock-0.8.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:e9904b5b37c3e5bb4a245c56bc4b7e497da57ffb8528f4fc39af9dcb168ee2e1"}, + {file = "fastrlock-0.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:43a241655e83e4603a152192cf022d5ca348c2f4e56dfb02e5c9c4c1a32f9cdb"}, + {file = "fastrlock-0.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9121a894d74e65557e47e777060a495ab85f4b903e80dd73a3c940ba042920d7"}, + {file = "fastrlock-0.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:11bbbbc526363955aeddb9eec4cee2a0012322b7b2f15b54f44454fcf4fd398a"}, + {file = "fastrlock-0.8.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:27786c62a400e282756ae1b090bcd7cfa35f28270cff65a9e7b27a5327a32561"}, + {file = "fastrlock-0.8.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:08315bde19d0c2e6b06593d5a418be3dc8f9b1ee721afa96867b9853fceb45cf"}, + {file = "fastrlock-0.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e8b49b5743ede51e0bcf6805741f39f5e0e0fd6a172ba460cb39e3097ba803bb"}, + {file = "fastrlock-0.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b443e73a4dfc7b6e0800ea4c13567b9694358e86f53bb2612a51c9e727cac67b"}, + {file = "fastrlock-0.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:b3853ed4ce522598dc886160a7bab432a093051af85891fa2f5577c1dcac8ed6"}, + {file = "fastrlock-0.8.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:790fc19bccbd39426060047e53629f171a44745613bf360a045e9f9c8c4a2cea"}, + {file = "fastrlock-0.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:dbdce852e6bb66e1b8c36679d482971d69d93acf1785657522e51b7de30c3356"}, + {file = "fastrlock-0.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d47713ffe6d4a627fbf078be9836a95ac106b4a0543e3841572c91e292a5d885"}, + {file = "fastrlock-0.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:ea96503b918fceaf40443182742b8964d47b65c5ebdea532893cb9479620000c"}, + {file = "fastrlock-0.8.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c6bffa978793bea5e1b00e677062e53a62255439339591b70e209fa1552d5ee0"}, + {file = "fastrlock-0.8.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:75c07726c8b1a52147fd7987d6baaa318c5dced1416c3f25593e40f56e10755b"}, + {file = "fastrlock-0.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:88f079335e9da631efa64486c8207564a7bcd0c00526bb9e842e9d5b7e50a6cc"}, + {file = "fastrlock-0.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4fb2e77ff04bc4beb71d63c8e064f052ce5a6ea1e001d528d4d7f4b37d736f2e"}, + {file = "fastrlock-0.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:b4c9083ea89ab236b06e9ef2263971db3b4b507195fc7d5eecab95828dcae325"}, + {file = "fastrlock-0.8.2-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:98195866d3a9949915935d40a88e4f1c166e82e378f622c88025f2938624a90a"}, + {file = "fastrlock-0.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b22ea9bf5f9fad2b0077e944a7813f91593a4f61adf8faf734a70aed3f2b3a40"}, + {file = "fastrlock-0.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc1bf0ac8a194313cf6e645e300a8a379674ceed8e0b1e910a2de3e3c28989e"}, + {file = "fastrlock-0.8.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a3dcc876050b8f5cbc0ee84ef1e7f0c1dfe7c148f10098828bc4403683c33f10"}, + {file = "fastrlock-0.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:685e656048b59d8dfde8c601f188ad53a4d719eb97080cafc8696cda6d75865e"}, + {file = "fastrlock-0.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:fb5363cf0fddd9b50525ddbf64a1e1b28ec4c6dfb28670a940cb1cf988a6786b"}, + {file = "fastrlock-0.8.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:a74f5a92fa6e51c4f3c69b29c4662088b97be12f40652a21109605a175c81824"}, + {file = "fastrlock-0.8.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ccf39ad5702e33e4d335b48ef9d56e21619b529b7f7471b5211419f380329b62"}, + {file = "fastrlock-0.8.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:66f2662c640bb71a1016a031eea6eef9d25c2bcdf7ffd1d1ddc5a58f9a1ced04"}, + {file = "fastrlock-0.8.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:17734e2e5af4c07ddb0fb10bd484e062c22de3be6b67940b9cc6ec2f18fa61ba"}, + {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:ab91b0c36e95d42e1041a4907e3eefd06c482d53af3c7a77be7e214cc7cd4a63"}, + {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b32fdf874868326351a75b1e4c02f97e802147119ae44c52d3d9da193ec34f5b"}, + {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:2074548a335fcf7d19ebb18d9208da9e33b06f745754466a7e001d2b1c58dd19"}, + {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4fb04442b6d1e2b36c774919c6bcbe3339c61b337261d4bd57e27932589095af"}, + {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1fed2f4797ad68e9982038423018cf08bec5f4ce9fed63a94a790773ed6a795c"}, + {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e380ec4e6d8b26e389713995a43cb7fe56baea2d25fe073d4998c4821a026211"}, + {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:25945f962c7bd808415cfde3da624d4399d4ea71ed8918538375f16bceb79e1c"}, + {file = "fastrlock-0.8.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2c1719ddc8218b01e82fb2e82e8451bd65076cb96d7bef4477194bbb4305a968"}, + {file = "fastrlock-0.8.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:5460c5ee6ced6d61ec8cd2324ebbe793a4960c4ffa2131ffff480e3b61c99ec5"}, + {file = "fastrlock-0.8.2-cp36-cp36m-win_amd64.whl", hash = "sha256:33145acbad8317584cd64588131c7e1e286beef6280c0009b4544c91fce171d2"}, + {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:59344c1d46b7dec97d3f22f1cc930fafe8980b3c5bc9c9765c56738a5f1559e4"}, + {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2a1c354f13f22b737621d914f3b4a8434ae69d3027a775e94b3e671756112f9"}, + {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:cf81e0278b645004388873e0a1f9e3bc4c9ab8c18e377b14ed1a544be4b18c9a"}, + {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1b15430b93d7eb3d56f6ff690d2ebecb79ed0e58248427717eba150a508d1cd7"}, + {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:067edb0a0805bf61e17a251d5046af59f6e9d2b8ad01222e0ef7a0b7937d5548"}, + {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eb31fe390f03f7ae886dcc374f1099ec88526631a4cb891d399b68181f154ff0"}, + {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:643e1e65b4f5b284427e61a894d876d10459820e93aa1e724dfb415117be24e0"}, + {file = "fastrlock-0.8.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5dfb78dd600a12f23fc0c3ec58f81336229fdc74501ecf378d1ce5b3f2f313ea"}, + {file = "fastrlock-0.8.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8ca0fe21458457077e4cb2d81e1ebdb146a00b3e9e2db6180a773f7ea905032"}, + {file = "fastrlock-0.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d918dfe473291e8bfd8e13223ea5cb9b317bd9f50c280923776c377f7c64b428"}, + {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:c393af77c659a38bffbca215c0bcc8629ba4299568308dd7e4ff65d62cabed39"}, + {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:73426f5eb2ecc10626c67cf86bd0af9e00d53e80e5c67d5ce8e18376d6abfa09"}, + {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:320fd55bafee3eb069cfb5d6491f811a912758387ef2193840e2663e80e16f48"}, + {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8c1c91a68926421f5ccbc82c85f83bd3ba593b121a46a1b9a554b3f0dd67a4bf"}, + {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ad1bc61c7f6b0e58106aaab034916b6cb041757f708b07fbcdd9d6e1ac629225"}, + {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:87f4e01b042c84e6090dbc4fbe3415ddd69f6bc0130382323f9d3f1b8dd71b46"}, + {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d34546ad2e4a480b94b6797bcc5a322b3c705c4c74c3e4e545c4a3841c1b2d59"}, + {file = "fastrlock-0.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ebb32d776b61acd49f859a1d16b9e3d84e7b46d0d92aebd58acd54dc38e96664"}, + {file = "fastrlock-0.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:30bdbe4662992348132d03996700e1cf910d141d629179b967b146a22942264e"}, + {file = "fastrlock-0.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:07ed3c7b3867c05a3d6be4ced200c7767000f3431b9be6da66972822dd86e8be"}, + {file = "fastrlock-0.8.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:ddf5d247f686aec853ddcc9a1234bfcc6f57b0a0670d2ad82fc25d8ae7e6a15f"}, + {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7269bb3fc15587b0c191eecd95831d771a7d80f0c48929e560806b038ff3066c"}, + {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:adcb9e77aa132cc6c9de2ffe7cf880a20aa8cdba21d367d1da1a412f57bddd5d"}, + {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:a3b8b5d2935403f1b4b25ae324560e94b59593a38c0d2e7b6c9872126a9622ed"}, + {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2587cedbb36c7988e707d83f0f1175c1f882f362b5ebbee25d70218ea33d220d"}, + {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9af691a9861027181d4de07ed74f0aee12a9650ac60d0a07f4320bff84b5d95f"}, + {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99dd6652bd6f730beadf74ef769d38c6bbd8ee6d1c15c8d138ea680b0594387f"}, + {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4d63b6596368dab9e0cc66bf047e7182a56f33b34db141816a4f21f5bf958228"}, + {file = "fastrlock-0.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ff75c90663d6e8996610d435e71487daa853871ad1770dd83dc0f2fc4997241e"}, + {file = "fastrlock-0.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e27c3cd27fbd25e5223c5c992b300cd4ee8f0a75c6f222ce65838138d853712c"}, + {file = "fastrlock-0.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:dd961a32a7182c3891cdebca417fda67496d5d5de6ae636962254d22723bdf52"}, + {file = "fastrlock-0.8.2.tar.gz", hash = "sha256:644ec9215cf9c4df8028d8511379a15d9c1af3e16d80e47f1b6fdc6ba118356a"}, ] [[package]] @@ -1154,49 +1192,57 @@ files = [ [[package]] name = "fonttools" -version = "4.42.0" +version = "4.44.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.42.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9c456d1f23deff64ffc8b5b098718e149279abdea4d8692dba69172fb6a0d597"}, - {file = "fonttools-4.42.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:150122ed93127a26bc3670ebab7e2add1e0983d30927733aec327ebf4255b072"}, - {file = "fonttools-4.42.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48e82d776d2e93f88ca56567509d102266e7ab2fb707a0326f032fe657335238"}, - {file = "fonttools-4.42.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58c1165f9b2662645de9b19a8c8bdd636b36294ccc07e1b0163856b74f10bafc"}, - {file = "fonttools-4.42.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2d6dc3fa91414ff4daa195c05f946e6a575bd214821e26d17ca50f74b35b0fe4"}, - {file = "fonttools-4.42.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fae4e801b774cc62cecf4a57b1eae4097903fced00c608d9e2bc8f84cd87b54a"}, - {file = "fonttools-4.42.0-cp310-cp310-win32.whl", hash = "sha256:b8600ae7dce6ec3ddfb201abb98c9d53abbf8064d7ac0c8a0d8925e722ccf2a0"}, - {file = "fonttools-4.42.0-cp310-cp310-win_amd64.whl", hash = "sha256:57b68eab183fafac7cd7d464a7bfa0fcd4edf6c67837d14fb09c1c20516cf20b"}, - {file = "fonttools-4.42.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0a1466713e54bdbf5521f2f73eebfe727a528905ff5ec63cda40961b4b1eea95"}, - {file = "fonttools-4.42.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3fb2a69870bfe143ec20b039a1c8009e149dd7780dd89554cc8a11f79e5de86b"}, - {file = "fonttools-4.42.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae881e484702efdb6cf756462622de81d4414c454edfd950b137e9a7352b3cb9"}, - {file = "fonttools-4.42.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27ec3246a088555629f9f0902f7412220c67340553ca91eb540cf247aacb1983"}, - {file = "fonttools-4.42.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8ece1886d12bb36c48c00b2031518877f41abae317e3a55620d38e307d799b7e"}, - {file = "fonttools-4.42.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:10dac980f2b975ef74532e2a94bb00e97a95b4595fb7f98db493c474d5f54d0e"}, - {file = "fonttools-4.42.0-cp311-cp311-win32.whl", hash = "sha256:83b98be5d291e08501bd4fc0c4e0f8e6e05b99f3924068b17c5c9972af6fff84"}, - {file = "fonttools-4.42.0-cp311-cp311-win_amd64.whl", hash = "sha256:e35bed436726194c5e6e094fdfb423fb7afaa0211199f9d245e59e11118c576c"}, - {file = "fonttools-4.42.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c36c904ce0322df01e590ba814d5d69e084e985d7e4c2869378671d79662a7d4"}, - {file = "fonttools-4.42.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d54e600a2bcfa5cdaa860237765c01804a03b08404d6affcd92942fa7315ffba"}, - {file = "fonttools-4.42.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01cfe02416b6d416c5c8d15e30315cbcd3e97d1b50d3b34b0ce59f742ef55258"}, - {file = "fonttools-4.42.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f81ed9065b4bd3f4f3ce8e4873cd6a6b3f4e92b1eddefde35d332c6f414acc3"}, - {file = "fonttools-4.42.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:685a4dd6cf31593b50d6d441feb7781a4a7ef61e19551463e14ed7c527b86f9f"}, - {file = "fonttools-4.42.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:329341ba3d86a36e482610db56b30705384cb23bd595eac8cbb045f627778e9d"}, - {file = "fonttools-4.42.0-cp38-cp38-win32.whl", hash = "sha256:4655c480a1a4d706152ff54f20e20cf7609084016f1df3851cce67cef768f40a"}, - {file = "fonttools-4.42.0-cp38-cp38-win_amd64.whl", hash = "sha256:6bd7e4777bff1dcb7c4eff4786998422770f3bfbef8be401c5332895517ba3fa"}, - {file = "fonttools-4.42.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9b55d2a3b360e0c7fc5bd8badf1503ca1c11dd3a1cd20f2c26787ffa145a9c7"}, - {file = "fonttools-4.42.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0df8ef75ba5791e873c9eac2262196497525e3f07699a2576d3ab9ddf41cb619"}, - {file = "fonttools-4.42.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd2363ea7728496827658682d049ffb2e98525e2247ca64554864a8cc945568"}, - {file = "fonttools-4.42.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d40673b2e927f7cd0819c6f04489dfbeb337b4a7b10fc633c89bf4f34ecb9620"}, - {file = "fonttools-4.42.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c8bf88f9e3ce347c716921804ef3a8330cb128284eb6c0b6c4b3574f3c580023"}, - {file = "fonttools-4.42.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:703101eb0490fae32baf385385d47787b73d9ea55253df43b487c89ec767e0d7"}, - {file = "fonttools-4.42.0-cp39-cp39-win32.whl", hash = "sha256:f0290ea7f9945174bd4dfd66e96149037441eb2008f3649094f056201d99e293"}, - {file = "fonttools-4.42.0-cp39-cp39-win_amd64.whl", hash = "sha256:ae7df0ae9ee2f3f7676b0ff6f4ebe48ad0acaeeeaa0b6839d15dbf0709f2c5ef"}, - {file = "fonttools-4.42.0-py3-none-any.whl", hash = "sha256:dfe7fa7e607f7e8b58d0c32501a3a7cac148538300626d1b930082c90ae7f6bd"}, - {file = "fonttools-4.42.0.tar.gz", hash = "sha256:614b1283dca88effd20ee48160518e6de275ce9b5456a3134d5f235523fc5065"}, + {file = "fonttools-4.44.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1cd1c6bb097e774d68402499ff66185190baaa2629ae2f18515a2c50b93db0c"}, + {file = "fonttools-4.44.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b9eab7f9837fdaa2a10a524fbcc2ec24bf60637c044b6e4a59c3f835b90f0fae"}, + {file = "fonttools-4.44.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f412954275e594f7a51c16f3b3edd850acb0d842fefc33856b63a17e18499a5"}, + {file = "fonttools-4.44.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50d25893885e80a5955186791eed5579f1e75921751539cc1dc3ffd1160b48cf"}, + {file = "fonttools-4.44.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:22ea8aa7b3712450b42b044702bd3a64fd118006bad09a6f94bd1b227088492e"}, + {file = "fonttools-4.44.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df40daa6c03b98652ffe8110ae014fe695437f6e1cb5a07e16ea37f40e73ac86"}, + {file = "fonttools-4.44.0-cp310-cp310-win32.whl", hash = "sha256:bca49da868e8bde569ef36f0cc1b6de21d56bf9c3be185c503b629c19a185287"}, + {file = "fonttools-4.44.0-cp310-cp310-win_amd64.whl", hash = "sha256:dbac86d83d96099890e731cc2af97976ff2c98f4ba432fccde657c5653a32f1c"}, + {file = "fonttools-4.44.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e8ff7d19a6804bfd561cfcec9b4200dd1788e28f7de4be70189801530c47c1b3"}, + {file = "fonttools-4.44.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8a1fa9a718de0bc026979c93e1e9b55c5efde60d76f91561fd713387573817d"}, + {file = "fonttools-4.44.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05064f95aacdfc06f21e55096c964b2228d942b8675fa26995a2551f6329d2d"}, + {file = "fonttools-4.44.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31b38528f25bc662401e6ffae14b3eb7f1e820892fd80369a37155e3b636a2f4"}, + {file = "fonttools-4.44.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:05d7c4d2c95b9490e669f3cb83918799bf1c838619ac6d3bad9ea017cfc63f2e"}, + {file = "fonttools-4.44.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6999e80a125b0cd8e068d0210b63323f17338038c2ecd2e11b9209ec430fe7f2"}, + {file = "fonttools-4.44.0-cp311-cp311-win32.whl", hash = "sha256:a7aec7f5d14dfcd71fb3ebc299b3f000c21fdc4043079101777ed2042ba5b7c5"}, + {file = "fonttools-4.44.0-cp311-cp311-win_amd64.whl", hash = "sha256:518a945dbfe337744bfff31423c1430303b8813c5275dffb0f2577f0734a1189"}, + {file = "fonttools-4.44.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:59b6ad83cce067d10f4790c037a5904424f45bebb5e7be2eb2db90402f288267"}, + {file = "fonttools-4.44.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c2de1fb18198acd400c45ffe2aef5420c8d55fde903e91cba705596099550f3b"}, + {file = "fonttools-4.44.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84f308b7a8d28208d54315d11d35f9888d6d607673dd4d42d60b463682ee0400"}, + {file = "fonttools-4.44.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66bc6efd829382f7a7e6cf33c2fb32b13edc8a239eb15f32acbf197dce7a0165"}, + {file = "fonttools-4.44.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a8b99713d3a0d0e876b6aecfaada5e7dc9fe979fcd90ef9fa0ba1d9b9aed03f2"}, + {file = "fonttools-4.44.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b63da598d9cbc52e2381f922da0e94d60c0429f92207bd3fb04d112fc82ea7cb"}, + {file = "fonttools-4.44.0-cp312-cp312-win32.whl", hash = "sha256:f611c97678604e302b725f71626edea113a5745a7fb557c958b39edb6add87d5"}, + {file = "fonttools-4.44.0-cp312-cp312-win_amd64.whl", hash = "sha256:58af428746fa73a2edcbf26aff33ac4ef3c11c8d75bb200eaea2f7e888d2de4e"}, + {file = "fonttools-4.44.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9ee8692e23028564c13d924004495f284df8ac016a19f17a87251210e1f1f928"}, + {file = "fonttools-4.44.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dab3d00d27b1a79ae4d4a240e8ceea8af0ff049fd45f05adb4f860d93744110d"}, + {file = "fonttools-4.44.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f53526668beccdb3409c6055a4ffe50987a7f05af6436fa55d61f5e7bd450219"}, + {file = "fonttools-4.44.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3da036b016c975c2d8c69005bdc4d5d16266f948a7fab950244e0f58301996a"}, + {file = "fonttools-4.44.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b99fe8ef4093f672d00841569d2d05691e50334d79f4d9c15c1265d76d5580d2"}, + {file = "fonttools-4.44.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d16d9634ff1e5cea2cf4a8cbda9026f766e4b5f30b48f8180f0e99133d3abfc"}, + {file = "fonttools-4.44.0-cp38-cp38-win32.whl", hash = "sha256:3d29509f6e05e8d725db59c2d8c076223d793e4e35773040be6632a0349f2f97"}, + {file = "fonttools-4.44.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4fa4f4bc8fd86579b8cdbe5e948f35d82c0eda0091c399d009b2a5a6b61c040"}, + {file = "fonttools-4.44.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c794de4086f06ae609b71ac944ec7deb09f34ecf73316fddc041087dd24bba39"}, + {file = "fonttools-4.44.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2db63941fee3122e31a21dd0f5b2138ce9906b661a85b63622421d3654a74ae2"}, + {file = "fonttools-4.44.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb01c49c8aa035d5346f46630209923d4927ed15c2493db38d31da9f811eb70d"}, + {file = "fonttools-4.44.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46c79af80a835410874683b5779b6c1ec1d5a285e11c45b5193e79dd691eb111"}, + {file = "fonttools-4.44.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b6e6aa2d066f8dafd06d8d0799b4944b5d5a1f015dd52ac01bdf2895ebe169a0"}, + {file = "fonttools-4.44.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:63a3112f753baef8c6ac2f5f574bb9ac8001b86c8c0c0380039db47a7f512d20"}, + {file = "fonttools-4.44.0-cp39-cp39-win32.whl", hash = "sha256:54efed22b2799a85475e6840e907c402ba49892c614565dc770aa97a53621b2b"}, + {file = "fonttools-4.44.0-cp39-cp39-win_amd64.whl", hash = "sha256:2e91e19b583961979e2e5a701269d3cfc07418963bee717f8160b0a24332826b"}, + {file = "fonttools-4.44.0-py3-none-any.whl", hash = "sha256:b9beb0fa6ff3ea808ad4a6962d68ac0f140ddab080957b20d9e268e4d67fb335"}, + {file = "fonttools-4.44.0.tar.gz", hash = "sha256:4e90dd81b6e0d97ebfe52c0d12a17a9ef7f305d6bfbb93081265057d6092f252"}, ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["munkres", "scipy"] lxml = ["lxml (>=4.0,<5)"] @@ -1206,7 +1252,7 @@ repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] type1 = ["xattr"] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.0.0)"] +unicode = ["unicodedata2 (>=15.1.0)"] woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] @@ -1226,6 +1272,16 @@ pygments = ">=2.7" sphinx = ">=5.0,<7.0" sphinx-basic-ng = "*" +[[package]] +name = "future" +version = "0.18.3" +description = "Clean single-source support for Python 3 and 2" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "future-0.18.3.tar.gz", hash = "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"}, +] + [[package]] name = "gast" version = "0.4.0" @@ -1263,27 +1319,26 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0dev)"] [[package]] name = "google-auth" -version = "2.17.3" +version = "2.23.4" description = "Google Authentication Library" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +python-versions = ">=3.7" files = [ - {file = "google-auth-2.17.3.tar.gz", hash = "sha256:ce311e2bc58b130fddf316df57c9b3943c2a7b4f6ec31de9663a9333e4064efc"}, - {file = "google_auth-2.17.3-py2.py3-none-any.whl", hash = "sha256:f586b274d3eb7bd932ea424b1c702a30e0393a2e2bc4ca3eae8263ffd8be229f"}, + {file = "google-auth-2.23.4.tar.gz", hash = "sha256:79905d6b1652187def79d491d6e23d0cbb3a21d3c7ba0dbaa9c8a01906b13ff3"}, + {file = "google_auth-2.23.4-py2.py3-none-any.whl", hash = "sha256:d4bbc92fe4b8bfd2f3e8d88e5ba7085935da208ee38a134fc280e7ce682a05f2"}, ] [package.dependencies] cachetools = ">=2.0.0,<6.0" pyasn1-modules = ">=0.2.1" -rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""} -six = ">=1.9.0" +rsa = ">=3.1.4,<5" [package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "requests (>=2.20.0,<3.0.0dev)"] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] -requests = ["requests (>=2.20.0,<3.0.0dev)"] +requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "google-auth-oauthlib" @@ -1320,13 +1375,13 @@ six = "*" [[package]] name = "googleapis-common-protos" -version = "1.60.0" +version = "1.61.0" description = "Common protobufs used in Google APIs" optional = false python-versions = ">=3.7" files = [ - {file = "googleapis-common-protos-1.60.0.tar.gz", hash = "sha256:e73ebb404098db405ba95d1e1ae0aa91c3e15a71da031a2eeb6b2e23e7bc3708"}, - {file = "googleapis_common_protos-1.60.0-py2.py3-none-any.whl", hash = "sha256:69f9bbcc6acde92cab2db95ce30a70bd2b81d20b12eff3f1aabaffcbe8a93918"}, + {file = "googleapis-common-protos-1.61.0.tar.gz", hash = "sha256:8a64866a97f6304a7179873a465d6eee97b7a24ec6cfd78e0f575e96b821240b"}, + {file = "googleapis_common_protos-1.61.0-py2.py3-none-any.whl", hash = "sha256:22f1915393bb3245343f6efe87f6fe868532efc12aa26b391b15132e1279f1c0"}, ] [package.dependencies] @@ -1337,60 +1392,69 @@ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] [[package]] name = "grpcio" -version = "1.57.0" +version = "1.59.2" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.7" files = [ - {file = "grpcio-1.57.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:092fa155b945015754bdf988be47793c377b52b88d546e45c6a9f9579ac7f7b6"}, - {file = "grpcio-1.57.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:2f7349786da979a94690cc5c2b804cab4e8774a3cf59be40d037c4342c906649"}, - {file = "grpcio-1.57.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:82640e57fb86ea1d71ea9ab54f7e942502cf98a429a200b2e743d8672171734f"}, - {file = "grpcio-1.57.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40b72effd4c789de94ce1be2b5f88d7b9b5f7379fe9645f198854112a6567d9a"}, - {file = "grpcio-1.57.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f708a6a17868ad8bf586598bee69abded4996b18adf26fd2d91191383b79019"}, - {file = "grpcio-1.57.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:60fe15288a0a65d5c1cb5b4a62b1850d07336e3ba728257a810317be14f0c527"}, - {file = "grpcio-1.57.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6907b1cf8bb29b058081d2aad677b15757a44ef2d4d8d9130271d2ad5e33efca"}, - {file = "grpcio-1.57.0-cp310-cp310-win32.whl", hash = "sha256:57b183e8b252825c4dd29114d6c13559be95387aafc10a7be645462a0fc98bbb"}, - {file = "grpcio-1.57.0-cp310-cp310-win_amd64.whl", hash = "sha256:7b400807fa749a9eb286e2cd893e501b110b4d356a218426cb9c825a0474ca56"}, - {file = "grpcio-1.57.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:c6ebecfb7a31385393203eb04ed8b6a08f5002f53df3d59e5e795edb80999652"}, - {file = "grpcio-1.57.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:00258cbe3f5188629828363ae8ff78477ce976a6f63fb2bb5e90088396faa82e"}, - {file = "grpcio-1.57.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:23e7d8849a0e58b806253fd206ac105b328171e01b8f18c7d5922274958cc87e"}, - {file = "grpcio-1.57.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5371bcd861e679d63b8274f73ac281751d34bd54eccdbfcd6aa00e692a82cd7b"}, - {file = "grpcio-1.57.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aed90d93b731929e742967e236f842a4a2174dc5db077c8f9ad2c5996f89f63e"}, - {file = "grpcio-1.57.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fe752639919aad9ffb0dee0d87f29a6467d1ef764f13c4644d212a9a853a078d"}, - {file = "grpcio-1.57.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fada6b07ec4f0befe05218181f4b85176f11d531911b64c715d1875c4736d73a"}, - {file = "grpcio-1.57.0-cp311-cp311-win32.whl", hash = "sha256:bb396952cfa7ad2f01061fbc7dc1ad91dd9d69243bcb8110cf4e36924785a0fe"}, - {file = "grpcio-1.57.0-cp311-cp311-win_amd64.whl", hash = "sha256:e503cb45ed12b924b5b988ba9576dc9949b2f5283b8e33b21dcb6be74a7c58d0"}, - {file = "grpcio-1.57.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:fd173b4cf02b20f60860dc2ffe30115c18972d7d6d2d69df97ac38dee03be5bf"}, - {file = "grpcio-1.57.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:d7f8df114d6b4cf5a916b98389aeaf1e3132035420a88beea4e3d977e5f267a5"}, - {file = "grpcio-1.57.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:76c44efa4ede1f42a9d5b2fed1fe9377e73a109bef8675fb0728eb80b0b8e8f2"}, - {file = "grpcio-1.57.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4faea2cfdf762a664ab90589b66f416274887641ae17817de510b8178356bf73"}, - {file = "grpcio-1.57.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c60b83c43faeb6d0a9831f0351d7787a0753f5087cc6fa218d78fdf38e5acef0"}, - {file = "grpcio-1.57.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b363bbb5253e5f9c23d8a0a034dfdf1b7c9e7f12e602fc788c435171e96daccc"}, - {file = "grpcio-1.57.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f1fb0fd4a1e9b11ac21c30c169d169ef434c6e9344ee0ab27cfa6f605f6387b2"}, - {file = "grpcio-1.57.0-cp37-cp37m-win_amd64.whl", hash = "sha256:34950353539e7d93f61c6796a007c705d663f3be41166358e3d88c45760c7d98"}, - {file = "grpcio-1.57.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:871f9999e0211f9551f368612460442a5436d9444606184652117d6a688c9f51"}, - {file = "grpcio-1.57.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:a8a8e560e8dbbdf29288872e91efd22af71e88b0e5736b0daf7773c1fecd99f0"}, - {file = "grpcio-1.57.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:2313b124e475aa9017a9844bdc5eafb2d5abdda9d456af16fc4535408c7d6da6"}, - {file = "grpcio-1.57.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4098b6b638d9e0ca839a81656a2fd4bc26c9486ea707e8b1437d6f9d61c3941"}, - {file = "grpcio-1.57.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e5b58e32ae14658085c16986d11e99abd002ddbf51c8daae8a0671fffb3467f"}, - {file = "grpcio-1.57.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0f80bf37f09e1caba6a8063e56e2b87fa335add314cf2b78ebf7cb45aa7e3d06"}, - {file = "grpcio-1.57.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5b7a4ce8f862fe32b2a10b57752cf3169f5fe2915acfe7e6a1e155db3da99e79"}, - {file = "grpcio-1.57.0-cp38-cp38-win32.whl", hash = "sha256:9338bacf172e942e62e5889b6364e56657fbf8ac68062e8b25c48843e7b202bb"}, - {file = "grpcio-1.57.0-cp38-cp38-win_amd64.whl", hash = "sha256:e1cb52fa2d67d7f7fab310b600f22ce1ff04d562d46e9e0ac3e3403c2bb4cc16"}, - {file = "grpcio-1.57.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:fee387d2fab144e8a34e0e9c5ca0f45c9376b99de45628265cfa9886b1dbe62b"}, - {file = "grpcio-1.57.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:b53333627283e7241fcc217323f225c37783b5f0472316edcaa4479a213abfa6"}, - {file = "grpcio-1.57.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:f19ac6ac0a256cf77d3cc926ef0b4e64a9725cc612f97228cd5dc4bd9dbab03b"}, - {file = "grpcio-1.57.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3fdf04e402f12e1de8074458549337febb3b45f21076cc02ef4ff786aff687e"}, - {file = "grpcio-1.57.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5613a2fecc82f95d6c51d15b9a72705553aa0d7c932fad7aed7afb51dc982ee5"}, - {file = "grpcio-1.57.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b670c2faa92124b7397b42303e4d8eb64a4cd0b7a77e35a9e865a55d61c57ef9"}, - {file = "grpcio-1.57.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7a635589201b18510ff988161b7b573f50c6a48fae9cb567657920ca82022b37"}, - {file = "grpcio-1.57.0-cp39-cp39-win32.whl", hash = "sha256:d78d8b86fcdfa1e4c21f8896614b6cc7ee01a2a758ec0c4382d662f2a62cf766"}, - {file = "grpcio-1.57.0-cp39-cp39-win_amd64.whl", hash = "sha256:20ec6fc4ad47d1b6e12deec5045ec3cd5402d9a1597f738263e98f490fe07056"}, - {file = "grpcio-1.57.0.tar.gz", hash = "sha256:4b089f7ad1eb00a104078bab8015b0ed0ebcb3b589e527ab009c53893fd4e613"}, + {file = "grpcio-1.59.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:d2fa68a96a30dd240be80bbad838a0ac81a61770611ff7952b889485970c4c71"}, + {file = "grpcio-1.59.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:cf0dead5a2c5a3347af2cfec7131d4f2a2e03c934af28989c9078f8241a491fa"}, + {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:e420ced29b5904cdf9ee5545e23f9406189d8acb6750916c2db4793dada065c6"}, + {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b230028a008ae1d0f430acb227d323ff8a619017415cf334c38b457f814119f"}, + {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a4a3833c0e067f3558538727235cd8a49709bff1003200bbdefa2f09334e4b1"}, + {file = "grpcio-1.59.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6b25ed37c27e652db01be341af93fbcea03d296c024d8a0e680017a268eb85dd"}, + {file = "grpcio-1.59.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73abb8584b0cf74d37f5ef61c10722adc7275502ab71789a8fe3cb7ef04cf6e2"}, + {file = "grpcio-1.59.2-cp310-cp310-win32.whl", hash = "sha256:d6f70406695e3220f09cd7a2f879333279d91aa4a8a1d34303b56d61a8180137"}, + {file = "grpcio-1.59.2-cp310-cp310-win_amd64.whl", hash = "sha256:3c61d641d4f409c5ae46bfdd89ea42ce5ea233dcf69e74ce9ba32b503c727e29"}, + {file = "grpcio-1.59.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:3059668df17627f0e0fa680e9ef8c995c946c792612e9518f5cc1503be14e90b"}, + {file = "grpcio-1.59.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:72ca2399097c0b758198f2ff30f7178d680de8a5cfcf3d9b73a63cf87455532e"}, + {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:c978f864b35f2261e0819f5cd88b9830b04dc51bcf055aac3c601e525a10d2ba"}, + {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9411e24328a2302e279e70cae6e479f1fddde79629fcb14e03e6d94b3956eabf"}, + {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb7e0fe6ad73b7f06d7e2b689c19a71cf5cc48f0c2bf8608469e51ffe0bd2867"}, + {file = "grpcio-1.59.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c2504eed520958a5b77cc99458297cb7906308cb92327f35fb7fbbad4e9b2188"}, + {file = "grpcio-1.59.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2171c39f355ba5b551c5d5928d65aa6c69807fae195b86ef4a7d125bcdb860a9"}, + {file = "grpcio-1.59.2-cp311-cp311-win32.whl", hash = "sha256:d2794f0e68b3085d99b4f6ff9c089f6fdd02b32b9d3efdfbb55beac1bf22d516"}, + {file = "grpcio-1.59.2-cp311-cp311-win_amd64.whl", hash = "sha256:2067274c88bc6de89c278a672a652b4247d088811ece781a4858b09bdf8448e3"}, + {file = "grpcio-1.59.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:535561990e075fa6bd4b16c4c3c1096b9581b7bb35d96fac4650f1181e428268"}, + {file = "grpcio-1.59.2-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:a213acfbf186b9f35803b52e4ca9addb153fc0b67f82a48f961be7000ecf6721"}, + {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:6959fb07e8351e20501ffb8cc4074c39a0b7ef123e1c850a7f8f3afdc3a3da01"}, + {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e82c5cf1495244adf5252f925ac5932e5fd288b3e5ab6b70bec5593074b7236c"}, + {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:023088764012411affe7db183d1ada3ad9daf2e23ddc719ff46d7061de661340"}, + {file = "grpcio-1.59.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:da2d94c15f88cd40d7e67f7919d4f60110d2b9d5b1e08cf354c2be773ab13479"}, + {file = "grpcio-1.59.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6009386a2df66159f64ac9f20425ae25229b29b9dd0e1d3dd60043f037e2ad7e"}, + {file = "grpcio-1.59.2-cp312-cp312-win32.whl", hash = "sha256:75c6ecb70e809cf1504465174343113f51f24bc61e22a80ae1c859f3f7034c6d"}, + {file = "grpcio-1.59.2-cp312-cp312-win_amd64.whl", hash = "sha256:cbe946b3e6e60a7b4618f091e62a029cb082b109a9d6b53962dd305087c6e4fd"}, + {file = "grpcio-1.59.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:f8753a6c88d1d0ba64302309eecf20f70d2770f65ca02d83c2452279085bfcd3"}, + {file = "grpcio-1.59.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:f1ef0d39bc1feb420caf549b3c657c871cad4ebbcf0580c4d03816b0590de0cf"}, + {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:4c93f4abbb54321ee6471e04a00139c80c754eda51064187963ddf98f5cf36a4"}, + {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:08d77e682f2bf730a4961eea330e56d2f423c6a9b91ca222e5b1eb24a357b19f"}, + {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff16d68bf453275466a9a46739061a63584d92f18a0f5b33d19fc97eb69867c"}, + {file = "grpcio-1.59.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4abb717e320e74959517dc8e84a9f48fbe90e9abe19c248541e9418b1ce60acd"}, + {file = "grpcio-1.59.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:36f53c2b3449c015880e7d55a89c992c357f176327b0d2873cdaaf9628a37c69"}, + {file = "grpcio-1.59.2-cp37-cp37m-win_amd64.whl", hash = "sha256:cc3e4cd087f07758b16bef8f31d88dbb1b5da5671d2f03685ab52dece3d7a16e"}, + {file = "grpcio-1.59.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:27f879ae604a7fcf371e59fba6f3ff4635a4c2a64768bd83ff0cac503142fef4"}, + {file = "grpcio-1.59.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:7cf05053242f61ba94014dd3a986e11a083400a32664058f80bf4cf817c0b3a1"}, + {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:e1727c1c0e394096bb9af185c6923e8ea55a5095b8af44f06903bcc0e06800a2"}, + {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d573e70a6fe77555fb6143c12d3a7d3fa306632a3034b4e7c59ca09721546f8"}, + {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31176aa88f36020055ace9adff2405a33c8bdbfa72a9c4980e25d91b2f196873"}, + {file = "grpcio-1.59.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:11168ef43e4a43ff1b1a65859f3e0ef1a173e277349e7fb16923ff108160a8cd"}, + {file = "grpcio-1.59.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:53c9aa5ddd6857c0a1cd0287225a2a25873a8e09727c2e95c4aebb1be83a766a"}, + {file = "grpcio-1.59.2-cp38-cp38-win32.whl", hash = "sha256:3b4368b33908f683a363f376dfb747d40af3463a6e5044afee07cf9436addf96"}, + {file = "grpcio-1.59.2-cp38-cp38-win_amd64.whl", hash = "sha256:0a754aff9e3af63bdc4c75c234b86b9d14e14a28a30c4e324aed1a9b873d755f"}, + {file = "grpcio-1.59.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:1f9524d1d701e399462d2c90ba7c193e49d1711cf429c0d3d97c966856e03d00"}, + {file = "grpcio-1.59.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:f93dbf58f03146164048be5426ffde298b237a5e059144847e4940f5b80172c3"}, + {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:6da6dea3a1bacf99b3c2187e296db9a83029ed9c38fd4c52b7c9b7326d13c828"}, + {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5f09cffa619adfb44799fa4a81c2a1ad77c887187613fb0a8f201ab38d89ba1"}, + {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c35aa9657f5d5116d23b934568e0956bd50c615127810fffe3ac356a914c176a"}, + {file = "grpcio-1.59.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:74100fecaec8a535e380cf5f2fb556ff84957d481c13e54051c52e5baac70541"}, + {file = "grpcio-1.59.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:128e20f57c5f27cb0157e73756d1586b83c1b513ebecc83ea0ac37e4b0e4e758"}, + {file = "grpcio-1.59.2-cp39-cp39-win32.whl", hash = "sha256:686e975a5d16602dc0982c7c703948d17184bd1397e16c8ee03511ecb8c4cdda"}, + {file = "grpcio-1.59.2-cp39-cp39-win_amd64.whl", hash = "sha256:242adc47725b9a499ee77c6a2e36688fa6c96484611f33b1be4c57ab075a92dd"}, + {file = "grpcio-1.59.2.tar.gz", hash = "sha256:d8f9cd4ad1be90b0cf350a2f04a38a36e44a026cac1e036ac593dc48efe91d52"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.57.0)"] +protobuf = ["grpcio-tools (>=1.59.2)"] [[package]] name = "grpcio-status" @@ -1408,93 +1472,69 @@ googleapis-common-protos = ">=1.5.5" grpcio = ">=1.48.2" protobuf = ">=3.12.0" -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - [[package]] name = "h5py" -version = "3.9.0" +version = "3.10.0" description = "Read and write HDF5 files from Python" optional = false python-versions = ">=3.8" files = [ - {file = "h5py-3.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eb7bdd5e601dd1739698af383be03f3dad0465fe67184ebd5afca770f50df9d6"}, - {file = "h5py-3.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:78e44686334cbbf2dd21d9df15823bc38663f27a3061f6a032c68a3e30c47bf7"}, - {file = "h5py-3.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f68b41efd110ce9af1cbe6fa8af9f4dcbadace6db972d30828b911949e28fadd"}, - {file = "h5py-3.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12aa556d540f11a2cae53ea7cfb94017353bd271fb3962e1296b342f6550d1b8"}, - {file = "h5py-3.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:d97409e17915798029e297a84124705c8080da901307ea58f29234e09b073ddc"}, - {file = "h5py-3.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:551e358db05a874a0f827b22e95b30092f2303edc4b91bb62ad2f10e0236e1a0"}, - {file = "h5py-3.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6822a814b9d8b8363ff102f76ea8d026f0ca25850bb579d85376029ee3e73b93"}, - {file = "h5py-3.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54f01202cdea754ab4227dd27014bdbd561a4bbe4b631424fd812f7c2ce9c6ac"}, - {file = "h5py-3.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64acceaf6aff92af091a4b83f6dee3cf8d3061f924a6bb3a33eb6c4658a8348b"}, - {file = "h5py-3.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:804c7fb42a34c8ab3a3001901c977a5c24d2e9c586a0f3e7c0a389130b4276fc"}, - {file = "h5py-3.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8d9492391ff5c3c80ec30ae2fe82a3f0efd1e750833739c25b0d090e3be1b095"}, - {file = "h5py-3.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9da9e7e63376c32704e37ad4cea2dceae6964cee0d8515185b3ab9cbd6b947bc"}, - {file = "h5py-3.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4e20897c88759cbcbd38fb45b507adc91af3e0f67722aa302d71f02dd44d286"}, - {file = "h5py-3.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbf5225543ca35ce9f61c950b73899a82be7ba60d58340e76d0bd42bf659235a"}, - {file = "h5py-3.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:36408f8c62f50007d14e000f9f3acf77e103b9e932c114cbe52a3089e50ebf94"}, - {file = "h5py-3.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:23e74b878bbe1653ab34ca49b83cac85529cd0b36b9d625516c5830cc5ca2eac"}, - {file = "h5py-3.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3f457089c5d524b7998e3649bc63240679b8fb0a3859ea53bbb06841f3d755f1"}, - {file = "h5py-3.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6284061f3214335e1eec883a6ee497dbe7a79f19e6a57fed2dd1f03acd5a8cb"}, - {file = "h5py-3.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7a745efd0d56076999b52e8da5fad5d30823bac98b59c68ae75588d09991a"}, - {file = "h5py-3.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:79bbca34696c6f9eeeb36a91776070c49a060b2879828e2c8fa6c58b8ed10dd1"}, - {file = "h5py-3.9.0.tar.gz", hash = "sha256:e604db6521c1e367c6bd7fad239c847f53cc46646f2d2651372d05ae5e95f817"}, + {file = "h5py-3.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b963fb772964fc1d1563c57e4e2e874022ce11f75ddc6df1a626f42bd49ab99f"}, + {file = "h5py-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:012ab448590e3c4f5a8dd0f3533255bc57f80629bf7c5054cf4c87b30085063c"}, + {file = "h5py-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:781a24263c1270a62cd67be59f293e62b76acfcc207afa6384961762bb88ea03"}, + {file = "h5py-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f42e6c30698b520f0295d70157c4e202a9e402406f50dc08f5a7bc416b24e52d"}, + {file = "h5py-3.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:93dd840bd675787fc0b016f7a05fc6efe37312a08849d9dd4053fd0377b1357f"}, + {file = "h5py-3.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2381e98af081b6df7f6db300cd88f88e740649d77736e4b53db522d8874bf2dc"}, + {file = "h5py-3.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:667fe23ab33d5a8a6b77970b229e14ae3bb84e4ea3382cc08567a02e1499eedd"}, + {file = "h5py-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90286b79abd085e4e65e07c1bd7ee65a0f15818ea107f44b175d2dfe1a4674b7"}, + {file = "h5py-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c013d2e79c00f28ffd0cc24e68665ea03ae9069e167087b2adb5727d2736a52"}, + {file = "h5py-3.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:92273ce69ae4983dadb898fd4d3bea5eb90820df953b401282ee69ad648df684"}, + {file = "h5py-3.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c97d03f87f215e7759a354460fb4b0d0f27001450b18b23e556e7856a0b21c3"}, + {file = "h5py-3.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86df4c2de68257b8539a18646ceccdcf2c1ce6b1768ada16c8dcfb489eafae20"}, + {file = "h5py-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba9ab36be991119a3ff32d0c7cbe5faf9b8d2375b5278b2aea64effbeba66039"}, + {file = "h5py-3.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:2c8e4fda19eb769e9a678592e67eaec3a2f069f7570c82d2da909c077aa94339"}, + {file = "h5py-3.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:492305a074327e8d2513011fa9fffeb54ecb28a04ca4c4227d7e1e9616d35641"}, + {file = "h5py-3.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9450464b458cca2c86252b624279115dcaa7260a40d3cb1594bf2b410a2bd1a3"}, + {file = "h5py-3.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd6f6d1384a9f491732cee233b99cd4bfd6e838a8815cc86722f9d2ee64032af"}, + {file = "h5py-3.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3074ec45d3dc6e178c6f96834cf8108bf4a60ccb5ab044e16909580352010a97"}, + {file = "h5py-3.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:212bb997a91e6a895ce5e2f365ba764debeaef5d2dca5c6fb7098d66607adf99"}, + {file = "h5py-3.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5dfc65ac21fa2f630323c92453cadbe8d4f504726ec42f6a56cf80c2f90d6c52"}, + {file = "h5py-3.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d4682b94fd36ab217352be438abd44c8f357c5449b8995e63886b431d260f3d3"}, + {file = "h5py-3.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aece0e2e1ed2aab076c41802e50a0c3e5ef8816d60ece39107d68717d4559824"}, + {file = "h5py-3.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43a61b2c2ad65b1fabc28802d133eed34debcc2c8b420cb213d3d4ef4d3e2229"}, + {file = "h5py-3.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:ae2f0201c950059676455daf92700eeb57dcf5caaf71b9e1328e6e6593601770"}, + {file = "h5py-3.10.0.tar.gz", hash = "sha256:d93adc48ceeb33347eb24a634fb787efc7ae4644e6ea4ba733d099605045c049"}, ] [package.dependencies] numpy = ">=1.17.3" [[package]] -name = "httpcore" -version = "0.16.3" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.7" -files = [ - {file = "httpcore-0.16.3-py3-none-any.whl", hash = "sha256:da1fb708784a938aa084bde4feb8317056c55037247c787bd7e19eb2c2949dc0"}, - {file = "httpcore-0.16.3.tar.gz", hash = "sha256:c5d6f04e2fc530f39e0c077e6a30caa53f1451096120f1f38b954afd0b17c0cb"}, -] - -[package.dependencies] -anyio = ">=3.0,<5.0" -certifi = "*" -h11 = ">=0.13,<0.15" -sniffio = "==1.*" - -[package.extras] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] - -[[package]] -name = "httpx" -version = "0.23.3" -description = "The next generation HTTP client." +name = "hyperopt" +version = "0.2.7" +description = "Distributed Asynchronous Hyperparameter Optimization" optional = false -python-versions = ">=3.7" +python-versions = "*" files = [ - {file = "httpx-0.23.3-py3-none-any.whl", hash = "sha256:a211fcce9b1254ea24f0cd6af9869b3d29aba40154e947d2a07bb499b3e310d6"}, - {file = "httpx-0.23.3.tar.gz", hash = "sha256:9818458eb565bb54898ccb9b8b251a28785dd4a55afbc23d0eb410754fe7d0f9"}, + {file = "hyperopt-0.2.7-py2.py3-none-any.whl", hash = "sha256:f3046d91fe4167dbf104365016596856b2524a609d22f047a066fc1ac796427c"}, + {file = "hyperopt-0.2.7.tar.gz", hash = "sha256:1bf89ae58050bbd32c7307199046117feee245c2fd9ab6255c7308522b7ca149"}, ] [package.dependencies] -certifi = "*" -httpcore = ">=0.15.0,<0.17.0" -rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} -sniffio = "*" +cloudpickle = "*" +future = "*" +networkx = ">=2.2" +numpy = "*" +py4j = "*" +scipy = "*" +six = "*" +tqdm = "*" [package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<13)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] +atpe = ["lightgbm", "scikit-learn"] +dev = ["black", "nose", "pre-commit", "pytest"] +mongotrials = ["pymongo"] +sparktrials = ["pyspark"] [[package]] name = "idna" @@ -1539,21 +1579,21 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs [[package]] name = "importlib-resources" -version = "6.0.1" +version = "6.1.1" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.0.1-py3-none-any.whl", hash = "sha256:134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf"}, - {file = "importlib_resources-6.0.1.tar.gz", hash = "sha256:4359457e42708462b9626a04657c6208ad799ceb41e5c58c57ffa0e6a098a5d4"}, + {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, + {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, ] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] [[package]] name = "iniconfig" @@ -1568,13 +1608,13 @@ files = [ [[package]] name = "ipython" -version = "8.12.2" +version = "8.12.3" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.8" files = [ - {file = "ipython-8.12.2-py3-none-any.whl", hash = "sha256:ea8801f15dfe4ffb76dea1b09b847430ffd70d827b41735c64a0638a04103bfc"}, - {file = "ipython-8.12.2.tar.gz", hash = "sha256:c7b80eb7f5a855a88efc971fda506ff7a91c280b42cdae26643e0f601ea281ea"}, + {file = "ipython-8.12.3-py3-none-any.whl", hash = "sha256:b0340d46a933d27c657b211a329d0be23793c36595acf9e6ef4164bc01a1804c"}, + {file = "ipython-8.12.3.tar.gz", hash = "sha256:3910c4b54543c2ad73d06579aa771041b7d5707b033bd488669b4cf544e3b363"}, ] [package.dependencies] @@ -1605,17 +1645,6 @@ qtconsole = ["qtconsole"] test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] -[[package]] -name = "iso8601" -version = "1.1.0" -description = "Simple module to parse ISO 8601 dates" -optional = false -python-versions = ">=3.6.2,<4.0" -files = [ - {file = "iso8601-1.1.0-py3-none-any.whl", hash = "sha256:8400e90141bf792bce2634df533dc57e3bee19ea120a87bebcd3da89a58ad73f"}, - {file = "iso8601-1.1.0.tar.gz", hash = "sha256:32811e7b81deee2063ea6d2e94f8819a86d1f3811e49d23623a41fa832bef03f"}, -] - [[package]] name = "isort" version = "5.12.0" @@ -1665,13 +1694,13 @@ tpu = ["jaxlib (==0.4.13)", "libtpu-nightly (==0.1.dev20230622)"] [[package]] name = "jedi" -version = "0.19.0" +version = "0.19.1" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" files = [ - {file = "jedi-0.19.0-py2.py3-none-any.whl", hash = "sha256:cb8ce23fbccff0025e9386b5cf85e892f94c9b822378f8da49970471335ac64e"}, - {file = "jedi-0.19.0.tar.gz", hash = "sha256:bcf9894f1753969cbac8022a8c2eaee06bfa3724e4192470aaffe7eb6272b0c4"}, + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, ] [package.dependencies] @@ -1680,7 +1709,7 @@ parso = ">=0.8.3,<0.9.0" [package.extras] docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" @@ -1712,34 +1741,51 @@ files = [ [[package]] name = "jsonschema" -version = "4.17.3" +version = "4.19.2" description = "An implementation of JSON Schema validation for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, - {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, + {file = "jsonschema-4.19.2-py3-none-any.whl", hash = "sha256:eee9e502c788e89cb166d4d37f43084e3b64ab405c795c03d343a4dbc2c810fc"}, + {file = "jsonschema-4.19.2.tar.gz", hash = "sha256:c9ff4d7447eed9592c23a12ccee508baf0dd0d59650615e847feb6cdca74f392"}, ] [package.dependencies] -attrs = ">=17.4.0" +attrs = ">=22.2.0" importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} +jsonschema-specifications = ">=2023.03.6" pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} -pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" [package.extras] format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] +[[package]] +name = "jsonschema-specifications" +version = "2023.7.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.7.1-py3-none-any.whl", hash = "sha256:05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1"}, + {file = "jsonschema_specifications-2023.7.1.tar.gz", hash = "sha256:c91a50404e88a1f6ba40636778e2ee08f6e24c5613fe4c53ac24578a5a7f72bb"}, +] + +[package.dependencies] +importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} +referencing = ">=0.28.0" + [[package]] name = "jupyter-client" -version = "8.3.0" +version = "8.6.0" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.3.0-py3-none-any.whl", hash = "sha256:7441af0c0672edc5d28035e92ba5e32fadcfa8a4e608a434c228836a89df6158"}, - {file = "jupyter_client-8.3.0.tar.gz", hash = "sha256:3af69921fe99617be1670399a0b857ad67275eefcfa291e2c81a160b7b650f5f"}, + {file = "jupyter_client-8.6.0-py3-none-any.whl", hash = "sha256:909c474dbe62582ae62b758bca86d6518c85234bdee2d908c778db6d72f39d99"}, + {file = "jupyter_client-8.6.0.tar.gz", hash = "sha256:0642244bb83b4764ae60d07e010e15f0e2d275ec4e918a8f7b80fbbef3ca60c7"}, ] [package.dependencies] @@ -1756,13 +1802,13 @@ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pyt [[package]] name = "jupyter-core" -version = "5.3.1" +version = "5.5.0" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_core-5.3.1-py3-none-any.whl", hash = "sha256:ae9036db959a71ec1cac33081eeb040a79e681f08ab68b0883e9a676c7a90dce"}, - {file = "jupyter_core-5.3.1.tar.gz", hash = "sha256:5ba5c7938a7f97a6b0481463f7ff0dbac7c15ba48cf46fa4035ca6e838aa1aba"}, + {file = "jupyter_core-5.5.0-py3-none-any.whl", hash = "sha256:e11e02cd8ae0a9de5c6c44abf5727df9f2581055afe00b22183f621ba3585805"}, + {file = "jupyter_core-5.5.0.tar.gz", hash = "sha256:880b86053bf298a8724994f95e99b99130659022a4f7f45f563084b6223861d3"}, ] [package.dependencies] @@ -1771,7 +1817,7 @@ pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_ traitlets = ">=5.3" [package.extras] -docs = ["myst-parser", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] [[package]] @@ -1797,79 +1843,115 @@ files = [ [[package]] name = "kiwisolver" -version = "1.4.4" +version = "1.4.5" description = "A fast implementation of the Cassowary constraint solver" optional = false python-versions = ">=3.7" files = [ - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, - {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, + {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, ] [[package]] @@ -1968,53 +2050,53 @@ files = [ [[package]] name = "llvmlite" -version = "0.40.1" +version = "0.41.1" description = "lightweight wrapper around basic LLVM functionality" optional = false python-versions = ">=3.8" files = [ - {file = "llvmlite-0.40.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:84ce9b1c7a59936382ffde7871978cddcda14098e5a76d961e204523e5c372fb"}, - {file = "llvmlite-0.40.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3673c53cb21c65d2ff3704962b5958e967c6fc0bd0cff772998face199e8d87b"}, - {file = "llvmlite-0.40.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bba2747cf5b4954e945c287fe310b3fcc484e2a9d1b0c273e99eb17d103bb0e6"}, - {file = "llvmlite-0.40.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbd5e82cc990e5a3e343a3bf855c26fdfe3bfae55225f00efd01c05bbda79918"}, - {file = "llvmlite-0.40.1-cp310-cp310-win32.whl", hash = "sha256:09f83ea7a54509c285f905d968184bba00fc31ebf12f2b6b1494d677bb7dde9b"}, - {file = "llvmlite-0.40.1-cp310-cp310-win_amd64.whl", hash = "sha256:7b37297f3cbd68d14a97223a30620589d98ad1890e5040c9e5fc181063f4ed49"}, - {file = "llvmlite-0.40.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a66a5bd580951751b4268f4c3bddcef92682814d6bc72f3cd3bb67f335dd7097"}, - {file = "llvmlite-0.40.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:467b43836b388eaedc5a106d76761e388dbc4674b2f2237bc477c6895b15a634"}, - {file = "llvmlite-0.40.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c23edd196bd797dc3a7860799054ea3488d2824ecabc03f9135110c2e39fcbc"}, - {file = "llvmlite-0.40.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a36d9f244b6680cb90bbca66b146dabb2972f4180c64415c96f7c8a2d8b60a36"}, - {file = "llvmlite-0.40.1-cp311-cp311-win_amd64.whl", hash = "sha256:5b3076dc4e9c107d16dc15ecb7f2faf94f7736cd2d5e9f4dc06287fd672452c1"}, - {file = "llvmlite-0.40.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4a7525db121f2e699809b539b5308228854ccab6693ecb01b52c44a2f5647e20"}, - {file = "llvmlite-0.40.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:84747289775d0874e506f907a4513db889471607db19b04de97d144047fec885"}, - {file = "llvmlite-0.40.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e35766e42acef0fe7d1c43169a8ffc327a47808fae6a067b049fe0e9bbf84dd5"}, - {file = "llvmlite-0.40.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cda71de10a1f48416309e408ea83dab5bf36058f83e13b86a2961defed265568"}, - {file = "llvmlite-0.40.1-cp38-cp38-win32.whl", hash = "sha256:96707ebad8b051bbb4fc40c65ef93b7eeee16643bd4d579a14d11578e4b7a647"}, - {file = "llvmlite-0.40.1-cp38-cp38-win_amd64.whl", hash = "sha256:e44f854dc11559795bcdeaf12303759e56213d42dabbf91a5897aa2d8b033810"}, - {file = "llvmlite-0.40.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f643d15aacd0b0b0dc8b74b693822ba3f9a53fa63bc6a178c2dba7cc88f42144"}, - {file = "llvmlite-0.40.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:39a0b4d0088c01a469a5860d2e2d7a9b4e6a93c0f07eb26e71a9a872a8cadf8d"}, - {file = "llvmlite-0.40.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9329b930d699699846623054121ed105fd0823ed2180906d3b3235d361645490"}, - {file = "llvmlite-0.40.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2dbbb8424037ca287983b115a29adf37d806baf7e1bf4a67bd2cffb74e085ed"}, - {file = "llvmlite-0.40.1-cp39-cp39-win32.whl", hash = "sha256:e74e7bec3235a1e1c9ad97d897a620c5007d0ed80c32c84c1d787e7daa17e4ec"}, - {file = "llvmlite-0.40.1-cp39-cp39-win_amd64.whl", hash = "sha256:ff8f31111bb99d135ff296757dc81ab36c2dee54ed4bd429158a96da9807c316"}, - {file = "llvmlite-0.40.1.tar.gz", hash = "sha256:5cdb0d45df602099d833d50bd9e81353a5e036242d3c003c5b294fc61d1986b4"}, + {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"}, ] [[package]] name = "markdown" -version = "3.4.4" +version = "3.5.1" description = "Python implementation of John Gruber's Markdown." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Markdown-3.4.4-py3-none-any.whl", hash = "sha256:a4c1b65c0957b4bd9e7d86ddc7b3c9868fb9670660f6f99f6d1bca8954d5a941"}, - {file = "Markdown-3.4.4.tar.gz", hash = "sha256:225c6123522495d4119a90b3a3ba31a1e87a70369e03f14799ea9c0d7183a3d6"}, + {file = "Markdown-3.5.1-py3-none-any.whl", hash = "sha256:5874b47d4ee3f0b14d764324d2c94c03ea66bee56f2d929da9f2508d65e722dc"}, + {file = "Markdown-3.5.1.tar.gz", hash = "sha256:b65d7beb248dc22f2e8a31fb706d93798093c308dc1aba295aedeb9d41a813bd"}, ] [package.dependencies] importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} [package.extras] -docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.0)", "mkdocs-nature (>=0.4)"] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] testing = ["coverage", "pyyaml"] [[package]] @@ -2088,52 +2170,58 @@ files = [ [[package]] name = "matplotlib" -version = "3.7.2" +version = "3.7.3" description = "Python plotting package" optional = false python-versions = ">=3.8" files = [ - {file = "matplotlib-3.7.2-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:2699f7e73a76d4c110f4f25be9d2496d6ab4f17345307738557d345f099e07de"}, - {file = "matplotlib-3.7.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a8035ba590658bae7562786c9cc6ea1a84aa49d3afab157e414c9e2ea74f496d"}, - {file = "matplotlib-3.7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f8e4a49493add46ad4a8c92f63e19d548b2b6ebbed75c6b4c7f46f57d36cdd1"}, - {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71667eb2ccca4c3537d9414b1bc00554cb7f91527c17ee4ec38027201f8f1603"}, - {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:152ee0b569a37630d8628534c628456b28686e085d51394da6b71ef84c4da201"}, - {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:070f8dddd1f5939e60aacb8fa08f19551f4b0140fab16a3669d5cd6e9cb28fc8"}, - {file = "matplotlib-3.7.2-cp310-cp310-win32.whl", hash = "sha256:fdbb46fad4fb47443b5b8ac76904b2e7a66556844f33370861b4788db0f8816a"}, - {file = "matplotlib-3.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:23fb1750934e5f0128f9423db27c474aa32534cec21f7b2153262b066a581fd1"}, - {file = "matplotlib-3.7.2-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:30e1409b857aa8a747c5d4f85f63a79e479835f8dffc52992ac1f3f25837b544"}, - {file = "matplotlib-3.7.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:50e0a55ec74bf2d7a0ebf50ac580a209582c2dd0f7ab51bc270f1b4a0027454e"}, - {file = "matplotlib-3.7.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ac60daa1dc83e8821eed155796b0f7888b6b916cf61d620a4ddd8200ac70cd64"}, - {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:305e3da477dc8607336ba10bac96986d6308d614706cae2efe7d3ffa60465b24"}, - {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c308b255efb9b06b23874236ec0f10f026673ad6515f602027cc8ac7805352d"}, - {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60c521e21031632aa0d87ca5ba0c1c05f3daacadb34c093585a0be6780f698e4"}, - {file = "matplotlib-3.7.2-cp311-cp311-win32.whl", hash = "sha256:26bede320d77e469fdf1bde212de0ec889169b04f7f1179b8930d66f82b30cbc"}, - {file = "matplotlib-3.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:af4860132c8c05261a5f5f8467f1b269bf1c7c23902d75f2be57c4a7f2394b3e"}, - {file = "matplotlib-3.7.2-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:a1733b8e84e7e40a9853e505fe68cc54339f97273bdfe6f3ed980095f769ddc7"}, - {file = "matplotlib-3.7.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d9881356dc48e58910c53af82b57183879129fa30492be69058c5b0d9fddf391"}, - {file = "matplotlib-3.7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f081c03f413f59390a80b3e351cc2b2ea0205839714dbc364519bcf51f4b56ca"}, - {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1cd120fca3407a225168238b790bd5c528f0fafde6172b140a2f3ab7a4ea63e9"}, - {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a2c1590b90aa7bd741b54c62b78de05d4186271e34e2377e0289d943b3522273"}, - {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d2ff3c984b8a569bc1383cd468fc06b70d7b59d5c2854ca39f1436ae8394117"}, - {file = "matplotlib-3.7.2-cp38-cp38-win32.whl", hash = "sha256:5dea00b62d28654b71ca92463656d80646675628d0828e08a5f3b57e12869e13"}, - {file = "matplotlib-3.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:0f506a1776ee94f9e131af1ac6efa6e5bc7cb606a3e389b0ccb6e657f60bb676"}, - {file = "matplotlib-3.7.2-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:6515e878f91894c2e4340d81f0911857998ccaf04dbc1bba781e3d89cbf70608"}, - {file = "matplotlib-3.7.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:71f7a8c6b124e904db550f5b9fe483d28b896d4135e45c4ea381ad3b8a0e3256"}, - {file = "matplotlib-3.7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12f01b92ecd518e0697da4d97d163b2b3aa55eb3eb4e2c98235b3396d7dad55f"}, - {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7e28d6396563955f7af437894a36bf2b279462239a41028323e04b85179058b"}, - {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbcf59334ff645e6a67cd5f78b4b2cdb76384cdf587fa0d2dc85f634a72e1a3e"}, - {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:318c89edde72ff95d8df67d82aca03861240512994a597a435a1011ba18dbc7f"}, - {file = "matplotlib-3.7.2-cp39-cp39-win32.whl", hash = "sha256:ce55289d5659b5b12b3db4dc9b7075b70cef5631e56530f14b2945e8836f2d20"}, - {file = "matplotlib-3.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:2ecb5be2b2815431c81dc115667e33da0f5a1bcf6143980d180d09a717c4a12e"}, - {file = "matplotlib-3.7.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fdcd28360dbb6203fb5219b1a5658df226ac9bebc2542a9e8f457de959d713d0"}, - {file = "matplotlib-3.7.2-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c3cca3e842b11b55b52c6fb8bd6a4088693829acbfcdb3e815fa9b7d5c92c1b"}, - {file = "matplotlib-3.7.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebf577c7a6744e9e1bd3fee45fc74a02710b214f94e2bde344912d85e0c9af7c"}, - {file = "matplotlib-3.7.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:936bba394682049919dda062d33435b3be211dc3dcaa011e09634f060ec878b2"}, - {file = "matplotlib-3.7.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bc221ffbc2150458b1cd71cdd9ddd5bb37962b036e41b8be258280b5b01da1dd"}, - {file = "matplotlib-3.7.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35d74ebdb3f71f112b36c2629cf32323adfbf42679e2751252acd468f5001c07"}, - {file = "matplotlib-3.7.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:717157e61b3a71d3d26ad4e1770dc85156c9af435659a25ee6407dc866cb258d"}, - {file = "matplotlib-3.7.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:20f844d6be031948148ba49605c8b96dfe7d3711d1b63592830d650622458c11"}, - {file = "matplotlib-3.7.2.tar.gz", hash = "sha256:a8cdb91dddb04436bd2f098b8fdf4b81352e68cf4d2c6756fcc414791076569b"}, + {file = "matplotlib-3.7.3-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:085c33b27561d9c04386789d5aa5eb4a932ddef43cfcdd0e01735f9a6e85ce0c"}, + {file = "matplotlib-3.7.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c568e80e1c17f68a727f30f591926751b97b98314d8e59804f54f86ae6fa6a22"}, + {file = "matplotlib-3.7.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7baf98c5ad59c5c4743ea884bb025cbffa52dacdfdac0da3e6021a285a90377e"}, + {file = "matplotlib-3.7.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:236024f582e40dac39bca592258888b38ae47a9fed7b8de652d68d3d02d47d2b"}, + {file = "matplotlib-3.7.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12b4f6795efea037ce2d41e7c417ad8bd02d5719c6ad4a8450a0708f4a1cfb89"}, + {file = "matplotlib-3.7.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b2136cc6c5415b78977e0e8c608647d597204b05b1d9089ccf513c7d913733"}, + {file = "matplotlib-3.7.3-cp310-cp310-win32.whl", hash = "sha256:122dcbf9be0086e2a95d9e5e0632dbf3bd5b65eaa68c369363310a6c87753059"}, + {file = "matplotlib-3.7.3-cp310-cp310-win_amd64.whl", hash = "sha256:4aab27d9e33293389e3c1d7c881d414a72bdfda0fedc3a6bf46c6fa88d9b8015"}, + {file = "matplotlib-3.7.3-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:d5adc743de91e8e0b13df60deb1b1c285b8effea3d66223afceb14b63c9b05de"}, + {file = "matplotlib-3.7.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:55de4cf7cd0071b8ebf203981b53ab64f988a0a1f897a2dff300a1124e8bcd8b"}, + {file = "matplotlib-3.7.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ac03377fd908aaee2312d0b11735753e907adb6f4d1d102de5e2425249693f6c"}, + {file = "matplotlib-3.7.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:755bafc10a46918ce9a39980009b54b02dd249594e5adf52f9c56acfddb5d0b7"}, + {file = "matplotlib-3.7.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a6094c6f8e8d18db631754df4fe9a34dec3caf074f6869a7db09f18f9b1d6b2"}, + {file = "matplotlib-3.7.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:272dba2f1b107790ed78ebf5385b8d14b27ad9e90419de340364b49fe549a993"}, + {file = "matplotlib-3.7.3-cp311-cp311-win32.whl", hash = "sha256:591c123bed1cb4b9996fb60b41a6d89c2ec4943244540776c5f1283fb6960a53"}, + {file = "matplotlib-3.7.3-cp311-cp311-win_amd64.whl", hash = "sha256:3bf3a178c6504694cee8b88b353df0051583f2f6f8faa146f67115c27c856881"}, + {file = "matplotlib-3.7.3-cp312-cp312-macosx_10_12_universal2.whl", hash = "sha256:edf54cac8ee3603f3093616b40a931e8c063969756a4d78a86e82c2fea9659f7"}, + {file = "matplotlib-3.7.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:91e36a85ea639a1ba9f91427041eac064b04829945fe331a92617b6cb21d27e5"}, + {file = "matplotlib-3.7.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:caf5eaaf7c68f8d7df269dfbcaf46f48a70ff482bfcebdcc97519671023f2a7d"}, + {file = "matplotlib-3.7.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74bf57f505efea376097e948b7cdd87191a7ce8180616390aef496639edf601f"}, + {file = "matplotlib-3.7.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee152a88a0da527840a426535514b6ed8ac4240eb856b1da92cf48124320e346"}, + {file = "matplotlib-3.7.3-cp312-cp312-win_amd64.whl", hash = "sha256:67a410a9c9e07cbc83581eeea144bbe298870bf0ac0ee2f2e10a015ab7efee19"}, + {file = "matplotlib-3.7.3-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:259999c05285cb993d7f2a419cea547863fa215379eda81f7254c9e932963729"}, + {file = "matplotlib-3.7.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:3f4e7fd5a6157e1d018ce2166ec8e531a481dd4a36f035b5c23edfe05a25419a"}, + {file = "matplotlib-3.7.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:faa3d12d8811d08d14080a8b7b9caea9a457dc495350166b56df0db4b9909ef5"}, + {file = "matplotlib-3.7.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:336e88900c11441e458da01c8414fc57e04e17f9d3bb94958a76faa2652bcf6b"}, + {file = "matplotlib-3.7.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:12f4c0dd8aa280d796c8772ea8265a14f11a04319baa3a16daa5556065e8baea"}, + {file = "matplotlib-3.7.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1990955b11e7918d256cf3b956b10997f405b7917a3f1c7d8e69c1d15c7b1930"}, + {file = "matplotlib-3.7.3-cp38-cp38-win32.whl", hash = "sha256:e78707b751260b42b721507ad7aa60fe4026d7f51c74cca6b9cd8b123ebb633a"}, + {file = "matplotlib-3.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:e594ee43c59ea39ca5c6244667cac9d017a3527febc31f5532ad9135cf7469ec"}, + {file = "matplotlib-3.7.3-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:6eaa1cf0e94c936a26b78f6d756c5fbc12e0a58c8a68b7248a2a31456ce4e234"}, + {file = "matplotlib-3.7.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0a97af9d22e8ebedc9f00b043d9bbd29a375e9e10b656982012dded44c10fd77"}, + {file = "matplotlib-3.7.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1f9c6c16597af660433ab330b59ee2934b832ee1fabcaf5cbde7b2add840f31e"}, + {file = "matplotlib-3.7.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7240259b4b9cbc62381f6378cff4d57af539162a18e832c1e48042fabc40b6b"}, + {file = "matplotlib-3.7.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:747c6191d2e88ae854809e69aa358dbf852ff1a5738401b85c1cc9012309897a"}, + {file = "matplotlib-3.7.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec726b08a5275d827aa91bb951e68234a4423adb91cf65bc0fcdc0f2777663f7"}, + {file = "matplotlib-3.7.3-cp39-cp39-win32.whl", hash = "sha256:40e3b9b450c6534f07278310c4e34caff41c2a42377e4b9d47b0f8d3ac1083a2"}, + {file = "matplotlib-3.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfc118642903a23e309b1da32886bb39a4314147d013e820c86b5fb4cb2e36d0"}, + {file = "matplotlib-3.7.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:165c8082bf8fc0360c24aa4724a22eaadbfd8c28bf1ccf7e94d685cad48261e4"}, + {file = "matplotlib-3.7.3-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebd8470cc2a3594746ff0513aecbfa2c55ff6f58e6cef2efb1a54eb87c88ffa2"}, + {file = "matplotlib-3.7.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7153453669c9672b52095119fd21dd032d19225d48413a2871519b17db4b0fde"}, + {file = "matplotlib-3.7.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:498a08267dc69dd8f24c4b5d7423fa584d7ce0027ba71f7881df05fc09b89bb7"}, + {file = "matplotlib-3.7.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d48999c4b19b5a0c058c9cd828ff6fc7748390679f6cf9a2ad653a3e802c87d3"}, + {file = "matplotlib-3.7.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22d65d18b4ee8070a5fea5761d59293f1f9e2fac37ec9ce090463b0e629432fd"}, + {file = "matplotlib-3.7.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c40cde976c36693cc0767e27cf5f443f91c23520060bd9496678364adfafe9c"}, + {file = "matplotlib-3.7.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:39018a2b17592448fbfdf4b8352955e6c3905359939791d4ff429296494d1a0c"}, + {file = "matplotlib-3.7.3.tar.gz", hash = "sha256:f09b3dd6bdeb588de91f853bbb2d6f0ff8ab693485b0c49035eaa510cb4f142e"}, ] [package.dependencies] @@ -2142,11 +2230,12 @@ cycler = ">=0.10" fonttools = ">=4.22.0" importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} kiwisolver = ">=1.0.1" -numpy = ">=1.20" +numpy = ">=1.20,<2" packaging = ">=20.0" pillow = ">=6.2.0" -pyparsing = ">=2.3.1,<3.1" +pyparsing = ">=2.3.1" python-dateutil = ">=2.7" +setuptools_scm = ">=7" [[package]] name = "matplotlib-inline" @@ -2175,13 +2264,13 @@ files = [ [[package]] name = "mistune" -version = "3.0.1" +version = "3.0.2" description = "A sane and fast Markdown parser with useful plugins and renderers" optional = false python-versions = ">=3.7" files = [ - {file = "mistune-3.0.1-py3-none-any.whl", hash = "sha256:b9b3e438efbb57c62b5beb5e134dab664800bdf1284a7ee09e8b12b13eb1aac6"}, - {file = "mistune-3.0.1.tar.gz", hash = "sha256:e912116c13aa0944f9dc530db38eb88f6a77087ab128f49f84a48f4c05ea163c"}, + {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, + {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, ] [[package]] @@ -2239,85 +2328,78 @@ tests = ["pytest (>=4.6)"] [[package]] name = "msgpack" -version = "1.0.5" +version = "1.0.7" description = "MessagePack serializer" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "msgpack-1.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:525228efd79bb831cf6830a732e2e80bc1b05436b086d4264814b4b2955b2fa9"}, - {file = "msgpack-1.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4f8d8b3bf1ff2672567d6b5c725a1b347fe838b912772aa8ae2bf70338d5a198"}, - {file = "msgpack-1.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdc793c50be3f01106245a61b739328f7dccc2c648b501e237f0699fe1395b81"}, - {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cb47c21a8a65b165ce29f2bec852790cbc04936f502966768e4aae9fa763cb7"}, - {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e42b9594cc3bf4d838d67d6ed62b9e59e201862a25e9a157019e171fbe672dd3"}, - {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:55b56a24893105dc52c1253649b60f475f36b3aa0fc66115bffafb624d7cb30b"}, - {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1967f6129fc50a43bfe0951c35acbb729be89a55d849fab7686004da85103f1c"}, - {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20a97bf595a232c3ee6d57ddaadd5453d174a52594bf9c21d10407e2a2d9b3bd"}, - {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d25dd59bbbbb996eacf7be6b4ad082ed7eacc4e8f3d2df1ba43822da9bfa122a"}, - {file = "msgpack-1.0.5-cp310-cp310-win32.whl", hash = "sha256:382b2c77589331f2cb80b67cc058c00f225e19827dbc818d700f61513ab47bea"}, - {file = "msgpack-1.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:4867aa2df9e2a5fa5f76d7d5565d25ec76e84c106b55509e78c1ede0f152659a"}, - {file = "msgpack-1.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9f5ae84c5c8a857ec44dc180a8b0cc08238e021f57abdf51a8182e915e6299f0"}, - {file = "msgpack-1.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e6ca5d5699bcd89ae605c150aee83b5321f2115695e741b99618f4856c50898"}, - {file = "msgpack-1.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5494ea30d517a3576749cad32fa27f7585c65f5f38309c88c6d137877fa28a5a"}, - {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ab2f3331cb1b54165976a9d976cb251a83183631c88076613c6c780f0d6e45a"}, - {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28592e20bbb1620848256ebc105fc420436af59515793ed27d5c77a217477705"}, - {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe5c63197c55bce6385d9aee16c4d0641684628f63ace85f73571e65ad1c1e8d"}, - {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed40e926fa2f297e8a653c954b732f125ef97bdd4c889f243182299de27e2aa9"}, - {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b2de4c1c0538dcb7010902a2b97f4e00fc4ddf2c8cda9749af0e594d3b7fa3d7"}, - {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bf22a83f973b50f9d38e55c6aade04c41ddda19b00c4ebc558930d78eecc64ed"}, - {file = "msgpack-1.0.5-cp311-cp311-win32.whl", hash = "sha256:c396e2cc213d12ce017b686e0f53497f94f8ba2b24799c25d913d46c08ec422c"}, - {file = "msgpack-1.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c4c68d87497f66f96d50142a2b73b97972130d93677ce930718f68828b382e2"}, - {file = "msgpack-1.0.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a2b031c2e9b9af485d5e3c4520f4220d74f4d222a5b8dc8c1a3ab9448ca79c57"}, - {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f837b93669ce4336e24d08286c38761132bc7ab29782727f8557e1eb21b2080"}, - {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1d46dfe3832660f53b13b925d4e0fa1432b00f5f7210eb3ad3bb9a13c6204a6"}, - {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:366c9a7b9057e1547f4ad51d8facad8b406bab69c7d72c0eb6f529cf76d4b85f"}, - {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:4c075728a1095efd0634a7dccb06204919a2f67d1893b6aa8e00497258bf926c"}, - {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:f933bbda5a3ee63b8834179096923b094b76f0c7a73c1cfe8f07ad608c58844b"}, - {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:36961b0568c36027c76e2ae3ca1132e35123dcec0706c4b7992683cc26c1320c"}, - {file = "msgpack-1.0.5-cp36-cp36m-win32.whl", hash = "sha256:b5ef2f015b95f912c2fcab19c36814963b5463f1fb9049846994b007962743e9"}, - {file = "msgpack-1.0.5-cp36-cp36m-win_amd64.whl", hash = "sha256:288e32b47e67f7b171f86b030e527e302c91bd3f40fd9033483f2cacc37f327a"}, - {file = "msgpack-1.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:137850656634abddfb88236008339fdaba3178f4751b28f270d2ebe77a563b6c"}, - {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c05a4a96585525916b109bb85f8cb6511db1c6f5b9d9cbcbc940dc6b4be944b"}, - {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56a62ec00b636583e5cb6ad313bbed36bb7ead5fa3a3e38938503142c72cba4f"}, - {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef8108f8dedf204bb7b42994abf93882da1159728a2d4c5e82012edd92c9da9f"}, - {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1835c84d65f46900920b3708f5ba829fb19b1096c1800ad60bae8418652a951d"}, - {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e57916ef1bd0fee4f21c4600e9d1da352d8816b52a599c46460e93a6e9f17086"}, - {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:17358523b85973e5f242ad74aa4712b7ee560715562554aa2134d96e7aa4cbbf"}, - {file = "msgpack-1.0.5-cp37-cp37m-win32.whl", hash = "sha256:cb5aaa8c17760909ec6cb15e744c3ebc2ca8918e727216e79607b7bbce9c8f77"}, - {file = "msgpack-1.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:ab31e908d8424d55601ad7075e471b7d0140d4d3dd3272daf39c5c19d936bd82"}, - {file = "msgpack-1.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b72d0698f86e8d9ddf9442bdedec15b71df3598199ba33322d9711a19f08145c"}, - {file = "msgpack-1.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:379026812e49258016dd84ad79ac8446922234d498058ae1d415f04b522d5b2d"}, - {file = "msgpack-1.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:332360ff25469c346a1c5e47cbe2a725517919892eda5cfaffe6046656f0b7bb"}, - {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:476a8fe8fae289fdf273d6d2a6cb6e35b5a58541693e8f9f019bfe990a51e4ba"}, - {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9985b214f33311df47e274eb788a5893a761d025e2b92c723ba4c63936b69b1"}, - {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48296af57cdb1d885843afd73c4656be5c76c0c6328db3440c9601a98f303d87"}, - {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:addab7e2e1fcc04bd08e4eb631c2a90960c340e40dfc4a5e24d2ff0d5a3b3edb"}, - {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:916723458c25dfb77ff07f4c66aed34e47503b2eb3188b3adbec8d8aa6e00f48"}, - {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:821c7e677cc6acf0fd3f7ac664c98803827ae6de594a9f99563e48c5a2f27eb0"}, - {file = "msgpack-1.0.5-cp38-cp38-win32.whl", hash = "sha256:1c0f7c47f0087ffda62961d425e4407961a7ffd2aa004c81b9c07d9269512f6e"}, - {file = "msgpack-1.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:bae7de2026cbfe3782c8b78b0db9cbfc5455e079f1937cb0ab8d133496ac55e1"}, - {file = "msgpack-1.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:20c784e66b613c7f16f632e7b5e8a1651aa5702463d61394671ba07b2fc9e025"}, - {file = "msgpack-1.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:266fa4202c0eb94d26822d9bfd7af25d1e2c088927fe8de9033d929dd5ba24c5"}, - {file = "msgpack-1.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18334484eafc2b1aa47a6d42427da7fa8f2ab3d60b674120bce7a895a0a85bdd"}, - {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57e1f3528bd95cc44684beda696f74d3aaa8a5e58c816214b9046512240ef437"}, - {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:586d0d636f9a628ddc6a17bfd45aa5b5efaf1606d2b60fa5d87b8986326e933f"}, - {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a740fa0e4087a734455f0fc3abf5e746004c9da72fbd541e9b113013c8dc3282"}, - {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3055b0455e45810820db1f29d900bf39466df96ddca11dfa6d074fa47054376d"}, - {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a61215eac016f391129a013c9e46f3ab308db5f5ec9f25811e811f96962599a8"}, - {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:362d9655cd369b08fda06b6657a303eb7172d5279997abe094512e919cf74b11"}, - {file = "msgpack-1.0.5-cp39-cp39-win32.whl", hash = "sha256:ac9dd47af78cae935901a9a500104e2dea2e253207c924cc95de149606dc43cc"}, - {file = "msgpack-1.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:06f5174b5f8ed0ed919da0e62cbd4ffde676a374aba4020034da05fab67b9164"}, - {file = "msgpack-1.0.5.tar.gz", hash = "sha256:c075544284eadc5cddc70f4757331d99dcbc16b2bbd4849d15f8aae4cf36d31c"}, + {file = "msgpack-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:04ad6069c86e531682f9e1e71b71c1c3937d6014a7c3e9edd2aa81ad58842862"}, + {file = "msgpack-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cca1b62fe70d761a282496b96a5e51c44c213e410a964bdffe0928e611368329"}, + {file = "msgpack-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e50ebce52f41370707f1e21a59514e3375e3edd6e1832f5e5235237db933c98b"}, + {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7b4f35de6a304b5533c238bee86b670b75b03d31b7797929caa7a624b5dda6"}, + {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28efb066cde83c479dfe5a48141a53bc7e5f13f785b92ddde336c716663039ee"}, + {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cb14ce54d9b857be9591ac364cb08dc2d6a5c4318c1182cb1d02274029d590d"}, + {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b573a43ef7c368ba4ea06050a957c2a7550f729c31f11dd616d2ac4aba99888d"}, + {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ccf9a39706b604d884d2cb1e27fe973bc55f2890c52f38df742bc1d79ab9f5e1"}, + {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cb70766519500281815dfd7a87d3a178acf7ce95390544b8c90587d76b227681"}, + {file = "msgpack-1.0.7-cp310-cp310-win32.whl", hash = "sha256:b610ff0f24e9f11c9ae653c67ff8cc03c075131401b3e5ef4b82570d1728f8a9"}, + {file = "msgpack-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:a40821a89dc373d6427e2b44b572efc36a2778d3f543299e2f24eb1a5de65415"}, + {file = "msgpack-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:576eb384292b139821c41995523654ad82d1916da6a60cff129c715a6223ea84"}, + {file = "msgpack-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:730076207cb816138cf1af7f7237b208340a2c5e749707457d70705715c93b93"}, + {file = "msgpack-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:85765fdf4b27eb5086f05ac0491090fc76f4f2b28e09d9350c31aac25a5aaff8"}, + {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3476fae43db72bd11f29a5147ae2f3cb22e2f1a91d575ef130d2bf49afd21c46"}, + {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d4c80667de2e36970ebf74f42d1088cc9ee7ef5f4e8c35eee1b40eafd33ca5b"}, + {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b0bf0effb196ed76b7ad883848143427a73c355ae8e569fa538365064188b8e"}, + {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f9a7c509542db4eceed3dcf21ee5267ab565a83555c9b88a8109dcecc4709002"}, + {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:84b0daf226913133f899ea9b30618722d45feffa67e4fe867b0b5ae83a34060c"}, + {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ec79ff6159dffcc30853b2ad612ed572af86c92b5168aa3fc01a67b0fa40665e"}, + {file = "msgpack-1.0.7-cp311-cp311-win32.whl", hash = "sha256:3e7bf4442b310ff154b7bb9d81eb2c016b7d597e364f97d72b1acc3817a0fdc1"}, + {file = "msgpack-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:3f0c8c6dfa6605ab8ff0611995ee30d4f9fcff89966cf562733b4008a3d60d82"}, + {file = "msgpack-1.0.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f0936e08e0003f66bfd97e74ee530427707297b0d0361247e9b4f59ab78ddc8b"}, + {file = "msgpack-1.0.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98bbd754a422a0b123c66a4c341de0474cad4a5c10c164ceed6ea090f3563db4"}, + {file = "msgpack-1.0.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b291f0ee7961a597cbbcc77709374087fa2a9afe7bdb6a40dbbd9b127e79afee"}, + {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebbbba226f0a108a7366bf4b59bf0f30a12fd5e75100c630267d94d7f0ad20e5"}, + {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e2d69948e4132813b8d1131f29f9101bc2c915f26089a6d632001a5c1349672"}, + {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdf38ba2d393c7911ae989c3bbba510ebbcdf4ecbdbfec36272abe350c454075"}, + {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:993584fc821c58d5993521bfdcd31a4adf025c7d745bbd4d12ccfecf695af5ba"}, + {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:52700dc63a4676669b341ba33520f4d6e43d3ca58d422e22ba66d1736b0a6e4c"}, + {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e45ae4927759289c30ccba8d9fdce62bb414977ba158286b5ddaf8df2cddb5c5"}, + {file = "msgpack-1.0.7-cp312-cp312-win32.whl", hash = "sha256:27dcd6f46a21c18fa5e5deed92a43d4554e3df8d8ca5a47bf0615d6a5f39dbc9"}, + {file = "msgpack-1.0.7-cp312-cp312-win_amd64.whl", hash = "sha256:7687e22a31e976a0e7fc99c2f4d11ca45eff652a81eb8c8085e9609298916dcf"}, + {file = "msgpack-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5b6ccc0c85916998d788b295765ea0e9cb9aac7e4a8ed71d12e7d8ac31c23c95"}, + {file = "msgpack-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:235a31ec7db685f5c82233bddf9858748b89b8119bf4538d514536c485c15fe0"}, + {file = "msgpack-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cab3db8bab4b7e635c1c97270d7a4b2a90c070b33cbc00c99ef3f9be03d3e1f7"}, + {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bfdd914e55e0d2c9e1526de210f6fe8ffe9705f2b1dfcc4aecc92a4cb4b533d"}, + {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36e17c4592231a7dbd2ed09027823ab295d2791b3b1efb2aee874b10548b7524"}, + {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38949d30b11ae5f95c3c91917ee7a6b239f5ec276f271f28638dec9156f82cfc"}, + {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ff1d0899f104f3921d94579a5638847f783c9b04f2d5f229392ca77fba5b82fc"}, + {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dc43f1ec66eb8440567186ae2f8c447d91e0372d793dfe8c222aec857b81a8cf"}, + {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dd632777ff3beaaf629f1ab4396caf7ba0bdd075d948a69460d13d44357aca4c"}, + {file = "msgpack-1.0.7-cp38-cp38-win32.whl", hash = "sha256:4e71bc4416de195d6e9b4ee93ad3f2f6b2ce11d042b4d7a7ee00bbe0358bd0c2"}, + {file = "msgpack-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:8f5b234f567cf76ee489502ceb7165c2a5cecec081db2b37e35332b537f8157c"}, + {file = "msgpack-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfef2bb6ef068827bbd021017a107194956918ab43ce4d6dc945ffa13efbc25f"}, + {file = "msgpack-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:484ae3240666ad34cfa31eea7b8c6cd2f1fdaae21d73ce2974211df099a95d81"}, + {file = "msgpack-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3967e4ad1aa9da62fd53e346ed17d7b2e922cba5ab93bdd46febcac39be636fc"}, + {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dd178c4c80706546702c59529ffc005681bd6dc2ea234c450661b205445a34d"}, + {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6ffbc252eb0d229aeb2f9ad051200668fc3a9aaa8994e49f0cb2ffe2b7867e7"}, + {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:822ea70dc4018c7e6223f13affd1c5c30c0f5c12ac1f96cd8e9949acddb48a61"}, + {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:384d779f0d6f1b110eae74cb0659d9aa6ff35aaf547b3955abf2ab4c901c4819"}, + {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f64e376cd20d3f030190e8c32e1c64582eba56ac6dc7d5b0b49a9d44021b52fd"}, + {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5ed82f5a7af3697b1c4786053736f24a0efd0a1b8a130d4c7bfee4b9ded0f08f"}, + {file = "msgpack-1.0.7-cp39-cp39-win32.whl", hash = "sha256:f26a07a6e877c76a88e3cecac8531908d980d3d5067ff69213653649ec0f60ad"}, + {file = "msgpack-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:1dc93e8e4653bdb5910aed79f11e165c85732067614f180f70534f056da97db3"}, + {file = "msgpack-1.0.7.tar.gz", hash = "sha256:572efc93db7a4d27e404501975ca6d2d9775705c2d922390d878fcf768d92c87"}, ] [[package]] name = "nbclient" -version = "0.8.0" +version = "0.9.0" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." optional = false python-versions = ">=3.8.0" files = [ - {file = "nbclient-0.8.0-py3-none-any.whl", hash = "sha256:25e861299e5303a0477568557c4045eccc7a34c17fc08e7959558707b9ebe548"}, - {file = "nbclient-0.8.0.tar.gz", hash = "sha256:f9b179cd4b2d7bca965f900a2ebf0db4a12ebff2f36a711cb66861e4ae158e55"}, + {file = "nbclient-0.9.0-py3-none-any.whl", hash = "sha256:a3a1ddfb34d4a9d17fc744d655962714a866639acd30130e9be84191cd97cd15"}, + {file = "nbclient-0.9.0.tar.gz", hash = "sha256:4b28c207877cf33ef3a9838cdc7a54c5ceff981194a82eac59d558f05487295e"}, ] [package.dependencies] @@ -2333,13 +2415,13 @@ test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>= [[package]] name = "nbconvert" -version = "7.7.3" +version = "7.11.0" description = "Converting Jupyter Notebooks" optional = false python-versions = ">=3.8" files = [ - {file = "nbconvert-7.7.3-py3-none-any.whl", hash = "sha256:3022adadff3f86578a47fab7c2228bb3ca9c56a24345642a22f917f6168b48fc"}, - {file = "nbconvert-7.7.3.tar.gz", hash = "sha256:4a5996bf5f3cd16aa0431897ba1aa4c64842c2079f434b3dc6b8c4b252ef3355"}, + {file = "nbconvert-7.11.0-py3-none-any.whl", hash = "sha256:d1d417b7f34a4e38887f8da5bdfd12372adf3b80f995d57556cb0972c68909fe"}, + {file = "nbconvert-7.11.0.tar.gz", hash = "sha256:abedc01cf543177ffde0bfc2a69726d5a478f6af10a332fc1bf29fcb4f0cf000"}, ] [package.dependencies] @@ -2366,7 +2448,7 @@ docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sp qtpdf = ["nbconvert[qtpng]"] qtpng = ["pyqtwebengine (>=5.15)"] serve = ["tornado (>=6.1)"] -test = ["flaky", "ipykernel", "ipywidgets (>=7)", "pre-commit", "pytest", "pytest-dependency"] +test = ["flaky", "ipykernel", "ipywidgets (>=7)", "pytest"] webpdf = ["playwright"] [[package]] @@ -2429,41 +2511,38 @@ test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] name = "numba" -version = "0.57.1" +version = "0.58.1" description = "compiling Python code using LLVM" optional = false python-versions = ">=3.8" files = [ - {file = "numba-0.57.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db8268eb5093cae2288942a8cbd69c9352f6fe6e0bfa0a9a27679436f92e4248"}, - {file = "numba-0.57.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:643cb09a9ba9e1bd8b060e910aeca455e9442361e80fce97690795ff9840e681"}, - {file = "numba-0.57.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:53e9fab973d9e82c9f8449f75994a898daaaf821d84f06fbb0b9de2293dd9306"}, - {file = "numba-0.57.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c0602e4f896e6a6d844517c3ab434bc978e7698a22a733cc8124465898c28fa8"}, - {file = "numba-0.57.1-cp310-cp310-win32.whl", hash = "sha256:3d6483c27520d16cf5d122868b79cad79e48056ecb721b52d70c126bed65431e"}, - {file = "numba-0.57.1-cp310-cp310-win_amd64.whl", hash = "sha256:a32ee263649aa3c3587b833d6311305379529570e6c20deb0c6f4fb5bc7020db"}, - {file = "numba-0.57.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c078f84b5529a7fdb8413bb33d5100f11ec7b44aa705857d9eb4e54a54ff505"}, - {file = "numba-0.57.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e447c4634d1cc99ab50d4faa68f680f1d88b06a2a05acf134aa6fcc0342adeca"}, - {file = "numba-0.57.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4838edef2df5f056cb8974670f3d66562e751040c448eb0b67c7e2fec1726649"}, - {file = "numba-0.57.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9b17fbe4a69dcd9a7cd49916b6463cd9a82af5f84911feeb40793b8bce00dfa7"}, - {file = "numba-0.57.1-cp311-cp311-win_amd64.whl", hash = "sha256:93df62304ada9b351818ba19b1cfbddaf72cd89348e81474326ca0b23bf0bae1"}, - {file = "numba-0.57.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8e00ca63c5d0ad2beeb78d77f087b3a88c45ea9b97e7622ab2ec411a868420ee"}, - {file = "numba-0.57.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ff66d5b022af6c7d81ddbefa87768e78ed4f834ab2da6ca2fd0d60a9e69b94f5"}, - {file = "numba-0.57.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:60ec56386076e9eed106a87c96626d5686fbb16293b9834f0849cf78c9491779"}, - {file = "numba-0.57.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6c057ccedca95df23802b6ccad86bb318be624af45b5a38bb8412882be57a681"}, - {file = "numba-0.57.1-cp38-cp38-win32.whl", hash = "sha256:5a82bf37444039c732485c072fda21a361790ed990f88db57fd6941cd5e5d307"}, - {file = "numba-0.57.1-cp38-cp38-win_amd64.whl", hash = "sha256:9bcc36478773ce838f38afd9a4dfafc328d4ffb1915381353d657da7f6473282"}, - {file = "numba-0.57.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae50c8c90c2ce8057f9618b589223e13faa8cbc037d8f15b4aad95a2c33a0582"}, - {file = "numba-0.57.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9a1b2b69448e510d672ff9a6b18d2db9355241d93c6a77677baa14bec67dc2a0"}, - {file = "numba-0.57.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3cf78d74ad9d289fbc1e5b1c9f2680fca7a788311eb620581893ab347ec37a7e"}, - {file = "numba-0.57.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f47dd214adc5dcd040fe9ad2adbd2192133c9075d2189ce1b3d5f9d72863ef05"}, - {file = "numba-0.57.1-cp39-cp39-win32.whl", hash = "sha256:a3eac19529956185677acb7f01864919761bfffbb9ae04bbbe5e84bbc06cfc2b"}, - {file = "numba-0.57.1-cp39-cp39-win_amd64.whl", hash = "sha256:9587ba1bf5f3035575e45562ada17737535c6d612df751e811d702693a72d95e"}, - {file = "numba-0.57.1.tar.gz", hash = "sha256:33c0500170d213e66d90558ad6aca57d3e03e97bb11da82e6d87ab793648cb17"}, + {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"}, ] [package.dependencies] importlib-metadata = {version = "*", markers = "python_version < \"3.9\""} -llvmlite = "==0.40.*" -numpy = ">=1.21,<1.25" +llvmlite = "==0.41.*" +numpy = ">=1.22,<1.27" [[package]] name = "numpy" @@ -2577,13 +2656,13 @@ scipy = ">=0.13.2" [[package]] name = "packaging" -version = "23.1" +version = "23.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] [[package]] @@ -2706,65 +2785,65 @@ files = [ [[package]] name = "pillow" -version = "10.0.1" +version = "10.1.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "Pillow-10.0.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:8f06be50669087250f319b706decf69ca71fdecd829091a37cc89398ca4dc17a"}, - {file = "Pillow-10.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50bd5f1ebafe9362ad622072a1d2f5850ecfa44303531ff14353a4059113b12d"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6a90167bcca1216606223a05e2cf991bb25b14695c518bc65639463d7db722d"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f11c9102c56ffb9ca87134bd025a43d2aba3f1155f508eff88f694b33a9c6d19"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:186f7e04248103482ea6354af6d5bcedb62941ee08f7f788a1c7707bc720c66f"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0462b1496505a3462d0f35dc1c4d7b54069747d65d00ef48e736acda2c8cbdff"}, - {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d889b53ae2f030f756e61a7bff13684dcd77e9af8b10c6048fb2c559d6ed6eaf"}, - {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:552912dbca585b74d75279a7570dd29fa43b6d93594abb494ebb31ac19ace6bd"}, - {file = "Pillow-10.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:787bb0169d2385a798888e1122c980c6eff26bf941a8ea79747d35d8f9210ca0"}, - {file = "Pillow-10.0.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fd2a5403a75b54661182b75ec6132437a181209b901446ee5724b589af8edef1"}, - {file = "Pillow-10.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2d7e91b4379f7a76b31c2dda84ab9e20c6220488e50f7822e59dac36b0cd92b1"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19e9adb3f22d4c416e7cd79b01375b17159d6990003633ff1d8377e21b7f1b21"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93139acd8109edcdeffd85e3af8ae7d88b258b3a1e13a038f542b79b6d255c54"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:92a23b0431941a33242b1f0ce6c88a952e09feeea9af4e8be48236a68ffe2205"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cbe68deb8580462ca0d9eb56a81912f59eb4542e1ef8f987405e35a0179f4ea2"}, - {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:522ff4ac3aaf839242c6f4e5b406634bfea002469656ae8358644fc6c4856a3b"}, - {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:84efb46e8d881bb06b35d1d541aa87f574b58e87f781cbba8d200daa835b42e1"}, - {file = "Pillow-10.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:898f1d306298ff40dc1b9ca24824f0488f6f039bc0e25cfb549d3195ffa17088"}, - {file = "Pillow-10.0.1-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:bcf1207e2f2385a576832af02702de104be71301c2696d0012b1b93fe34aaa5b"}, - {file = "Pillow-10.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d6c9049c6274c1bb565021367431ad04481ebb54872edecfcd6088d27edd6ed"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28444cb6ad49726127d6b340217f0627abc8732f1194fd5352dec5e6a0105635"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de596695a75496deb3b499c8c4f8e60376e0516e1a774e7bc046f0f48cd620ad"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:2872f2d7846cf39b3dbff64bc1104cc48c76145854256451d33c5faa55c04d1a"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4ce90f8a24e1c15465048959f1e94309dfef93af272633e8f37361b824532e91"}, - {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ee7810cf7c83fa227ba9125de6084e5e8b08c59038a7b2c9045ef4dde61663b4"}, - {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1be1c872b9b5fcc229adeadbeb51422a9633abd847c0ff87dc4ef9bb184ae08"}, - {file = "Pillow-10.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:98533fd7fa764e5f85eebe56c8e4094db912ccbe6fbf3a58778d543cadd0db08"}, - {file = "Pillow-10.0.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:764d2c0daf9c4d40ad12fbc0abd5da3af7f8aa11daf87e4fa1b834000f4b6b0a"}, - {file = "Pillow-10.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fcb59711009b0168d6ee0bd8fb5eb259c4ab1717b2f538bbf36bacf207ef7a68"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:697a06bdcedd473b35e50a7e7506b1d8ceb832dc238a336bd6f4f5aa91a4b500"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f665d1e6474af9f9da5e86c2a3a2d2d6204e04d5af9c06b9d42afa6ebde3f21"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:2fa6dd2661838c66f1a5473f3b49ab610c98a128fc08afbe81b91a1f0bf8c51d"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:3a04359f308ebee571a3127fdb1bd01f88ba6f6fb6d087f8dd2e0d9bff43f2a7"}, - {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:723bd25051454cea9990203405fa6b74e043ea76d4968166dfd2569b0210886a"}, - {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:71671503e3015da1b50bd18951e2f9daf5b6ffe36d16f1eb2c45711a301521a7"}, - {file = "Pillow-10.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:44e7e4587392953e5e251190a964675f61e4dae88d1e6edbe9f36d6243547ff3"}, - {file = "Pillow-10.0.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:3855447d98cced8670aaa63683808df905e956f00348732448b5a6df67ee5849"}, - {file = "Pillow-10.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ed2d9c0704f2dc4fa980b99d565c0c9a543fe5101c25b3d60488b8ba80f0cce1"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5bb289bb835f9fe1a1e9300d011eef4d69661bb9b34d5e196e5e82c4cb09b37"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0d3e54ab1df9df51b914b2233cf779a5a10dfd1ce339d0421748232cea9876"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:2cc6b86ece42a11f16f55fe8903595eff2b25e0358dec635d0a701ac9586588f"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:ca26ba5767888c84bf5a0c1a32f069e8204ce8c21d00a49c90dabeba00ce0145"}, - {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f0b4b06da13275bc02adfeb82643c4a6385bd08d26f03068c2796f60d125f6f2"}, - {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bc2e3069569ea9dbe88d6b8ea38f439a6aad8f6e7a6283a38edf61ddefb3a9bf"}, - {file = "Pillow-10.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8b451d6ead6e3500b6ce5c7916a43d8d8d25ad74b9102a629baccc0808c54971"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:32bec7423cdf25c9038fef614a853c9d25c07590e1a870ed471f47fb80b244db"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cf63d2c6928b51d35dfdbda6f2c1fddbe51a6bc4a9d4ee6ea0e11670dd981e"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f6d3d4c905e26354e8f9d82548475c46d8e0889538cb0657aa9c6f0872a37aa4"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:847e8d1017c741c735d3cd1883fa7b03ded4f825a6e5fcb9378fd813edee995f"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:7f771e7219ff04b79e231d099c0a28ed83aa82af91fd5fa9fdb28f5b8d5addaf"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459307cacdd4138edee3875bbe22a2492519e060660eaf378ba3b405d1c66317"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b059ac2c4c7a97daafa7dc850b43b2d3667def858a4f112d1aa082e5c3d6cf7d"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6caf3cd38449ec3cd8a68b375e0c6fe4b6fd04edb6c9766b55ef84a6e8ddf2d"}, - {file = "Pillow-10.0.1.tar.gz", hash = "sha256:d72967b06be9300fed5cfbc8b5bafceec48bf7cdc7dab66b1d2549035287191d"}, + {file = "Pillow-10.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106"}, + {file = "Pillow-10.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818"}, + {file = "Pillow-10.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992"}, + {file = "Pillow-10.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f"}, + {file = "Pillow-10.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212"}, + {file = "Pillow-10.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2"}, + {file = "Pillow-10.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f"}, + {file = "Pillow-10.1.0.tar.gz", hash = "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38"}, ] [package.extras] @@ -2784,13 +2863,13 @@ files = [ [[package]] name = "platformdirs" -version = "3.10.0" +version = "4.0.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, - {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, + {file = "platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b"}, + {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, ] [package.extras] @@ -2799,13 +2878,13 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-co [[package]] name = "pluggy" -version = "1.2.0" +version = "1.3.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, - {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, ] [package.extras] @@ -2825,13 +2904,13 @@ files = [ [[package]] name = "prompt-toolkit" -version = "3.0.39" +version = "3.0.40" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, - {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, + {file = "prompt_toolkit-3.0.40-py3-none-any.whl", hash = "sha256:99ba3dfb23d5b5af89712f89e60a5f3d9b8b67a9482ca377c5771d0e9047a34b"}, + {file = "prompt_toolkit-3.0.40.tar.gz", hash = "sha256:a371c06bb1d66cd499fecd708e50c0b6ae00acba9822ba33c586e2f16d1b739e"}, ] [package.dependencies] @@ -2887,25 +2966,27 @@ files = [ [[package]] name = "psutil" -version = "5.9.5" +version = "5.9.6" 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.*" -files = [ - {file = "psutil-5.9.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f"}, - {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5"}, - {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4"}, - {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48"}, - {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4"}, - {file = "psutil-5.9.5-cp27-none-win32.whl", hash = "sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f"}, - {file = "psutil-5.9.5-cp27-none-win_amd64.whl", hash = "sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42"}, - {file = "psutil-5.9.5-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217"}, - {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da"}, - {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4"}, - {file = "psutil-5.9.5-cp36-abi3-win32.whl", hash = "sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d"}, - {file = "psutil-5.9.5-cp36-abi3-win_amd64.whl", hash = "sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9"}, - {file = "psutil-5.9.5-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30"}, - {file = "psutil-5.9.5.tar.gz", hash = "sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c"}, +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "psutil-5.9.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:fb8a697f11b0f5994550555fcfe3e69799e5b060c8ecf9e2f75c69302cc35c0d"}, + {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:91ecd2d9c00db9817a4b4192107cf6954addb5d9d67a969a4f436dbc9200f88c"}, + {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:10e8c17b4f898d64b121149afb136c53ea8b68c7531155147867b7b1ac9e7e28"}, + {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:18cd22c5db486f33998f37e2bb054cc62fd06646995285e02a51b1e08da97017"}, + {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ca2780f5e038379e520281e4c032dddd086906ddff9ef0d1b9dcf00710e5071c"}, + {file = "psutil-5.9.6-cp27-none-win32.whl", hash = "sha256:70cb3beb98bc3fd5ac9ac617a327af7e7f826373ee64c80efd4eb2856e5051e9"}, + {file = "psutil-5.9.6-cp27-none-win_amd64.whl", hash = "sha256:51dc3d54607c73148f63732c727856f5febec1c7c336f8f41fcbd6315cce76ac"}, + {file = "psutil-5.9.6-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c69596f9fc2f8acd574a12d5f8b7b1ba3765a641ea5d60fb4736bf3c08a8214a"}, + {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92e0cc43c524834af53e9d3369245e6cc3b130e78e26100d1f63cdb0abeb3d3c"}, + {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4"}, + {file = "psutil-5.9.6-cp36-cp36m-win32.whl", hash = "sha256:3ebf2158c16cc69db777e3c7decb3c0f43a7af94a60d72e87b2823aebac3d602"}, + {file = "psutil-5.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:ff18b8d1a784b810df0b0fff3bcb50ab941c3b8e2c8de5726f9c71c601c611aa"}, + {file = "psutil-5.9.6-cp37-abi3-win32.whl", hash = "sha256:a6f01f03bf1843280f4ad16f4bde26b817847b4c1a0db59bf6419807bc5ce05c"}, + {file = "psutil-5.9.6-cp37-abi3-win_amd64.whl", hash = "sha256:6e5fb8dc711a514da83098bc5234264e551ad980cec5f85dabf4d38ed6f15e9a"}, + {file = "psutil-5.9.6-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:daecbcbd29b289aac14ece28eca6a3e60aa361754cf6da3dfb20d4d32b6c7f57"}, + {file = "psutil-5.9.6.tar.gz", hash = "sha256:e4b92ddcd7dd4cdd3f900180ea1e104932c7bce234fb88976e2a3b296441225a"}, ] [package.extras] @@ -2936,6 +3017,17 @@ files = [ [package.extras] tests = ["pytest"] +[[package]] +name = "py4j" +version = "0.10.9.7" +description = "Enables Python programs to dynamically access arbitrary Java objects" +optional = false +python-versions = "*" +files = [ + {file = "py4j-0.10.9.7-py2.py3-none-any.whl", hash = "sha256:85defdfd2b2376eb3abf5ca6474b51ab7e0de341c75a02f46dc9b5976f5a5c1b"}, + {file = "py4j-0.10.9.7.tar.gz", hash = "sha256:0b6e5315bb3ada5cf62ac651d107bb2ebc02def3dee9d9548e3baac644ea8dbb"}, +] + [[package]] name = "pyasn1" version = "0.5.0" @@ -2961,6 +3053,20 @@ files = [ [package.dependencies] pyasn1 = ">=0.4.6,<0.6.0" +[[package]] +name = "pybind11" +version = "2.11.1" +description = "Seamless operability between C++11 and Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pybind11-2.11.1-py3-none-any.whl", hash = "sha256:33cdd02a6453380dd71cc70357ce388ad1ee8d32bd0e38fc22b273d050aa29b3"}, + {file = "pybind11-2.11.1.tar.gz", hash = "sha256:00cd59116a6e8155aecd9174f37ba299d1d397ed4a6b86ac1dfe01b3e40f2cc4"}, +] + +[package.extras] +global = ["pybind11-global (==2.11.1)"] + [[package]] name = "pybtex" version = "0.24.0" @@ -2982,17 +3088,17 @@ test = ["pytest"] [[package]] name = "pybtex-docutils" -version = "1.0.2" +version = "1.0.3" description = "A docutils backend for pybtex." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pybtex-docutils-1.0.2.tar.gz", hash = "sha256:43aa353b6d498fd5ac30f0073a98e332d061d34fe619d3d50d1761f8fd4aa016"}, - {file = "pybtex_docutils-1.0.2-py3-none-any.whl", hash = "sha256:6f9e3c25a37bcaac8c4f69513272706ec6253bb708a93d8b4b173f43915ba239"}, + {file = "pybtex-docutils-1.0.3.tar.gz", hash = "sha256:3a7ebdf92b593e00e8c1c538aa9a20bca5d92d84231124715acc964d51d93c6b"}, + {file = "pybtex_docutils-1.0.3-py3-none-any.whl", hash = "sha256:8fd290d2ae48e32fcb54d86b0efb8d573198653c7e2447d5bec5847095f430b9"}, ] [package.dependencies] -docutils = ">=0.8" +docutils = ">=0.14" pybtex = ">=0.16" [[package]] @@ -3008,47 +3114,47 @@ files = [ [[package]] name = "pydantic" -version = "1.10.12" +version = "1.10.13" description = "Data validation and settings management using python type hints" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic-1.10.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a1fcb59f2f355ec350073af41d927bf83a63b50e640f4dbaa01053a28b7a7718"}, - {file = "pydantic-1.10.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b7ccf02d7eb340b216ec33e53a3a629856afe1c6e0ef91d84a4e6f2fb2ca70fe"}, - {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fb2aa3ab3728d950bcc885a2e9eff6c8fc40bc0b7bb434e555c215491bcf48b"}, - {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:771735dc43cf8383959dc9b90aa281f0b6092321ca98677c5fb6125a6f56d58d"}, - {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca48477862372ac3770969b9d75f1bf66131d386dba79506c46d75e6b48c1e09"}, - {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a5e7add47a5b5a40c49b3036d464e3c7802f8ae0d1e66035ea16aa5b7a3923ed"}, - {file = "pydantic-1.10.12-cp310-cp310-win_amd64.whl", hash = "sha256:e4129b528c6baa99a429f97ce733fff478ec955513630e61b49804b6cf9b224a"}, - {file = "pydantic-1.10.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0d191db0f92dfcb1dec210ca244fdae5cbe918c6050b342d619c09d31eea0cc"}, - {file = "pydantic-1.10.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:795e34e6cc065f8f498c89b894a3c6da294a936ee71e644e4bd44de048af1405"}, - {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69328e15cfda2c392da4e713443c7dbffa1505bc9d566e71e55abe14c97ddc62"}, - {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2031de0967c279df0d8a1c72b4ffc411ecd06bac607a212892757db7462fc494"}, - {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ba5b2e6fe6ca2b7e013398bc7d7b170e21cce322d266ffcd57cca313e54fb246"}, - {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2a7bac939fa326db1ab741c9d7f44c565a1d1e80908b3797f7f81a4f86bc8d33"}, - {file = "pydantic-1.10.12-cp311-cp311-win_amd64.whl", hash = "sha256:87afda5539d5140cb8ba9e8b8c8865cb5b1463924d38490d73d3ccfd80896b3f"}, - {file = "pydantic-1.10.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:549a8e3d81df0a85226963611950b12d2d334f214436a19537b2efed61b7639a"}, - {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:598da88dfa127b666852bef6d0d796573a8cf5009ffd62104094a4fe39599565"}, - {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba5c4a8552bff16c61882db58544116d021d0b31ee7c66958d14cf386a5b5350"}, - {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c79e6a11a07da7374f46970410b41d5e266f7f38f6a17a9c4823db80dadf4303"}, - {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab26038b8375581dc832a63c948f261ae0aa21f1d34c1293469f135fa92972a5"}, - {file = "pydantic-1.10.12-cp37-cp37m-win_amd64.whl", hash = "sha256:e0a16d274b588767602b7646fa05af2782576a6cf1022f4ba74cbb4db66f6ca8"}, - {file = "pydantic-1.10.12-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a9dfa722316f4acf4460afdf5d41d5246a80e249c7ff475c43a3a1e9d75cf62"}, - {file = "pydantic-1.10.12-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a73f489aebd0c2121ed974054cb2759af8a9f747de120acd2c3394cf84176ccb"}, - {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bcb8cbfccfcf02acb8f1a261143fab622831d9c0989707e0e659f77a18e0"}, - {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fcfb5296d7877af406ba1547dfde9943b1256d8928732267e2653c26938cd9c"}, - {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2f9a6fab5f82ada41d56b0602606a5506aab165ca54e52bc4545028382ef1c5d"}, - {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dea7adcc33d5d105896401a1f37d56b47d443a2b2605ff8a969a0ed5543f7e33"}, - {file = "pydantic-1.10.12-cp38-cp38-win_amd64.whl", hash = "sha256:1eb2085c13bce1612da8537b2d90f549c8cbb05c67e8f22854e201bde5d98a47"}, - {file = "pydantic-1.10.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ef6c96b2baa2100ec91a4b428f80d8f28a3c9e53568219b6c298c1125572ebc6"}, - {file = "pydantic-1.10.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c076be61cd0177a8433c0adcb03475baf4ee91edf5a4e550161ad57fc90f523"}, - {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5a58feb9a39f481eda4d5ca220aa8b9d4f21a41274760b9bc66bfd72595b86"}, - {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5f805d2d5d0a41633651a73fa4ecdd0b3d7a49de4ec3fadf062fe16501ddbf1"}, - {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1289c180abd4bd4555bb927c42ee42abc3aee02b0fb2d1223fb7c6e5bef87dbe"}, - {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5d1197e462e0364906cbc19681605cb7c036f2475c899b6f296104ad42b9f5fb"}, - {file = "pydantic-1.10.12-cp39-cp39-win_amd64.whl", hash = "sha256:fdbdd1d630195689f325c9ef1a12900524dceb503b00a987663ff4f58669b93d"}, - {file = "pydantic-1.10.12-py3-none-any.whl", hash = "sha256:b749a43aa51e32839c9d71dc67eb1e4221bb04af1033a32e3923d46f9effa942"}, - {file = "pydantic-1.10.12.tar.gz", hash = "sha256:0fe8a415cea8f340e7a9af9c54fc71a649b43e8ca3cc732986116b3cb135d303"}, + {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"}, ] [package.dependencies] @@ -3072,36 +3178,19 @@ files = [ [package.extras] plugins = ["importlib-metadata"] -[[package]] -name = "pyjwt" -version = "2.8.0" -description = "JSON Web Token implementation in Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, - {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, -] - -[package.extras] -crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] - [[package]] name = "pylint" -version = "2.17.5" +version = "2.17.7" description = "python code static checker" optional = false python-versions = ">=3.7.2" files = [ - {file = "pylint-2.17.5-py3-none-any.whl", hash = "sha256:73995fb8216d3bed149c8d51bba25b2c52a8251a2c8ac846ec668ce38fab5413"}, - {file = "pylint-2.17.5.tar.gz", hash = "sha256:f7b601cbc06fef7e62a754e2b41294c2aa31f1cb659624b9a85bcba29eaf8252"}, + {file = "pylint-2.17.7-py3-none-any.whl", hash = "sha256:27a8d4c7ddc8c2f8c18aa0050148f89ffc09838142193fdbe98f172781a3ff87"}, + {file = "pylint-2.17.7.tar.gz", hash = "sha256:f4fcac7ae74cfe36bc8451e931d8438e4a476c20314b1101c458ad0f05191fad"}, ] [package.dependencies] -astroid = ">=2.15.6,<=2.17.0-dev0" +astroid = ">=2.15.8,<=2.17.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, @@ -3120,13 +3209,13 @@ testutils = ["gitpython (>3)"] [[package]] name = "pyparsing" -version = "3.0.9" +version = "3.1.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, + {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, + {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, ] [package.extras] @@ -3134,77 +3223,44 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pyquil" -version = "3.5.4" +version = "4.0.3" description = "A Python library for creating Quantum Instruction Language (Quil) programs." optional = false -python-versions = ">=3.7,<4.0" +python-versions = ">=3.8,<4.0" files = [ - {file = "pyquil-3.5.4-py3-none-any.whl", hash = "sha256:ef36458b38b314f647f0e6cb067358e92033821f90fb7a533baa5ff59bfbaaf1"}, - {file = "pyquil-3.5.4.tar.gz", hash = "sha256:4fe65c83a4cf9164d3c7ddb314029d71b7388fb22fb56a1ba8f4dd3c1bb1d9a6"}, + {file = "pyquil-4.0.3-py3-none-any.whl", hash = "sha256:4abc72adf7cbd22a55d2f674d9c2b076cb5bc3a066320c515b59a9f794ba66d0"}, + {file = "pyquil-4.0.3.tar.gz", hash = "sha256:fd5d65ad4fba788c232c8f7e18cab6a83ecc2514dc6eb4da4dd3db86668b2ddf"}, ] [package.dependencies] deprecated = ">=1.2.13,<2.0.0" lark = ">=0.11.1,<0.12.0" +matplotlib-inline = ">=0.1.6,<0.2.0" networkx = ">=2.5" -numpy = ">=1.21,<2.0" -qcs-api-client = ">=0.21.0,<0.22.0" +numpy = ">=1.22,<2.0" +packaging = ">=23.1,<24.0" +pydantic = ">=1.10.7,<2.0.0" +qcs-sdk-python = "0.12.8" rpcq = ">=3.10.0,<4.0.0" -scipy = ">=1.6.1,<2.0.0" +scipy = ">=1.7.3,<2.0.0" tenacity = ">=8.2.2,<9.0.0" types-deprecated = ">=1.2.9.2,<2.0.0.0" types-python-dateutil = ">=2.8.19,<3.0.0" types-retry = ">=0.9.9,<0.10.0" [package.extras] -docs = ["Sphinx (>=4.0.2,<5.0.0)", "nbsphinx (>=0.8.6,<0.9.0)", "recommonmark (>=0.7.1,<0.8.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)"] +docs = ["Sphinx (>=7.1.2,<8.0.0)", "matplotlib (>=3.7.1,<4.0.0)", "nbsphinx (>=0.9.1,<0.10.0)", "pandoc (==2.4b0)", "recommonmark (>=0.7.1,<0.8.0)", "seaborn (>=0.12.2,<0.13.0)", "sphinx-rtd-theme (>=1.3.0,<2.0.0)"] latex = ["ipython (>=7.21.0,<8.0.0)"] -[[package]] -name = "pyrsistent" -version = "0.19.3" -description = "Persistent/Functional/Immutable data structures" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, - {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, - {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, - {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, - {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, - {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, - {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, - {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, - {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, - {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, - {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, - {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, - {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, - {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, - {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, - {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, - {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, - {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, - {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, - {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, - {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, - {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, -] - [[package]] name = "pytest" -version = "7.4.0" +version = "7.4.3" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, - {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, + {file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"}, + {file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"}, ] [package.dependencies] @@ -3252,78 +3308,78 @@ six = ">=1.5" [[package]] name = "python-rapidjson" -version = "1.10" +version = "1.13" description = "Python wrapper around rapidjson" optional = false python-versions = ">=3.6" files = [ - {file = "python-rapidjson-1.10.tar.gz", hash = "sha256:acfecbf5edb91ec72a20a125de7f56b8c2f6161eff4c65382c8ee6a2484d3540"}, - {file = "python_rapidjson-1.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1db7b0af882999f5685eb7046a0f3b3aca5d55a3e84b3089747d29a4ec6fdade"}, - {file = "python_rapidjson-1.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a87c8c8b615513f9dc414af1554140589036d14840f5e1f1845965e1c0a080e1"}, - {file = "python_rapidjson-1.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a0a2f5c4abe529ca2764343416e35710a263832533b7bdc76c3285efb5b5ecc8"}, - {file = "python_rapidjson-1.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40467c3a6d8f070cc4d196fe46a79ed59d1a13a4d3fdc6a0325a21816600e5a7"}, - {file = "python_rapidjson-1.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9df4e7237a3e77666ccb9b437013294e6aa3968528f7c61f60f6f38eea0f8f79"}, - {file = "python_rapidjson-1.10-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:99a5215f24ff1fa6cc67ee275a6852aa56d934d3b8cd7a40197feb632b54fd76"}, - {file = "python_rapidjson-1.10-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3dbea0ee9fa1cd6ecc13a949f6bb94013639d39cdb56f58df4ab61130d35e57c"}, - {file = "python_rapidjson-1.10-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:6d1d0c5da3bd5f701b1aed550e1e7bd59b16ae642877cddf18815006cf998f9a"}, - {file = "python_rapidjson-1.10-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:072f76c1f1483bcc4056d7d3a8b0319bf841a73e955f188302094b62b2163bf9"}, - {file = "python_rapidjson-1.10-cp310-cp310-win32.whl", hash = "sha256:c95d466307a2140a7687a575103980c6e81c9f62d19556cafad3d6b2932b7eb1"}, - {file = "python_rapidjson-1.10-cp310-cp310-win_amd64.whl", hash = "sha256:454ffda58cc6fed64d983b1b8ae4b39a563b4fd671dae9132e06450025898539"}, - {file = "python_rapidjson-1.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fff343076fbeee0cd7e4e3fb9472f2d567a127ec7b8b5b7ecba6bf7960a3ce07"}, - {file = "python_rapidjson-1.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:686482c67727edad4b6d0c753bc159f35134a5a623e9651c4b7c008ef2996252"}, - {file = "python_rapidjson-1.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ef7d55688b7123d62690b193537cc048fa9f35cfa43d249fedc0d9fd398890a"}, - {file = "python_rapidjson-1.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f27c0601792533ab6e98452961d61566480dc155da19d2a358a5fd9a85d9321"}, - {file = "python_rapidjson-1.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95176e35e3bacb8a1a27f563e815b5b57c717992c871b1c25fd76a835fbba32c"}, - {file = "python_rapidjson-1.10-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:47a0ec20886b8be86af307c10d699a447e22979ed7dd1f2b7ed5cb7496b3d920"}, - {file = "python_rapidjson-1.10-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f7968c0cb09d9a76aa2483556ba46ab42634baf216cb2f2c7cd6bf77119a33c1"}, - {file = "python_rapidjson-1.10-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5faab270a4dd49216ceaca7169682680b2f5df8311c1ed259e4612d9d0cf61b7"}, - {file = "python_rapidjson-1.10-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:81b797934dc037810f5f98af138b55a3b6f18dd569cc5e8f81fe79956a4717ca"}, - {file = "python_rapidjson-1.10-cp311-cp311-win32.whl", hash = "sha256:6c1d62cc58a61629fc5e216fb7b3a1b02787c98fded874a7b474b1e6325e377e"}, - {file = "python_rapidjson-1.10-cp311-cp311-win_amd64.whl", hash = "sha256:29d31fc4254f1a4dca420e58bd1331e990fc2959d09ff2daa7934d52732a8491"}, - {file = "python_rapidjson-1.10-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:718f4e217b511cfbf9166f55ccf4bf4e4538495bee403e390cf89791c0debc26"}, - {file = "python_rapidjson-1.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:541bbb96353cf3fe2bdb29e727087226532be4e4573daad6f042cfdea533a564"}, - {file = "python_rapidjson-1.10-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50f0402a6899c6a177d4a37152deefcd59c61e44bef56b71e8d006a186c86286"}, - {file = "python_rapidjson-1.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c035e17744d6d6fba073b550b0040a74e55f2ad33fd798df206ff6879b41ad10"}, - {file = "python_rapidjson-1.10-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da970bde42309a74a5556e696673ea11c4545b8bee5081b84265ded460b2e9ef"}, - {file = "python_rapidjson-1.10-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7437a649821008aa456f2fbec737880d7f9bdda7ec94cc1743a43ccf32b5d26"}, - {file = "python_rapidjson-1.10-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:362d969bbd277f78bf0b1ffaa810857ea40351146b827f896f8d49e9c25fc99c"}, - {file = "python_rapidjson-1.10-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:409256e7748c4ab7f17b3793c7a78ca01914c487644fc42140d116ed4dec8c4f"}, - {file = "python_rapidjson-1.10-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a34a7e2853456fe50ba2ee22e38e7841e55eee10021d4496cce62285f148e8e7"}, - {file = "python_rapidjson-1.10-cp37-cp37m-win32.whl", hash = "sha256:bc4a97940e5afa60a598483d0eb863b26e4810aaf030d92a4301f5fc183e1b6d"}, - {file = "python_rapidjson-1.10-cp37-cp37m-win_amd64.whl", hash = "sha256:89586b67f9c69b66885774acebf3d018e7b8f93cea2b3cffa306ec9d37877594"}, - {file = "python_rapidjson-1.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2e38082b1a8ce3e2bd55821852c0cd643cdabe6497fd9c054f6b47a099afbea0"}, - {file = "python_rapidjson-1.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0955ef22fabb36b26fcad702ae54c1bce2bc2a74b1883c42d251d72011d0d426"}, - {file = "python_rapidjson-1.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0a9db03c68ab0158bcdf80299b2c980186d148aa3e05d5650fea5148a425a29a"}, - {file = "python_rapidjson-1.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fde8ab0f06debaa06d93085f19dc3ec3db53f22883f1625dd32b96a87e7009de"}, - {file = "python_rapidjson-1.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23539c9f7d85d64a00d3cb44c7d9ab3be2184d4da42a5f3263dcfd1d0203ee43"}, - {file = "python_rapidjson-1.10-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8bfd484285f3477acef0bb45abd2b80b6252e35a5a53395ce48f0327cbe43c23"}, - {file = "python_rapidjson-1.10-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8b0ed643ebaa8ddf3f40422752efe83abda29aa30a9e6866ccd9dd591b5057d0"}, - {file = "python_rapidjson-1.10-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:5aeca661a0f229f1312fb3ad3e1a5c6736d49942d80d4931810158559eb8f119"}, - {file = "python_rapidjson-1.10-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8a68ed066e8f0878b7112f943cf35ba9e5217395bcdd8cb478cde01871e2701c"}, - {file = "python_rapidjson-1.10-cp38-cp38-win32.whl", hash = "sha256:d286be6f63446776c4958bb37824c683194b4878fc9cd5b7255134fb5a6ba536"}, - {file = "python_rapidjson-1.10-cp38-cp38-win_amd64.whl", hash = "sha256:aece5270c6e6d5c3d54586c9a5fb9677d70d7019744a59560c5c369c7b9bba25"}, - {file = "python_rapidjson-1.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc09c5ad0fe71f262cdcc5655409f132f1560a8af80e76e7757945ce401fdbab"}, - {file = "python_rapidjson-1.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f6447bd7a8ff5135ab7e372b48a174d3c560d5b322e32bd465e8458e6e4593"}, - {file = "python_rapidjson-1.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22ede69213885391b46cc14596bfd4cd1a5c6f34a2db6600fb08b03982dbc7b7"}, - {file = "python_rapidjson-1.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a9425129623718a04b885a12190faa23e7997c4e8632054e18df7ea473f746d"}, - {file = "python_rapidjson-1.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:60e10f32e1a8d155448842934cbe71eb620b4b4a0cb3627ba4c4856e27556534"}, - {file = "python_rapidjson-1.10-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8d23caab17b87ed5b82e28cdc19172ba1ca65c982e3fff387961d3f33710031f"}, - {file = "python_rapidjson-1.10-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f07d4fcdcfd64bdad0143b9705c5d5089677ebddf60ac6c1f8074a34b1c70cf9"}, - {file = "python_rapidjson-1.10-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:87b991c7ae435489c56a46cef228d2b65a3df689ee4fe24fab69c791c841f633"}, - {file = "python_rapidjson-1.10-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3706a5c4f21073c04be133c36565efc6e3f5646a03c8d19af78c19d7c70eb708"}, - {file = "python_rapidjson-1.10-cp39-cp39-win32.whl", hash = "sha256:47f9078ea6884f700166a8728d863609fec62232e66a33b8fb4a7706ce7c731c"}, - {file = "python_rapidjson-1.10-cp39-cp39-win_amd64.whl", hash = "sha256:9e4921ab7002ae9faad7f439a7c50aa195039f177e9e51a76c34c97966c79a79"}, + {file = "python-rapidjson-1.13.tar.gz", hash = "sha256:ffe9d382be84ddcf197c188d2f49baa8b47270cec95a1dcb62496e2af3eb71d4"}, + {file = "python_rapidjson-1.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12b0dad7a605d6482fecae18046d91ec772cef1db5d506256b5f399bf0de9b79"}, + {file = "python_rapidjson-1.13-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87ffa883e20bbb320695b68393b120d916e4bc9125da3ece1f5c32c65f3d2022"}, + {file = "python_rapidjson-1.13-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f6ea7c0d41a5daf1fbc91f749084bf41afcd48d9883a1fa00ec806fc04f2af2"}, + {file = "python_rapidjson-1.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:016c0143832f9679eaef35683c606086cea937a98c264cf830adfd0887cb1f68"}, + {file = "python_rapidjson-1.13-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e065e68dcada7df47c74fa974a5293601c97e8d38c1b4acea1700eb1f7ce1b18"}, + {file = "python_rapidjson-1.13-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7a700730b5109207799025aeade538ab830a7bbefc8612cfe565e660bdae706d"}, + {file = "python_rapidjson-1.13-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ee8bf49beccaa5acd458bc83e45d49892c906830580ecc17a744f15cfe752366"}, + {file = "python_rapidjson-1.13-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a6d910663a1f6c5c1658b176824e46dcf30370c3939a21575c78906e06e06ab3"}, + {file = "python_rapidjson-1.13-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ede37e4640cb9aaeb812963d2098f8bbff9a86b95a5638e9222bb619ba3a68c0"}, + {file = "python_rapidjson-1.13-cp310-cp310-win32.whl", hash = "sha256:2c86448740a4085197e8e3708c68bd21d3dfaa6d1b9821824a59dc22e90c1fc7"}, + {file = "python_rapidjson-1.13-cp310-cp310-win_amd64.whl", hash = "sha256:4873a3e2ee676f26c4cfdd0026f2a09220868e3df79d6981fab87f4bb5689588"}, + {file = "python_rapidjson-1.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ceca087be345f383999faf388298300f9a40a4e9d5cac142c0e1ce3f9ee3249"}, + {file = "python_rapidjson-1.13-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa60bf1bc77e8db0d4edafc92130dc70cb1b06c3ef47abaa83bef43198212b9b"}, + {file = "python_rapidjson-1.13-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dcc302a70a7addcced0901873bce03319b75035ed5bfda144be9b1c8ef4c724e"}, + {file = "python_rapidjson-1.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b951a1bece7ad6224c00634f0e2b52311830b10dead62713d2822979013a0eb"}, + {file = "python_rapidjson-1.13-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:677f7e3173aff366fb673abca99aa9e477b3607d86ecf83b21e8f5b2144db4c9"}, + {file = "python_rapidjson-1.13-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3d9c071acb3c9c6dc4a4a3cd2c776a09d5605e92610ff462df40803c7135f734"}, + {file = "python_rapidjson-1.13-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:438bed3cf5c0aebbbbdf5b545fa641051f3c34f5f3d991adbe0d57cf0dba4735"}, + {file = "python_rapidjson-1.13-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:ccdb9cf48a451bf69a862285f45ee69ce96109400c8823d85d385af13a977168"}, + {file = "python_rapidjson-1.13-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:69d15112ee3ed1ed7e8edc54a2fbbc3c21bca642faf64c0a3951ae8dfdfc53dc"}, + {file = "python_rapidjson-1.13-cp311-cp311-win32.whl", hash = "sha256:10d236ab4c04d98b427282f87a5c600d482ad001653f07d72d94319e043a029e"}, + {file = "python_rapidjson-1.13-cp311-cp311-win_amd64.whl", hash = "sha256:263828991e0335685feb283e8fd576de7520b0c7b61000bdb5d9f55d3b509c51"}, + {file = "python_rapidjson-1.13-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df351d0aa2f2b70a911964233938c1a0907b5df4f92a0ff7fa5724f9b05eadfd"}, + {file = "python_rapidjson-1.13-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c651217b33886b826b1e1d0506e2e7072f03c8e98b3e23edd5fb52d717a3d7cc"}, + {file = "python_rapidjson-1.13-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4557aebbdd93fa54e51cb9a66aca29096253803dfcfad9210378c1230e24d1dc"}, + {file = "python_rapidjson-1.13-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f682fa579de6ef4b0fb8308d3810e54acece8075864f061be380efab1363545"}, + {file = "python_rapidjson-1.13-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09cb57befa52eb6d229540bc268e9db0336428025773a282140b6d6a8c0b0cfc"}, + {file = "python_rapidjson-1.13-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bffb9953ac4adfddbb186f26a23b668697a1a18c9e6242238f911215fc4c19df"}, + {file = "python_rapidjson-1.13-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:c726c8ee15332b4257e11fc2f2f6d8c3b893abbc4529f7d0fe4db245d5d48958"}, + {file = "python_rapidjson-1.13-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:127c1511f5b6e792257a384b1d5adf9f510a0b9d7a9125e136efcf97c7f12d59"}, + {file = "python_rapidjson-1.13-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:674e924dcafb34568f1e9e86487a3a3cd608408b0656f593ead59f71550a8153"}, + {file = "python_rapidjson-1.13-cp312-cp312-win32.whl", hash = "sha256:d626ac73df1214ee69c75eadc407107715f38f895e52645c529d3cd0a98f06b8"}, + {file = "python_rapidjson-1.13-cp312-cp312-win_amd64.whl", hash = "sha256:896e5a748a9a153f03d47197f8e324948fb7815ae911c4da58f9d4b259541a83"}, + {file = "python_rapidjson-1.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fbd3fc5cd5a9c29064c3df8ad24c8f8f8e2b41244fb041c7889ed23b09224898"}, + {file = "python_rapidjson-1.13-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67aa202d5c6d957c8f2d95ee5e381de71215e9e31276763abd07ac0697f1850b"}, + {file = "python_rapidjson-1.13-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bdd559c991bee7c745834ecfd31db7286612cd72bdbe17706b225ad09063341"}, + {file = "python_rapidjson-1.13-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7fd4d54d9ced3a35a263e34daac36ff190d4927f80bd1d5b180e9114e172227"}, + {file = "python_rapidjson-1.13-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fca75f4e671eb83b7342c735a605ca85b0c9a3107bdba8f78e9c620b4f020f0c"}, + {file = "python_rapidjson-1.13-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3677a1534f43302736a87299ada097dd96b5644bfcd9997be5e1b15f535acdd7"}, + {file = "python_rapidjson-1.13-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3fd925c62c8c2a16e185c5e9bc3d3bc43c10c6ac0f8c50f99b6339dfc35d5234"}, + {file = "python_rapidjson-1.13-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:e5f44d35677b9dbb0dec8223cc7a0824c7d1947e2fcc207453ccd2dafc3786a9"}, + {file = "python_rapidjson-1.13-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c1f56d2546c2f2235595b14535e17037bf2a7956542c3eb65032b6282fdd9bf7"}, + {file = "python_rapidjson-1.13-cp38-cp38-win32.whl", hash = "sha256:93eebbbfd1cffffdfac0f02d11757f4a8017465ea88be24f8fbb0f22bf97f21e"}, + {file = "python_rapidjson-1.13-cp38-cp38-win_amd64.whl", hash = "sha256:7884325958745ec047a15eaa2c5b6b95b94bf22812e1d8c991729de39ae59b48"}, + {file = "python_rapidjson-1.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7789994fa71df0da256f5b8afe3949be293840c31d31de89ced058d5bce08ef"}, + {file = "python_rapidjson-1.13-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93db30e414770452119ff4bfa5234aebd36476663ea3542685a388b78a98e0e7"}, + {file = "python_rapidjson-1.13-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29fb34ee79c3e4646845edb7ddf857cdaeb3a30fbcd55b91bf9e79a04b9fde60"}, + {file = "python_rapidjson-1.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ffbe8b4bd475af1571bfc61679685a624740a19441fdd72fb360db2dc96a7a"}, + {file = "python_rapidjson-1.13-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d66f4196b35ce962bfce185d9860bbe23e5a075b48db7b8318650be3aefa307"}, + {file = "python_rapidjson-1.13-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1b9c8b7c0b99ad0bf5b1493883ce4a8a447ac30c0c6d8f26232c0ed6e8ed578f"}, + {file = "python_rapidjson-1.13-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf42f367c7950cc7169cfcd78e54d8ed607207e9d078fe13b1f5ffc992910960"}, + {file = "python_rapidjson-1.13-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:74b7ff43aecac7c83e1f3d2cce363c0b01c68923d6dd6874c5607b1eb2f61504"}, + {file = "python_rapidjson-1.13-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6ad430a03e180619b1f1e3d9e2a129bbfa2e7aed3e49bf2ef4db274286e8379a"}, + {file = "python_rapidjson-1.13-cp39-cp39-win32.whl", hash = "sha256:de295c31400a52f2d8b04f6358093fc574eef53e2a49faf7a334cc4adfc43aea"}, + {file = "python_rapidjson-1.13-cp39-cp39-win_amd64.whl", hash = "sha256:599fcf313db14b762204fbc325c5630516a2a1953e32015e37d06d4cd631800e"}, ] [[package]] name = "pytz" -version = "2023.3" +version = "2023.3.post1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, - {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, ] [[package]] @@ -3514,26 +3570,33 @@ files = [ cffi = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] -name = "qcs-api-client" -version = "0.21.6" -description = "A client library for accessing the Rigetti QCS API" +name = "qcs-sdk-python" +version = "0.12.8" +description = "Python interface for the QCS Rust SDK" optional = false -python-versions = ">=3.7,<4.0" +python-versions = "*" files = [ - {file = "qcs_api_client-0.21.6-py3-none-any.whl", hash = "sha256:0231c9a741c137adc78539068b7fe1d4e1854bee4e3e868017abc4eb3876c3a0"}, - {file = "qcs_api_client-0.21.6.tar.gz", hash = "sha256:1da391ff03715c9d50e14aa6006b5f0c3cffde9018fb968ff27545cc90c87a9c"}, + {file = "qcs_sdk_python-0.12.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:c8d33a63e950576ca0dc41a69a709fb7e6d004138f57d9b9650626ef6bc18400"}, + {file = "qcs_sdk_python-0.12.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ad7d11d696a0e39a5c231f72ab189f144a28e3c7aadfcb11cd446ea3ad3bcab"}, + {file = "qcs_sdk_python-0.12.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1673925ce4518adb4bcdd4cf2ad38171a1d7d9468759f84918a2c52043213432"}, + {file = "qcs_sdk_python-0.12.8-cp310-none-win_amd64.whl", hash = "sha256:fe822d085ebcecdf9df1d98e67eaa6f400b92e3091798685d0b69a5131e853bf"}, + {file = "qcs_sdk_python-0.12.8-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:17669efa260dad1b166bd5d31076bfb4bd5cbe70d41b0327b30f86cac52b1df0"}, + {file = "qcs_sdk_python-0.12.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d3623253336dee5c10e4513cbe5b645256e9e5b47ddb0aacaaea2b0463fdb64"}, + {file = "qcs_sdk_python-0.12.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0282e088cfb43f06d7274b5e1483bd91c8d7467d9e6ca3faf751acc6396e2a8d"}, + {file = "qcs_sdk_python-0.12.8-cp311-none-win_amd64.whl", hash = "sha256:6fa57d6515b61a262b1b62870dcf03c413c2833e4883b607dd8d5ad3f1899767"}, + {file = "qcs_sdk_python-0.12.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5de242120e60fb8d4e94152db1e28af7243f10fd13a552fc23cf5073878c0fc1"}, + {file = "qcs_sdk_python-0.12.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:393b6d9745743e2c74660c3274c5cf4607a3f9cc1042b40c5b42d5115144e97c"}, + {file = "qcs_sdk_python-0.12.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62ed8e87638d097cc9f04b251bf0cd9d7014f44467da6af0d62d01b6e05a1319"}, + {file = "qcs_sdk_python-0.12.8-cp38-none-win_amd64.whl", hash = "sha256:84d3275d52366df547a2f5656438218714c7bf7da2565d87d8b6f1d4833c3b0e"}, + {file = "qcs_sdk_python-0.12.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:c9e07017d105ac8027dd41be57e287d8338db588bb653f21ac3362e0a2a63a7b"}, + {file = "qcs_sdk_python-0.12.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f25c65f9acfe4ef1b0355047685061e777819fb1d40bb5fde8acf426b65d1ea"}, + {file = "qcs_sdk_python-0.12.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fe1165651d93f217e18d63f6687f5db3e21230933234ebffeaa0562f9c8e7fd"}, + {file = "qcs_sdk_python-0.12.8-cp39-none-win_amd64.whl", hash = "sha256:6d352f57ccbaa1a2dac8d1a56fb604bb2e6c54075a2ebdf7ee2e81282a60a53f"}, + {file = "qcs_sdk_python-0.12.8.tar.gz", hash = "sha256:ef39c8a50059a55fd391e71d34b3f223839d3d4585d1a79b2e11cf83ef8789d6"}, ] [package.dependencies] -attrs = ">=21.3.0,<22.0.0" -httpx = ">=0.23.0,<0.24.0" -iso8601 = ">=1.0.2,<2.0.0" -pydantic = ">=1.7.2,<2.0.0" -PyJWT = ">=2.4.0,<3.0.0" -python-dateutil = ">=2.8.1,<3.0.0" -retrying = ">=1.3.3,<2.0.0" -rfc3339 = ">=6.2,<7.0" -toml = ">=0.10.2,<0.11.0" +quil = "0.5.7" [[package]] name = "qdldl" @@ -3569,7 +3632,7 @@ scipy = ">=0.13.2" [[package]] name = "qibojit" -version = "0.1.1" +version = "0.1.2" description = "Simulation tools based on numba and cupy." optional = false python-versions = ">=3.8.0,<3.12" @@ -3579,14 +3642,43 @@ develop = false [package.dependencies] numba = ">=0.51.0" psutil = "^5.9.5" -qibo = ">=0.2.0" +qibo = ">=0.2.2" scipy = "^1.10.1" [package.source] type = "git" url = "https://github.com/qiboteam/qibojit.git" reference = "HEAD" -resolved_reference = "0cac397880b750477ab00b43cec797f23292141a" +resolved_reference = "1d335f312bea3d1a522289332f53a2649c69d300" + +[[package]] +name = "quil" +version = "0.5.7" +description = "A Python package for building and parsing Quil programs." +optional = false +python-versions = ">=3.8" +files = [ + {file = "quil-0.5.7-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ab0c8221f2f6df06bc77d7408611a1bb25f8df31c9201f4e35625948e1fa9960"}, + {file = "quil-0.5.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dde46f1dec73e6c4ed3d793f6d2eb6e59ae8b7852538e01b4f9eadcdc1ce54c1"}, + {file = "quil-0.5.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6948a98d4882a2ff3ccb2898d5353f63181b4f6e85f163e085ddf3e2a87ecb7"}, + {file = "quil-0.5.7-cp310-none-win32.whl", hash = "sha256:834df8c66e9bc14d6295211606481186e306eadc3b3513106fa47dc62a176e52"}, + {file = "quil-0.5.7-cp310-none-win_amd64.whl", hash = "sha256:fff71da0396a782f3bb5f76afb6f098ac97071ef894b9978210cd962cd49636f"}, + {file = "quil-0.5.7-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:2e15e851db2fb05993baa49d8c76f1519ead0422219e691d94e8ce04ed517ea6"}, + {file = "quil-0.5.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41486358498ac92708fb6f68cf600082beb32e29f8852e598ce375c5fae0f75c"}, + {file = "quil-0.5.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c43ad9299ff5180f6bafe936639b3c0881637d0cad7a837d1041eebb42f59e7d"}, + {file = "quil-0.5.7-cp311-none-win32.whl", hash = "sha256:6303c3bbc9f325e9d5515b6ec989a8d348180a18942238e5f1d8e430bae7968c"}, + {file = "quil-0.5.7-cp311-none-win_amd64.whl", hash = "sha256:99403f934620b8ccdf43196245197f20b81613513c1faa32f84beb3f88475f3d"}, + {file = "quil-0.5.7-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ef35c4b44346f6724302705a54e8762f94ca574f51b5e7226f1f7140539e429c"}, + {file = "quil-0.5.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:018fa87c5bee1a4016ef90d3fc8dc38a821ffe504bb8abab07db7bc05eb29d07"}, + {file = "quil-0.5.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dba0e78718c118c5607e91c9a569d087919aa0dba88dbd12539fdf55ff2d9d87"}, + {file = "quil-0.5.7-cp38-none-win32.whl", hash = "sha256:a2d1078282608546357b1502bdd26325f5e57d8cf1b2a6e514041c608a8c9dd5"}, + {file = "quil-0.5.7-cp38-none-win_amd64.whl", hash = "sha256:ea875d3155c6b35a234a63d26881c7cce1a8a6c50ebcb124614aff743ec56c57"}, + {file = "quil-0.5.7-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:795abbd209dc1022261d8538a79cd81b19082d5b1a4f56dfe4fbcc876c40f164"}, + {file = "quil-0.5.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:171da20314564d9695b7cd6c91a488cb5378c011fe612ed569053658a5798087"}, + {file = "quil-0.5.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:827069ad86334251b0a213e64bdceb97847996e81712f75b6afeadc8d32dc752"}, + {file = "quil-0.5.7-cp39-none-win32.whl", hash = "sha256:7fb1ecc7dd5d589e79424c0dea6823995f107b205dbe879ccd01d3ba646ad9ec"}, + {file = "quil-0.5.7-cp39-none-win_amd64.whl", hash = "sha256:a9e0ec7bdd4513a323e0a0e2cc1a4faabc8501df85d4bc3b80394e728c986244"}, +] [[package]] name = "recommonmark" @@ -3604,6 +3696,21 @@ commonmark = ">=0.8.1" docutils = ">=0.11" sphinx = ">=1.3.1" +[[package]] +name = "referencing" +version = "0.30.2" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.30.2-py3-none-any.whl", hash = "sha256:449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf"}, + {file = "referencing-0.30.2.tar.gz", hash = "sha256:794ad8003c65938edcdbc027f1933215e0d0ccc0291e3ce20a4d87432b59efc0"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + [[package]] name = "requests" version = "2.31.0" @@ -3643,48 +3750,6 @@ requests = ">=2.0.0" [package.extras] rsa = ["oauthlib[signedtoken] (>=3.0.0)"] -[[package]] -name = "retrying" -version = "1.3.4" -description = "Retrying" -optional = false -python-versions = "*" -files = [ - {file = "retrying-1.3.4-py3-none-any.whl", hash = "sha256:8cc4d43cb8e1125e0ff3344e9de678fefd85db3b750b81b2240dc0183af37b35"}, - {file = "retrying-1.3.4.tar.gz", hash = "sha256:345da8c5765bd982b1d1915deb9102fd3d1f7ad16bd84a9700b85f64d24e8f3e"}, -] - -[package.dependencies] -six = ">=1.7.0" - -[[package]] -name = "rfc3339" -version = "6.2" -description = "Format dates according to the RFC 3339." -optional = false -python-versions = "*" -files = [ - {file = "rfc3339-6.2-py3-none-any.whl", hash = "sha256:f44316b21b21db90a625cde04ebb0d46268f153e6093021fa5893e92a96f58a3"}, - {file = "rfc3339-6.2.tar.gz", hash = "sha256:d53c3b5eefaef892b7240ba2a91fef012e86faa4d0a0ca782359c490e00ad4d0"}, -] - -[[package]] -name = "rfc3986" -version = "1.5.0" -description = "Validating URI References per RFC 3986" -optional = false -python-versions = "*" -files = [ - {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, - {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, -] - -[package.dependencies] -idna = {version = "*", optional = true, markers = "extra == \"idna2008\""} - -[package.extras] -idna2008 = ["idna"] - [[package]] name = "rpcq" version = "3.11.0" @@ -3701,6 +3766,114 @@ python-rapidjson = "*" pyzmq = ">=17" "ruamel.yaml" = "*" +[[package]] +name = "rpds-py" +version = "0.12.0" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.12.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:c694bee70ece3b232df4678448fdda245fd3b1bb4ba481fb6cd20e13bb784c46"}, + {file = "rpds_py-0.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:30e5ce9f501fb1f970e4a59098028cf20676dee64fc496d55c33e04bbbee097d"}, + {file = "rpds_py-0.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d72a4315514e5a0b9837a086cb433b004eea630afb0cc129de76d77654a9606f"}, + {file = "rpds_py-0.12.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eebaf8c76c39604d52852366249ab807fe6f7a3ffb0dd5484b9944917244cdbe"}, + {file = "rpds_py-0.12.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a239303acb0315091d54c7ff36712dba24554993b9a93941cf301391d8a997ee"}, + {file = "rpds_py-0.12.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ced40cdbb6dd47a032725a038896cceae9ce267d340f59508b23537f05455431"}, + {file = "rpds_py-0.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c8c0226c71bd0ce9892eaf6afa77ae8f43a3d9313124a03df0b389c01f832de"}, + {file = "rpds_py-0.12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b8e11715178f3608874508f08e990d3771e0b8c66c73eb4e183038d600a9b274"}, + {file = "rpds_py-0.12.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5210a0018c7e09c75fa788648617ebba861ae242944111d3079034e14498223f"}, + {file = "rpds_py-0.12.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:171d9a159f1b2f42a42a64a985e4ba46fc7268c78299272ceba970743a67ee50"}, + {file = "rpds_py-0.12.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:57ec6baec231bb19bb5fd5fc7bae21231860a1605174b11585660236627e390e"}, + {file = "rpds_py-0.12.0-cp310-none-win32.whl", hash = "sha256:7188ddc1a8887194f984fa4110d5a3d5b9b5cd35f6bafdff1b649049cbc0ce29"}, + {file = "rpds_py-0.12.0-cp310-none-win_amd64.whl", hash = "sha256:1e04581c6117ad9479b6cfae313e212fe0dfa226ac727755f0d539cd54792963"}, + {file = "rpds_py-0.12.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:0a38612d07a36138507d69646c470aedbfe2b75b43a4643f7bd8e51e52779624"}, + {file = "rpds_py-0.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f12d69d568f5647ec503b64932874dade5a20255736c89936bf690951a5e79f5"}, + {file = "rpds_py-0.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f8a1d990dc198a6c68ec3d9a637ba1ce489b38cbfb65440a27901afbc5df575"}, + {file = "rpds_py-0.12.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8c567c664fc2f44130a20edac73e0a867f8e012bf7370276f15c6adc3586c37c"}, + {file = "rpds_py-0.12.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0e9e976e0dbed4f51c56db10831c9623d0fd67aac02853fe5476262e5a22acb7"}, + {file = "rpds_py-0.12.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:efddca2d02254a52078c35cadad34762adbae3ff01c6b0c7787b59d038b63e0d"}, + {file = "rpds_py-0.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9e7f29c00577aff6b318681e730a519b235af292732a149337f6aaa4d1c5e31"}, + {file = "rpds_py-0.12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:389c0e38358fdc4e38e9995e7291269a3aead7acfcf8942010ee7bc5baee091c"}, + {file = "rpds_py-0.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:33ab498f9ac30598b6406e2be1b45fd231195b83d948ebd4bd77f337cb6a2bff"}, + {file = "rpds_py-0.12.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d56b1cd606ba4cedd64bb43479d56580e147c6ef3f5d1c5e64203a1adab784a2"}, + {file = "rpds_py-0.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1fa73ed22c40a1bec98d7c93b5659cd35abcfa5a0a95ce876b91adbda170537c"}, + {file = "rpds_py-0.12.0-cp311-none-win32.whl", hash = "sha256:dbc25baa6abb205766fb8606f8263b02c3503a55957fcb4576a6bb0a59d37d10"}, + {file = "rpds_py-0.12.0-cp311-none-win_amd64.whl", hash = "sha256:c6b52b7028b547866c2413f614ee306c2d4eafdd444b1ff656bf3295bf1484aa"}, + {file = "rpds_py-0.12.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:9620650c364c01ed5b497dcae7c3d4b948daeae6e1883ae185fef1c927b6b534"}, + {file = "rpds_py-0.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2124f9e645a94ab7c853bc0a3644e0ca8ffbe5bb2d72db49aef8f9ec1c285733"}, + {file = "rpds_py-0.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281c8b219d4f4b3581b918b816764098d04964915b2f272d1476654143801aa2"}, + {file = "rpds_py-0.12.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:27ccc93c7457ef890b0dd31564d2a05e1aca330623c942b7e818e9e7c2669ee4"}, + {file = "rpds_py-0.12.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1c562a9bb72244fa767d1c1ab55ca1d92dd5f7c4d77878fee5483a22ffac808"}, + {file = "rpds_py-0.12.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e57919c32ee295a2fca458bb73e4b20b05c115627f96f95a10f9f5acbd61172d"}, + {file = "rpds_py-0.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa35ad36440aaf1ac8332b4a4a433d4acd28f1613f0d480995f5cfd3580e90b7"}, + {file = "rpds_py-0.12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e6aea5c0eb5b0faf52c7b5c4a47c8bb64437173be97227c819ffa31801fa4e34"}, + {file = "rpds_py-0.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:81cf9d306c04df1b45971c13167dc3bad625808aa01281d55f3cf852dde0e206"}, + {file = "rpds_py-0.12.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:08e6e7ff286254016b945e1ab632ee843e43d45e40683b66dd12b73791366dd1"}, + {file = "rpds_py-0.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4d0a675a7acbbc16179188d8c6d0afb8628604fc1241faf41007255957335a0b"}, + {file = "rpds_py-0.12.0-cp312-none-win32.whl", hash = "sha256:b2287c09482949e0ca0c0eb68b2aca6cf57f8af8c6dfd29dcd3bc45f17b57978"}, + {file = "rpds_py-0.12.0-cp312-none-win_amd64.whl", hash = "sha256:8015835494b21aa7abd3b43fdea0614ee35ef6b03db7ecba9beb58eadf01c24f"}, + {file = "rpds_py-0.12.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:6174d6ad6b58a6bcf67afbbf1723420a53d06c4b89f4c50763d6fa0a6ac9afd2"}, + {file = "rpds_py-0.12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a689e1ded7137552bea36305a7a16ad2b40be511740b80748d3140614993db98"}, + {file = "rpds_py-0.12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f45321224144c25a62052035ce96cbcf264667bcb0d81823b1bbc22c4addd194"}, + {file = "rpds_py-0.12.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aa32205358a76bf578854bf31698a86dc8b2cb591fd1d79a833283f4a403f04b"}, + {file = "rpds_py-0.12.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91bd2b7cf0f4d252eec8b7046fa6a43cee17e8acdfc00eaa8b3dbf2f9a59d061"}, + {file = "rpds_py-0.12.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3acadbab8b59f63b87b518e09c4c64b142e7286b9ca7a208107d6f9f4c393c5c"}, + {file = "rpds_py-0.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:429349a510da82c85431f0f3e66212d83efe9fd2850f50f339341b6532c62fe4"}, + {file = "rpds_py-0.12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05942656cb2cb4989cd50ced52df16be94d344eae5097e8583966a1d27da73a5"}, + {file = "rpds_py-0.12.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0c5441b7626c29dbd54a3f6f3713ec8e956b009f419ffdaaa3c80eaf98ddb523"}, + {file = "rpds_py-0.12.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:b6b0e17d39d21698185097652c611f9cf30f7c56ccec189789920e3e7f1cee56"}, + {file = "rpds_py-0.12.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3b7a64d43e2a1fa2dd46b678e00cabd9a49ebb123b339ce799204c44a593ae1c"}, + {file = "rpds_py-0.12.0-cp38-none-win32.whl", hash = "sha256:e5bbe011a2cea9060fef1bb3d668a2fd8432b8888e6d92e74c9c794d3c101595"}, + {file = "rpds_py-0.12.0-cp38-none-win_amd64.whl", hash = "sha256:bec29b801b4adbf388314c0d050e851d53762ab424af22657021ce4b6eb41543"}, + {file = "rpds_py-0.12.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:1096ca0bf2d3426cbe79d4ccc91dc5aaa73629b08ea2d8467375fad8447ce11a"}, + {file = "rpds_py-0.12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48aa98987d54a46e13e6954880056c204700c65616af4395d1f0639eba11764b"}, + {file = "rpds_py-0.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7979d90ee2190d000129598c2b0c82f13053dba432b94e45e68253b09bb1f0f6"}, + {file = "rpds_py-0.12.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:88857060b690a57d2ea8569bca58758143c8faa4639fb17d745ce60ff84c867e"}, + {file = "rpds_py-0.12.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4eb74d44776b0fb0782560ea84d986dffec8ddd94947f383eba2284b0f32e35e"}, + {file = "rpds_py-0.12.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f62581d7e884dd01ee1707b7c21148f61f2febb7de092ae2f108743fcbef5985"}, + {file = "rpds_py-0.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f5dcb658d597410bb7c967c1d24eaf9377b0d621358cbe9d2ff804e5dd12e81"}, + {file = "rpds_py-0.12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9bf9acce44e967a5103fcd820fc7580c7b0ab8583eec4e2051aec560f7b31a63"}, + {file = "rpds_py-0.12.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:240687b5be0f91fbde4936a329c9b7589d9259742766f74de575e1b2046575e4"}, + {file = "rpds_py-0.12.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:25740fb56e8bd37692ed380e15ec734be44d7c71974d8993f452b4527814601e"}, + {file = "rpds_py-0.12.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a54917b7e9cd3a67e429a630e237a90b096e0ba18897bfb99ee8bd1068a5fea0"}, + {file = "rpds_py-0.12.0-cp39-none-win32.whl", hash = "sha256:b92aafcfab3d41580d54aca35a8057341f1cfc7c9af9e8bdfc652f83a20ced31"}, + {file = "rpds_py-0.12.0-cp39-none-win_amd64.whl", hash = "sha256:cd316dbcc74c76266ba94eb021b0cc090b97cca122f50bd7a845f587ff4bf03f"}, + {file = "rpds_py-0.12.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:0853da3d5e9bc6a07b2486054a410b7b03f34046c123c6561b535bb48cc509e1"}, + {file = "rpds_py-0.12.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:cb41ad20064e18a900dd427d7cf41cfaec83bcd1184001f3d91a1f76b3fcea4e"}, + {file = "rpds_py-0.12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b710bf7e7ae61957d5c4026b486be593ed3ec3dca3e5be15e0f6d8cf5d0a4990"}, + {file = "rpds_py-0.12.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a952ae3eb460c6712388ac2ec706d24b0e651b9396d90c9a9e0a69eb27737fdc"}, + {file = "rpds_py-0.12.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0bedd91ae1dd142a4dc15970ed2c729ff6c73f33a40fa84ed0cdbf55de87c777"}, + {file = "rpds_py-0.12.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:761531076df51309075133a6bc1db02d98ec7f66e22b064b1d513bc909f29743"}, + {file = "rpds_py-0.12.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2baa6be130e8a00b6cbb9f18a33611ec150b4537f8563bddadb54c1b74b8193"}, + {file = "rpds_py-0.12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f05450fa1cd7c525c0b9d1a7916e595d3041ac0afbed2ff6926e5afb6a781b7f"}, + {file = "rpds_py-0.12.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:81c4d1a3a564775c44732b94135d06e33417e829ff25226c164664f4a1046213"}, + {file = "rpds_py-0.12.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e888be685fa42d8b8a3d3911d5604d14db87538aa7d0b29b1a7ea80d354c732d"}, + {file = "rpds_py-0.12.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6f8d7fe73d1816eeb5378409adc658f9525ecbfaf9e1ede1e2d67a338b0c7348"}, + {file = "rpds_py-0.12.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:0831d3ecdea22e4559cc1793f22e77067c9d8c451d55ae6a75bf1d116a8e7f42"}, + {file = "rpds_py-0.12.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:513ccbf7420c30e283c25c82d5a8f439d625a838d3ba69e79a110c260c46813f"}, + {file = "rpds_py-0.12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:301bd744a1adaa2f6a5e06c98f1ac2b6f8dc31a5c23b838f862d65e32fca0d4b"}, + {file = "rpds_py-0.12.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f8832a4f83d4782a8f5a7b831c47e8ffe164e43c2c148c8160ed9a6d630bc02a"}, + {file = "rpds_py-0.12.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b2416ed743ec5debcf61e1242e012652a4348de14ecc7df3512da072b074440"}, + {file = "rpds_py-0.12.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35585a8cb5917161f42c2104567bb83a1d96194095fc54a543113ed5df9fa436"}, + {file = "rpds_py-0.12.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d389ff1e95b6e46ebedccf7fd1fadd10559add595ac6a7c2ea730268325f832c"}, + {file = "rpds_py-0.12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9b007c2444705a2dc4a525964fd4dd28c3320b19b3410da6517cab28716f27d3"}, + {file = "rpds_py-0.12.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:188912b22b6c8225f4c4ffa020a2baa6ad8fabb3c141a12dbe6edbb34e7f1425"}, + {file = "rpds_py-0.12.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b4cf9ab9a0ae0cb122685209806d3f1dcb63b9fccdf1424fb42a129dc8c2faa"}, + {file = "rpds_py-0.12.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:2d34a5450a402b00d20aeb7632489ffa2556ca7b26f4a63c35f6fccae1977427"}, + {file = "rpds_py-0.12.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:466030a42724780794dea71eb32db83cc51214d66ab3fb3156edd88b9c8f0d78"}, + {file = "rpds_py-0.12.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:68172622a5a57deb079a2c78511c40f91193548e8ab342c31e8cb0764d362459"}, + {file = "rpds_py-0.12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54cdfcda59251b9c2f87a05d038c2ae02121219a04d4a1e6fc345794295bdc07"}, + {file = "rpds_py-0.12.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6b75b912a0baa033350367a8a07a8b2d44fd5b90c890bfbd063a8a5f945f644b"}, + {file = "rpds_py-0.12.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:47aeceb4363851d17f63069318ba5721ae695d9da55d599b4d6fb31508595278"}, + {file = "rpds_py-0.12.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0525847f83f506aa1e28eb2057b696fe38217e12931c8b1b02198cfe6975e142"}, + {file = "rpds_py-0.12.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efbe0b5e0fd078ed7b005faa0170da4f72666360f66f0bb2d7f73526ecfd99f9"}, + {file = "rpds_py-0.12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0fadfdda275c838cba5102c7f90a20f2abd7727bf8f4a2b654a5b617529c5c18"}, + {file = "rpds_py-0.12.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:56dd500411d03c5e9927a1eb55621e906837a83b02350a9dc401247d0353717c"}, + {file = "rpds_py-0.12.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:6915fc9fa6b3ec3569566832e1bb03bd801c12cea030200e68663b9a87974e76"}, + {file = "rpds_py-0.12.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5f1519b080d8ce0a814f17ad9fb49fb3a1d4d7ce5891f5c85fc38631ca3a8dc4"}, + {file = "rpds_py-0.12.0.tar.gz", hash = "sha256:7036316cc26b93e401cedd781a579be606dad174829e6ad9e9c5a0da6e036f80"}, +] + [[package]] name = "rsa" version = "4.9" @@ -3717,101 +3890,119 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruamel-yaml" -version = "0.17.32" +version = "0.18.5" 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" +python-versions = ">=3.7" files = [ - {file = "ruamel.yaml-0.17.32-py3-none-any.whl", hash = "sha256:23cd2ed620231677564646b0c6a89d138b6822a0d78656df7abda5879ec4f447"}, - {file = "ruamel.yaml-0.17.32.tar.gz", hash = "sha256:ec939063761914e14542972a5cba6d33c23b0859ab6342f61cf070cfc600efc2"}, + {file = "ruamel.yaml-0.18.5-py3-none-any.whl", hash = "sha256:a013ac02f99a69cdd6277d9664689eb1acba07069f912823177c5eced21a6ada"}, + {file = "ruamel.yaml-0.18.5.tar.gz", hash = "sha256:61917e3a35a569c1133a8f772e1226961bf5a1198bea7e23f06a0841dea1ab0e"}, ] [package.dependencies] -"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.12\""} +"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} [package.extras] -docs = ["ryd"] +docs = ["mercurial (>5.7)", "ryd"] jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] [[package]] name = "ruamel-yaml-clib" -version = "0.2.7" +version = "0.2.8" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5859983f26d8cd7bb5c287ef452e8aacc86501487634573d260968f753e1d71"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:debc87a9516b237d0466a711b18b6ebeb17ba9f391eb7f91c649c5c4ec5006c7"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:df5828871e6648db72d1c19b4bd24819b80a755c4541d3409f0f7acd0f335c80"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:efa08d63ef03d079dcae1dfe334f6c8847ba8b645d08df286358b1f5293d24ab"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win32.whl", hash = "sha256:763d65baa3b952479c4e972669f679fe490eee058d5aa85da483ebae2009d231"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:d000f258cf42fec2b1bbf2863c61d7b8918d31ffee905da62dede869254d3b8a"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:045e0626baf1c52e5527bd5db361bc83180faaba2ff586e763d3d5982a876a9e"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:1a6391a7cabb7641c32517539ca42cf84b87b667bad38b78d4d42dd23e957c81"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:9c7617df90c1365638916b98cdd9be833d31d337dbcd722485597b43c4a215bf"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:41d0f1fa4c6830176eef5b276af04c89320ea616655d01327d5ce65e50575c94"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-win32.whl", hash = "sha256:f6d3d39611ac2e4f62c3128a9eed45f19a6608670c5a2f4f07f24e8de3441d38"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:da538167284de58a52109a9b89b8f6a53ff8437dd6dc26d33b57bf6699153122"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4b3a93bb9bc662fc1f99c5c3ea8e623d8b23ad22f861eb6fce9377ac07ad6072"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_12_0_arm64.whl", hash = "sha256:a234a20ae07e8469da311e182e70ef6b199d0fbeb6c6cc2901204dd87fb867e8"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:15910ef4f3e537eea7fe45f8a5d19997479940d9196f357152a09031c5be59f3"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:370445fd795706fd291ab00c9df38a0caed0f17a6fb46b0f607668ecb16ce763"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win32.whl", hash = "sha256:ecdf1a604009bd35c674b9225a8fa609e0282d9b896c03dd441a91e5f53b534e"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win_amd64.whl", hash = "sha256:f34019dced51047d6f70cb9383b2ae2853b7fc4dce65129a5acd49f4f9256646"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2aa261c29a5545adfef9296b7e33941f46aa5bbd21164228e833412af4c9c75f"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f01da5790e95815eb5a8a138508c01c758e5f5bc0ce4286c4f7028b8dd7ac3d0"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:40d030e2329ce5286d6b231b8726959ebbe0404c92f0a578c0e2482182e38282"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c3ca1fbba4ae962521e5eb66d72998b51f0f4d0f608d3c0347a48e1af262efa7"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win32.whl", hash = "sha256:7bdb4c06b063f6fd55e472e201317a3bb6cdeeee5d5a38512ea5c01e1acbdd93"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:be2a7ad8fd8f7442b24323d24ba0b56c51219513cfa45b9ada3b87b76c374d4b"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91a789b4aa0097b78c93e3dc4b40040ba55bef518f84a40d4442f713b4094acb"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:99e77daab5d13a48a4054803d052ff40780278240a902b880dd37a51ba01a307"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:3243f48ecd450eddadc2d11b5feb08aca941b5cd98c9b1db14b2fd128be8c697"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8831a2cedcd0f0927f788c5bdf6567d9dc9cc235646a434986a852af1cb54b4b"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win32.whl", hash = "sha256:3110a99e0f94a4a3470ff67fc20d3f96c25b13d24c6980ff841e82bafe827cac"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:92460ce908546ab69770b2e576e4f99fbb4ce6ab4b245345a3869a0a0410488f"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5bc0667c1eb8f83a3752b71b9c4ba55ef7c7058ae57022dd9b29065186a113d9"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:4a4d8d417868d68b979076a9be6a38c676eca060785abaa6709c7b31593c35d1"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf9a6bc4a0221538b1a7de3ed7bca4c93c02346853f44e1cd764be0023cd3640"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:a7b301ff08055d73223058b5c46c55638917f04d21577c95e00e0c4d79201a6b"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win32.whl", hash = "sha256:d5e51e2901ec2366b79f16c2299a03e74ba4531ddcfacc1416639c557aef0ad8"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:184faeaec61dbaa3cace407cffc5819f7b977e75360e8d5ca19461cd851a5fc5"}, - {file = "ruamel.yaml.clib-0.2.7.tar.gz", hash = "sha256:1f08fd5a2bea9c4180db71678e850b995d2a5f4537be0e94557668cf0f5f9497"}, + {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-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-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-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"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b"}, + {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win32.whl", hash = "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win32.whl", hash = "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win32.whl", hash = "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15"}, + {file = "ruamel.yaml.clib-0.2.8.tar.gz", hash = "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512"}, ] [[package]] name = "scikit-learn" -version = "1.3.0" +version = "1.3.2" description = "A set of python modules for machine learning and data mining" optional = false python-versions = ">=3.8" files = [ - {file = "scikit-learn-1.3.0.tar.gz", hash = "sha256:8be549886f5eda46436b6e555b0e4873b4f10aa21c07df45c4bc1735afbccd7a"}, - {file = "scikit_learn-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:981287869e576d42c682cf7ca96af0c6ac544ed9316328fd0d9292795c742cf5"}, - {file = "scikit_learn-1.3.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:436aaaae2c916ad16631142488e4c82f4296af2404f480e031d866863425d2a2"}, - {file = "scikit_learn-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7e28d8fa47a0b30ae1bd7a079519dd852764e31708a7804da6cb6f8b36e3630"}, - {file = "scikit_learn-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae80c08834a473d08a204d966982a62e11c976228d306a2648c575e3ead12111"}, - {file = "scikit_learn-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:552fd1b6ee22900cf1780d7386a554bb96949e9a359999177cf30211e6b20df6"}, - {file = "scikit_learn-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79970a6d759eb00a62266a31e2637d07d2d28446fca8079cf9afa7c07b0427f8"}, - {file = "scikit_learn-1.3.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:850a00b559e636b23901aabbe79b73dc604b4e4248ba9e2d6e72f95063765603"}, - {file = "scikit_learn-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee04835fb016e8062ee9fe9074aef9b82e430504e420bff51e3e5fffe72750ca"}, - {file = "scikit_learn-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d953531f5d9f00c90c34fa3b7d7cfb43ecff4c605dac9e4255a20b114a27369"}, - {file = "scikit_learn-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:151ac2bf65ccf363664a689b8beafc9e6aae36263db114b4ca06fbbbf827444a"}, - {file = "scikit_learn-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a885a9edc9c0a341cab27ec4f8a6c58b35f3d449c9d2503a6fd23e06bbd4f6a"}, - {file = "scikit_learn-1.3.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:9877af9c6d1b15486e18a94101b742e9d0d2f343d35a634e337411ddb57783f3"}, - {file = "scikit_learn-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c470f53cea065ff3d588050955c492793bb50c19a92923490d18fcb637f6383a"}, - {file = "scikit_learn-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd6e2d7389542eae01077a1ee0318c4fec20c66c957f45c7aac0c6eb0fe3c612"}, - {file = "scikit_learn-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:3a11936adbc379a6061ea32fa03338d4ca7248d86dd507c81e13af428a5bc1db"}, - {file = "scikit_learn-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:998d38fcec96584deee1e79cd127469b3ad6fefd1ea6c2dfc54e8db367eb396b"}, - {file = "scikit_learn-1.3.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:ded35e810438a527e17623ac6deae3b360134345b7c598175ab7741720d7ffa7"}, - {file = "scikit_learn-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e8102d5036e28d08ab47166b48c8d5e5810704daecf3a476a4282d562be9a28"}, - {file = "scikit_learn-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7617164951c422747e7c32be4afa15d75ad8044f42e7d70d3e2e0429a50e6718"}, - {file = "scikit_learn-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:1d54fb9e6038284548072df22fd34777e434153f7ffac72c8596f2d6987110dd"}, + {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"}, ] [package.dependencies] joblib = ">=1.1.1" -numpy = ">=1.17.3" +numpy = ">=1.17.3,<2.0" scipy = ">=1.5.0" threadpoolctl = ">=2.0.0" @@ -3861,48 +4052,74 @@ test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeo [[package]] name = "scs" -version = "3.2.3" -description = "scs: splitting conic solver" +version = "3.2.4" +description = "Splitting conic solver" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "scs-3.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9d7f7fd2d2cd88938c159b15e8915d9536610e50a9c34ecf36ce0290807afe55"}, - {file = "scs-3.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:368194620918301bf5309a35a7cd0444f1b1992b182c0a29033c26eb97b3dcb2"}, - {file = "scs-3.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:2d835a74c283be73bff6e1978d3ae77a60d9e87db1fdd12916464fa2a1dda517"}, - {file = "scs-3.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:81511fda3254c0d29089443dcd2305e81d203509e4d77afd160e9174b15ad75a"}, - {file = "scs-3.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715ca4532de39b462bd393f9e8b4bf57be4122e20f0780d00db3cab1450a585d"}, - {file = "scs-3.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:fcf4b985a787135b3e83682a4c5b9bce9c6290cfead1d7225c38f34f5ead7187"}, - {file = "scs-3.2.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:91f5194cfabe354c9b1f0ea1de82114028d81c5a4a633177b8da2fe36f301758"}, - {file = "scs-3.2.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0d15f21e9053c5df37dab0d700da55fcc71f2f454748f364b9de594988b2ab3"}, - {file = "scs-3.2.3-cp37-cp37m-win_amd64.whl", hash = "sha256:6a80727167ad73151ced202a1ac6c0c7644b00b2e2607edec8a8807fc0443ac8"}, - {file = "scs-3.2.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:79d7d6c42ee636821460d317b8250945ce04363a47a63aef6b1eae0bd7a418fc"}, - {file = "scs-3.2.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6f64d23247797cfa289095fb5ddea6eeff5adf98961e953da90233278827e0c"}, - {file = "scs-3.2.3-cp38-cp38-win_amd64.whl", hash = "sha256:9a14a7c80efb34b469eb4dbaf26a9104dd2ca93e477985f948d8f28cd4b1a2ba"}, - {file = "scs-3.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3eb601738b260e3dcad117f3e02aceaca5d1e8eac2be225be1c0f9cbf83e75cb"}, - {file = "scs-3.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1b24176de97ecedf698596086f85da6dad472fe38a4b21cf4b460f87cae2c37"}, - {file = "scs-3.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:ddaa5af34a0e1f636d312eb1901bd407383f0b04dda50fba7242d56e618c0966"}, - {file = "scs-3.2.3.tar.gz", hash = "sha256:e3bd779e7e977e3ae5a2f2035aa4c2a309e29082d59a722d5d6592edc4bdb4b3"}, + {file = "scs-3.2.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e8e23f70a7ae7cfa44f2a780e083e0eafd9fa90a4a4c10f47238248864b13c86"}, + {file = "scs-3.2.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b4a8b87d30c199a99cb96e9a26e72e034d3e9445229d8c51a9bff082c25b5f"}, + {file = "scs-3.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:084cf35d036aae4e72459f64e36bca46e4e328b866f6524a7b21f59345e66ac4"}, + {file = "scs-3.2.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1956274820f6d6f9a83243b27c0cfa2783618e28c370ac97f193e06afd3c0aa5"}, + {file = "scs-3.2.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dd81e0193943531683b1bf186893956ed32602ec442cae4408ef439edb7ad1f"}, + {file = "scs-3.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:ae7c59399cbc364bec596e75e7a301234c1f6a8b8bd82ff80354f322b5789bc1"}, + {file = "scs-3.2.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:189a1f3dd2e7359a98b648e58d2a9dcbf4f6ef17d8c55f11591a92a7dbe9cf01"}, + {file = "scs-3.2.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397c112c9d0b013f9a164129f3fd218fe5cd0872e70254270b6ba5692c200d9d"}, + {file = "scs-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:a192aedb6008363895a31b24201b5171b52345a9083431bcd39e67f969420707"}, + {file = "scs-3.2.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:50ee8cda8e3daaa0ee0480a8e6efd4201a25ec0a179687ed92f95c9098e8fcf8"}, + {file = "scs-3.2.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc460c2b95f919a17d8d610acfea22a280bfaeb19990080a013a56c00acb27ab"}, + {file = "scs-3.2.4-cp37-cp37m-win_amd64.whl", hash = "sha256:0d8bdcf9bf57a51a3ce7329c4ca54ca2c0c2637750f81675c1229f00a74e8d40"}, + {file = "scs-3.2.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:28cea65a9ed1e4ab301794a26aac2c2969763ad9fab40c82e148a154bd28415a"}, + {file = "scs-3.2.4-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:35de1ddb073fde2f987212be93a078b6a9d640f4a6102fccaa8df4b6ed82d73e"}, + {file = "scs-3.2.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ac0ef5ed17390ced8638f3984a904daa734ece8362f77a09c7f9cff9d58351"}, + {file = "scs-3.2.4-cp38-cp38-win_amd64.whl", hash = "sha256:c661438a404fac0118f6de46def9db260f1135b7d89c6f52d252378abaefa45d"}, + {file = "scs-3.2.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f4e10681576a2de7dd9880ee20581fa1bb7da8af006e6cb6b915c1932b0c7ce2"}, + {file = "scs-3.2.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5b2e6fbfa5b15724aa28599eaf88567741a583615d43d626f92c71cfd3d5cae"}, + {file = "scs-3.2.4-cp39-cp39-win_amd64.whl", hash = "sha256:fc8180564c4048516b9c742d5fd962cc26d0dd9982466b63103d922af9e96cff"}, + {file = "scs-3.2.4.tar.gz", hash = "sha256:09ffaa670d8608901db94addd8581376498cd9818eb5ef27fed3560f0bf0661b"}, ] [package.dependencies] -numpy = ">=1.7" -scipy = ">=0.13.2" +numpy = "*" +scipy = "*" [[package]] name = "setuptools" -version = "68.0.0" +version = "68.2.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, - {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, + {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, + {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "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-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "setuptools-scm" +version = "8.0.4" +description = "the blessed package to manage your versions by scm tags" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-scm-8.0.4.tar.gz", hash = "sha256:b5f43ff6800669595193fd09891564ee9d1d7dcb196cab4b2506d53a2e1c95c7"}, + {file = "setuptools_scm-8.0.4-py3-none-any.whl", hash = "sha256:b47844cd2a84b83b3187a5782c71128c28b4c94cad8bfb871da2784a5cb54c4f"}, +] + +[package.dependencies] +packaging = ">=20" +setuptools = "*" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} +typing-extensions = "*" + +[package.extras] +docs = ["entangled-cli[rich]", "mkdocs", "mkdocs-entangled-plugin", "mkdocs-material", "mkdocstrings[python]", "pygments"] +rich = ["rich"] +test = ["build", "pytest", "rich", "wheel"] [[package]] name = "six" @@ -3915,17 +4132,6 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -[[package]] -name = "sniffio" -version = "1.3.0" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, -] - [[package]] name = "snowballstemmer" version = "2.2.0" @@ -3950,13 +4156,13 @@ files = [ [[package]] name = "soupsieve" -version = "2.4.1" +version = "2.5" description = "A modern CSS selector implementation for Beautiful Soup." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, - {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, ] [[package]] @@ -4152,13 +4358,13 @@ test = ["pytest"] [[package]] name = "stack-data" -version = "0.6.2" +version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" optional = false python-versions = "*" files = [ - {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, - {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, ] [package.dependencies] @@ -4199,13 +4405,13 @@ widechars = ["wcwidth"] [[package]] name = "tenacity" -version = "8.2.2" +version = "8.2.3" description = "Retry code until it succeeds" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"}, - {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"}, + {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, + {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, ] [package.extras] @@ -4237,14 +4443,14 @@ wheel = ">=0.26" [[package]] name = "tensorboard-data-server" -version = "0.7.1" +version = "0.7.2" description = "Fast data loading for TensorBoard" optional = false python-versions = ">=3.7" files = [ - {file = "tensorboard_data_server-0.7.1-py3-none-any.whl", hash = "sha256:9938bd39f5041797b33921066fba0eab03a0dd10d1887a05e62ae58841ad4c3f"}, - {file = "tensorboard_data_server-0.7.1-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:be8d016a1aa394e6198280d4a3dc37898f56467310c5f5e617cac10a783e055a"}, - {file = "tensorboard_data_server-0.7.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:255c02b7f5b03dd5c0a88c928e563441ff39e1d4b4a234cdbe09f016e53d9594"}, + {file = "tensorboard_data_server-0.7.2-py3-none-any.whl", hash = "sha256:7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb"}, + {file = "tensorboard_data_server-0.7.2-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60"}, + {file = "tensorboard_data_server-0.7.2-py3-none-manylinux_2_31_x86_64.whl", hash = "sha256:ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530"}, ] [[package]] @@ -4308,25 +4514,30 @@ files = [ [[package]] name = "tensorflow-io-gcs-filesystem" -version = "0.33.0" +version = "0.34.0" description = "TensorFlow IO" optional = false python-versions = ">=3.7, <3.12" files = [ - {file = "tensorflow_io_gcs_filesystem-0.33.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:2dd49262831ee20f03fd3f5d2c679e7111cd1575e0ad60f60b5632f2da555bfc"}, - {file = "tensorflow_io_gcs_filesystem-0.33.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4e1d833f6856aec465652c0d7a75a7c28cf83b132b8351ba0c4df4e05136c403"}, - {file = "tensorflow_io_gcs_filesystem-0.33.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8295a65fd4fa731b06b31fab223e3ba11369430537169934a17f7bcc07dfef76"}, - {file = "tensorflow_io_gcs_filesystem-0.33.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:58f953665620725c842de8f4074c14779bf11d9081e4d0d8f2b75145de9ee20a"}, - {file = "tensorflow_io_gcs_filesystem-0.33.0-cp311-cp311-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ac69d8ba4d27435a5e199248b3a3befc19e65d86a97a52a19ee1f43195f51207"}, - {file = "tensorflow_io_gcs_filesystem-0.33.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c793e313e9cfed6caa328ec1a162844006a4bc016ba1d116813d7541938a9"}, - {file = "tensorflow_io_gcs_filesystem-0.33.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:99c063f766fdb431d555f17fa185979195abb0477445f054fe16567bfd340fd7"}, - {file = "tensorflow_io_gcs_filesystem-0.33.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cfa1df21535f7c945041fda99da2940a56b67d86e20aa2ac8cde3d371bc08659"}, - {file = "tensorflow_io_gcs_filesystem-0.33.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8d3ddd86a0f7cf4d35f2401d5b28d574d0f296b4e4349c69c671f7b83fc6ce8f"}, - {file = "tensorflow_io_gcs_filesystem-0.33.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4657f92dcc2474adc773bf69b836818b416c22cfadaac05b9b64f2a53f3009ee"}, - {file = "tensorflow_io_gcs_filesystem-0.33.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcf4fc3a44f75b7dccb7b40ca709872bf7f0e812522f82aa7881ecdc0d86af48"}, - {file = "tensorflow_io_gcs_filesystem-0.33.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:68db367697353184667bbd94faf53a58e7b695acb905f23da1e8ccad8bd6b451"}, - {file = "tensorflow_io_gcs_filesystem-0.33.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a57e64cd5d22085f9b475df9d12086a894eb8861524970c8839a2ec315841a20"}, - {file = "tensorflow_io_gcs_filesystem-0.33.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7916ca0accdd259c3fbee1b1f0816d61d6e8a639aa5bc1d4cdfbaf63b344623"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:d831702fbb270996b27cda7fde06e0825b2ea81fd8dd3ead35242f4f8b3889b8"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:b9a93fcb01db269bc845a1ced431f3c61201755ce5f9ec4885760f30122276ef"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5813c336b4f7cb0a01ff4cc6cbd3edf11ef67305baf0e3cf634911b702f493f8"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b035f4c92639657b6d376929d550ac3dee9e6c0523eb434eefe0a27bae3d05b"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:a17a616d2c7fae83de4424404815843507d40d4eb0d507c636a5493a20c3d958"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:ec4604c99cbb5b708f4516dee27aa655abae222b876c98b740f4c2f89dd5c001"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp311-cp311-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cbe26c4a3332589c7b724f147df453b5c226993aa8d346a15536358d77b364c4"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e6353123a5b51397950138a118876af833a7db66b531123bb86f82e80ab0e72"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f211d2b3db8f9931765992b607b71cbfb98c8cd6169079d004a67a94ab10ecb4"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:d3feba2dd76f7c188137c34642d68d378f0eed81636cb95090ecb1496722707c"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:44ad387a812a78e7424bb8bee3820521ae1c044bddf72b1e163e8df95c124a74"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:7f60183473f0ca966451bb1d1bb5dc29b3cf9c74d1d0e7f2ed46760ed56bd4af"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:3f346b287ed2400e09b13cfd8524222fd70a66aadb9164c645286c2087007e9f"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:027a07553367187f918a99661f63ae0506b91b77a70bee9c7ccaf3920bf7cfe7"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d8664bddbe4e7b56ce94db8b93ea9077a158fb5e15364e11e29f93015ceea24"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:182b0fbde7e9a537fda0b354c28b0b6c035736728de8fe2db7ef49cf90352014"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:0dafed144673e1173528768fe208a7c5a6e8edae40208381cac420ee7c918ec9"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:396bfff61b49f80b86ddebe0c76ae0f2731689cee49ad7d782625180b50b13af"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b20622f8572fcb6c93e8f7d626327472f263e47ebd63d2153ef09162ef5ef7b5"}, ] [package.extras] @@ -4379,17 +4590,6 @@ webencodings = ">=0.4" doc = ["sphinx", "sphinx_rtd_theme"] test = ["flake8", "isort", "pytest"] -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] - [[package]] name = "tomli" version = "2.0.1" @@ -4403,13 +4603,13 @@ files = [ [[package]] name = "tomlkit" -version = "0.12.1" +version = "0.12.2" description = "Style preserving TOML library" optional = false python-versions = ">=3.7" files = [ - {file = "tomlkit-0.12.1-py3-none-any.whl", hash = "sha256:712cbd236609acc6a3e2e97253dfc52d4c2082982a88f61b640ecf0817eab899"}, - {file = "tomlkit-0.12.1.tar.gz", hash = "sha256:38e1ff8edb991273ec9f6181244a6a391ac30e9f5098e7535640ea6be97a7c86"}, + {file = "tomlkit-0.12.2-py3-none-any.whl", hash = "sha256:eeea7ac7563faeab0a1ed8fe12c2e5a51c61f933f2502f7e9db0241a65163ad0"}, + {file = "tomlkit-0.12.2.tar.gz", hash = "sha256:df32fab589a81f0d7dc525a4267b6d7a64ee99619cbd1eeb0fae32c1dd426977"}, ] [[package]] @@ -4454,18 +4654,18 @@ telegram = ["requests"] [[package]] name = "traitlets" -version = "5.9.0" +version = "5.13.0" description = "Traitlets Python configuration system" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, - {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, + {file = "traitlets-5.13.0-py3-none-any.whl", hash = "sha256:baf991e61542da48fe8aef8b779a9ea0aa38d8a54166ee250d5af5ecf4486619"}, + {file = "traitlets-5.13.0.tar.gz", hash = "sha256:9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.6.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "types-deprecated" @@ -4502,13 +4702,13 @@ files = [ [[package]] name = "typing-extensions" -version = "4.7.1" -description = "Backported and Experimental Type Hints for Python 3.7+" +version = "4.8.0" +description = "Backported and Experimental Type Hints for Python 3.8+" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, - {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, ] [[package]] @@ -4541,13 +4741,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "wcwidth" -version = "0.2.6" +version = "0.2.9" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, - {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, + {file = "wcwidth-0.2.9-py2.py3-none-any.whl", hash = "sha256:9a929bd8380f6cd9571a968a9c8f4353ca58d7cd812a4822bba831f8d685b223"}, + {file = "wcwidth-0.2.9.tar.gz", hash = "sha256:a675d1a4a2d24ef67096a04b85b02deeecd8e226f57b5e3a72dbb9ed99d27da8"}, ] [[package]] @@ -4580,13 +4780,13 @@ watchdog = ["watchdog (>=2.3)"] [[package]] name = "wheel" -version = "0.41.1" +version = "0.41.3" description = "A built-package format for Python" optional = false python-versions = ">=3.7" files = [ - {file = "wheel-0.41.1-py3-none-any.whl", hash = "sha256:473219bd4cbedc62cea0cb309089b593e47c15c4a2531015f94e4e3b9a0f6981"}, - {file = "wheel-0.41.1.tar.gz", hash = "sha256:12b911f083e876e10c595779709f8a88a59f45aacc646492a67fe9ef796c1b47"}, + {file = "wheel-0.41.3-py3-none-any.whl", hash = "sha256:488609bc63a29322326e05560731bf7bfea8e48ad646e1f5e40d366607de0942"}, + {file = "wheel-0.41.3.tar.gz", hash = "sha256:4d4987ce51a49370ea65c0bfd2234e8ce80a12780820d9dc462597a6e60d0841"}, ] [package.extras] @@ -4677,20 +4877,20 @@ files = [ [[package]] name = "zipp" -version = "3.16.2" +version = "3.17.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, - {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.12" -content-hash = "b506ce19e860956a3a4437620519237f1680fddc6488a206ff58017ed4faf958" +content-hash = "17c405bf0d0437db1c02987011d8e38bb0d1c9af74ff1d801b73c339a702c529" diff --git a/pyproject.toml b/pyproject.toml index 7c08b1fbba..be261183d7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,7 @@ joblib = "^1.2.0" matplotlib = "^3.7.0" psutil = "^5.9.4" tabulate = "^0.9.0" -hyperopt = ">=0.2.6" +hyperopt = "^0.2.6" [tool.poetry.group.docs] optional = true From f4ac2de2c6e4b02b91fae646c4d4fcd9cfcff85c Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Mon, 13 Nov 2023 15:34:47 +0100 Subject: [PATCH 028/143] moving hyperopt to test deps --- poetry.lock | 11 +++++------ pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/poetry.lock b/poetry.lock index 865b114f8c..b4787d8a16 100644 --- a/poetry.lock +++ b/poetry.lock @@ -4724,18 +4724,17 @@ files = [ [[package]] name = "urllib3" -version = "2.0.7" +version = "2.1.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"}, - {file = "urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84"}, + {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, + {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -4893,4 +4892,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.12" -content-hash = "17c405bf0d0437db1c02987011d8e38bb0d1c9af74ff1d801b73c339a702c529" +content-hash = "eac1b11957e665008f4676902c9e0a770fbc118bebf5ed807e8301a6f8d8d5a5" diff --git a/pyproject.toml b/pyproject.toml index be261183d7..0bc64e3d3e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,6 @@ joblib = "^1.2.0" matplotlib = "^3.7.0" psutil = "^5.9.4" tabulate = "^0.9.0" -hyperopt = "^0.2.6" [tool.poetry.group.docs] optional = true @@ -56,6 +55,7 @@ scikit-learn = "^1.2.1" dill = "^0.3.6" pytest-cov = "^4.0.0" pylint = "^2.16.2" +hyperopt = "^0.2.6" qibojit = { git = "https://github.com/qiboteam/qibojit.git" } tensorflow = { version = "^2.12.0", markers = "sys_platform == 'linux' or sys_platform == 'darwin'" } # TODO: the marker is a temporary solution due to the lack of the tensorflow-io 0.32.0's wheels for Windows, this package is one of From e945891be411f68a4fff366fcec11a16e00a703c Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Mon, 13 Nov 2023 15:35:32 +0100 Subject: [PATCH 029/143] pass mode to constructor, use deepcopy --- src/qibo/models/double_bracket.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/qibo/models/double_bracket.py b/src/qibo/models/double_bracket.py index a876b8b6c6..a74aaed854 100644 --- a/src/qibo/models/double_bracket.py +++ b/src/qibo/models/double_bracket.py @@ -1,3 +1,4 @@ +from copy import deepcopy from enum import Enum, auto from functools import partial @@ -26,7 +27,8 @@ class DoubleBracketFlow: For more details, see https://arxiv.org/pdf/2206.11772.pdf Args: - hamiltonian (Hamiltonian): Starting Hamiltonian + hamiltonian (Hamiltonian): Starting Hamiltonian; + mode (FlowGeneratorType): type of generator of the evolution. Example: .. code-block:: python @@ -43,9 +45,14 @@ class DoubleBracketFlow: dbf.h """ - def __init__(self, hamiltonian: Hamiltonian): - # TODO: consider passing Mode here - self.h = self.h0 = hamiltonian + def __init__( + self, + hamiltonian: Hamiltonian, + mode: FlowGeneratorType = FlowGeneratorType.canonical, + ): + self.h = hamiltonian + self.h0 = deepcopy(self.h) + self.mode = mode def __call__(self, step: float, mode: FlowGeneratorType, d: np.array = None): if mode is FlowGeneratorType.canonical: @@ -144,13 +151,13 @@ def loss(self, step: float, look_ahead: int = 1): look_ahead: number of flow steps to compute the loss function; """ # copy initial hamiltonian - h_copy = self.h + h_copy = deepcopy(self.h) # off_diagonal_norm's value before the steps old_loss = self.off_diagonal_norm for _ in range(look_ahead): - self.__call__(mode=FlowGeneratorType.canonical, step=step) + self.__call__(mode=self.mode, step=step) # off_diagonal_norm's value after the steps new_loss = self.off_diagonal_norm From 53c1fa53010280438985b29e90b43296f8cce1e2 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Mon, 13 Nov 2023 16:05:26 +0100 Subject: [PATCH 030/143] fix dbf test --- tests/test_models_dbf.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/tests/test_models_dbf.py b/tests/test_models_dbf.py index 90569037bf..70bb06ee33 100644 --- a/tests/test_models_dbf.py +++ b/tests/test_models_dbf.py @@ -55,9 +55,9 @@ def test_double_bracket_flow_single_commutator(backend, nqubits): @pytest.mark.parametrize("nqubits", [3, 4, 5]) -@pytest.mark.parametrize("look_ahead", [1, 2]) -def test_hyperopt_step(backend, nqubits, look_ahead): +def test_hyperopt_step(backend, nqubits): h0 = random_hermitian(2**nqubits, backend=backend) + d = backend.cast(np.diag(np.diag(backend.to_numpy(h0)))) dbf = DoubleBracketFlow(Hamiltonian(nqubits, h0, backend=backend)) # find initial best step with look_ahead = 1 @@ -71,9 +71,12 @@ def test_hyperopt_step(backend, nqubits, look_ahead): assert step != initial_step # evolve following the optimized first step - dbf(mode=FlowGeneratorType.canonical, step=step) + for generator in FlowGeneratorType: + dbf(mode=generator, step=step, d=d) # find the following step size with look_ahead + look_ahead = 3 + step = dbf.hyperopt_step( step_min=initial_step - delta, step_max=initial_step + delta, @@ -81,5 +84,6 @@ def test_hyperopt_step(backend, nqubits, look_ahead): look_ahead=look_ahead, ) - for _ in range(NSTEPS): - dbf(mode=FlowGeneratorType.canonical, step=step) + # evolve following the optimized first step + for gentype in range(look_ahead): + dbf(mode=FlowGeneratorType(gentype + 1), step=step, d=d) From 5ce4b5fe1620e2a19901003aeb1ffaade4228e0c Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Mon, 13 Nov 2023 16:32:09 +0100 Subject: [PATCH 031/143] fix loss function according to Edoardo's suggestions --- src/qibo/models/double_bracket.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/qibo/models/double_bracket.py b/src/qibo/models/double_bracket.py index a74aaed854..cbc96d5e5f 100644 --- a/src/qibo/models/double_bracket.py +++ b/src/qibo/models/double_bracket.py @@ -107,8 +107,8 @@ def backend(self): def hyperopt_step( self, - step_min: float = 0.0001, - step_max: float = 0.5, + step_min: float = 1e-5, + step_max: float = 1, max_evals: int = 1000, space: callable = hyperopt.hp.uniform, optimizer: callable = hyperopt.tpe, @@ -153,16 +153,13 @@ def loss(self, step: float, look_ahead: int = 1): # copy initial hamiltonian h_copy = deepcopy(self.h) - # off_diagonal_norm's value before the steps - old_loss = self.off_diagonal_norm - for _ in range(look_ahead): self.__call__(mode=self.mode, step=step) # off_diagonal_norm's value after the steps - new_loss = self.off_diagonal_norm + loss = self.off_diagonal_norm # set back the initial configuration self.h = h_copy - return new_loss - old_loss + return loss From c60ffc18a734c21bf974799e320f3bc7c88faff5 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Mon, 13 Nov 2023 20:26:59 +0100 Subject: [PATCH 032/143] add dbf example --- examples/dbf/dbf.ipynb | 721 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 721 insertions(+) create mode 100644 examples/dbf/dbf.ipynb diff --git a/examples/dbf/dbf.ipynb b/examples/dbf/dbf.ipynb new file mode 100644 index 0000000000..926b5518ee --- /dev/null +++ b/examples/dbf/dbf.ipynb @@ -0,0 +1,721 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cb748c1a-2ecd-44a2-91d8-c1255a00615b", + "metadata": {}, + "source": [ + "## Double-Bracket Flow diagonalization algorithm\n", + "\n", + "In this example we present the `Qibo`'s implementation of the Double-Bracket Flow (DBF) algorithm, which can be used to prepare the eigenstates of a quantum system. \n", + "\n", + "#### The initial setup\n", + "\n", + "At first we import some useful packages." + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "f270b1ea-ee6a-4eac-a0ff-3d7dae296cf0", + "metadata": {}, + "outputs": [], + "source": [ + "from copy import deepcopy\n", + "\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "\n", + "from hyperopt import hp, tpe\n", + "\n", + "from qibo import hamiltonians, set_backend\n", + "from qibo.models.double_bracket import FlowGeneratorType, DoubleBracketFlow" + ] + }, + { + "cell_type": "markdown", + "id": "ba6e5402-ea34-4979-bb79-fd395567f77d", + "metadata": {}, + "source": [ + "Here we define a simple plotting function useful to keep track of the diagonalization process." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "4aec7b46-19b9-4004-93c0-a90255e58fd9", + "metadata": {}, + "outputs": [], + "source": [ + "def visualize_matrix(matrix, title=\"\"):\n", + " \"\"\"Visualize hamiltonian in a heatmap form.\"\"\"\n", + " fig, ax = plt.subplots(figsize=(5,5))\n", + " ax.set_title(title)\n", + " im = ax.imshow(np.absolute(matrix), cmap=\"inferno\")\n", + " fig.colorbar(im, ax=ax)\n", + "\n", + "def visualize_drift(h0, h):\n", + " \"\"\"Visualize drift of the evolved hamiltonian w.r.t. h0.\"\"\"\n", + " fig, ax = plt.subplots(figsize=(5,5))\n", + " ax.set_title(r\"Drift: $|\\hat{H}_0 - \\hat{H}_{\\ell}|$\")\n", + " im = ax.imshow(np.absolute(h0 - h), cmap=\"inferno\")\n", + " fig.colorbar(im, ax=ax)\n", + "\n", + "def plot_histories(histories, labels):\n", + " \"\"\"Plot off-diagonal norm histories over a sequential evolution.\"\"\"\n", + " colors = sns.color_palette(\"inferno\", n_colors=len(histories)).as_hex()\n", + " plt.figure(figsize=(5,5*6/8))\n", + " for i, (h, l) in enumerate(zip(histories, labels)):\n", + " plt.plot(h, lw=2, color=colors[i], label=l, marker='.')\n", + " plt.legend()\n", + " plt.xlabel(\"Iterations\")\n", + " plt.ylabel(r\"$\\| \\sigma(\\hat{H}) \\|^2$\")\n", + " plt.title(\"Loss function histories\")\n", + " plt.grid(True)\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "9f4cd7cc-9952-4da4-baef-e916300a9365", + "metadata": {}, + "source": [ + "We need to define a target hamiltonian which we aim to diagonalize. As an example, we consider the Transverse Field Ising Model (TFIM):\n", + "$$ H_{\\rm TFIM} = - \\sum_{q=0}^{N}\\bigl( Z_i Z_{i+1} + h X_i \\bigr),$$\n", + "which is already implemented in `Qibo`. For this tutorial we set $N=6$ and $h=3$." + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "id": "2c4ed408-68ed-4054-825c-2a7df0979a4f", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Qibo 0.2.2|INFO|2023-11-13 20:02:07]: Using qibojit (numba) backend on /CPU:0\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# set the qibo backend (we suggest qibojit if N >= 20)\n", + "set_backend(\"qibojit\", \"numba\")\n", + "\n", + "# define the hamiltonian\n", + "h = hamiltonians.TFIM(nqubits=5, h=3)\n", + "\n", + "# vosualize the matrix\n", + "visualize_matrix(h.matrix, title=\"Target hamiltonian\")" + ] + }, + { + "cell_type": "markdown", + "id": "4794e779-bf2d-4ab5-97ce-f876d9522a35", + "metadata": {}, + "source": [ + "#### The generator of the evolution\n", + "\n", + "The model is implemented following the procedure presented in [1], and the first practical step is to define the generator of the flow $\\hat{\\mathcal{U}}_{\\ell}$, which executes one diagonalization step $$\\hat{H}_{\\ell} = \\hat{\\mathcal{U}}_{\\ell}^{\\dagger} \\hat{H} \\hat{\\mathcal{U}}_{\\ell}.$$ In `Qibo`, we define the flow type through a `FlowGeneratorType` object, which can be chosen between one of the following:\n", + "- `canonical`: the generator of the flow at step $k+1$ is defined using the commutator between the off diagonal part $\\sigma(\\hat{H_k})$ and the diagonal part $\\Delta(\\hat{H}_k)$ of the target evolved hamiltonian:\n", + " $$\\hat{\\mathcal{U}}_{k+1}=\\exp\\bigl\\{i[\\Delta(\\hat{H}_k), \\sigma(\\hat{H}_k)]\\bigr\\}.$$ \n", + "- `single_commutator`: the evolution follows a similar procedure of the previous point in this list, but any additional matrix $D$ can be used to control the evolution:\n", + " $$ \\hat{\\mathcal{U}}_{k+1}=\\exp\\bigl\\{i[D, \\hat{H}_k]\\bigr\\}. $$\n", + "- `group_commutator`: the following group commutator is used to compute the evolution:\n", + " $$ \\hat{\\mathcal{U}}_{k+1}= e^{-isD} e^{is\\hat{H}} e^{-isD} e^{-is\\hat{H}}. $$\n", + "\n", + "In order to set one of this evolution generators one can do as follow:" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "26a487e9-366b-4203-b660-e3d4af2bcb68", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "FlowGeneratorType.canonical\n", + "FlowGeneratorType.single_commutator\n", + "FlowGeneratorType.group_commutator\n" + ] + } + ], + "source": [ + "# we have a look inside the FlowGeneratorType class\n", + "for generator in FlowGeneratorType:\n", + " print(generator)" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "da8dce89-27f6-403d-982a-58d531fade48", + "metadata": {}, + "outputs": [], + "source": [ + "# here we set the canonical generator\n", + "flowtype = FlowGeneratorType.canonical" + ] + }, + { + "cell_type": "markdown", + "id": "fc4f9f75-0548-4533-a13c-3aba3191e608", + "metadata": {}, + "source": [ + "#### The `DoubleBracketFlow` class\n", + "\n", + "A `DoubleBracketFlow` object can be initialize by calling the `qibo.models.double_braket.DoubleBracketFlow` model and passing the target hamiltonian and the generator type we want to use to perform the evolutionary steps." + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "055870ec-55f2-4b99-a622-e3aa4c7dd0e9", + "metadata": {}, + "outputs": [], + "source": [ + "dbf = DoubleBracketFlow(hamiltonian=deepcopy(h), mode=flowtype)" + ] + }, + { + "cell_type": "markdown", + "id": "b38cf803-60b4-467a-be8e-cbad5d81f14a", + "metadata": {}, + "source": [ + "#### `DoubleBracketFlow` features" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "id": "9e278c3d-9f34-4a40-b453-4e030c751ef5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Backend: qibojit (numba)\n" + ] + } + ], + "source": [ + "# on which qibo backend am I running the algorithm?\n", + "print(f\"Backend: {dbf.backend}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "5b8e142b-a0a2-41bd-a16a-265a420b7360", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initial form of the target hamiltonian:\n", + "[[-5.-0.j -3.-0.j -3.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", + " [-3.-0.j -1.-0.j -0.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", + " [-3.-0.j -0.-0.j -1.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", + " ...\n", + " [-0.-0.j -0.-0.j -0.-0.j ... -1.-0.j -0.-0.j -3.-0.j]\n", + " [-0.-0.j -0.-0.j -0.-0.j ... -0.-0.j -1.-0.j -3.-0.j]\n", + " [-0.-0.j -0.-0.j -0.-0.j ... -3.-0.j -3.-0.j -5.-0.j]]\n" + ] + } + ], + "source": [ + "# the initial target hamiltonian is a qibo hamiltonian\n", + "# thus the matrix can be accessed typing h.matrix\n", + "print(f\"Initial form of the target hamiltonian:\\n{dbf.h0.matrix}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "4f9d1d41-3df7-49cf-96ca-fa1019c00c33", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# let's visualize it in a more graphical way\n", + "visualize_matrix(dbf.h0.matrix, r\"$H_0$\")" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "7b864712-219c-44b6-8337-19ef0100e318", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# since we didn't perform yet any evolutionary step they are the same\n", + "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" + ] + }, + { + "cell_type": "markdown", + "id": "5e576bc4-4e79-4c71-9ea0-b3012e9f2ba1", + "metadata": {}, + "source": [ + "which shows $\\hat{H}$ is now identical to $\\hat{H}_0$ since no evolution step has been performed yet." + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "da3d3aaa-17e1-492e-bcd3-b510f44a5391", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# diagonal part of the H target\n", + "visualize_matrix(dbf.diagonal_h_matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "24d0dfa1-7039-4d7d-8aa3-5a937b9ab0b8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "HS norm of the off diagonal part of H: 1440.0\n" + ] + } + ], + "source": [ + "# Hilbert-Schmidt norm of the off-diagonal part\n", + "# which we want to bring to be close to zero\n", + "print(f\"HS norm of the off diagonal part of H: {dbf.off_diagonal_norm}\")" + ] + }, + { + "cell_type": "markdown", + "id": "3d5b37f3-2477-49a0-9f80-7da5ddda1fff", + "metadata": {}, + "source": [ + "#### Call the `DoubleBracketFlow` to perform a DBF iteration\n", + "\n", + "If the DBF object is called, a Double Bracket Flow iteration is performed. This can be done customizing the flow by setting the flow step and the desired `FlowGeneratorType`. If no generator is provided, the one passed at the initialization time is used (default is `FlowGeneratorType.canonical`)." + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "9a886261-8aa6-4df0-a31b-9c39847db124", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initial value of the off-diagonal norm: 1440.0\n", + "One step later off-diagonal norm: 1168.2530943739996\n" + ] + } + ], + "source": [ + "# perform one evolution step\n", + "\n", + "# initial value of the off-diagonal norm\n", + "print(f\"Initial value of the off-diagonal norm: {dbf.off_diagonal_norm}\")\n", + "\n", + "dbf(step=0.01, mode=flowtype)\n", + "\n", + "# after one step\n", + "print(f\"One step later off-diagonal norm: {dbf.off_diagonal_norm}\")" + ] + }, + { + "cell_type": "markdown", + "id": "b78dd05d-ffe3-435a-b5ec-2a42f28066b2", + "metadata": {}, + "source": [ + "We can check now if something happened by plotting the drift:" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "cc74812d-7c2c-44e4-afc2-e235968801b4", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" + ] + }, + { + "cell_type": "markdown", + "id": "3465a422-eebf-4e80-ae96-bba894132330", + "metadata": {}, + "source": [ + "The set step can be good, but maybe not the best one. In order to do this choice in a wiser way, we can call the DBF hyperoptimization routine to search for a better initial step. The `dbf.hyperopt_step` method is built on top of the [`hyperopt`](https://hyperopt.github.io/hyperopt/) package. Any algorithm or sampling space provided by the official package can be used. We are going to use the default options (we sample new steps from a uniform space following a _Tree of Parzen estimators algorithm_)." + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "aad79966-7a11-4a45-aba5-4a4bb8315c50", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "100%|█████████████████████████████████████████████████████████████████████████| 1000/1000 [00:09<00:00, 100.75trial/s, best loss: 828.6241921617013]\n" + ] + } + ], + "source": [ + "# restart\n", + "dbf.h = dbf.h0\n", + "\n", + "# optimization of the step, we allow to search in [1e-5, 1]\n", + "step = dbf.hyperopt_step(\n", + " step_min = 1e-5,\n", + " step_max = 1,\n", + " space = hp.uniform,\n", + " optimizer = tpe,\n", + " max_evals = 1000,\n", + " verbose = True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "49483a47-d29d-440e-a4bc-143bfe6bb3cf", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZ4AAAGiCAYAAADXxKDZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAqe0lEQVR4nO3df3CV5Z3//9cByQlKcjD8yI+SIIhCFYNtKmlGy4KkhGyHwcofaJ1pdCkObmCKWbeanVbQbSesnVFsm8aOdaGdKWJxCo52hNVIwrhLrEQYpN3NAJ+0xEJC5TskEOUAua/vH5FjD4TkPrnv3OdcyfPhXDOcO/e57vc5d+Dtdd3Xj5AxxggAgICMSnYAAICRhcQDAAgUiQcAECgSDwAgUCQeAECgSDwAgECReAAAgSLxAAACReIBAASKxAMACBSJBwDg2vr16xUKheLKrFmzEqrjmiGKDQAwTN166616++23Y6+vuSaxVELiAQAk5JprrlFOTs7g3+9jLACAgJw7d07nz5/3pS5jjEKhUNyxcDiscDjc5/mHDx9WXl6e0tPTVVJSopqaGhUUFLi+XohtEQDALufOndO0aTlqb+/0pb5x48bp7NmzccfWrVun9evXX3Hum2++qbNnz2rmzJk6ceKEnnrqKf31r3/VoUOHlJGR4ep6JB4AsExXV5cikYj+31+eU2bmWI91farpUx9VW1ubMjMzY8f7a/H8vdOnT2vq1Kl69tlntWLFClfXpKsNACyVmTnWc+L5vK7MuMTj1vjx43XzzTfryJEjrt/DcGoAsJQxF30pXpw9e1ZHjx5Vbm6u6/eQeADAUsb0+FIS8dhjj6mxsVF//vOf9T//8z/65je/qdGjR+v+++93XQddbQAA1z766CPdf//9OnXqlCZNmqS77rpLTU1NmjRpkus6SDwAYCnHXJTjsass0fdv3brV0/UkEg8AWMuPZzRe3z8YPOMBAASKFg8AWKp3cIDXFk9igwv8QOIBAEsZ56KM4zHxeHz/YNDVBgAIFC0eALCVudhbvNYRMBIPAFiKUW0AALhAiwcAbOVclJwL3usIGIkHACzV29U22nMdQaOrDQAQKFo8AGAr56LkeGvx0NUGAHDP0sRDVxsAIFC0eADAWj0+TABlrTYAgEsh56JCjreOqxBdbQCA4Y4WDwDYyrkoeWzxMKoNAOCepYmHrjYAQKBo8QCApULmokLG4+ACtkUAALjmOJLjcTi04/gTSwLoagMABIoWDwBYqnceT8hzHUEj8QCArZweH0a1Bb9yAV1tAIBA0eIBAFs5FyWPXW1MIAUAuBZyenxYq42uNgDAMJdyLR7HcXT8+HFlZGQoFPLYhASAFGCM0ZkzZ5SXl6dRo3z8/33jw+ACw7YIOn78uPLz85MdBgD4rq2tTVOmTPGtvpDjeO4qCyVhAumQJZ7a2lr9+Mc/Vnt7u+bMmaOf/vSnmjt37oDvy8jIkCT9+djzyswc2++5f3ngRV9ilaQv/b7Z1Xn7v1Hka31+chNbMuJKZal8PzGcGEkm9u/bSDckieeVV15RVVWVXnjhBRUXF2vjxo0qKytTS0uLJk+e3O97L3WvZWaOVWbmtf2emzHGz/Dddeu5v2bw3YTuYqP78u+l8v3EcGP8f3zg9Pgwqm2YDC549tlntXLlSj300EO65ZZb9MILL+jaa6/Vf/7nfw7F5QBgROod1ea9BM33xHP+/Hk1NzertLT084uMGqXS0lLt3bv3ivOj0ai6urriCgBg+PI98Xz88cfq6elRdnZ23PHs7Gy1t7dfcX5NTY0ikUisMLAAAFxyevwpAUv6PJ7q6mp1dnbGSltbW7JDAgAr2NrV5vvggokTJ2r06NHq6OiIO97R0aGcnJwrzg+HwwqHw36HAQBIUb63eNLS0lRUVKT6+vrYMcdxVF9fr5KSEr8vBwAjl6VdbUMynLqqqkoVFRX6yle+orlz52rjxo3q7u7WQw89NBSXA4ARKeQYzxNAQ47xKRr3hiTxLF++XH/729/05JNPqr29Xbfffrt27tx5xYCD/vzlgRcHnGOxclfhgPXs/vSXrq535J6BJ7dK0owdf/CtPrd1ueWmPr8/p+38vJ+J1AeMZEO2csHq1au1evXqoaoeAOD0SF5XvBkuXW0AgAAYHxJPEhYJTfpwagDAyEKLBwAsFTKOQsbbWm0hM4xWpwYADDFLn/HQ1QYACBQtHgCwleP4sC0CXW0AALdIPMFzMzl0wdjvuKztoLdgLpOqkzmZMDk4fG+Af6xOPAAwkoUcRyGPDRavS+4MBokHAGzlOD6Mags+8TCqDQAQKFo8AGArS1s8JB4AsJWliYeuNgBAoGjxAICtTI/kdSM31moDALhl63BqutoAAIFK2RbPl37fLKn/pSDczRJ3tyKBm220e42MVQRSObZUlspbo2MYsnRwQcomHgDAACxNPHS1AQACRYsHAGzlGO8tFq+j4gaBxAMAtnKMD11twSceutoAAIGixQMAtvJlIzhaPAAAtxzHnzJIGzZsUCgU0tq1axN6H4kHAJCw999/X7/4xS9UWOh2DuTnSDwAYCvH+FMSdPbsWT3wwAN68cUXdf311yf8/pR9xrP/G0XKGNN/eP7O7HZX14Kx33F13otl7lZMcCOVZ7AzU39w3HxWVoXAgIwjGY/PeExv4unq6oo7HA6HFQ6H+3xLZWWlvvGNb6i0tFQ//OEPE74kLR4AgPLz8xWJRGKlpqamz/O2bt2qDz744Ko/dyNlWzwAgAEYH+bxfNbiaWtrU2ZmZuxwX62dtrY2ffe739Vbb72l9PT0QV+SxAMAtvJxAmlmZmZc4ulLc3OzTp48qS9/+cuxYz09PdqzZ49+9rOfKRqNavTo0QNeksQDAHBl4cKF+vDDD+OOPfTQQ5o1a5Yef/xxV0lHIvEAgL0CXjInIyNDs2fPjjt23XXXacKECVcc7w+JBwAsZRzvO1cnYedrEg8AYPAaGhoSfg+JBwBsZenq1CmbePza+trvyXXJmBg6HCYSMmEycSPp9wOD5MiHxONHIIlhAikAIFC+J57169crFArFlVmzZvl9GQCA41MJ2JB0td166616++23P7/INSnbowcA9jKfFa91BGxIMsI111yjnJwcV+dGo1FFo9HY68sXqgMADC9D8ozn8OHDysvL0/Tp0/XAAw/o2LFjVz23pqYmbmG6/Pz8oQgJAIYd44R8KUHzPfEUFxdr8+bN2rlzp+rq6tTa2qqvfe1rOnPmTJ/nV1dXq7OzM1ba2tr8DgkAhiee8fQqLy+P/bmwsFDFxcWaOnWqfvvb32rFihVXnN/fng8AgOFnyJ/6jx8/XjfffLOOHDky1JcCgJHFhCSvXWVJGFww5PN4zp49q6NHjyo3N3eoLwUAI4qtz3h8b/E89thjWrJkiaZOnarjx49r3bp1Gj16tO6//36/L5XSs+Hd1Od2G23Jv9USUhkz9QeH7w228T3xfPTRR7r//vt16tQpTZo0SXfddZeampo0adIkvy8FACOb40NX23AYXLB161a/qwQA9MWEeounOvwJJRGs1QYACBRr2QCApfwYHMBGcAAA95xRPjzjCb6vja42AECgaPEAgK0Y1QYACJIxIRmPo9oMo9oAAMPdsG/xJGtWt7v63K1IsHJXoavzpJEx49zPezCSZunzvQ1Dlg4uGPaJBwCGK+PIh+HUjGoDAAxztHgAwFa+bIswDFanBgAEw59RbcNg62sAAPpDiwcAbOWM6i2e6vAnlESQeADAUv4sEkpXGwBgmAsZk4wFE66uq6tLkUhE+79xhzLG9N8gYxJbPDdbab9Y5u822kxKHJnYRjtRRpKjzs5OZWZmeq7t0r+Tf300W5lhb+2HrqijLzzX4VtsbtDVBgC2svQZD11tAIBA0eIBAEvZOriAxAMAlmICKQAALtDiAQBbWTq4gMQDAJay9RkPXW0AgEDR4gEAS9k6uCBlE8+Xft8sqf8vhNnw8fxclSAZW4YzG94eydpSHpcxPjzjScLaNXS1AQAClbItHgBA/2wdXEDiAQBLGeP9GU0ylommqw0AEChaPABgKx+62kRXGwDALWNGyRhvHVfJ2JKNrjYAQKBo8QCArZyQ964yutoAAG6xckESMBs+cX7POPcTs+GHHz/vKfdz+Ej4Gc+ePXu0ZMkS5eXlKRQKaceOHXE/N8boySefVG5ursaOHavS0lIdPnzYr3gBAJ+5NIHUawlawomnu7tbc+bMUW1tbZ8/f+aZZ/STn/xEL7zwgt577z1dd911Kisr07lz5zwHCwD43KVRbV5L0BLuaisvL1d5eXmfPzPGaOPGjfr+97+vpUuXSpJ+/etfKzs7Wzt27NB9993nLVoAgPV8TXWtra1qb29XaWlp7FgkElFxcbH27t3b53ui0ai6urriCgBgYCOmq60/7e3tkqTs7Oy449nZ2bGfXa6mpkaRSCRW8vPz/QwJAIatS6PavJagJX0CaXV1tTo7O2Olra0t2SEBAIaQr8Opc3JyJEkdHR3Kzc2NHe/o6NDtt9/e53vC4bDC4bCfYQDAiGDrPB5fWzzTpk1TTk6O6uvrY8e6urr03nvvqaSkxM9LAcCIZ4wPz3hsmEB69uxZHTlyJPa6tbVVBw4cUFZWlgoKCrR27Vr98Ic/1E033aRp06bpBz/4gfLy8nTPPff4GTcAwFIJJ559+/ZpwYIFsddVVVWSpIqKCm3evFnf+9731N3drYcfflinT5/WXXfdpZ07dyo9Pd2/qBMwkmbD+7mSQypjNvzwwyokg2Pr6tQJJ5758+f3G2goFNLTTz+tp59+2lNgAID+2br1ddJHtQEARharFwkFgJHM1lFtJB4AsJStiYeuNgBAoEg8AGAp4/ixXlti16yrq1NhYaEyMzOVmZmpkpISvfnmmwnVQVcbAFgqGV1tU6ZM0YYNG3TTTTfJGKNf/epXWrp0qfbv369bb73VVR0kHgCAa0uWLIl7/aMf/Uh1dXVqamoi8SRqOEw0TeUJkwvGfmfAc14sO+jrNUfSRMKRYDj8HfWbPxNIe99/+ZY0btbR7Onp0bZt29Td3Z3Qsmg84wEASzkm5EuRpPz8/Lgtampqaq563Q8//FDjxo1TOBzWqlWrtH37dt1yyy2u46bFAwBQW1ubMjMzY6/7a+3MnDlTBw4cUGdnp1599VVVVFSosbHRdfIh8QCArfzYQfSz918apeZGWlqaZsyYIUkqKirS+++/r+eff16/+MUvXL2fxAMAlkqVCaSO4ygajbo+n8QDAHCturpa5eXlKigo0JkzZ7RlyxY1NDRo165drusg8QCApZLR4jl58qS+/e1v68SJE4pEIiosLNSuXbv09a9/3XUdJB4AsFQyEs9LL73k6XoSw6kBAAGjxQMAlnLMKDkeJ5B6ff9gkHgSlMrbLqfy9sF+rkqQyvcAyTeSVjgwxocdSNkWAQAw3NHiAQBLpco8nkSReADAUrYmHrraAACBosUDAJb6+9WlvdQRNBIPAFiKrjYAAFygxQMAlrK1xUPiAQBL8YwHcVJ1FYFUntXttq4FY7/jskb/VkvA8MMKGMlD4gEASxnjvavMGJ+CSQCJBwAsZeszHka1AQACRYsHACxlfBhcwKg2AIBrdLUBAOACLR4AsJStLR4SDwBYigmkSNhwmMzpZ2xu63I7MXTlrkIXZzHxD/3z43f3zIWL+tLv3/crJOuReADAUrZ2tSU8uGDPnj1asmSJ8vLyFAqFtGPHjrifP/jggwqFQnFl8eLFfsULAPjMpa42ryVoCSee7u5uzZkzR7W1tVc9Z/HixTpx4kSsvPzyy56CBAAMHwl3tZWXl6u8vLzfc8LhsHJyclzVF41GFY1GY6+7uroSDQkARiSjkIw8drV5fP9gDMk8noaGBk2ePFkzZ87UI488olOnTl313JqaGkUikVjJz88fipAAYNi59IzHawma74ln8eLF+vWvf636+nr9x3/8hxobG1VeXq6enp4+z6+urlZnZ2estLW1+R0SACCF+D6q7b777ov9+bbbblNhYaFuvPFGNTQ0aOHChVecHw6HFQ6H/Q4DAIY9W+fxDPmSOdOnT9fEiRN15MiRob4UAIwodLVdxUcffaRTp04pNzd3qC8FALBAwl1tZ8+ejWu9tLa26sCBA8rKylJWVpaeeuopLVu2TDk5OTp69Ki+973vacaMGSorK0voOvu/UaSMMf2HN1K2m03lz5mM1RLcG7g+t9tov1jm7zbaqbo1ulupHFsyDPw5h2abT0c+dLUlYVRbwoln3759WrBgQex1VVWVJKmiokJ1dXU6ePCgfvWrX+n06dPKy8vTokWL9O///u88xwEASBpE4pk/f75MP5t079q1y1NAAAB3bF0yh7XaAMBSjkKeu8qS0dXGRnAAgEDR4gEAW/kxHJquNgCAW0wgBQDABVo8AGApRrUBAALlfFa81hG0lE08X/p9szTAMD83s6dHysxpDI7bFQlW7ip0dd7uT3/p6jw/f3eTsYpAKseG1JeyiQcA0D+62gAAgXKM91FpztAsI9cvRrUBAAJFiwcALGUUkvG45I3X9w8GiQcALMUEUgAAXKDFAwCW6h1c4L2OoJF4AMBSPONJAtu3D4Y9/JwY6rdUnszpZ2z8HR0+rE48ADCS2Tq4gMQDAJYyprd4rSNojGoDAASKFg8AWMooJIfBBQCAoNi6SChdbQCAQNHiAQBLMaoNABAo81nxWkfQ6GoDAARq2Ld4UnlWN5LP798Pt9xtpe3v71oqryLAKiSDQ1cbACBQzmfFax1Bo6sNABAoWjwAYClb5/GQeADAUrY+46GrDQAQKBIPAFjK+FQSUVNTozvuuEMZGRmaPHmy7rnnHrW0tCRUB4kHACx1qavNa0lEY2OjKisr1dTUpLfeeksXLlzQokWL1N3d7boOnvEAAFzbuXNn3OvNmzdr8uTJam5u1rx581zVQeIBAEv5OY+nq6sr7ng4HFY4HB7w/Z2dnZKkrKws19ck8XyGFQ5GpuTdT/9m6vstVX93+Tt6JT+HU+fn58cdX7dundavX9/vex3H0dq1a3XnnXdq9uzZrq+Z0DMeNw+Vzp07p8rKSk2YMEHjxo3TsmXL1NHRkchlAAABa2trU2dnZ6xUV1cP+J7KykodOnRIW7duTehaCSUeNw+VHn30Ub3++uvatm2bGhsbdfz4cd17770JBQUAGJjR591tgy2XRrVlZmbGlYG62VavXq033nhDu3fv1pQpUxKKO6GutoEeKnV2duqll17Sli1bdPfdd0uSNm3apC9+8YtqamrSV7/61YSCAwBcnZEPXW0Jbn1tjNGaNWu0fft2NTQ0aNq0aQlf09MznssfKjU3N+vChQsqLS2NnTNr1iwVFBRo7969fSaeaDSqaDQae335Ay4AQOqorKzUli1b9NprrykjI0Pt7e2SpEgkorFjx7qqY9DzePp6qNTe3q60tDSNHz8+7tzs7OxYcJerqalRJBKJlcsfcAEA+uYYf0oi6urq1NnZqfnz5ys3NzdWXnnlFdd1DLrFc+mh0rvvvjvYKiRJ1dXVqqqqir3u6uoi+QCAC8nYgdQY73uWDirxXHqotGfPnriHSjk5OTp//rxOnz4d1+rp6OhQTk5On3W5HSsOABgeEupqM8Zo9erV2r59u955550rHioVFRVpzJgxqq+vjx1raWnRsWPHVFJS4k/EAABJyVkyxw8JtXgGeqgUiUS0YsUKVVVVKSsrS5mZmVqzZo1KSkqGzYi2VN4+GIkbSZMSR8rv7ki6p7buQJpQ4qmrq5MkzZ8/P+74pk2b9OCDD0qSnnvuOY0aNUrLli1TNBpVWVmZfv7zn/sSLADAfgklHjcPldLT01VbW6va2tpBBwUAGBg7kAIAAmVrVxv78QAAAkWLBwAsZUxv8VpH0Eg8AGApRyE5Ca611lcdQaOrDQAQKFo8AGCpway11lcdQSPxAICtfHjG43mxt0Eg8QwRN7Odh8PM6ZEilWfD+x3bSDFSVnJIRSQeALCUrYMLSDwAYClbh1Mzqg0AEChaPABgKVuXzCHxAIClbB1OTVcbACBQtHgAwFJG3qfhJKHBQ+IBAFv1drV5HE5NVxsAYLijxZNEqTwbHoOTjNnwfq9IsHJXoYuzRs7vmh+rkJy5cFFf+v37foUUY+s8HhIPAFjK1uHUdLUBAAJFiwcALEVXGwAgUHS1AQDgAi0eALCU8WHJHLraAACu2bpyAV1tAIBA0eKxAFv0Dp1kTc5NxtbX7g1c34Kx33FV04tlB70GE5PKE64Hrmto2hW2rk5N4gEAS9k6nJquNgBAoGjxAIClbJ3HQ+IBAEvZ+oyHrjYAQKBo8QCApWydx0PiAQBL0dUGAIALtHgAwFK2zuMh8QwjfmzRm0hdw0Eqz4ZPZW5XJHC3jba0+9NfDniO3/dgONxTW4dT09UGAAhUQomnpqZGd9xxhzIyMjR58mTdc889amlpiTtn/vz5CoVCcWXVqlW+Bg0A+KzFYzyWJMSdUOJpbGxUZWWlmpqa9NZbb+nChQtatGiRuru7485buXKlTpw4ESvPPPOMr0EDAD4fTu21BC2hZzw7d+6Me71582ZNnjxZzc3NmjdvXuz4tddeq5ycHFd1RqNRRaPR2Ouurq5EQgIAWMbTM57Ozk5JUlZWVtzx3/zmN5o4caJmz56t6upqffLJJ1eto6amRpFIJFby8/O9hAQAI4YZbPfa3xWrRrU5jqO1a9fqzjvv1OzZs2PHv/Wtb2nq1KnKy8vTwYMH9fjjj6ulpUW/+93v+qynurpaVVVVsdddXV0kHwBwwRgfVi6wKfFUVlbq0KFDevfdd+OOP/zww7E/33bbbcrNzdXChQt19OhR3XjjjVfUEw6HFQ6HBxsGAMAyg+pqW716td544w3t3r1bU6ZM6ffc4uJiSdKRI0cGcykAwFU4PpWgJdTiMcZozZo12r59uxoaGjRt2rQB33PgwAFJUm5u7qACBAD0rXc4tLe+spTf+rqyslJbtmzRa6+9poyMDLW3t0uSIpGIxo4dq6NHj2rLli36x3/8R02YMEEHDx7Uo48+qnnz5qmw0N0MZgytkTSr2098b4PjZkUCyf335ic/7+lIuZ9+SSjx1NXVSeqdJPr3Nm3apAcffFBpaWl6++23tXHjRnV3dys/P1/Lli3T97//fd8CBgD0GhHbIpgBhj/k5+ersbHRU0AAAHf8WHmAbREAAMMeq1MDgKXMZ/95rSNoJB4AsBRdbQAAuECLBwAsZetGcCQeALCUMT4840nCYm10tQEAAkWLB31ipv7gjJTZ8H7/frixcpfb1U/8/d7cfNaBPueZCxf1pd+/71dIMXS1AQACRVcbAAAu0OIBAEsZee8qS/m12gAAqcMxxodtEehqAwCksD179mjJkiXKy8tTKBTSjh07Eq6DxAMAljI+/ZeI7u5uzZkzR7W1tYOOm642ALBUMoZTl5eXq7y83NM1STwAAHV1dcW9DofDCofDQ3ItEg88GSkTJv3mx6TEROryW3Jic1fXgrHfcXXei2UHvQQTZ+DPOTQP8B35MLjgs/fn5+fHHV+3bp3Wr1/vqe6rIfEAgKX8HNXW1tamzMzM2PGhau1IJB4AgKTMzMy4xDOUSDwAYCl2IAUABMrPZzxunT17VkeOHIm9bm1t1YEDB5SVlaWCggJXdZB4AACu7du3TwsWLIi9rqqqkiRVVFRo8+bNruog8QCApZLR4pk/f77nFa1JPABgKVuf8bBkDgAgULR4AMBSxoeuNka1YdiyfaZ+MqTy9uOpHJvbFQncbqW9+9NfDnhO0ra+DjkKhbyt1uYkYfNrutoAAIGixQMAlnJkFAp4VJsfSDwAYCnz2YBqr3UEja42AECgaPEAgKUcyYeutuCReADAUoxqAwDABVo8AGApR45CHlssyWjxkHgAwFIkHsCjVJ4Nn8pS+XvzMza/76ebFQkkacHY77g4y91qCeiV0DOeuro6FRYWxrZILSkp0Ztvvhn7+blz51RZWakJEyZo3LhxWrZsmTo6OnwPGgDw+TweryVoCSWeKVOmaMOGDWpubta+fft09913a+nSpfrjH/8oSXr00Uf1+uuva9u2bWpsbNTx48d17733DkngADDSOSHHlxK0hLralixZEvf6Rz/6kerq6tTU1KQpU6bopZde0pYtW3T33XdLkjZt2qQvfvGLampq0le/+tU+64xGo4pGo7HXXV1diX4GAIBFBj2cuqenR1u3blV3d7dKSkrU3NysCxcuqLS0NHbOrFmzVFBQoL179161npqaGkUikVjJz88fbEgAMKIYOZ7/S/muNkn68MMPNW7cOIXDYa1atUrbt2/XLbfcovb2dqWlpWn8+PFx52dnZ6u9vf2q9VVXV6uzszNW2traEv4QADASGfX4UoKW8Ki2mTNn6sCBA+rs7NSrr76qiooKNTY2DjqAcDiscDg86PcDAOyScOJJS0vTjBkzJElFRUV6//339fzzz2v58uU6f/68Tp8+Hdfq6ejoUE5Ojm8BAwB69c7BsW8ej+clcxzHUTQaVVFRkcaMGaP6+vrYz1paWnTs2DGVlJR4vQwA4DKOT095gpZQi6e6ulrl5eUqKCjQmTNntGXLFjU0NGjXrl2KRCJasWKFqqqqlJWVpczMTK1Zs0YlJSVXHdEGDEYqT0pMZan8vSVja3S39bmZHHrD7yr7/XlX1yfSeP+3vrZVQonn5MmT+va3v60TJ04oEomosLBQu3bt0te//nVJ0nPPPadRo0Zp2bJlikajKisr089//vMhCRwARrrewQEhz3UELaHE89JLL/X78/T0dNXW1qq2ttZTUACAgY3YZzwAACSCRUIBwFJ+rLWWjAmkJB4AsJSjHsnjMx4nCc946GoDAASKFg8AWIquNgBAoBzjQ1ebSfHh1EEw5tIs2uBn02J4OXPhoouz+D27XKp+b+7iktzG5r6+gXV1fTLAzz+V9Pf/vo1sIZNi38RHH33E1ggAhqW2tjZNmTLFcz1dXV2KRCKacG2RRoW8tR8cc1GnPmlWZ2enMjMzPcfmRsq1ePLy8tTW1qaMjAyFQr1NyK6uLuXn56utrS2wL8Zvtn8G2+OX7P8MxJ98g/0MxhidOXNGeXl5vsbT+4zHW1cZz3gkjRo16qr/R5CZmWntL+wltn8G2+OX7P8MxJ98g/kMkUhkiKKxT8olHgCAO8Y4cryu1WZo8QAAXOrtJvO6SChrtfUpHA5r3bp1Vu9UavtnsD1+yf7PQPzJNxw+QypIuVFtAID+XRrVFkm/RaHQaE91GdOjznN/Gtmj2gAA7vQ+4aGrDQCAftHiAQBL9Y5IY1QbACAgfmxbnYytr+lqAwAEyorEU1tbqxtuuEHp6ekqLi7WH/7wh2SH5Mr69esVCoXiyqxZs5IdVr/27NmjJUuWKC8vT6FQSDt27Ij7uTFGTz75pHJzczV27FiVlpbq8OHDyQm2DwPF/+CDD15xTxYvXpycYPtQU1OjO+64QxkZGZo8ebLuuecetbS0xJ1z7tw5VVZWasKECRo3bpyWLVumjo6OJEV8JTefYf78+Vfch1WrViUp4nh1dXUqLCyMrU5QUlKiN998M/bzVPr+jTEyxvFYgh/YnPKJ55VXXlFVVZXWrVunDz74QHPmzFFZWZlOnjyZ7NBcufXWW3XixIlYeffdd5MdUr+6u7s1Z84c1dbW9vnzZ555Rj/5yU/0wgsv6L333tN1112nsrIynTt3LuBI+zZQ/JK0ePHiuHvy8ssvBxhh/xobG1VZWammpia99dZbunDhghYtWqTu7u7YOY8++qhef/11bdu2TY2NjTp+/LjuvffeJEYdz81nkKSVK1fG3YdnnnkmSRHHmzJlijZs2KDm5mbt27dPd999t5YuXao//vGPklLr+7+0H4/XEnzgKW7u3LmmsrIy9rqnp8fk5eWZmpqaJEblzrp168ycOXOSHcagSTLbt2+PvXYcx+Tk5Jgf//jHsWOnT5824XDYvPzyy0mIsH+Xx2+MMRUVFWbp0qVJiWcwTp48aSSZxsZGY0zv9z1mzBizbdu22Dn/+7//aySZvXv3JivMfl3+GYwx5h/+4R/Md7/73eQFlaDrr7/e/PKXv0yZ77+zs9NIMmPTbjDXhqd7KmPTbjCSTGdnZ2Dxp3SL5/z582publZpaWns2KhRo1RaWqq9e/cmMTL3Dh8+rLy8PE2fPl0PPPCAjh07luyQBq21tVXt7e1x9yMSiai4uNia+yFJDQ0Nmjx5smbOnKlHHnlEp06dSnZIV9XZ2SlJysrKkiQ1NzfrwoULcfdg1qxZKigoSNl7cPlnuOQ3v/mNJk6cqNmzZ6u6ulqffNL/njbJ0NPTo61bt6q7u1slJSUp9/0b0+NLCVpKj2r7+OOP1dPTo+zs7Ljj2dnZ+r//+78kReVecXGxNm/erJkzZ+rEiRN66qmn9LWvfU2HDh1SRkZGssNLWHt7uyT1eT8u/SzVLV68WPfee6+mTZumo0eP6t/+7d9UXl6uvXv3avRobzPA/eY4jtauXas777xTs2fPltR7D9LS0jR+/Pi4c1P1HvT1GSTpW9/6lqZOnaq8vDwdPHhQjz/+uFpaWvS73/0uidF+7sMPP1RJSYnOnTuncePGafv27brlllt04MCBlPr+/RgKzXDqYaa8vDz258LCQhUXF2vq1Kn67W9/qxUrViQxspHrvvvui/35tttuU2FhoW688UY1NDRo4cKFSYzsSpWVlTp06FDKPxfsz9U+w8MPPxz782233abc3FwtXLhQR48e1Y033hh0mFeYOXOmDhw4oM7OTr366quqqKhQY2NjssMaNlK6q23ixIkaPXr0FSNGOjo6lJOTk6SoBm/8+PG6+eabdeTIkWSHMiiXvvPhcj8kafr06Zo4cWLK3ZPVq1frjTfe0O7du+P2p8rJydH58+d1+vTpuPNT8R5c7TP0pbi4WJJS5j6kpaVpxowZKioqUk1NjebMmaPnn38+5b5/WwcXpHTiSUtLU1FRkerr62PHHMdRfX29SkpKkhjZ4Jw9e1ZHjx5Vbm5uskMZlGnTpiknJyfufnR1dem9996z8n5IvVutnzp1KmXuiTFGq1ev1vbt2/XOO+9o2rRpcT8vKirSmDFj4u5BS0uLjh07ljL3YKDP0JcDBw5IUsrch8s5jqNoNJpy37/3odROUrraUn5U29atW004HDabN282f/rTn8zDDz9sxo8fb9rb25Md2oD+5V/+xTQ0NJjW1lbz3//936a0tNRMnDjRnDx5MtmhXdWZM2fM/v37zf79+40k8+yzz5r9+/ebv/zlL8YYYzZs2GDGjx9vXnvtNXPw4EGzdOlSM23aNPPpp58mOfJe/cV/5swZ89hjj5m9e/ea1tZW8/bbb5svf/nL5qabbjLnzp1LdujGGGMeeeQRE4lETENDgzlx4kSsfPLJJ7FzVq1aZQoKCsw777xj9u3bZ0pKSkxJSUkSo4430Gc4cuSIefrpp82+fftMa2uree2118z06dPNvHnzkhx5ryeeeMI0Njaa1tZWc/DgQfPEE0+YUChk/uu//ssYkxrf/6VRbWNGZ5u0a3I9lTGjswMf1ZbyiccYY37605+agoICk5aWZubOnWuampqSHZIry5cvN7m5uSYtLc184QtfMMuXLzdHjhxJdlj92r17t5F0RamoqDDG9A6p/sEPfmCys7NNOBw2CxcuNC0tLckN+u/0F/8nn3xiFi1aZCZNmmTGjBljpk6dalauXJlS/xPTV+ySzKZNm2LnfPrpp+af//mfzfXXX2+uvfZa881vftOcOHEieUFfZqDPcOzYMTNv3jyTlZVlwuGwmTFjhvnXf/3XQP/h688//dM/malTp5q0tDQzadIks3DhwljSMSY1vv9Lieea0ZPMmGuyPZVrRk8KPPGwHw8AWObSfjyjR2UpFPL2xMQYRz3O/xfofjwp/YwHADD8MJwaAKxlJM+j0oLv9CLxAICl/NmPh0VCAQDDHC0eALBU7+RPjy0eutoAAO55TzzJeMZDVxsAIFC0eADAVj4MLlASBheQeADAUrY+46GrDQAQKFo8AGAtBhcAAAJlep/ReCmDTDy1tbW64YYblJ6eruLiYv3hD39w/V4SDwAgIa+88oqqqqq0bt06ffDBB5ozZ47Kysp08uRJV+9ndWoAsMyl1aml0fKnq60nodWpi4uLdccdd+hnP/uZpN6N8vLz87VmzRo98cQTA76fFg8AWO2qWyC5LL26urriSjQa7fNq58+fV3Nzs0pLS2PHRo0apdLSUu3du9dVxCQeALBMWlqacnJyJPX4UsaNG6f8/HxFIpFYqamp6fPaH3/8sXp6epSdnR13PDs7W+3t7a7iZ1QbAFgmPT1dra2tOn/+vC/1GWMUCsV32YXDYV/q7guJBwAslJ6ervT09MCvO3HiRI0ePVodHR1xxzs6Oj5rhQ2MrjYAgGtpaWkqKipSfX197JjjOKqvr1dJSYmrOmjxAAASUlVVpYqKCn3lK1/R3LlztXHjRnV3d+uhhx5y9X4SDwAgIcuXL9ff/vY3Pfnkk2pvb9ftt9+unTt3XjHg4GqYxwMACBTPeAAAgSLxAAACReIBAASKxAMACBSJBwAQKBIPACBQJB4AQKBIPACAQJF4AACBIvEAAAJF4gEABOr/B3tglwUGPsrTAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "visualize_matrix(dbf.h.matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "id": "6bdaf7f9-7e49-4a16-8b29-ae1f9746cd9b", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" + ] + }, + { + "cell_type": "markdown", + "id": "b5f1d00e-e763-40d9-822f-e0e8d4c57d9a", + "metadata": {}, + "source": [ + "#### Let's evolve the model for `NSTEPS`\n", + "\n", + "We know recover the initial hamiltonian, and we perform a sequence of DBF iteration steps, in order to show how this mechanism can lead to a proper diagonalization of the target hamiltonian.\n", + "\n", + "#### Method 1: fixed step" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "id": "59a6a485-a714-4e14-b27a-1df2930068ee", + "metadata": {}, + "outputs": [], + "source": [ + "# restart\n", + "dbf_1 = DoubleBracketFlow(hamiltonian=deepcopy(h), mode=flowtype)\n", + "off_diagonal_norm_history = [dbf_1.off_diagonal_norm]\n", + "histories, labels = [], [\"Fixed step\"]\n", + "\n", + "# set the number of evolution steps\n", + "NSTEPS = 20\n", + "step = 0.005\n", + "\n", + "for s in range(NSTEPS):\n", + " dbf_1(step=step)\n", + " off_diagonal_norm_history.append(dbf_1.off_diagonal_norm)\n", + "\n", + "histories.append(off_diagonal_norm_history)" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "7e0b2f18-ca53-4f34-9fcf-0052dcc31dc5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeAAAAF2CAYAAAC260vLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABbfUlEQVR4nO3deVhU5f//8ecM+44gq6LgkvuKSq5ZIG6VmmUW39IyzdTMbP9VblmmlR/TzKw+aotW2mJ9rFTc0xARdyRXVFIWFRGQbWDO7w9icgRkm+Ew8H5cF5fMmfvc53VuD7w5Z86iURRFQQghhBA1Sqt2ACGEEKI+kgIshBBCqEAKsBBCCKECKcBCCCGECqQACyGEECqQAiyEEEKoQAqwEEIIoQIpwEIIIYQKpAALIYQQKpACLEQtsXHjRjp37oy9vT0ajYb09HS1I5VKo9Ewa9asGl/u2LFjcXZ2rlBbtTKW5dy5c2g0GlatWqV2FFGLSAEWddqqVavQaDTs379f7Si3dfXqVUaNGoWDgwNLly7lq6++wsnJSbU8v/32W60qYDVhzZo1LFq0SO0Yoh6xVjuAEAJiYmLIzMzkrbfeIiwsTO04/PbbbyxdurTUIpyTk4O1de3+1VGVjGvWrOHYsWNMmzbN5HmaNm1KTk4ONjY2Ju9bWK7a/VMkRD2RmpoKgLu7u7pBKsDe3l7tCOWqLRkLCgrQ6/XY2trWmkyi9pBD0EIABw8eZPDgwbi6uuLs7ExoaCh79+41aqPT6Zg9ezYtW7bE3t4eT09P+vTpQ2RkpKFNcnIyTzzxBI0bN8bOzg4/Pz+GDRvGuXPnylx2//79GTNmDADdu3dHo9EwduxYAAIDAw3f3zpP//79Da937NiBRqNh7dq1vP322zRu3Bh7e3tCQ0M5ffp0ifmjo6MZMmQIDRo0wMnJiY4dO/Lhhx8CRZ+1Ll26FCj6LLX4q1hpn69WZPyKPw7Ys2cP06dPx8vLCycnJ0aMGMHly5fLHJ9bXbx4keHDh+Ps7IyXlxcvvvgihYWFRm1uzZiZmcm0adMIDAzEzs4Ob29vBgwYwIEDBwzj+euvv3L+/HnD+gYGBhrmT01NZdy4cfj4+GBvb0+nTp344osvjJZZ/Dnv+++/z6JFi2jevDl2dnYcP368zM+A//rrLx588EE8PDywt7enW7du/PLLL0ZtKrLdCcske8Ci3ouLi6Nv3764urry8ssvY2Njw/Lly+nfvz87d+4kJCQEgFmzZjFv3jyeeuopevToQUZGBvv37+fAgQMMGDAAgJEjRxIXF8ezzz5LYGAgqampREZGcuHCBaNf6Dd7/fXXadWqFZ9++ilz5swhKCiI5s2bV2ld3n33XbRaLS+++CLXr19nwYIFREREEB0dbWgTGRnJvffei5+fH8899xy+vr7Ex8ezYcMGnnvuOZ5++mkuXbpEZGQkX331lcnGr9izzz5LgwYNmDlzJufOnWPRokVMmTKF7777rtxlFRYWMnDgQEJCQnj//ffZsmULH3zwAc2bN+eZZ54pc76JEyfy/fffM2XKFNq2bcvVq1fZvXs38fHxdO3alddff53r16/z999/85///AfAcMJXTk4O/fv35/Tp00yZMoWgoCDWrVvH2LFjSU9P57nnnjNa1sqVK8nNzWXChAnY2dnh4eGBXq8vddx69+5No0aNePXVV3FycmLt2rUMHz6cH374gREjRgAV2+6EhVKEqMNWrlypAEpMTEyZbYYPH67Y2toqZ86cMUy7dOmS4uLiovTr188wrVOnTsrQoUPL7OfatWsKoLz33nsmy9m0aVNlzJgxJdrfddddyl133WV4vX37dgVQ2rRpo+Tl5Rmmf/jhhwqgHD16VFEURSkoKFCCgoKUpk2bKteuXTPqU6/XG76fPHmyUtavB0CZOXOm4XVFx694HcPCwoyW9fzzzytWVlZKenp6qcsrNmbMGAVQ5syZYzS9S5cuSnBw8G0zurm5KZMnT75t/0OHDlWaNm1aYvqiRYsUQPn6668N0/Lz85WePXsqzs7OSkZGhqIoipKQkKAAiqurq5KammrUR/F7K1euNEwLDQ1VOnTooOTm5hqm6fV6pVevXkrLli0N08rb7oTlkkPQol4rLCxk8+bNDB8+nGbNmhmm+/n58eijj7J7924yMjKAos9n4+LiOHXqVKl9OTg4YGtry44dO7h27VqN5L/VE088ga2treF13759ATh79ixQdKg4ISGBadOmlfi8+ebDzBVVmfErNmHCBKNl9e3bl8LCQs6fP1+hZU6cONHodd++fQ3rVxZ3d3eio6O5dOlShZZxs99++w1fX18eeeQRwzQbGxumTp1KVlYWO3fuNGo/cuRIvLy8bttnWloa27ZtY9SoUWRmZnLlyhWuXLnC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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_histories(histories, labels)" + ] + }, + { + "cell_type": "markdown", + "id": "eb797d6c-0eba-4da4-b492-8b5d70f9123f", + "metadata": {}, + "source": [ + "#### Method 2: optimizing the step" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "id": "a6fd1e33-3620-4f3b-b705-a120f6da0027", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "100%|███████████████████████████████████████████████████████████████████████████| 500/500 [00:03<00:00, 139.16trial/s, best loss: 829.4328971659771]\n", + "New optimized step: 0.011402705976672802\n", + "New optimized step: 0.006325014072323076\n", + "New optimized step: 0.010001573165578734\n", + "New optimized step: 0.007316716304573426\n", + "New optimized step: 0.0076802187698581095\n", + "New optimized step: 0.005495896033227967\n", + "New optimized step: 0.007264060988945372\n", + "New optimized step: 0.01135271597899832\n", + "New optimized step: 0.006630479573440658\n", + "New optimized step: 0.012085489806130539\n", + "New optimized step: 0.005846928182131419\n", + "New optimized step: 0.008295938853037754\n", + "New optimized step: 0.0004088170011721827\n", + "New optimized step: 0.00036462944225239616\n", + "New optimized step: 0.0010186195535541141\n", + "New optimized step: 0.008008841699702174\n", + "New optimized step: 0.0018840493701289263\n", + "New optimized step: 0.005885553634458635\n", + "New optimized step: 0.0026508328880453513\n" + ] + } + ], + "source": [ + "# restart\n", + "dbf_2 = DoubleBracketFlow(hamiltonian=deepcopy(h), mode=flowtype)\n", + "off_diagonal_norm_history = [dbf_2.off_diagonal_norm]\n", + "\n", + "# set the number of evolution steps\n", + "NSTEPS = 20\n", + "\n", + "# optimize first step\n", + "step = dbf_2.hyperopt_step(\n", + " step_min = 1e-5,\n", + " step_max = 1,\n", + " space = hp.uniform,\n", + " optimizer = tpe,\n", + " max_evals = 500,\n", + " verbose = True \n", + ")\n", + "\n", + "for s in range(NSTEPS):\n", + " if s != 0:\n", + " step = dbf_2.hyperopt_step(\n", + " step_min = 1e-5,\n", + " step_max = 1,\n", + " space = hp.uniform,\n", + " optimizer = tpe,\n", + " max_evals = 100, \n", + " )\n", + " print(f\"New optimized step: {step}\")\n", + " dbf_2(step=step)\n", + " off_diagonal_norm_history.append(dbf_2.off_diagonal_norm)\n", + "\n", + "histories.append(off_diagonal_norm_history)\n", + "labels.append(\"Optimizing step\")" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "0f0212bf-b642-4fea-9203-037876e0b266", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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jvx+gNR48/0yClGdaHwCcWjc+d/fOzNq1KgR+/fv54477uDhhx+mQYMGjB07lnvuuYfdu3fj6+trVP7FF19k//79dOjQgffff5/333+fvn37Gva///77REZGEhISYli61Ry2bdtGfHw8zZs3JygoyPCza9euCtUXFhbGypUr+eWXX2jdujWLFy82jIJ2cnIq9hhvb28+//xzunTpQuvWrdm4cSO///674ZnnGTNmcP78eRo0aGDoxm/dujXbtm3j1KlTdOvWzbCkrX5NeD39de7RowezZs1i/vz5RtfZHKQL2krd+iiSxt3ntuU9/D0Jf7w72xdvIj83n+/GLUPRKAydM5xOw8Nve6wQomrVr1/f0NorjaenJz/++KOhy9zT09Nov747trBp06Yxbdo0w/vizqV/frewwku6hoaGGvW+Fbfca0nHAuTn55OWlma07dbne++//37uv/9+w/tZs2ZRt25dw8jkWw0ZMoQhQ4aUGMNdd93F4cOHi2zv1KkTGzZsuG38np6e/PDDD4ZrXBVLvUoL2EoZPYpUxskB2g41HlGo6lRWvfa9tISFEFbpk08+ISoqinPnzvHNN98wb948Ro0aZemwqoy0gK2UphyPIullJqcX2abmq9w4fx2voNu3oIUQoqqdPn2amTNnkpSURL169XjxxRd5/fXXLR1WlZEEbKUK34sqy0hoKHgkSdEoqLp/u40UO4VaobVNHp8QwvxK6/a1dR988AEffPCBpcMwXOfKPCJVEdIFbaU0FeiC9gryYegc4xlsuj/TS1q/QghhhSQBW6mKtIABOg0PZ+DUfx/wz0rNMmlcQliT8swoJYSpmOp7JwnYSikunuBY8JB+eVdo6TTibhxdHQE48vsBtNlak8cnhCXpZz3KzMy0cCSiJtJ/70qafaus5B6wlVIUBY13ILrEOMNkHCU9nH4rJzcnWgxoy8GV+8hOzeLExmO0us98zwcKUdXs7Ozw9vY2zCvs6upa5t8PPZ1OR25uLtnZ2VXyyEllSbzmV1rMqqqSmZlJYmIi3t7e2NmVfbrS4kgCtmIanwB0iXGQk4manY7iUvbpJdsP68TBlfsAOPDzPknAotrRr3hT2uIBJVFVlaysLFxcXMqdvC1B4jW/ssZcltWnykISsBUrPBBLTbkK5UjAd9zdCK9gH1KvJHNqSyzp12/K/NCiWlEUhaCg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ZCQADz30UInHVOX1zcjIoE2bNiU+wjd37lw++ugjPv30U/bu3Yubmxt9+/YlOzu7xDrL+ztgqngzMzM5cOAAb731FgcOHOCXX37h5MmT3H///aXWW57vlani1evXr5/Rub/77rvb1mmp6wsYxRkfH8+XX36JoiiGWQhLYo7rW5a/X6WtFV+cinznb0sVVebOO+9Ux48fb3ifn5+vBgcHq7Nnzy62/MMPP6wOHDjQaFvnzp3Vp59+2qxxFicxMVEF1G3btpVYZunSpaqXl1fVBVXI1KlT1TZt2pS5vDVdW72JEyeqDRo0UHU6XbH7LXl9AXXVqlWG9zqdTg0MDFTnzZtn2JaSkqI6OTmp3333XYn1lPd3wFTxFmffvn0qoF64cKHEMuX9XlVUcfGOGjVKHTx4cLnqsabrO3jwYPXee++9bZmqur63/v1KSUlRHRwc1J9++slQJjY2VgXU3bt3F1tHRb/ztyMt4CqSm5tLdHS00drEGo2GiIgIdu/eXewxu3fvNioPBWsVl1TenFJTUwHw9fW9bbn09HTq169PSEgIgwcPJiYmpirCA+D06dMEBwdzxx13MHLkSC5evFhiWWu6tlDw/fj222954oknbruYhyWvb2FxcXEkJCQYXUMvLy86d+5c4jWsyO+AOaWmpqIoSpHlSm9Vnu+VqW3duhV/f3+aNGnCs88+y40bN0osa03X9+rVq/zxxx+MGTOm1LJVcX1v/ftV2lrxxanId740koCryPXr18nPzy927eGS1h0uaa3i261TbA46nY5JkybRpUuXInNvF9akSRO+/PJLfv31V7799lt0Oh133303f//9t9lj7Ny5M8uWLWPdunUsXryYuLg4unXrxs2bN4stby3XVm/16tWkpKQwevToEstY8vreSn+dynMNK/I7YC7Z2dm8+uqrjBgx4raT7pf3e2VK/fr14+uvv2bTpk3MmTOHbdu20b9/f/Lz84stb03X96uvvsLDw6PULt2quL7F/f0qy1rxt6rId7401W4qSmF648eP59ixY6XemwkPDzesMgVw991306xZM5YsWcLbb79t1hj79+9veN26dWs6d+5M/fr1+fHHH8v0r3BL+9///kf//v1vu4SZJa9vdaLVann44YdRVZXFixfftqwlv1fDhw83vG7VqhWtW7emQYMGbN26lV69epn13JX15ZdfMnLkyFIHCVbF9S3r3y9LkBZwFalduzZ2dnZFRtkVXpv4VoGBgeUqbw4TJkxgzZo1bNmypdzLLTo4ONCuXTvOnDljpuhK5u3tTePGjUs8tzVcW70LFy6wceNGnnzyyXIdZ8nrq79O5bmGFfkdMDV98r1w4YJh2dHyKO17ZU533HEHtWvXLvHc1nB9Af766y9OnjxZ7u8zmP76lvT3KzAw0LBWfGGl/T3WlynrMaWRBFxFHB0d6dChA5s2bTJs0+l0bNq0yahVU1h4eLhReShYq7ik8qakqioTJkxg1apVbN68mbCwsHLXkZ+fz9GjRwkKCjJDhLeXnp7O2bNnSzy3Ja/trZYuXYq/vz8DBw4s13GWvL5hYWEEBgYaXcO0tDT27t1b4jWsyO+AKemT7+nTp9m4cSO1atUqdx2lfa/M6e+//+bGjRslntvS11fvf//7Hx06dKBNmzblPtZU17e0v18dOnQwrBWvd+ta8beqyHe+LIGKKvL999+rTk5O6rJly9Tjx4+rY8eOVb29vdWEhARVVVX10UcfVV977TVD+Z07d6r29vbqe++9p8bGxqpTp05VHRwc1KNHj5o91meffVb18vJSt27dqsbHxxt+MjMzDWVujXf69Onq+vXr1bNnz6rR0dHq8OHDVWdnZzUmJsbs8b744ovq1q1b1bi4OHXnzp1qRESEWrt2bTUxMbHYWC15bQvLz89X69Wrp7766qtF9ln6+t68eVM9ePCgevDgQRVQ58+frx48eNAwavjdd99Vvb291V9//VU9cuSIOnjwYDUsLEzNysoy1HHvvfeqCxcuNLwv7XfAXPHm5uaq999/v1q3bl310KFDRt/pnJycEuMt7Xtlrnhv3rypvvTSS+ru3bvVuLg4dePGjWr79u3VRo0aqdnZ2SXGa6nrq5eamqq6urqqixcvLraOqrq+Zfn79cwzz6j16tVTN2/erO7fv18NDw9Xw8PDjepp0qSJ+ssvvxjel+U7Xx6SgKvYwoUL1Xr16qmOjo7qnXfeqe7Zs8ewr0ePHuqoUaOMyv/4449q48aNVUdHR7VFixbqH3/8USVxAsX+LF26tMR4J02aZPhsAQEB6oABA9QDBw5USbz/+c9/1KCgINXR0VGtU6eO+p///Ec9c+ZMibGqquWubWHr169XAfXkyZNF9ln6+m7ZsqXY74A+Jp1Op7711ltqQECA6uTkpPbq1avI56hfv746depUo223+x0wV7xxcXElfqe3bNlSYrylfa/MFW9mZqbap08f1c/PT3VwcFDr16+vPvXUU0USqbVcX70lS5aoLi4uakpKSrF1VNX1Lcvfr6ysLHXcuHGqj4+P6urqqg4dOlSNj48vUk/hY8rynS8PWY5QCCGEsAC5ByyEEEJYgCRgIYQQwgIkAQshhBAWIAlYCCGEsABJwEIIIYQFSAIWQgghLEASsBBCCGEBkoCFEGYXGhrKggULLB2GEFZFErAQ1czo0aMZMmQIAD179mTSpElVdu5ly5YVu75uVFQUY8eOrbI4hLAFshyhEKJUubm5ODo6Vvh4Pz8/E0YjRPUgLWAhqqnRo0ezbds2PvzwQxRFQVEUzp8/D8CxY8fo378/7u7uBAQE8Oijj3L9+nXDsT179mTChAlMmjSJ2rVr07dvXwDmz59Pq1atcHNzIyQkhHHjxpGeng7A1q1befzxx0lNTTWcb9q0aUDRLuiLFy8yePBg3N3d8fT05OGHHzZa5m3atGm0bduWb775htDQULy8vBg+fLjRQu0rV66kVatWuLi4UKtWLSIiIsjIyDDT1RTC9CQBC1FNffjhh4SHh/PUU08RHx9PfHw8ISEhpKSkcO+999KuXTv279/PunXruHr1Kg8//LDR8V999RWOjo7s3LmTTz/9FACNRsNHH31ETEwMX331FZs3b+aVV14B4O6772bBggV4enoazvfSSy8ViUun0zF48GCSkpLYtm0bkZGRnDt3jv/85z9G5c6ePcvq1atZs2YNa9asYdu2bbz77rsAxMfHM2LECJ544gliY2PZunUrDzzwADK1vbAl0gUtRDXl5eWFo6Mjrq6uRguGf/zxx7Rr14533nnHsO3LL78kJCSEU6dO0bhxYwAaNWrE3LlzjeosfD85NDSUmTNn8swzz/DJJ5/g6OiIl5cXiqLcdoHyTZs2cfToUeLi4ggJCQHg66+/pkWLFkRFRdGpUyegIFEvW7YMDw8PAB599FE2bdrErFmziI+PJy8vjwceeID69esD0KpVq0pcLSGqnrSAhahhDh8+zJYtW3B3dzf8NG3aFChodep16NChyLEbN26kV69e1KlTBw8PDx599FFu3LhBZmZmmc8fGxtLSEiIIfkCNG/eHG9vb2JjYw3bQkNDDckXICgoiMTERADatGlDr169aNWqFQ899BCff/45ycnJZb8IQlgBScBC1DDp6ekMGjSIQ4cOGf2cPn2a7t27G8q5ubkZHXf+/Hnuu+8+Wrduzc8//0x0dDSLFi0CCgZpmZqDg4PRe0VR0Ol0ANjZ2REZGcmff/5J8+bNWbhwIU2aNCEuLs7kcQhhLpKAhajGHB0dyc/PN9rWvn17YmJiCA0NpWHDhkY/tybdwqKjo9HpdLz//vvcddddNG7cmCtXrpR6vls1a9aMS5cucenSJcO248ePk5KSQvPmzcv82RRFoUuXLkyfPp2DBw/i6OjIqlWryny8EJYmCViIaiw0NJS9e/dy/vx5rl+/jk6nY/z48SQlJTFixAiioqI4e/Ys69ev5/HHH79t8mzYsCFarZaFCxdy7tw5vvnmG8PgrMLnS09PZ9OmTVy/fr3YrumIiAhatWrFyJEjOXDgAPv27eOxxx6jR48edOzYsUyfa+/evbzzzjvs37+fixcv8ssvv3Dt2jWaNWtWvgskhAVJAhaiGnvppZews7OjefPm+Pn5cfHiRYKDg9m5cyf5+fn06dOHVq1aMWnSJLy9vdFoSv6T0KZNG+bPn8+cOXNo2bIly5cvZ/bs2UZl7r77bp555hn+85//4OfnV2QQFxS0XH/99Vd8fHzo3r07ERER3HHHHfzwww9l/lyenp5s376dAQMG0LhxY958803ef/99+vfvX/aLI4SFKaqM2xdCCCGqnLSAhRBCCAuQBCyEEEJYgCRgIYQQwgIkAQshhBAWIAlYCCGEsABJwEIIIYQFSAIWQgghLEASsBBCCGEBkoCFEEIIC5AELIQQQliAJGAhhBDCAiQBCyGEEBbw/wNjLO4T2EG5AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_histories(histories, labels)" + ] + }, + { + "cell_type": "markdown", + "id": "32341937-4178-41d2-a10e-5e4d2634098e", + "metadata": {}, + "source": [ + "The hyperoptimization can lead to a faster convergence of the algor" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "id": "82b89092-07e5-4788-9ae0-8907df2428eb", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "visualize_matrix(dbf_1.h.matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "ac8ed320-04a8-42af-a980-48ab4f1fff7c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "visualize_matrix(dbf_2.h.matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd90001b-23a2-4fdf-b8d8-d53718d145bc", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 092062052b1f0f4dd758672567ccf9e70e4b33f0 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Mon, 13 Nov 2023 20:27:50 +0100 Subject: [PATCH 033/143] add dbf example to docs --- doc/source/code-examples/applications.rst | 10 ++++++++++ doc/source/code-examples/tutorials/dbf/dbf.ipynb | 1 + 2 files changed, 11 insertions(+) create mode 120000 doc/source/code-examples/tutorials/dbf/dbf.ipynb diff --git a/doc/source/code-examples/applications.rst b/doc/source/code-examples/applications.rst index 695755ebcc..51af3d5db3 100644 --- a/doc/source/code-examples/applications.rst +++ b/doc/source/code-examples/applications.rst @@ -69,6 +69,8 @@ Quantum Physics tutorials/bell-variational/README.md tutorials/falqon/README.md tutorials/grover/README.md + tutorials/dbf/dbf.ipynb + Quantum Machine Learning ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -151,6 +153,14 @@ Adiabatic Evolution tutorials/adiabatic3sat/README.md +Diagonalization +^^^^^^^^^^^^^^^ + +.. toctree:: + :maxdepth: 1 + + tutorials/dbf/dbf.ipynb + FALQON ^^^^^^ diff --git a/doc/source/code-examples/tutorials/dbf/dbf.ipynb b/doc/source/code-examples/tutorials/dbf/dbf.ipynb new file mode 120000 index 0000000000..1a4dac7946 --- /dev/null +++ b/doc/source/code-examples/tutorials/dbf/dbf.ipynb @@ -0,0 +1 @@ +/home/matteo/Documents/PhD/qibo/examples/dbf/dbf.ipynb \ No newline at end of file From cce058bb9075c3030e3713da334d69550cd6af79 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Mon, 13 Nov 2023 20:28:10 +0100 Subject: [PATCH 034/143] fix dbf --- src/qibo/models/double_bracket.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/qibo/models/double_bracket.py b/src/qibo/models/double_bracket.py index cbc96d5e5f..7536947392 100644 --- a/src/qibo/models/double_bracket.py +++ b/src/qibo/models/double_bracket.py @@ -54,7 +54,10 @@ def __init__( self.h0 = deepcopy(self.h) self.mode = mode - def __call__(self, step: float, mode: FlowGeneratorType, d: np.array = None): + def __call__(self, step: float, mode: FlowGeneratorType = None, d: np.array = None): + if mode is None: + mode = self.mode + if mode is FlowGeneratorType.canonical: operator = self.backend.calculate_matrix_exp( 1.0j * step, From 641e3ac1502eeb8fd3b7e3e1b7cc5c605209b07c Mon Sep 17 00:00:00 2001 From: Andrea Date: Tue, 14 Nov 2023 12:49:12 +0400 Subject: [PATCH 035/143] Minor improvements --- examples/dbf/dbf.ipynb | 326 ++++++++--------------------------------- 1 file changed, 61 insertions(+), 265 deletions(-) diff --git a/examples/dbf/dbf.ipynb b/examples/dbf/dbf.ipynb index 926b5518ee..1bf8d058e2 100644 --- a/examples/dbf/dbf.ipynb +++ b/examples/dbf/dbf.ipynb @@ -16,7 +16,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": null, "id": "f270b1ea-ee6a-4eac-a0ff-3d7dae296cf0", "metadata": {}, "outputs": [], @@ -43,7 +43,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": null, "id": "4aec7b46-19b9-4004-93c0-a90255e58fd9", "metadata": {}, "outputs": [], @@ -52,14 +52,21 @@ " \"\"\"Visualize hamiltonian in a heatmap form.\"\"\"\n", " fig, ax = plt.subplots(figsize=(5,5))\n", " ax.set_title(title)\n", - " im = ax.imshow(np.absolute(matrix), cmap=\"inferno\")\n", + " try:\n", + " im = ax.imshow(np.absolute(matrix), cmap=\"inferno\")\n", + " except TypeError:\n", + " im = ax.imshow(np.absolute(matrix.get()), cmap=\"inferno\")\n", " fig.colorbar(im, ax=ax)\n", "\n", "def visualize_drift(h0, h):\n", " \"\"\"Visualize drift of the evolved hamiltonian w.r.t. h0.\"\"\"\n", " fig, ax = plt.subplots(figsize=(5,5))\n", " ax.set_title(r\"Drift: $|\\hat{H}_0 - \\hat{H}_{\\ell}|$\")\n", - " im = ax.imshow(np.absolute(h0 - h), cmap=\"inferno\")\n", + " try:\n", + " im = ax.imshow(np.absolute(h0 - h), cmap=\"inferno\")\n", + " except TypeError:\n", + " im = ax.imshow(np.absolute((h0 - h).get()), cmap=\"inferno\")\n", + "\n", " fig.colorbar(im, ax=ax)\n", "\n", "def plot_histories(histories, labels):\n", @@ -88,31 +95,13 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": null, "id": "2c4ed408-68ed-4054-825c-2a7df0979a4f", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Qibo 0.2.2|INFO|2023-11-13 20:02:07]: Using qibojit (numba) backend on /CPU:0\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZ4AAAGiCAYAAADXxKDZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA0sUlEQVR4nO3df1hUdb4H8PeAzoDCjKLCgAKhlqYG7pKybOVPEtnWNL131doblmtWaCnVGndbsR/70Gqb9oOwR7tam2arjz+yLclU8FZgiXrNunGFJUUFTMsZQBmU871/EFMjCGfmHM7MGd6vnvM8zuHM93zODPnx+9sghBAgIiLSSIC3AyAioq6FiYeIiDTFxENERJpi4iEiIk0x8RARkaaYeIiISFNMPEREpCkmHiIi0hQTDxERaYqJh4iINMXEQ0REsi1btgwGg8HlGDp0qFtldOuk2IiIyE8NHz4cH3/8sfN1t27upRImHiIicku3bt1gtVo9f7+KsRARkUYaGhrQ2NioSllCCBgMBpdzJpMJJpOpzeuPHz+OqKgoBAUFITk5GTk5OYiJiZF9PwO3RSAi0peGhgbExVlRXW1TpbyQkBDU1dW5nMvOzsayZctaXfvhhx+irq4OQ4YMQVVVFZ5++mmcPn0ax44dQ2hoqKz7MfEQEemM3W6HxWLBv06shNkcrLCsSxgYuxiVlZUwm83O8+3VeH7uwoULiI2NxYsvvoi5c+fKuieb2oiIdMpsDlaceH4qy+ySeOTq1asXbrjhBpSVlcl+D4dTExHplBBXVDmUqKurQ3l5OSIjI2W/h4mHiEinhGhS5XDH448/jsLCQnz77bf47LPPcNdddyEwMBCzZ8+WXQab2oiISLZTp05h9uzZOH/+PPr164dbb70VxcXF6Nevn+wymHiIiHRKElcgKWwqc/f9mzZtUnQ/gImHiEi31OijUfp+T7CPh4iINMUaDxGRTjUPDlBa43FvcIEamHiIiHRKSFcgJIWJR+H7PcGmNiIi0hRrPEREeiWuNB9Ky9AYEw8RkU5xVBsREZEMrPEQEemVdAWQLisvQ2Os8ZDujBs3DiNGjPB2GC7GjRuHcePGOV9/++23MBgMWL9+vVfiWb9+PQwGA7799luv3J+04QuLhHqCicePGAwGWUdBQYG3Q3Xx2WefYdmyZbhw4YK3Q+lUH3zwQZsbaxF1NWxq8yN///vfXV6/9dZb2L17d6vzN954o5Zhdeizzz7D008/jTlz5qBXr17eDscjH330UYfXfPDBB8jNzdUk+fzHf/wHZs2aJWsjL9Ix6QogBSovQ2NMPH7k97//vcvr4uJi7N69u9V5Twgh0NDQgOBgdTad8jdGo9HbIbgIDAxEYKDCv5DI9+k08bCprYtZt24dJkyYgPDwcJhMJgwbNgx5eXmtrrvuuuvw29/+Fvn5+bj55psRHByM119/HQBw4sQJ3HnnnejZsyfCw8OxePFi5Ofnt9mMd+DAAUyePBkWiwU9evTA2LFj8emnnzp/vmzZMjzxxBMAgLi4OGdzoJy+ia+//hrjx49Hjx490L9/fyxfvtzl542NjVi6dCkSExNhsVjQs2dP3Hbbbdi3b5/LdS39MS+88AJyc3MxcOBA9OjRA5MmTUJlZSWEEHj22WcxYMAABAcHY+rUqfj+++9dyri6j+dqc+bMQW5uLgDXJtEW9fX1eOyxxxAdHQ2TyYQhQ4bghRdewNU70xsMBixYsADbt2/HiBEjYDKZMHz4cOzatcvlurb6eHbs2IE77rgDUVFRMJlMGDRoEJ599lk0NbkumdLSh9bR50vkKdZ4upi8vDwMHz4cd955J7p164adO3fi4YcfhiRJyMjIcLm2tLQUs2fPxvz58zFv3jwMGTIE9fX1mDBhAqqqqvDoo4/CarVi48aNrf4yB4C9e/ciLS0NiYmJyM7ORkBAgDPx/fd//zdGjx6N6dOn4//+7//wzjvvYOXKlejbty8AdLi3xw8//IDJkydj+vTp+N3vfoctW7ZgyZIluOmmm5CWlgageV/6tWvXYvbs2Zg3bx5qa2vxxhtvIDU1FZ9//jlGjhzpUuaGDRvQ2NiIhQsX4vvvv8fy5cvxu9/9DhMmTEBBQQGWLFmCsrIyvPLKK3j88cfxX//1X7I/9/nz5+PMmTNtNn0KIXDnnXdi3759mDt3LkaOHIn8/Hw88cQTOH36NFauXOly/SeffIKtW7fi4YcfRmhoKF5++WXMmDEDJ0+eRJ8+fa4Zw/r16xESEoLMzEyEhIRg7969WLp0Kex2O1asWOH250u+oEmFCaDar9UGQX4rIyNDXP0VX7x4sdV1qampYuDAgS7nYmNjBQCxa9cul/N/+9vfBACxfft257lLly6JoUOHCgBi3759QgghJEkS119/vUhNTRWSJLncPy4uTtx+++3OcytWrBAAREVFhaznGjt2rAAg3nrrLec5h8MhrFarmDFjhvPclStXhMPhcHnvDz/8ICIiIsT999/vPFdRUSEAiH79+okLFy44z2dlZQkAIiEhQVy+fNl5fvbs2cJoNIqGhgaXmMaOHduqzHXr1jnPtfV9CCHE9u3bBQDx3HPPuZz/t3/7N2EwGERZWZnzHABhNBpdzv3P//yPACBeeeUV57l169a1+kzb+u7nz58vevTo0epZ5Hy+5D02m00AEKfK5wr72YcUHafK5woAwmazaRY/m9q6mJ/30dhsNpw7dw5jx47Fv/71L9hsNpdr4+LikJqa6nJu165d6N+/P+68807nuaCgIMybN8/luiNHjuD48eO4++67cf78eZw7dw7nzp1DfX09Jk6ciP3790OSJI+fIyQkxKXvymg0YvTo0fjXv/7lPBcYGOjse5EkCd9//z2uXLmCm2++GYcOHWpV5r//+7/DYrE4XyclJQFo7jvr1q2by/nGxkacPn3a4/h/7oMPPkBgYCAeeeQRl/OPPfYYhBD48MMPXc6npKRg0KBBztfx8fEwm80uz96Wn3/3tbW1OHfuHG677TZcvHgR33zzjcu1cj5fIk+xqa2L+fTTT5GdnY2ioiJcvHjR5Wc2m83lL964uLhW7z9x4gQGDRrk0j8BAIMHD3Z5ffz4cQBAenr6NWOx2Wzo3bu3288AAAMGDGgVQ+/evXH06FGXc2+++Sb+9re/4ZtvvsHlyz9NtGvr2WJiYlxet3wW0dHRbZ7/4YcfPIr9aidOnEBUVBRCQ0NdzreMPjxx4kS7cQLNz95RPF999RWeeuop7N27F3a73eVnV/+jQ+7nS14mXQEkhfUHjmqjzlReXo6JEydi6NChePHFFxEdHQ2j0YgPPvgAK1eubFUDUTKCraWsFStWtOpLaRESEuJx+dcasSV+1hn/9ttvY86cOZg2bRqeeOIJhIeHIzAwEDk5OSgvL5ddppx7acmTeC5cuICxY8fCbDbjmWeewaBBgxAUFIRDhw5hyZIlrb57X3tmugYmHvJ1O3fuhMPhwHvvvefyr+a2BgZcS2xsLL7++msIIVz+RVxWVuZyXUtTkNlsRkpKSrtlXv0va7Vs2bIFAwcOxNatW13ukZ2d3Sn368i1njM2NhYff/wxamtrXWo9Lc1fsbGxiu9dUFCA8+fPY+vWrRgzZozzfEVFheKyidzFPp4upOVfsT//V6vNZsO6detkl5GamorTp0/jvffec55raGjAmjVrXK5LTEzEoEGD8MILL6Curq5VOd99953zzz179gQA1VcuaOt5Dxw4gKKiIlXvI9e1nvM3v/kNmpqa8Oqrr7qcX7lyJQwGgyqjyNr6LBobG/Haa68pLpu8xyCuqHJojTWeLmTSpEkwGo2YMmUK5s+fj7q6OqxZswbh4eGoqqqSVcb8+fPx6quvYvbs2Xj00UcRGRmJDRs2ICgoCMBP/6oPCAjA2rVrkZaWhuHDh+O+++5D//79cfr0aezbtw9msxk7d+4E0JykAOBPf/oTZs2ahe7du2PKlCnOv6g99dvf/hZbt27FXXfdhTvuuAMVFRVYvXo1hg0b1mYy7Gwtz/nII48gNTUVgYGBmDVrFqZMmYLx48fjT3/6E7799lskJCTgo48+wo4dO7Bo0SKXgQSe+vWvf43evXsjPT0djzzyCAwGA/7+97+z6UzvJAmQFA6HVjDIx1NMPF3IkCFDsGXLFjz11FN4/PHHYbVa8dBDD6Ffv364//77ZZXRMv9j4cKFeOmllxASEoJ7770Xv/71rzFjxgxnAgKaJyIWFRXh2Wefxauvvoq6ujpYrVYkJSVh/vz5zutGjRqFZ599FqtXr8auXbsgSRIqKioUJ545c+aguroar7/+OvLz8zFs2DC8/fbb2Lx5s1fWq5s+fToWLlyITZs24e2334YQArNmzUJAQADee+89LF26FO+++y7WrVuH6667DitWrMBjjz2myr379OmD999/H4899hieeuop9O7dG7///e8xceLEViMXiTqbQfCfPKSCVatWYfHixTh16hT69+/v7XCI/JrdbofFYsGZY3fBHNpdWVm1lxE1YhtsNhvMZrNKEbaPNR5y26VLl1xGvDU0NOD111/H9ddfz6RDpCWpSYVRbdqvXMDEQ26bPn06YmJiMHLkSNhsNrz99tv45ptvsGHDBm+HRkQ6wMRDbktNTcXatWuxYcMGNDU1YdiwYdi0aRNmzpzp7dCIuhbpCiApnI7ghXk87OMhItKZlj6eqkOpqvTxRP4yX9M+Hs7jISIiTflcU5skSThz5gxCQ0M7bUY7EZGWhBCora1FVFQUAgJU/Pe+UGFwgeDgApw5c6bVooxERP6gsrISAwYMUK08gyTBoHBUmsGfJpDm5uZixYoVqK6uRkJCAl555RWMHj26w/e1rFX17cmXYDa3v0jliXvWtPtzd/zinyWyrjt8R6Kq5alJTmzeiMuX+fL3Sf5EABCtViDvqjol8bz77rvIzMzE6tWrkZSUhFWrViE1NRWlpaUIDw9v970tzWtmczDM5h7tXhvaXc3w5TXryb+n9s2E8mJj8+XP+fL3Sf5GqN99IDWpMKpN+6a2Thlc8OKLL2LevHm47777MGzYMKxevRo9evRwa6tgIiJqn0FqUuXQmuqJp7GxESUlJS5L4QcEBCAlJaXNVYEdDgfsdrvLQURE/kv1xHPu3Dk0NTUhIiLC5XxERASqq6tbXZ+TkwOLxeI8OLCAiEgmqUmdQ2Nen8eTlZUFm83mPCorK70dEhGRLui1qU31wQV9+/ZFYGAgampqXM7X1NTAarW2ut5kMsFkMqkdBhER+SjVazxGoxGJiYnYs2eP85wkSdizZw+Sk5PVvh0RUdel06a2ThlOnZmZifT0dNx8880YPXo0Vq1ahfr6etx3332dcTsioi7JIAnFE0ANkvbLdXZK4pk5cya+++47LF26FNXV1Rg5ciR27drVasBBe07cs6bDORbz8uM7LGffpbWy7lc2rePJrQAwePvnqpUntyy55JSn9nPqnZrfpzvlEXVlnbZywYIFC7BgwYLOKp6IiKQmQOmKN/7S1EZERBoQKiQeLywS6vXh1ERE1LWwxkNEpFMGIcEglK3VZhB+tDo1ERF1Mp328bCpjYiINMUaDxGRXkmSCtsisKmNiIjkYuLRnpzJoeOD/yCztKPKgrmKr07m5IRJz/BzI1KPrhMPEVFXZpAkGBRWWJQuueMJJh4iIr2SJBVGtWmfeDiqjYiINMUaDxGRXum0xsPEQ0SkVzpNPGxqIyIiTbHGQ0SkV6IJULqRG9dqIyIiufQ6nJpNbUREpCmfrfH84p8lANpfCkLeLHF5KxLI2Ua7WddYRcCXY/Nlvrw1OvkhnQ4u8NnEQ0REHdBp4mFTGxERaYo1HiIivZKE8hqL0lFxHmDiISLSK0mo0NSmfeJhUxsREWmKNR4iIr1SZSM41niIiEguSVLn8NDzzz8Pg8GARYsWufU+Jh4iInLbF198gddffx3x8XLnQP6EiYeISK8koc7hprq6Otxzzz1Ys2YNevfu7fb7fbaP5/AdiQjt3n546s7sllfW+OA/yLpuTaq8FRPk8OUZ7Jyp7xk5z8pVIahDQgKEwj4e0Zx47Ha7y2mTyQSTydTmWzIyMnDHHXcgJSUFzz33nNu3ZI2HiIgQHR0Ni8XiPHJyctq8btOmTTh06NA1fy6Hz9Z4iIioA0KFeTw/1ngqKythNpudp9uq7VRWVuLRRx/F7t27ERQU5PEtmXiIiPRKxQmkZrPZJfG0paSkBGfPnsUvf/lL57mmpibs378fr776KhwOBwIDAzu8JRMPERHJMnHiRHz55Zcu5+677z4MHToUS5YskZV0ACYeIiL90njJnNDQUIwYMcLlXM+ePdGnT59W59vDxENEpFNCUr5ztRd2vmbiISIizxUUFLj9HiYeIiK90unq1D6beNTa+lrtyXXemBjqDxMJOWHSfV3p94M8JEGFxKNGIO7hBFIiItKU6oln2bJlMBgMLsfQoUPVvg0REUkqHRrrlKa24cOH4+OPP/7pJt18tkWPiEi/xI+H0jI01ikZoVu3brBarbKudTgccDgcztdXL1RHRET+pVP6eI4fP46oqCgMHDgQ99xzD06ePHnNa3NyclwWpouOju6MkIiI/I6QDKocWlM98SQlJWH9+vXYtWsX8vLyUFFRgdtuuw21tbVtXp+VlQWbzeY8Kisr1Q6JiMg/sY+nWVpamvPP8fHxSEpKQmxsLP7xj39g7ty5ra5vb88HIiLyP53e69+rVy/ccMMNKCsr6+xbERF1LcIAKG0q88Lggk6fx1NXV4fy8nJERkZ29q2IiLoUvfbxqF7jefzxxzFlyhTExsbizJkzyM7ORmBgIGbPnq32rXx6Nryc8uRuow2ot1qCL+NMfc/wcyO9UT3xnDp1CrNnz8b58+fRr18/3HrrrSguLka/fv3UvhURUdcmqdDU5g+DCzZt2qR2kURE1BZhaD4UlaFOKO7gWm1ERKQprmVDRKRTagwO4EZwREQknxSgQh+P9m1tbGojIiJNscZDRKRXHNVGRERaEsIAoXBUm+CoNiIi8nd+X+Px1qxueeXJW5FgXn68rOuArjHjXM3voCvN0ufn5od0OrjA7xMPEZG/EhJUGE7NUW1EROTnWOMhItIrVbZF8IPVqYmISBvqjGrzg62viYiI2sMaDxGRXkkBzYeiMtQJxR1MPEREOqXOIqFsaiMiIj9nEMIbCyZcm91uh8ViweE7RiG0e/sVMk5icyVnK+01qepuo81JiV0Tt9F2lwAgwWazwWw2Ky6t5e/J04sjYDYpqz/YHRL6r6xRLTY52NRGRKRXOu3jYVMbERFpijUeIiKd0uvgAiYeIiKd4gRSIiIiGVjjISLSK50OLmDiISLSKb328bCpjYiINMUaDxGRTul1cIHPJp5f/LMEQPsfCGfDu1JzVQJvbBnO2fD64a0t5ekqQoU+Hi+sXcOmNiIi0pTP1niIiKh9eh1cwMRDRKRTQijvo/HGMtFsaiMiIk2xxkNEpFcqNLWBTW1ERCSXEAEQQlnDlTe2ZGNTGxERaYo1HiIivZIMypvK2NRGRERyceUCL+BsePepPeNcTZwN73/U/E75ffoPt/t49u/fjylTpiAqKgoGgwHbt293+bkQAkuXLkVkZCSCg4ORkpKC48ePqxUvERH9qGUCqdJDa24nnvr6eiQkJCA3N7fNny9fvhwvv/wyVq9ejQMHDqBnz55ITU1FQ0OD4mCJiOgnLaPalB5ac7upLS0tDWlpaW3+TAiBVatW4amnnsLUqVMBAG+99RYiIiKwfft2zJo1S1m0RESke6qmuoqKClRXVyMlJcV5zmKxICkpCUVFRW2+x+FwwG63uxxERNSxLtPU1p7q6moAQEREhMv5iIgI58+ulpOTA4vF4jyio6PVDImIyG+1jGpTemjN6xNIs7KyYLPZnEdlZaW3QyIiok6k6nBqq9UKAKipqUFkZKTzfE1NDUaOHNnme0wmE0wmk5phEBF1CXqdx6NqjScuLg5WqxV79uxxnrPb7Thw4ACSk5PVvBURUZcnhAp9PHqYQFpXV4eysjLn64qKChw5cgRhYWGIiYnBokWL8Nxzz+H6669HXFwc/vznPyMqKgrTpk1TM24iItIptxPPwYMHMX78eOfrzMxMAEB6ejrWr1+PP/7xj6ivr8cDDzyACxcu4NZbb8WuXbsQFBSkXtRu6Eqz4dVcycGXcTa8/+EqJJ7R6+rUbieecePGtRuowWDAM888g2eeeUZRYERE1D69bn3t9VFtRETUteh6kVAioq5Mr6PamHiIiHRKr4mHTW1ERKQpJh4iIp0Skhrrtbl3z7y8PMTHx8NsNsNsNiM5ORkffvihW2WwqY2ISKe80dQ2YMAAPP/887j++ushhMCbb76JqVOn4vDhwxg+fLisMph4iIhItilTpri8/stf/oK8vDwUFxcz8bjLHyaa+vKEyfHBf+jwmjWpR1W9Z1eaSNgV+MP/o2pTZwJp8/uv3pJGzjqaTU1N2Lx5M+rr691aFo19PEREOiUJgyoHAERHR7tsUZOTk3PN+3755ZcICQmByWTCgw8+iG3btmHYsGGy42aNh4iIUFlZCbPZ7HzdXm1nyJAhOHLkCGw2G7Zs2YL09HQUFhbKTj5MPEREeqXGDqI/vr9llJocRqMRgwcPBgAkJibiiy++wEsvvYTXX39d1vuZeIiIdMpXJpBKkgSHwyH7eiYeIiKSLSsrC2lpaYiJiUFtbS02btyIgoIC5Ofnyy6DiYeISKe8UeM5e/Ys7r33XlRVVcFisSA+Ph75+fm4/fbbZZfBxENEpFPeSDxvvPGGovsBHE5NREQaY42HiEinJBEASeEEUqXv9wQTj5t8edtlX94+WM1VCXz5OyDv60orHAihwg6k3BaBiIj8HWs8REQ65SvzeNzFxENEpFN6TTxsaiMiIk2xxkNEpFM/X11aSRlaY+IhItIpNrURERHJwBoPEZFO6bXGw8RDRKRT7OMhF766ioAvz+qWW9b44D/ILFG91RLI/3AFDO9h4iEi0ikhlDeVCaFSMG5g4iEi0im99vFwVBsREWmKNR4iIp0SKgwu4Kg2IiKSjU1tREREMrDGQ0SkU3qt8TDxEBHpFCeQktv8YTKnmrHJLUvuxNB5+fEyruLEP2qfGr+7tZev4Bf//EKtkHSPiYeISKf02tTm9uCC/fv3Y8qUKYiKioLBYMD27dtdfj5nzhwYDAaXY/LkyWrFS0REP2ppalN6aM3txFNfX4+EhATk5uZe85rJkyejqqrKebzzzjuKgiQiIv/hdlNbWloa0tLS2r3GZDLBarXKKs/hcMDhcDhf2+12d0MiIuqSBAwQUNjUpvD9nuiUeTwFBQUIDw/HkCFD8NBDD+H8+fPXvDYnJwcWi8V5REdHd0ZIRER+p6WPR+mhNdUTz+TJk/HWW29hz549+Otf/4rCwkKkpaWhqampzeuzsrJgs9mcR2VlpdohERGRD1F9VNusWbOcf77pppsQHx+PQYMGoaCgABMnTmx1vclkgslkUjsMIiK/p9d5PJ2+ZM7AgQPRt29flJWVdfatiIi6FDa1XcOpU6dw/vx5REZGdvatiIhIB9xuaqurq3OpvVRUVODIkSMICwtDWFgYnn76acyYMQNWqxXl5eX44x//iMGDByM1NdWt+xy+IxGh3dsPr6tsN+vLz+mN1RLk67g8udtor0lVdxttX90aXS5fjs0bOn7OztnmU4IKTW1eGNXmduI5ePAgxo8f73ydmZkJAEhPT0deXh6OHj2KN998ExcuXEBUVBQmTZqEZ599lv04REQEwIPEM27cOIh2NunOz89XFBAREcmj1yVzuFYbEZFOSTAobirzRlMbN4IjIiJNscZDRKRXagyHZlMbERHJxQmkREREMrDGQ0SkUxzVRkREmpJ+PJSWoTWfTTy/+GcJ0MEwPzmzp7vKzGnyjNwVCeblx8u6bt+ltbKuU/N31xurCPhybOT7fDbxEBFR+9jURkREmpKE8lFpUucsI9cujmojIiJNscZDRKRTAgYIhUveKH2/J5h4iIh0ihNIiYiIZGCNh4hIp5oHFygvQ2tMPEREOsU+Hi/Q+/bBpB9qTgxVmy9P5lQzNv4/6j90nXiIiLoyvQ4uYOIhItIpIZoPpWVojaPaiIhIU6zxEBHplIABEgcXEBGRVvS6SCib2oiISFOs8RAR6RRHtRERkabEj4fSMrTGpjYiItKU39d4fHlWN3mf2r8fcsnbSlvd3zVfXkWAq5B4hk1tRESkKenHQ2kZWmNTGxERaYo1HiIindLrPB4mHiIindJrHw+b2oiISFNMPEREOiVUOtyRk5ODUaNGITQ0FOHh4Zg2bRpKS0vdKoOJh4hIp1qa2pQe7igsLERGRgaKi4uxe/duXL58GZMmTUJ9fb3sMtjHQ0REsu3atcvl9fr16xEeHo6SkhKMGTNGVhlMPEREOqXmPB673e5y3mQywWQydfh+m80GAAgLC5N9TyaeH3GFg67Je9+nejP11earv7v8f7Q1NYdTR0dHu5zPzs7GsmXL2n2vJElYtGgRbrnlFowYMUL2Pd3q45HTqdTQ0ICMjAz06dMHISEhmDFjBmpqaty5DRERaayyshI2m815ZGVldfiejIwMHDt2DJs2bXLrXm4lHjmdSosXL8bOnTuxefNmFBYW4syZM5g+fbpbQRERUccEfmpu8/RoGdVmNptdjo6a2RYsWID3338f+/btw4ABA9yK262mto46lWw2G9544w1s3LgREyZMAACsW7cON954I4qLi/GrX/3KreCIiOjaBFRoanNz62shBBYuXIht27ahoKAAcXFxbt9TUR/P1Z1KJSUluHz5MlJSUpzXDB06FDExMSgqKmoz8TgcDjgcDufrqzu4iIjId2RkZGDjxo3YsWMHQkNDUV1dDQCwWCwIDg6WVYbH83ja6lSqrq6G0WhEr169XK6NiIhwBne1nJwcWCwW53F1BxcREbVNEuoc7sjLy4PNZsO4ceMQGRnpPN59913ZZXhc42npVPrkk088LQIAkJWVhczMTOdru93O5ENEJIM3diAVQvmepR4lnpZOpf3797t0KlmtVjQ2NuLChQsutZ6amhpYrdY2y5I7VpyIiPyDW01tQggsWLAA27Ztw969e1t1KiUmJqJ79+7Ys2eP81xpaSlOnjyJ5ORkdSImIiIA3lkyRw1u1Xg66lSyWCyYO3cuMjMzERYWBrPZjIULFyI5OdlvRrT58vbB5L6uNCmxq/zudqXvVK87kLqVePLy8gAA48aNczm/bt06zJkzBwCwcuVKBAQEYMaMGXA4HEhNTcVrr72mSrBERKR/biUeOZ1KQUFByM3NRW5ursdBERFRx7gDKRERaUqvTW3cj4eIiDTFGg8RkU4J0XwoLUNrTDxERDolwQDJzbXW2ipDa2xqIyIiTbHGQ0SkU56stdZWGVpj4iEi0isV+ngUL/bmASaeTiJntrM/zJzuKnx5NrzasXUVXWUlB1/ExENEpFN6HVzAxENEpFN6HU7NUW1ERKQp1niIiHRKr0vmMPEQEemUXodTs6mNiIg0xRoPEZFOCSifhuOFCg8TDxGRXjU3tSkcTs2mNiIi8nes8XiRL8+GJ894Yza82isSzMuPl3FV1/ldU2MVktrLV/CLf36hVkhOep3Hw8RDRKRTeh1OzaY2IiLSFGs8REQ6xaY2IiLSFJvaiIiIZGCNh4hIp4QKS+awqY2IiGTT68oFbGojIiJNscajA9yit/N4a3KuN7a+lq/j8sYH/0FWSWtSjyoNxsmXJ1x3XFbn1Cv0ujo1Ew8RkU7pdTg1m9qIiEhTrPEQEemUXufxMPEQEemUXvt42NRGRESaYo2HiEin9DqPh4mHiEin2NRGREQkA2s8REQ6pdd5PEw8fkSNLXrdKcsf+PJseF8md0UCedtoA/sure3wGrW/A3/4TvU6nJpNbUREpCm3Ek9OTg5GjRqF0NBQhIeHY9q0aSgtLXW5Zty4cTAYDC7Hgw8+qGrQRET0Y41HKDy8ELdbiaewsBAZGRkoLi7G7t27cfnyZUyaNAn19fUu182bNw9VVVXOY/ny5aoGTUREPw2nVnpoza0+nl27drm8Xr9+PcLDw1FSUoIxY8Y4z/fo0QNWq1VWmQ6HAw6Hw/nabre7ExIREemMoj4em80GAAgLC3M5v2HDBvTt2xcjRoxAVlYWLl68eM0ycnJyYLFYnEd0dLSSkIiIugzhafPazw5djWqTJAmLFi3CLbfcghEjRjjP33333YiNjUVUVBSOHj2KJUuWoLS0FFu3bm2znKysLGRmZjpf2+12Jh8iIhmEUGHlAj0lnoyMDBw7dgyffPKJy/kHHnjA+eebbroJkZGRmDhxIsrLyzFo0KBW5ZhMJphMJk/DICIinfGoqW3BggV4//33sW/fPgwYMKDda5OSkgAAZWVlntyKiIiuQVLp0JpbNR4hBBYuXIht27ahoKAAcXFxHb7nyJEjAIDIyEiPAiQiorY1D4dW1lbm81tfZ2RkYOPGjdixYwdCQ0NRXV0NALBYLAgODkZ5eTk2btyI3/zmN+jTpw+OHj2KxYsXY8yYMYiPlzeDmTpXV5rVrSZ+bp6RsyIBIP9zU5Oa32lX+T7V4lbiycvLA9A8SfTn1q1bhzlz5sBoNOLjjz/GqlWrUF9fj+joaMyYMQNPPfWUagETEVGzLrEtguhg+EN0dDQKCwsVBURERPKosfIAt0UgIiK/x9WpiYh0Svz4n9IytMbEQ0SkU2xqIyIikoE1HiIindLrRnBMPEREOiWECn08XlisjU1tRESkKdZ4qE2cqe+ZrjIbXu3fDznm5ctd/UTdz03Os3b0nLWXr+AX//xCrZCc2NRGRESaYlMbERGRDKzxEBHplIDypjKfX6uNiIh8hySECtsisKmNiIh82P79+zFlyhRERUXBYDBg+/btbpfBxENEpFNCpf/cUV9fj4SEBOTm5nocN5vaiIh0yhvDqdPS0pCWlqbonkw8REQEu93u8tpkMsFkMnXKvZh4SJGuMmFSbWpMSnSnLLV5JzZ5ZY0P/oOs69akHlUSjIuOn7NzOvAlqDC44Mf3R0dHu5zPzs7GsmXLFJV9LUw8REQ6peaotsrKSpjNZuf5zqrtAEw8REQEwGw2uySezsTEQ0SkU9yBlIiINKVmH49cdXV1KCsrc76uqKjAkSNHEBYWhpiYGFllMPEQEZFsBw8exPjx452vMzMzAQDp6elYv369rDKYeIiIdMobNZ5x48YpXtGaiYeISKf02sfDJXOIiEhTrPEQEemUUKGpjaPayG/pfaa+N/jy9uO+HJvcFQnkbqW979LaDq/x2tbXBgkGg7LV2iQvbH7NpjYiItIUazxERDolQcCg8ag2NTDxEBHplPhxQLXSMrTGpjYiItIUazxERDolASo0tWmPiYeISKc4qo2IiEgG1niIiHRKggSDwhqLN2o8TDxERDrFxEOkkC/Phvdlvvy5qRmb2t+nnBUJAGB88B9kXCVvtQRq5lYfT15eHuLj451bpCYnJ+PDDz90/ryhoQEZGRno06cPQkJCMGPGDNTU1KgeNBER/TSPR+mhNbcSz4ABA/D888+jpKQEBw8exIQJEzB16lR89dVXAIDFixdj586d2Lx5MwoLC3HmzBlMnz69UwInIurqJIOkyqE1t5rapkyZ4vL6L3/5C/Ly8lBcXIwBAwbgjTfewMaNGzFhwgQAwLp163DjjTeiuLgYv/rVr9os0+FwwOFwOF/b7XZ3n4GIiHTE4+HUTU1N2LRpE+rr65GcnIySkhJcvnwZKSkpzmuGDh2KmJgYFBUVXbOcnJwcWCwW5xEdHe1pSEREXYqApPg/n29qA4Avv/wSISEhMJlMePDBB7Ft2zYMGzYM1dXVMBqN6NWrl8v1ERERqK6uvmZ5WVlZsNlszqOystLthyAi6ooEmlQ5tOb2qLYhQ4bgyJEjsNls2LJlC9LT01FYWOhxACaTCSaTyeP3ExGRvrideIxGIwYPHgwASExMxBdffIGXXnoJM2fORGNjIy5cuOBS66mpqYHValUtYCIiatY8B0d/83gUL5kjSRIcDgcSExPRvXt37Nmzx/mz0tJSnDx5EsnJyUpvQ0REV5FU6uXRmls1nqysLKSlpSEmJga1tbXYuHEjCgoKkJ+fD4vFgrlz5yIzMxNhYWEwm81YuHAhkpOTrzmijcgTvjwp0Zf58ufmja3R5ZYnZ3LodVsz2v253X4R6KX+1td65VbiOXv2LO69915UVVXBYrEgPj4e+fn5uP322wEAK1euREBAAGbMmAGHw4HU1FS89tprnRI4EVFX1zw4wKC4DK25lXjeeOONdn8eFBSE3Nxc5ObmKgqKiIg61mX7eIiIiNzBRUKJiHRKjbXWvDGBlImHiEinJDQBCvt4JC/08bCpjYiINMUaDxGRTrGpjYiINCUJFZrahI8Pp9aCEC2zaLWfTUv+pfbyFRlX8ffsar76ucmLC5Abm/zyOma3X+zg55cA/Pzvt67NIHzskzh16hS3RiAiv1RZWYkBAwYoLsdut8NisaBPj0QEGJTVHyRxBecvlsBms8FsNiuOTQ6fq/FERUWhsrISoaGhMBiaq5B2ux3R0dGorKzU7INRm96fQe/xA/p/BsbvfZ4+gxACtbW1iIqKUjWe5j4eZU1l7OMBEBAQcM1/EZjNZt3+wrbQ+zPoPX5A/8/A+L3Pk2ewWCydFI3++FziISIieYSQICldq02wxkNERDI1N5MpXSSUa7W1yWQyITs7W9c7ler9GfQeP6D/Z2D83ucPz+ALfG5UGxERta9lVJslaBgMhkBFZQnRBFvD1117VBsREcnT3MPDpjYiIqJ2scZDRKRTzSPSOKqNiIg0osa21d7Y+ppNbUREpCldJJ7c3Fxcd911CAoKQlJSEj7//HNvhyTLsmXLYDAYXI6hQ4d6O6x27d+/H1OmTEFUVBQMBgO2b9/u8nMhBJYuXYrIyEgEBwcjJSUFx48f906wbego/jlz5rT6TiZPnuydYNuQk5ODUaNGITQ0FOHh4Zg2bRpKS0tdrmloaEBGRgb69OmDkJAQzJgxAzU1NV6KuDU5zzBu3LhW38ODDz7opYhd5eXlIT4+3rk6QXJyMj788EPnz33p8xdCQAhJ4aH9wGafTzzvvvsuMjMzkZ2djUOHDiEhIQGpqak4e/ast0OTZfjw4aiqqnIen3zyibdDald9fT0SEhKQm5vb5s+XL1+Ol19+GatXr8aBAwfQs2dPpKamoqGhQeNI29ZR/AAwefJkl+/knXfe0TDC9hUWFiIjIwPFxcXYvXs3Ll++jEmTJqG+vt55zeLFi7Fz505s3rwZhYWFOHPmDKZPn+7FqF3JeQYAmDdvnsv3sHz5ci9F7GrAgAF4/vnnUVJSgoMHD2LChAmYOnUqvvrqKwC+9fm37Mej9NA+cB83evRokZGR4Xzd1NQkoqKiRE5Ojhejkic7O1skJCR4OwyPARDbtm1zvpYkSVitVrFixQrnuQsXLgiTySTeeecdL0TYvqvjF0KI9PR0MXXqVK/E44mzZ88KAKKwsFAI0fx5d+/eXWzevNl5zf/+7/8KAKKoqMhbYbbr6mcQQoixY8eKRx991HtBual3795i7dq1PvP522w2AUAEG68TPUwDFR3BxusEAGGz2TSL36drPI2NjSgpKUFKSorzXEBAAFJSUlBUVOTFyOQ7fvw4oqKiMHDgQNxzzz04efKkt0PyWEVFBaqrq12+D4vFgqSkJN18HwBQUFCA8PBwDBkyBA899BDOnz/v7ZCuyWazAQDCwsIAACUlJbh8+bLLdzB06FDExMT47Hdw9TO02LBhA/r27YsRI0YgKysLFy+2v6eNNzQ1NWHTpk2or69HcnKyz33+QjSpcmjNp0e1nTt3Dk1NTYiIiHA5HxERgW+++cZLUcmXlJSE9evXY8iQIaiqqsLTTz+N2267DceOHUNoaKi3w3NbdXU1ALT5fbT8zNdNnjwZ06dPR1xcHMrLy/Gf//mfSEtLQ1FREQIDlc0AV5skSVi0aBFuueUWjBgxAkDzd2A0GtGrVy+Xa331O2jrGQDg7rvvRmxsLKKionD06FEsWbIEpaWl2Lp1qxej/cmXX36J5ORkNDQ0ICQkBNu2bcOwYcNw5MgRn/r81RgKzeHUfiYtLc355/j4eCQlJSE2Nhb/+Mc/MHfuXC9G1nXNmjXL+eebbroJ8fHxGDRoEAoKCjBx4kQvRtZaRkYGjh075vP9gu251jM88MADzj/fdNNNiIyMxMSJE1FeXo5BgwZpHWYrQ4YMwZEjR2Cz2bBlyxakp6ejsLDQ22H5DZ9uauvbty8CAwNbjRipqamB1Wr1UlSe69WrF2644QaUlZV5OxSPtHzm/vJ9AMDAgQPRt29fn/tOFixYgPfffx/79u1z2Z/KarWisbERFy5ccLneF7+Daz1DW5KSkgDAZ74Ho9GIwYMHIzExETk5OUhISMBLL73kc5+/XgcX+HTiMRqNSExMxJ49e5znJEnCnj17kJyc7MXIPFNXV4fy8nJERkZ6OxSPxMXFwWq1unwfdrsdBw4c0OX3ATRvtX7+/Hmf+U6EEFiwYAG2bduGvXv3Ii4uzuXniYmJ6N69u8t3UFpaipMnT/rMd9DRM7TlyJEjAOAz38PVJEmCw+Hwuc9f+VBqyStNbT4/qm3Tpk3CZDKJ9evXi6+//lo88MADolevXqK6utrboXXoscceEwUFBaKiokJ8+umnIiUlRfTt21ecPXvW26FdU21trTh8+LA4fPiwACBefPFFcfjwYXHixAkhhBDPP/+86NWrl9ixY4c4evSomDp1qoiLixOXLl3ycuTN2ou/trZWPP7446KoqEhUVFSIjz/+WPzyl78U119/vWhoaPB26EIIIR566CFhsVhEQUGBqKqqch4XL150XvPggw+KmJgYsXfvXnHw4EGRnJwskpOTvRi1q46eoaysTDzzzDPi4MGDoqKiQuzYsUMMHDhQjBkzxsuRN3vyySdFYWGhqKioEEePHhVPPvmkMBgM4qOPPhJC+Mbn3zKqrXtghDB2i1R0dA+M0HxUm88nHiGEeOWVV0RMTIwwGo1i9OjRori42NshyTJz5kwRGRkpjEaj6N+/v5g5c6YoKyvzdljt2rdvnwDQ6khPTxdCNA+p/vOf/ywiIiKEyWQSEydOFKWlpd4N+mfai//ixYti0qRJol+/fqJ79+4iNjZWzJs3z6f+EdNW7ADEunXrnNdcunRJPPzww6J3796iR48e4q677hJVVVXeC/oqHT3DyZMnxZgxY0RYWJgwmUxi8ODB4oknntD0L7723H///SI2NlYYjUbRr18/MXHiRGfSEcI3Pv+WxNMtsJ/o3i1C0dEtsJ/miYf78RAR6UzLfjyBAWEwGJT1mAghoUn6XtP9eHy6j4eIiPwPh1MTEemWABSPStO+0YuJh4hIp9TZj4eLhBIRkZ9jjYeISKeaJ38qrPGwqY2IiORTnni80cfDpjYiItIUazxERHqlwuACeGFwARMPEZFO6bWPh01tRESkKdZ4iIh0i4MLiIhIU6K5j0bJ4WHiyc3NxXXXXYegoCAkJSXh888/l/1eJh4iInLLu+++i8zMTGRnZ+PQoUNISEhAamoqzp49K+v9XJ2aiEhnWlanBgKhTlNbk1urUyclJWHUqFF49dVXATRvlBcdHY2FCxfiySef7PD9rPEQEenaNbdAknk0s9vtLofD4Wjzbo2NjSgpKUFKSorzXEBAAFJSUlBUVCQrYiYeIiKdMRqNsFqtAJpUOUJCQhAdHQ2LxeI8cnJy2rz3uXPn0NTUhIiICJfzERERqK6ulhU/R7UREelMUFAQKioq0NjYqEp5QggYDK5NdiaTSZWy28LEQ0SkQ0FBQQgKCtL8vn379kVgYCBqampcztfU1PxYC+sYm9qIiEg2o9GIxMRE7Nmzx3lOkiTs2bMHycnJsspgjYeIiNySmZmJ9PR03HzzzRg9ejRWrVqF+vp63HfffbLez8RDRERumTlzJr777jssXboU1dXVGDlyJHbt2tVqwMG1cB4PERFpin08RESkKSYeIiLSFBMPERFpiomHiIg0xcRDRESaYuIhIiJNMfEQEZGmmHiIiEhTTDxERKQpJh4iItIUEw8REWnq/wFwnwcXnTlccAAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# set the qibo backend (we suggest qibojit if N >= 20)\n", - "set_backend(\"qibojit\", \"numba\")\n", + "set_backend(\"qibojit\", \"qibojit\")\n", "\n", "# define the hamiltonian\n", "h = hamiltonians.TFIM(nqubits=5, h=3)\n", @@ -128,33 +117,25 @@ "source": [ "#### The generator of the evolution\n", "\n", - "The model is implemented following the procedure presented in [1], and the first practical step is to define the generator of the flow $\\hat{\\mathcal{U}}_{\\ell}$, which executes one diagonalization step $$\\hat{H}_{\\ell} = \\hat{\\mathcal{U}}_{\\ell}^{\\dagger} \\hat{H} \\hat{\\mathcal{U}}_{\\ell}.$$ In `Qibo`, we define the flow type through a `FlowGeneratorType` object, which can be chosen between one of the following:\n", + "The model is implemented following the procedure presented in [1], and the first practical step is to define the generator of the flow $\\hat{\\mathcal{U}}_{\\ell}$, which executes one diagonalization step $$\\hat{H}_{\\ell} = \\hat{\\mathcal{U}}_{\\ell}^{\\dagger} \\hat{H} \\hat{\\mathcal{U}}_{\\ell}.$$\n", + "In `Qibo`, we define the flow type through a `FlowGeneratorType` object, which can be chosen between one of the following:\n", "- `canonical`: the generator of the flow at step $k+1$ is defined using the commutator between the off diagonal part $\\sigma(\\hat{H_k})$ and the diagonal part $\\Delta(\\hat{H}_k)$ of the target evolved hamiltonian:\n", - " $$\\hat{\\mathcal{U}}_{k+1}=\\exp\\bigl\\{i[\\Delta(\\hat{H}_k), \\sigma(\\hat{H}_k)]\\bigr\\}.$$ \n", - "- `single_commutator`: the evolution follows a similar procedure of the previous point in this list, but any additional matrix $D$ can be used to control the evolution:\n", - " $$ \\hat{\\mathcal{U}}_{k+1}=\\exp\\bigl\\{i[D, \\hat{H}_k]\\bigr\\}. $$\n", + " $$\\hat{\\mathcal{U}}_{k+1}=\\exp\\bigl\\{s[\\Delta(\\hat{H}_k), \\sigma(\\hat{H}_k)]\\bigr\\}.$$ \n", + "- `single_commutator`: the evolution follows a similar procedure of the previous point in this list, but any additional matrix $D_k$ can be used to control the evolution at each step:\n", + " $$ \\hat{\\mathcal{U}}_{k+1}=\\exp\\bigl\\{s[D_k, \\hat{H}_k]\\bigr\\}. $$\n", "- `group_commutator`: the following group commutator is used to compute the evolution:\n", - " $$ \\hat{\\mathcal{U}}_{k+1}= e^{-isD} e^{is\\hat{H}} e^{-isD} e^{-is\\hat{H}}. $$\n", + " $$ \\hat{\\mathcal{U}}_{k+1}= e^{is\\hat{H_k}} e^{isD_k} e^{-is\\hat{H_k}} e^{-isD_k}, $$\n", + "which approximates the canonical commutator for small $s$.\n", "\n", "In order to set one of this evolution generators one can do as follow:" ] }, { "cell_type": "code", - "execution_count": 70, + "execution_count": null, "id": "26a487e9-366b-4203-b660-e3d4af2bcb68", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "FlowGeneratorType.canonical\n", - "FlowGeneratorType.single_commutator\n", - "FlowGeneratorType.group_commutator\n" - ] - } - ], + "outputs": [], "source": [ "# we have a look inside the FlowGeneratorType class\n", "for generator in FlowGeneratorType:\n", @@ -163,7 +144,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": null, "id": "da8dce89-27f6-403d-982a-58d531fade48", "metadata": {}, "outputs": [], @@ -184,7 +165,7 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": null, "id": "055870ec-55f2-4b99-a622-e3aa4c7dd0e9", "metadata": {}, "outputs": [], @@ -202,18 +183,10 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": null, "id": "9e278c3d-9f34-4a40-b453-4e030c751ef5", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Backend: qibojit (numba)\n" - ] - } - ], + "outputs": [], "source": [ "# on which qibo backend am I running the algorithm?\n", "print(f\"Backend: {dbf.backend}\")" @@ -221,25 +194,10 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": null, "id": "5b8e142b-a0a2-41bd-a16a-265a420b7360", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Initial form of the target hamiltonian:\n", - "[[-5.-0.j -3.-0.j -3.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", - " [-3.-0.j -1.-0.j -0.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", - " [-3.-0.j -0.-0.j -1.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", - " ...\n", - " [-0.-0.j -0.-0.j -0.-0.j ... -1.-0.j -0.-0.j -3.-0.j]\n", - " [-0.-0.j -0.-0.j -0.-0.j ... -0.-0.j -1.-0.j -3.-0.j]\n", - " [-0.-0.j -0.-0.j -0.-0.j ... -3.-0.j -3.-0.j -5.-0.j]]\n" - ] - } - ], + "outputs": [], "source": [ "# the initial target hamiltonian is a qibo hamiltonian\n", "# thus the matrix can be accessed typing h.matrix\n", @@ -248,21 +206,10 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": null, "id": "4f9d1d41-3df7-49cf-96ca-fa1019c00c33", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# let's visualize it in a more graphical way\n", "visualize_matrix(dbf.h0.matrix, r\"$H_0$\")" @@ -270,21 +217,10 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": null, "id": "7b864712-219c-44b6-8337-19ef0100e318", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcgAAAGiCAYAAABjzlbWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABFYklEQVR4nO3df1hUVf4H8PeAMKgwg6gwoKiYLlIKJgSN/VIhwfqWrGyp0aosi2sLVtD2A9fEcjfsh4oWydNqmiVp7LNpmVEEod9yxBwj04g1v7aQOGCygGDAwNzvH8bUyB2YYWYcLr5f+5xn5c65534u8zx8Oueec65MEAQBREREZMLF2QEQERH1R0yQREREIpggiYiIRDBBEhERiWCCJCIiEsEESUREJIIJkoiISAQTJBERkQgmSCIiIhFMkERERCKYIImIyGq5ubkYN24cPDw8EBUVhSNHjpite/LkSSQkJGDcuHGQyWTIycnpU5utra1ITU3F8OHD4enpiYSEBNTW1trztkwwQRIRkVV2796NjIwMZGVl4dixYwgLC0NsbCzq6upE61+6dAnjx4/H2rVroVKp+txmeno63n//fRQUFODAgQOoqanBvHnzHHKPAACBiIjICpGRkUJqaqrx587OTiEgIEDIzs7u9dyxY8cKGzZssLrNhoYGwc3NTSgoKDDWqaioEAAIGo3Ghrsxb5DjUi8RETlKa2sr2tvb7dKWIAiQyWQmx+RyOeRyebe67e3t0Gq1yMzMNB5zcXFBTEwMNBpNn65vSZtarRZ6vR4xMTHGOpMmTcKYMWOg0Whw88039+naPWGCJCKSmNbWVgQFqaDTNdqlPU9PTzQ3N5scy8rKwurVq7vV/fHHH9HZ2Qk/Pz+T435+fvj222/7dH1L2tTpdHB3d4e3t3e3Ojqdrk/X7Q0TJBGRxLS3t0Ona8T//WcDFIrBNrXV1PQTxo9NR3V1NRQKhfG4WO/xWsMESUQkUQrFYJsT5C9tKUwSpDkjRoyAq6trt9mjtbW1Zifg2KNNlUqF9vZ2NDQ0mPQibblubziLlYhIogShwy7FGu7u7ggPD0dxcbHxmMFgQHFxMdRqdZ/uw5I2w8PD4ebmZlKnsrISVVVVfb5ub9iDJCKSKEHohCB02tyGtTIyMrB48WJEREQgMjISOTk5aGlpQVJSEgBg0aJFGDVqFLKzswFcHhL+5ptvjP8+e/YsysvL4enpiQkTJljUplKpRHJyMjIyMuDj4wOFQoHly5dDrVY7ZIIOwARJRERWmj9/Ps6fP49Vq1ZBp9Nh6tSpKCwsNE6yqaqqgovLLwOUNTU1uPHGG40/v/TSS3jppZdwxx13oLS01KI2AWDDhg1wcXFBQkIC2traEBsbi1dffdVh9ykTBEFwWOtERGR3TU1NUCqV0P24zi6TdFQjHkNjY6NFzyCvJexBEhFJVF+eIYq1QeI4SYeIiEgEEyQRgHXr1mH//v3ODqNHUoiRrq7Lk3RsncVq2ySfgYxDrHTNKygowOrVq+Hm5oZTp05h+PDhzg6pGynESFefYOiAYLBxiNXG8wcy9iDpmtbW1oYnn3wSW7duxZ133omsrCxnh9SNFGIkGoiYIOmalpOTg8mTJ+P+++/Hpk2b8M477xjXa/UXUoiRnETosE8hUVzmQUQkMV3LPH6oWQGFwsPGtloxOuA5LvMQwR4kERGRCCZIumq2b98OmUyG77//3uT4F198genTp2Po0KGQyWQoLy+32zXHjRsn+sqeawl/BwOYoQMw6G0sHGI1hwmSetSV1LqKh4cHAgICEBsbi02bNuHixYs2ta/X63Hfffehvr4eGzZswJtvvomxY8fi0KFDWL16NRoaGuxzI1f46KOPIJPJkJ+fL/r5vffei6FDh8JgMDjk+paQQozkXM7YrPxawmUeZJFnn30WQUFB0Ov10Ol0KC0txaOPPor169fjvffeQ2hoaK9t/P73v8eCBQtM3jN3+vRp/Oc//8E//vEP/PGPfzQeP3ToEJ555hksWbKk2wtS7eGrr74CAERERIh+rtVqMXnyZJP9JK82KcRINJAxQZJF5syZY/KHOjMzEyUlJfif//kf3HvvvaioqMDgweJ7Qra0tGDo0KFwdXWFq6uryWd1dXUA4JAk2JPjx49DoVBg4sSJ3T7T6XSoqanB3XfffVVjupIUYiQnM3QABtfe6/XWBonif3pSn82aNQtPP/00/vOf/+Ctt94CAKxevRoymQzffPMNHnjgAQwbNgy33norgO7PIJcsWYI77rgDAHDfffdBJpNhxowZWL16NR5//HEAQFBQkHF4t+u8b7/9FlVVVTbF/tVXX+HGG2+ETCbr9plWqwUAhIWF2XQNW0khRnIyQ4d9ColiD5Js8vvf/x4rVqzAxx9/jJSUFOPx++67DxMnTsRzzz0HcyuJ/vSnP2HUqFF47rnn8PDDD+Omm26Cn58f/Pz88O9//xtvv/02NmzYgBEjRgAARo4cCQAICQkxeU2Otdrb21FZWYmFCxfiu+++6/Z5SUkJAFg0bOwoUoiRaKBjgiSbjB49GkqlEqdPnzY5HhYWZnZySRe1Wo22tjY899xzuO222/C73/3O+Nm0adPw9ttvIz4+HuPGjbNrzN988w30ej127NiBHTt2mK3nzOQjhRipP+i0w0J/7sVqDhMk2czT07PbbNZly5Y57Hq27m1x/PhxAJd3qBk1alS3z5ctWwYvLy8olUqr2zYYDGhvb7eorlwuFx0+dXSMNHDIDB2QGWx7UibjEKtZTJBks+bmZvj6+pocCwoKclI0vfvqq6/g6uqKZcuWmcyoBYCffvoJ//3vf43PTQHg/PnzWLJkCUpLSzF69Gi8+uqriI6OFm374MGDmDlzpkVxVFRUYNKkSXaJEQCSkpJw4sQJlJWVcWYrkR0wQZJNfvjhBzQ2NmLChAkmx83NaO0Pjh8/juuuu65b4gEuJy2DwWAydJmamgqVSoXz58/jk08+wf33349Tp07Bx8en2/mTJk3Ctm3bLIrD39/fbjEeOnQIDQ0NkMlk0Ov1oufRAGToAGzsQXKSjnlMkGSTN998EwAQGxtr13bNDT3aw/Hjx3HLLbeIfnby5EkAv8wObW5uxp49e/B///d/GDJkCO69915MmTIFe/fuRVJSUrfzVSoVlixZclVjBIC9e/di7ty5eOWVV5gcryVMkA7FcRjqs5KSEqxZswZBQUFITEy0a9tDhw4FANGddGxZ5qHT6VBXV4cbbrhB9PMrk8+pU6fg6emJ0aNHG+tMmTLFWM8RrI0RAEpLS9HZ2Yk777zTYXERXWvYgySLfPjhh/j222/R0dGB2tpalJSUoKioCGPHjsV7770HDw/b3ihwpfDwcADAX//6VyxYsABubm645557MHToUJuWeXTtTtNT8vH09MR1110H4HIP8so3HCgUCly4cMHqazsqxs7OTtTU1ODTTz/lnqvXGJnQAZlg4yQdbjVnFhMkWWTVqlUAAHd3d/j4+GDKlCnIyclBUlISvLy87H69m266CWvWrEFeXh4KCwthMBhw5swZY8+yr7pmh/aUfCZPnmwc4vX09ERTU5NJnaamJnh6etoUhz1jrK2thYuLC9zc3Lo9C6YBzmAADDYu0+BevmbxfZA0oI0bNw5Llizpc8+qubkZPj4+OHPmjHG5xcyZM7Fo0SLRZ5DO8O9//xtTp07Ft99+izFjxnT73NbfAfU/Xe+DPPvNfVB4udnW1kU9Rl1fwPdBiuAzSKIeeHp6Yu7cucjKysJPP/2Effv24fjx45g7d66zQzM6duwYfvOb3yAwMBDFxcXODoeuosvrIG0vJI4JkqgXr776KmpqajB8+HBkZGRg9+7doks8nKG9vR379+/H7NmzMWPGjG7DwTTAGTrtU0gUn0ES9WLkyJHYv3+/s8MQ5e7u3uNWdETUd0yQNKB1vQHkWsbfwQBm6AAMNq4Z5hCrWUyQREQSJTN02mEvVg6xmsNnkERERCL6XQ/SYDCgpqYGXl5eDt1ujIjoahEEARcvXkRAQIB9N5IXOm3fak5gD9Kcfpcga2pqEBgY6OwwiIjsrrq62mTbQlvJDAabh0hl3CjALIclyNzcXLz44ovQ6XQICwvDyy+/jMjIyF7P69qVJX/qXRjiatsCWCKi/uBSpx4PlO93yK5T5DgOSZC7d+9GRkYG8vLyEBUVhZycHMTGxqKysrLbewOv1DWsOsTVDUMHMUES0cBh98dGhk47zGLlEKs5Dpmks379eqSkpCApKQnXX3898vLyMGTIELz++uuOuBwR0TXp8ixW2wuJs3uCbG9vh1arRUxMzC8XcXFBTEwMNBpNt/ptbW1oamoyKURERM5m9wT5448/orOzE35+fibH/fz8oNPputXPzs6GUqk0Fk7QISKyELeacyinr4PMzMxEY2OjsVRXVzs7JCIiSeAQq2PZPUGOGDECrq6uqK2tNTleW1sLlUrVrb5cLodCoTApRETUv+Xm5mLcuHHw8PBAVFQUjhw50mP9goICTJo0CR4eHpgyZUq3/Y1lMploefHFF411xo0b1+3ztWvXOuT+AAckSHd3d4SHh5u8dsdgMKC4uBhqtdrelyMiunY5aYi1a6VCVlYWjh07hrCwMMTGxqKurk60/qFDh7Bw4UIkJyfjyy+/RHx8POLj43HixAljnXPnzpmU119/HTKZDAkJCSZtPfvssyb1li9fbnX8lnLIEGtGRgb+8Y9/4I033kBFRQUeeughtLS09JsXzBIRDQQyg/DzZgG2FMHq61q7UmHjxo2Ii4vD448/jpCQEKxZswbTpk3DK6+8YqyjUqlMyt69ezFz5kyMHz/epC0vLy+TekOHDrU6fks5JEHOnz8fL730ElatWoWpU6eivLwchYWF3SbuEBFR/3DlaoK2tjbRetauVAAAjUZjUh8AYmNjzdavra3FBx98gOTk5G6frV27FsOHD8eNN96IF198ER0djnsbicN20klLS0NaWpqjmiciIkMnYOtOcT8PsV65giArKwurV6/uVr2nlQrffvut6CV0Op3FKxsA4I033oCXlxfmzZtncvzhhx/GtGnT4OPjg0OHDiEzMxPnzp3D+vXre7zFvup3e7ESEZGFBDskyJ83K6+urjaZJCmXy21suO9ef/11JCYmwsPDw+R4RkaG8d+hoaFwd3fHn/70J2RnZzskXiZIIiKyeBWBtSsVgMvPFy2t/7//+7+orKzE7t27e40lKioKHR0d+P777xEcHNxrfWs5fR0kERH1jUww2KVYoy8rFdRqtUl9ACgqKhKtv3XrVoSHhyMsLKzXWMrLy+Hi4tLrHt99xR4kEZFU2fEZpDUyMjKwePFiREREIDIyEjk5OSYrFRYtWoRRo0YhOzsbAPDII4/gjjvuwLp163D33Xdj165dOHr0KF577TWTdpuamlBQUIB169Z1u6ZGo0FZWRlmzpwJLy8vaDQapKen48EHH8SwYcP6cOO9Y4IkIiKrzJ8/H+fPn8eqVaug0+kwdepUk5UKVVVVJi+Gnj59OvLz87Fy5UqsWLECEydOxJ49ezB58mSTdnft2gVBELBw4cJu15TL5di1axdWr16NtrY2BAUFIT093eS5pL3JBEGwfhGMAzU1NUGpVGJP+Fy+7oqIBoSWDj3itXvR2Nhol93Cuv5O/vjhRCiGutrWVksnRsw5ZbfYBhL2IImIpMpgsMP7IG0dox24OEmHiIhIBHuQREQSdXmrONvbIHFMkEREUmUw2GEWKxOkORxiJSIiEsEeJBGRVLEH6VBMkEREUsUE6VAcYiUiIhLBHiQRkVQJnUAfXnhs2gZ7kOYwQRIRSRSXeTgWh1iJiIhEsAdJRCRVnKTjUEyQRERSxQTpUBxiJSIiEsEeJBGRVBkE23uAts6CHcCYIImIpMog2GGIlQnSHA6xEhERiWAPkohIquzywmT2IM1hgiQikiomSIfiECsREZEI9iCJiKSKk3QcigmSiEiqBAMg2DjEKjBBmsMhViIiIhHsQRIRSZVghyFW9iDNYoIkIpIqPoN0KA6xEhERiWAPkohIqtiDdCgmSCIiiRIMl4utbZA4DrESERGJYA+SiEiqOMTqUEyQRERSZYAdEqQ9AhmYOMRKREQkwu4JcvXq1ZDJZCZl0qRJ9r4MEREZ7FRIlEOGWG+44QZ88sknv1xkEEdyiYjsTvi52NoGiXJI5ho0aBBUKpVFddva2tDW1mb8uampyREhERERWcUhzyBPnTqFgIAAjB8/HomJiaiqqjJbNzs7G0ql0lgCAwMdERIR0YAjGGR2KSTO7gkyKioK27dvR2FhITZv3owzZ87gtttuw8WLF0XrZ2ZmorGx0Viqq6vtHRIR0cDEZ5AOZfcEOWfOHNx3330IDQ1FbGws9u/fj4aGBrzzzjui9eVyORQKhUkhIqL+LTc3F+PGjYOHhweioqJw5MiRHusXFBRg0qRJ8PDwwJQpU7B//36Tz5csWdJtgmdcXJxJnfr6eiQmJkKhUMDb2xvJyclobm62+711cfgyD29vb/zmN7/Bd9995+hLERFdWwQZYLCx9OGFy7t370ZGRgaysrJw7NgxhIWFITY2FnV1daL1Dx06hIULFyI5ORlffvkl4uPjER8fjxMnTpjUi4uLw7lz54zl7bffNvk8MTERJ0+eRFFREfbt24eDBw9i6dKlVsdvKYcnyObmZpw+fRr+/v6OvhQR0TXFWc8g169fj5SUFCQlJeH6669HXl4ehgwZgtdff120/saNGxEXF4fHH38cISEhWLNmDaZNm4ZXXnnFpJ5cLodKpTKWYcOGGT+rqKhAYWEhtmzZgqioKNx66614+eWXsWvXLtTU1Fh9D5awe4L8y1/+ggMHDuD777/HoUOH8Nvf/haurq5YuHChvS9FRER20tTUZFJ+vbrg19rb26HVahETE2M85uLigpiYGGg0GtFzNBqNSX0AiI2N7Va/tLQUvr6+CA4OxkMPPYQLFy6YtOHt7Y2IiAjjsZiYGLi4uKCsrMzq+7WE3RPkDz/8gIULFyI4OBj3338/hg8fjsOHD2PkyJH2vhQR0bXN1uHVrgIgMDDQZEVBdna26CV//PFHdHZ2ws/Pz+S4n58fdDqd6Dk6na7X+nFxcdixYweKi4vx/PPP48CBA5gzZw46OzuNbfj6+pq0MWjQIPj4+Ji9rq3svg5y165d9m6SiIjECH17hmjaxuX/q66uNpkkKZfLbWvXSgsWLDD+e8qUKQgNDcV1112H0tJSREdHX9VYunAvViIi6raawFyCHDFiBFxdXVFbW2tyvLa21uwGMSqVyqr6ADB+/HiMGDHCOMFTpVJ1mwTU0dGB+vp6izemsRYTJBGRRDljko67uzvCw8NRXFxsPGYwGFBcXAy1Wi16jlqtNqkPAEVFRWbrA5cf1124cME4wVOtVqOhoQFardZYp6SkBAaDAVFRUVbdg6W4SSoRkVQZXIzPEPvehvWbsWZkZGDx4sWIiIhAZGQkcnJy0NLSgqSkJADAokWLMGrUKONzzEceeQR33HEH1q1bh7vvvhu7du3C0aNH8dprrwG4vNrhmWeeQUJCAlQqFU6fPo0nnngCEyZMQGxsLAAgJCQEcXFxSElJQV5eHvR6PdLS0rBgwQIEBATY9jswgwmSiIisMn/+fJw/fx6rVq2CTqfD1KlTUVhYaJyIU1VVBReXXwYop0+fjvz8fKxcuRIrVqzAxIkTsWfPHkyePBkA4OrqiuPHj+ONN95AQ0MDAgICMHv2bKxZs8ZkqHfnzp1IS0tDdHQ0XFxckJCQgE2bNjnsPmWCIPSrvdybmpqgVCqxJ3wuhg5yc3Y4REQ2a+nQI167F42NjXbZLazr72Td0wooPGzrQTa1CvBd02S32AYS9iCJiCRKEGQQbJzF2r+6SP0LJ+kQERGJYA+SiEiqnDRJ51rBBElEJFGCATa/z1FggjSLQ6xEREQi2IMkIpIqQWb7EKutW9UNYEyQREQSZZ9ZrEyQ5nCIlYiISAR7kEREUmVwuVxsasM+oQxETJBERBLVl83GxdogcRxiJSIiEsEeJBGRRHGSjmMxQRIRSRWfQToUh1iJiIhEsAdJRCRRnKTjWEyQREQSxWeQjsUhViIiIhHsQRIRSRUn6TgUEyQRkUTxGaRjcYiViIhIBHuQREQSxUk6jsUESUQkVYIdnkEK9gllIOIQKxERkQj2IImIJIqTdByLCZKISKIEwfZniAKHWM3iECsREZEI9iCJiKTKDkOs4BCrWUyQREQSJQguEATbBgIFjrGaxSFWIiIiEexBEhFJlUFm+xAph1jNYoIkIpIo7qTjWBxiJSIiEmF1gjx48CDuueceBAQEQCaTYc+ePSafC4KAVatWwd/fH4MHD0ZMTAxOnTplr3iJiOhnXRsF2FpInNUJsqWlBWFhYcjNzRX9/IUXXsCmTZuQl5eHsrIyDB06FLGxsWhtbbU5WCIi+kXXLFZbC4mz+hnknDlzMGfOHNHPBEFATk4OVq5ciblz5wIAduzYAT8/P+zZswcLFiywLVoiIqKrxK7/6XDmzBnodDrExMQYjymVSkRFRUGj0Yie09bWhqamJpNCRES94xCrY9k1Qep0OgCAn5+fyXE/Pz/jZ1fKzs6GUqk0lsDAQHuGREQ0YHXNYrW1kDinDz5nZmaisbHRWKqrq50dEhER9SI3Nxfjxo2Dh4cHoqKicOTIkR7rFxQUYNKkSfDw8MCUKVOwf/9+42d6vR5PPvkkpkyZgqFDhyIgIACLFi1CTU2NSRvjxo2DTCYzKWvXrnXI/QF2TpAqlQoAUFtba3K8trbW+NmV5HI5FAqFSSEiot45qwe5e/duZGRkICsrC8eOHUNYWBhiY2NRV1cnWv/QoUNYuHAhkpOT8eWXXyI+Ph7x8fE4ceIEAODSpUs4duwYnn76aRw7dgz/+te/UFlZiXvvvbdbW88++yzOnTtnLMuXL7c6fkvZNUEGBQVBpVKhuLjYeKypqQllZWVQq9X2vBQR0TVPEOzwDLIPCXL9+vVISUlBUlISrr/+euTl5WHIkCF4/fXXRetv3LgRcXFxePzxxxESEoI1a9Zg2rRpeOWVVwBcnqtSVFSE+++/H8HBwbj55pvxyiuvQKvVoqqqyqQtLy8vqFQqYxk6dKj1vzgLWZ0gm5ubUV5ejvLycgCXJ+aUl5ejqqoKMpkMjz76KP72t7/hvffew9dff41FixYhICAA8fHxdg6diIjs5crJkm1tbaL12tvbodVqTSZjuri4ICYmxuxkTI1GY1IfAGJjY83WB4DGxkbIZDJ4e3ubHF+7di2GDx+OG2+8ES+++CI6OjosvEPrWb3M4+jRo5g5c6bx54yMDADA4sWLsX37djzxxBNoaWnB0qVL0dDQgFtvvRWFhYXw8PCwX9RERGTXt3lcOUEyKysLq1ev7lb/xx9/RGdnp+hkzG+//Vb0GjqdzqrJm62trXjyySexcOFCk8duDz/8MKZNmwYfHx8cOnQImZmZOHfuHNavX9/rffaF1QlyxowZPb4eRSaT4dlnn8Wzzz5rU2BERNQzeyzT6Dq/urraJBnJ5XKb2u0rvV6P+++/H4IgYPPmzSafdXXIACA0NBTu7u7405/+hOzsbIfE6/RZrERE5HxXTpY0l3BGjBgBV1dXqyZjqlQqi+p3Jcf//Oc/KCoq6nXSZlRUFDo6OvD999/3cnd9wwRJRCRRzpjF6u7ujvDwcJPJmAaDAcXFxWYnY6rVapP6AFBUVGRSvys5njp1Cp988gmGDx/eayzl5eVwcXGBr6+vVfdgKb7uiohIopz1uquMjAwsXrwYERERiIyMRE5ODlpaWpCUlAQAWLRoEUaNGoXs7GwAwCOPPII77rgD69atw913341du3bh6NGjeO211wBcTo6/+93vcOzYMezbtw+dnZ3G55M+Pj5wd3eHRqNBWVkZZs6cCS8vL2g0GqSnp+PBBx/EsGHDbPodmMMESUREVpk/fz7Onz+PVatWQafTYerUqSgsLDROxKmqqoKLyy8DlNOnT0d+fj5WrlyJFStWYOLEidizZw8mT54MADh79izee+89AMDUqVNNrvXpp59ixowZkMvl2LVrF1avXo22tjYEBQUhPT3d5LmkvcmEnmbcOEFTUxOUSiX2hM/F0EFuzg6HiMhmLR16xGv3orGx0S6boXT9nTx+bzi83Gzr51zUdyD0Pa3dYhtI2IMkIpIoZw2xXis4SYeIiEgEe5BERBJln40C2E8yhwmSiEiiDIIMBhuHSG09fyDjfzoQERGJYA+SiEiq7LDVHGw9fwBjgiQikijOYnUsDrESERGJYA+SiEii2IN0LCZIIiKJYoJ0LA6xEhERiWAPkohIogyCCww2LvS39fyBjAmSiEiiBMH2ZR4cYjWP/+lAREQkgj1IIiKJ4iQdx2KCJCKSKCZIx+IQKxERkQj2IImIJIpv83AsJkgiIoniEKtjcYiViIhIBHuQREQSxR6kYzFBEhFJFJ9BOhaHWImIiESwB0lEJFGCYPsQqSDYKZgBiAmSiEii+AzSsTjESkREJII9SCIiiRLsMEmHPUjzmCCJiCSKQ6yOxSFWIiIiEexBEhFJFHuQjsUESUQkUdwowLE4xEpERCSCPUgiIoniEKtjWd2DPHjwIO655x4EBARAJpNhz549Jp8vWbIEMpnMpMTFxdkrXiIi+lnXEKuthcRZnSBbWloQFhaG3Nxcs3Xi4uJw7tw5Y3n77bdtCpKIiOhqs3qIdc6cOZgzZ06PdeRyOVQqlUXttbW1oa2tzfhzU1OTtSEREV2TBMggwMYhVhvPH8gcMkmntLQUvr6+CA4OxkMPPYQLFy6YrZudnQ2lUmksgYGBjgiJiGjA6XoGaWshcXZPkHFxcdixYweKi4vx/PPP48CBA5gzZw46OztF62dmZqKxsdFYqqur7R0SERHZWW5uLsaNGwcPDw9ERUXhyJEjPdYvKCjApEmT4OHhgSlTpmD//v0mnwuCgFWrVsHf3x+DBw9GTEwMTp06ZVKnvr4eiYmJUCgU8Pb2RnJyMpqbm+1+b13sniAXLFiAe++9F1OmTEF8fDz27duHL774AqWlpaL15XI5FAqFSSEiot45a5LO7t27kZGRgaysLBw7dgxhYWGIjY1FXV2daP1Dhw5h4cKFSE5Oxpdffon4+HjEx8fjxIkTxjovvPACNm3ahLy8PJSVlWHo0KGIjY1Fa2ursU5iYiJOnjyJoqIi7Nu3DwcPHsTSpUut/8VZyOHrIMePH48RI0bgu+++c/SliIiuKc4aYl2/fj1SUlKQlJSE66+/Hnl5eRgyZAhef/110fobN25EXFwcHn/8cYSEhGDNmjWYNm0aXnnllZ/vQ0BOTg5WrlyJuXPnIjQ0FDt27EBNTY1xpURFRQUKCwuxZcsWREVF4dZbb8XLL7+MXbt2oaamps+/w544PEH+8MMPuHDhAvz9/R19KSIi6qOmpiaT8uvJk7/W3t4OrVaLmJgY4zEXFxfExMRAo9GInqPRaEzqA0BsbKyx/pkzZ6DT6UzqKJVKREVFGetoNBp4e3sjIiLCWCcmJgYuLi4oKyvr2033wuoE2dzcjPLycpSXlwO4fGPl5eWoqqpCc3MzHn/8cRw+fBjff/89iouLMXfuXEyYMAGxsbH2jp2I6JpmgB2GWH+exRoYGGgyYTI7O1v0mj/++CM6Ozvh5+dnctzPzw86nU70HJ1O12P9rv/vrY6vr6/J54MGDYKPj4/Z69rK6mUeR48excyZM40/Z2RkAAAWL16MzZs34/jx43jjjTfQ0NCAgIAAzJ49G2vWrIFcLrdf1EREZFfV1dUmc0D4N7sPCXLGjBkQBMHs5x999JFNARERkWXsudWcpZMkR4wYAVdXV9TW1pocr62tNbv+XaVS9Vi/6/9ra2tNHsfV1tZi6tSpxjpXTgLq6OhAfX29xevurcXNyomIJMoAmV2KNdzd3REeHo7i4uJf4jAYUFxcDLVaLXqOWq02qQ8ARUVFxvpBQUFQqVQmdZqamlBWVmaso1ar0dDQAK1Wa6xTUlICg8GAqKgoq+7BUtysnIiIrJKRkYHFixcjIiICkZGRyMnJQUtLC5KSkgAAixYtwqhRo4zPMR955BHccccdWLduHe6++27s2rULR48exWuvvQYAkMlkePTRR/G3v/0NEydORFBQEJ5++mkEBAQgPj4eABASEoK4uDikpKQgLy8Per0eaWlpWLBgAQICAhxyn0yQRERSZY+dcPpw/vz583H+/HmsWrUKOp0OU6dORWFhoXGSTVVVFVxcfhmgnD59OvLz87Fy5UqsWLECEydOxJ49ezB58mRjnSeeeAItLS1YunQpGhoacOutt6KwsBAeHh7GOjt37kRaWhqio6Ph4uKChIQEbNq0yYab75lM6OmBohM0NTVBqVRiT/hcDB3k5uxwiIhs1tKhR7x2LxobG+2yGUrX38l3pv4OQ1xt+zt5qVOP+8v/abfYBhI+gyQiIhLBIVYiIoniC5MdiwmSiEiiDD8XW9sgcRxiJSIiEsEeJBGRRHGI1bGYIImIJMogoE+vq7qyDRLHIVYiIiIR7EESEUmUABkEK7eKE2uDxDFBEhFJVNcrq2xtg8RxiJWIiEgEe5BERBJ1eZKO7W2QOCZIIiKJ4jNIx+IQKxERkQj2IImIJIqTdByLCZKISKIE4XKxtQ0SxyFWIiIiEexBEhFJlAAZDJyk4zBMkEREEsXNyh2LQ6xEREQi2IMkIpIozmJ1LCZIIiKJEn4utrZB4jjESkREJII9SCIiieIQq2MxQRIRSZTh52JrGySOQ6xEREQi2IMkIpIoroN0LCZIIiKJ4jNIx+IQKxERkQj2IImIJIrrIB2LCZKISKI4xOpYHGIlIiISwR4kEZFEcR2kYzFBEhFJFJd5OJZVQ6zZ2dm46aab4OXlBV9fX8THx6OystKkTmtrK1JTUzF8+HB4enoiISEBtbW1dg2aiIjI0axKkAcOHEBqaioOHz6MoqIi6PV6zJ49Gy0tLcY66enpeP/991FQUIADBw6gpqYG8+bNs3vgRETXOgG/DLP2tXAWq3lWDbEWFhaa/Lx9+3b4+vpCq9Xi9ttvR2NjI7Zu3Yr8/HzMmjULALBt2zaEhITg8OHDuPnmm+0XORHRNU6AHYZYwSFWc2yaxdrY2AgA8PHxAQBotVro9XrExMQY60yaNAljxoyBRqMRbaOtrQ1NTU0mhYiIyNn6nCANBgMeffRR3HLLLZg8eTIAQKfTwd3dHd7e3iZ1/fz8oNPpRNvJzs6GUqk0lsDAwL6GRER0TTEI9ikkrs8JMjU1FSdOnMCuXbtsCiAzMxONjY3GUl1dbVN7RETXCsFOxVHq6+uRmJgIhUIBb29vJCcno7m5ucdzepvo+dVXX2HhwoUIDAzE4MGDERISgo0bN5q0UVpaCplM1q2Y66iZ06dlHmlpadi3bx8OHjyI0aNHG4+rVCq0t7ejoaHBpBdZW1sLlUol2pZcLodcLu9LGERE1I8lJibi3LlzxkmdSUlJWLp0KfLz882ek56ejg8++AAFBQVQKpVIS0vDvHnz8PnnnwO4/CjP19cXb731FgIDA3Ho0CEsXboUrq6uSEtLM2mrsrISCoXC+LOvr69V8VuVIAVBwPLly/Huu++itLQUQUFBJp+Hh4fDzc0NxcXFSEhIMAZYVVUFtVptVWBERNQze241d+X8D1s7LxUVFSgsLMQXX3yBiIgIAMDLL7+Mu+66Cy+99BICAgK6nWPJRM8//OEPJueMHz8eGo0G//rXv7olSF9f326P/Kxh1RBramoq3nrrLeTn58PLyws6nQ46nQ4//fQTAECpVCI5ORkZGRn49NNPodVqkZSUBLVazRmsRER2ZusSj1/vxBMYGGgyHyQ7O9um2DQaDby9vY3JEQBiYmLg4uKCsrIy0XP6MtETuJxYuyaL/trUqVPh7++PO++809gDtYZVPcjNmzcDAGbMmGFyfNu2bViyZAkAYMOGDXBxcUFCQgLa2toQGxuLV1991erAiIjo6qmurjYZjrT10ZdOp+s2pDlo0CD4+PiYfRbYl4mehw4dwu7du/HBBx8Yj/n7+yMvLw8RERFoa2vDli1bMGPGDJSVlWHatGkW34PVQ6y98fDwQG5uLnJzc61pmoiIrGTPreYUCoVJgjTnqaeewvPPP99jnYqKCptistSJEycwd+5cZGVlYfbs2cbjwcHBCA4ONv48ffp0nD59Ghs2bMCbb75pcfvci5WISKKcsVn5Y489ZhwxNGf8+PFQqVSoq6szOd7R0YH6+nqzkzatmej5zTffIDo6GkuXLsXKlSt7jTsyMhKfffZZr/V+jQmSiIgsNnLkSIwcObLXemq1Gg0NDdBqtQgPDwcAlJSUwGAwICoqSvQcSyd6njx5ErNmzcLixYvx97//3aK4y8vL4e/vb1HdLkyQREQSJQiXi61tOEJISAji4uKQkpKCvLw86PV6pKWlYcGCBcYZrGfPnkV0dDR27NiByMhIk4mePj4+UCgUWL58uclEzxMnTmDWrFmIjY1FRkaG8dmkq6urMXHn5OQgKCgIN9xwA1pbW7FlyxaUlJTg448/tuoemCCJiCTKABkMNu6lauv5Pdm5cyfS0tIQHR1tnLy5adMm4+d6vR6VlZW4dOmS8VhvEz3/+c9/4vz583jrrbfw1ltvGY+PHTsW33//PQCgvb0djz32GM6ePYshQ4YgNDQUn3zyCWbOnGlV/DLBkpk3V1FTUxOUSiX2hM/F0EFuzg6HiMhmLR16xGv3orGx0aKJML3p+ju5YsxSeLi429RWq6Edz1W9ZrfYBhL2IImIJMoee6lyL1bzmCCJiKTKDs8g+UJI82x63RUREdFAxR4kEZFE9fdJOlLHBElEJFH9eZnHQMAhViIiIhHsQRIRSZQztpq7ljBBEhFJFJd5OBaHWImIiESwB0lEJFECbF/GyA6keUyQREQSdXmI1cZlHsyQZnGIlYiISAR7kEREEsV1kI7FBElEJFFc5uFYHGIlIiISwR4kEZFEcYjVsZggiYgkikOsjsUhViIiIhHsQRIRSZRgh63mOMRqHhMkEZFEcScdx+IQKxERkQj2IImIJIpv83AsJkgiIoniMg/H4hArERGRCPYgiYgkiusgHYsJkohIovgM0rE4xEpERCSCPUgiIoniOkjHYoIkIpIoDrE6FodYiYiIRLAHSUQkUVwH6VhMkEREEsVlHo7FIVYiIiIRViXI7Oxs3HTTTfDy8oKvry/i4+NRWVlpUmfGjBmQyWQmZdmyZXYNmoiIfu5BCjYWZ99EP2ZVgjxw4ABSU1Nx+PBhFBUVQa/XY/bs2WhpaTGpl5KSgnPnzhnLCy+8YNegiYjol2UethYSZ9UzyMLCQpOft2/fDl9fX2i1Wtx+++3G40OGDIFKpbKozba2NrS1tRl/bmpqsiYkIiIih7DpGWRjYyMAwMfHx+T4zp07MWLECEyePBmZmZm4dOmS2Tays7OhVCqNJTAw0JaQiIiuGYKtw6t2mAU7kPU5QRoMBjz66KO45ZZbMHnyZOPxBx54AG+99RY+/fRTZGZm4s0338SDDz5otp3MzEw0NjYaS3V1dV9DIiK6pnQt87C1OEp9fT0SExOhUCjg7e2N5ORkNDc393hOa2srUlNTMXz4cHh6eiIhIQG1tbUmda6c5yKTybBr1y6TOqWlpZg2bRrkcjkmTJiA7du3Wx1/n5d5pKam4sSJE/jss89Mji9dutT47ylTpsDf3x/R0dE4ffo0rrvuum7tyOVyyOXyvoZBRET9VGJiIs6dO2ecs5KUlISlS5ciPz/f7Dnp6en44IMPUFBQAKVSibS0NMybNw+ff/65Sb1t27YhLi7O+LO3t7fx32fOnMHdd9+NZcuWYefOnSguLsYf//hH+Pv7IzY21uL4+5Qg09LSsG/fPhw8eBCjR4/usW5UVBQA4LvvvhNNkERE1Df2XAd55fwPWzsvFRUVKCwsxBdffIGIiAgAwMsvv4y77roLL730EgICArqd09jYiK1btyI/Px+zZs0CcDkRhoSE4PDhw7j55puNdb29vc3OdcnLy0NQUBDWrVsHAAgJCcFnn32GDRs2WJUgrRpiFQQBaWlpePfdd1FSUoKgoKBezykvLwcA+Pv7W3MpIiLqxeXniIKN5XJbgYGBJvNBsrOzbYpNo9HA29vbmBwBICYmBi4uLigrKxM9R6vVQq/XIyYmxnhs0qRJGDNmDDQajUnd1NRUjBgxApGRkXj99dch/GqsWKPRmLQBALGxsd3a6I1VPcjU1FTk5+dj79698PLygk6nAwAolUoMHjwYp0+fRn5+Pu666y4MHz4cx48fR3p6Om6//XaEhoZaFRgREV091dXVUCgUxp9tffSl0+ng6+trcmzQoEHw8fEx5g6xc9zd3U2GSwHAz8/P5Jxnn30Ws2bNwpAhQ/Dxxx/jz3/+M5qbm/Hwww8b2/Hz8+vWRlNTE3766ScMHjzYonuwKkFu3rwZwOXNAH5t27ZtWLJkCdzd3fHJJ58gJycHLS0tCAwMREJCAlauXGnNZYiIyAL2fN2VQqEwSZDmPPXUU3j++ed7rFNRUWFjVD17+umnjf++8cYb0dLSghdffNGYIO3FqgQp9DLdKTAwEAcOHLApICIisow9dsKx9nVXjz32GJYsWdJjnfHjx0OlUqGurs7keEdHB+rr680+O1SpVGhvb0dDQ4NJL7K2trbHtfVRUVFYs2YN2traIJfLoVKpus18ra2thUKhsLj3CHCzciIissLIkSMxcuTIXuup1Wo0NDRAq9UiPDwcAFBSUgKDwWCcvHml8PBwuLm5obi4GAkJCQCAyspKVFVVQa1Wm71WeXk5hg0bZhwWVqvV2L9/v0mdoqKiHtsQwwRJRCRRws//s7UNRwgJCUFcXBxSUlKQl5cHvV6PtLQ0LFiwwDiD9ezZs4iOjsaOHTsQGRkJpVKJ5ORkZGRkwMfHBwqFAsuXL4darTbOYH3//fdRW1uLm2++GR4eHigqKsJzzz2Hv/zlL8ZrL1u2DK+88gqeeOIJ/OEPf0BJSQneeecdfPDBB1bdAxMkEZFEOWOI1Ro7d+5EWloaoqOj4eLigoSEBGzatMn4uV6vR2Vlpcluaxs2bDDWbWtrQ2xsLF599VXj525ubsjNzUV6ejoEQcCECROwfv16pKSkGOsEBQXhgw8+QHp6OjZu3IjRo0djy5YtVi3xAACZ0NuDxausqakJSqUSe8LnYuggN2eHQ0Rks5YOPeK1e9HY2GjRRJjedP2dvMtzKdxk7ja1pRfasb/5NbvFNpCwB0lEJFF8YbJjMUESEUmUINjhGWT/GkTsV2x6mwcREdFAxR4kEZFEcYjVsZggiYgkikOsjsUhViIiIhHsQRIRSZQA24dI2X80jwmSiEiiDIIAg40pzsAhVrM4xEpERCSCPUgiIonqz3uxDgRMkEREEsVlHo7FIVYiIiIR7EESEUmUAXaYpMMhVrOYIImIJIqzWB2LQ6xEREQi2IMkIpIozmJ1LCZIIiKJ4jNIx+IQKxERkQj2IImIJIo9SMdigiQikig+g3QsDrESERGJYA+SiEiiBDsMsbIHaR4TJBGRRBlkBshktu2mauBurGZxiJWIiEgEe5BERBJlgAAZZ7E6DBMkEZFECT8v9LC1DRLHIVYiIiIR7EESEUmUAbDDECuZwwRJRCRRnMXqWBxiJSIiEsEeJBGRRBlggMzGHiB7kOYxQRIRSRQTpGNxiJWIiEiEVQly8+bNCA0NhUKhgEKhgFqtxocffmj8vLW1FampqRg+fDg8PT2RkJCA2tpauwdNRES/rIO0tZA4qxLk6NGjsXbtWmi1Whw9ehSzZs3C3LlzcfLkSQBAeno63n//fRQUFODAgQOoqanBvHnzHBI4EdG1ziAz2KWQOKueQd5zzz0mP//973/H5s2bcfjwYYwePRpbt25Ffn4+Zs2aBQDYtm0bQkJCcPjwYdx8882ibba1taGtrc34c1NTk7X3QEREZHd9fgbZ2dmJXbt2oaWlBWq1GlqtFnq9HjExMcY6kyZNwpgxY6DRaMy2k52dDaVSaSyBgYF9DYmI6JoiwGDz/zjEap7VCfLrr7+Gp6cn5HI5li1bhnfffRfXX389dDod3N3d4e3tbVLfz88POp3ObHuZmZlobGw0lurqaqtvgojoWiSg0y7FUerr65GYmAiFQgFvb28kJyejubm5x3N6m8uyfft2yGQy0VJXVwcAKC0tFf28p1wkxuplHsHBwSgvL0djYyP++c9/YvHixThw4IC1zRjJ5XLI5fI+n09ERP1TYmIizp07h6KiIuj1eiQlJWHp0qXIz883e056ejo++OADFBQUQKlUIi0tDfPmzcPnn38OAJg/fz7i4uJMzlmyZAlaW1vh6+trcryyshIKhcL485Wf98bqBOnu7o4JEyYAAMLDw/HFF19g48aNmD9/Ptrb29HQ0GDSi6ytrYVKpbL2MkRE1IvLaxjtsw7yyvkftnZeKioqUFhYiC+++AIREREAgJdffhl33XUXXnrpJQQEBHQ7p7Gxsde5LIMHD8bgwYON55w/fx4lJSXYunVrt/Z8fX27jWpaw+Z1kAaDAW1tbQgPD4ebmxuKi4uNn1VWVqKqqgpqtdrWyxAR0RUMdnoKCQCBgYEm80Gys7Ntik2j0cDb29uYHAEgJiYGLi4uKCsrEz2nL3NZduzYgSFDhuB3v/tdt8+mTp0Kf39/3HnnncYeqDWs6kFmZmZizpw5GDNmDC5evIj8/HyUlpbio48+glKpRHJyMjIyMuDj4wOFQoHly5dDrVabncFKRET9Q3V1tclwpK2PvnQ6XbchzUGDBsHHx8fss8C+zGXZunUrHnjgAZNepb+/P/Ly8hAREYG2tjZs2bIFM2bMQFlZGaZNm2bxPViVIOvq6rBo0SKcO3cOSqUSoaGh+Oijj3DnnXcCADZs2AAXFxckJCSgra0NsbGxePXVV625BBERWejyJBuZzW0AMG4A05unnnoKzz//fI91KioqbIrJUhqNBhUVFXjzzTdNjgcHByM4ONj48/Tp03H69Gls2LChW92eWJUgxcZ4f83DwwO5ubnIzc21plkiIuoDez6DtNRjjz2GJUuW9Fhn/PjxUKlUxlmlXTo6OlBfX292XopKpbJqLsuWLVswdepUhIeH9xp3ZGQkPvvss17r/Ro3KyciIouNHDkSI0eO7LWeWq1GQ0MDtFqtMYGVlJTAYDAgKipK9Jxfz2VJSEgAYH4uS3NzM9555x2Ln5WWl5fD39/forpdmCCJiCTKHnupOmqjgJCQEMTFxSElJQV5eXnQ6/VIS0vDggULjDNYz549i+joaOzYsQORkZFWzWXZvXs3Ojo68OCDD3a7dk5ODoKCgnDDDTegtbUVW7ZsQUlJCT7++GOr7oEJkohIogzoBGx8Bmlw4EYBO3fuRFpaGqKjo43zUzZt2mT8XK/Xo7KyEpcuXTIes3Quy9atWzFv3jzRZRzt7e147LHHcPbsWQwZMgShoaH45JNPMHPmTKvilwmCIFh1hoM1NTVBqVRiT/hcDB3k5uxwiIhs1tKhR7x2LxobGy2aCNObrr+TfkOnw0VmWz/HIHSgtuWQ3WIbSNiDJCKSqP48xDoQMEESEUmUQbDDEKvguCFWqet3CbJrxPdSp97JkRAR2UfX37N+9kSLetHvEuTFixcBAA+U73dyJERE9nXx4kUolUq7tcchVsfqdwkyICAA1dXV8PLygkx2eeigqakJgYGB3bZCkhKp34PU4wekfw+M3/n6eg+CIODixYuiG3Tb4nKCtG2IlAnSvH6XIF1cXDB69GjRzyzdCqk/k/o9SD1+QPr3wPidry/3YM+eI10d/S5BEhGRZQTBAIOte7EK7EGawwRJRCRRl4dHbd2snAnSHJvfB3k1yOVyZGVl2fz6FWeS+j1IPX5A+vfA+J1vINwDWa7f7aRDREQ969pJR+lxPWQyV5vaEoRONLZ+w510RHCIlYhIoi4/geQQq6NIYoiViIjoamMPkohIoi7PQOUsVkdhgiQikihbNwmwVxsDFYdYiYiIREgiQebm5mLcuHHw8PBAVFQUjhw54uyQLLJ69WrIZDKTMmnSJGeH1aODBw/innvuQUBAAGQyGfbs2WPyuSAIWLVqFfz9/TF48GDExMTg1KlTzglWRG/xL1mypNt3EhcX55xgRWRnZ+Omm26Cl5cXfH19ER8fj8rKSpM6ra2tSE1NxfDhw+Hp6YmEhATU1tY6KeLuLLmHGTNmdPseli1b5qSITW3evBmhoaHG3XLUajU+/PBD4+f96fcvCAIEwWBj4UIGc/p9gty9ezcyMjKQlZWFY8eOISwsDLGxsairq3N2aBa54YYbcO7cOWP57LPPnB1Sj1paWhAWFobc3FzRz1944QVs2rQJeXl5KCsrw9ChQxEbG4vW1tarHKm43uIHgLi4OJPv5O23376KEfbswIEDSE1NxeHDh1FUVAS9Xo/Zs2ejpaXFWCc9PR3vv/8+CgoKcODAAdTU1GDevHlOjNqUJfcAACkpKSbfwwsvvOCkiE2NHj0aa9euhVarxdGjRzFr1izMnTsXJ0+eBNC/fv9dm5XbWsgMoZ+LjIwUUlNTjT93dnYKAQEBQnZ2thOjskxWVpYQFhbm7DD6DIDw7rvvGn82GAyCSqUSXnzxReOxhoYGQS6XC2+//bYTIuzZlfELgiAsXrxYmDt3rlPi6Yu6ujoBgHDgwAFBEC7/vt3c3ISCggJjnYqKCgGAoNFonBVmj668B0EQhDvuuEN45JFHnBeUlYYNGyZs2bKl3/z+GxsbBQDCYPdxwhD5eJvKYPdxAgChsbHxqsUvFf26B9ne3g6tVouYmBjjMRcXF8TExECj0TgxMsudOnUKAQEBGD9+PBITE1FVVeXskPrszJkz0Ol0Jt+HUqlEVFSUZL4PACgtLYWvry+Cg4Px0EMP4cKFC84OyazGxkYAgI+PDwBAq9VCr9ebfAeTJk3CmDFj+u13cOU9dNm5cydGjBiByZMnIzMzE5cuXXJGeD3q7OzErl270NLSArVa3e9+/4LQaZdC4vr1LNYff/wRnZ2d8PPzMznu5+eHb7/91klRWS4qKgrbt29HcHAwzp07h2eeeQa33XYbTpw4AS8vL2eHZzWdTgcAot9H12f9XVxcHObNm4egoCCcPn0aK1aswJw5c6DRaODqatuOJPZmMBjw6KOP4pZbbsHkyZMBXP4O3N3d4e3tbVK3v34HYvcAAA888ADGjh2LgIAAHD9+HE8++SQqKyvxr3/9y4nR/uLrr7+GWq1Ga2srPD098e677+L6669HeXl5v/r922OJBpd5mNevE6TUzZkzx/jv0NBQREVFYezYsXjnnXeQnJzsxMiuXQsWLDD+e8qUKQgNDcV1112H0tJSREdHOzGy7lJTU3HixIl+/9y6J+buYenSpcZ/T5kyBf7+/oiOjsbp06dx3XXXXe0wuwkODkZ5eTkaGxvxz3/+E4sXL8aBAwecHRZdZf16iHXEiBFwdXXtNkOstrYWKpXKSVH1nbe3N37zm9/gu+++c3YofdL1Ox8o3wcAjB8/HiNGjOh330laWhr27duHTz/91OT9qCqVCu3t7WhoaDCp3x+/A3P3ICYqKgoA+s334O7ujgkTJiA8PBzZ2dkICwvDxo0b+93vn5N0HKtfJ0h3d3eEh4ejuLjYeMxgMKC4uBhqtdqJkfVNc3MzTp8+DX9/f2eH0idBQUFQqVQm30dTUxPKysok+X0AwA8//IALFy70m+9EEASkpaXh3XffRUlJCYKCgkw+Dw8Ph5ubm8l3UFlZiaqqqn7zHfR2D2LKy8sBoN98D1cyGAxoa2vrd79/25d4GDjE2oN+P8SakZGBxYsXIyIiApGRkcjJyUFLSwuSkpKcHVqv/vKXv+Cee+7B2LFjUVNTg6ysLLi6umLhwoXODs2s5uZmk/+KP3PmDMrLy+Hj44MxY8bg0Ucfxd/+9jdMnDgRQUFBePrppxEQEID4+HjnBf0rPcXv4+ODZ555BgkJCVCpVDh9+jSeeOIJTJgwAbGxsU6M+hepqanIz8/H3r174eXlZXyupVQqMXjwYCiVSiQnJyMjIwM+Pj5QKBRYvnw51Go1br75ZidHf1lv93D69Gnk5+fjrrvuwvDhw3H8+HGkp6fj9ttvR2hoqJOjBzIzMzFnzhyMGTMGFy9eRH5+PkpLS/HRRx9J4vdPduTsabSWePnll4UxY8YI7u7uQmRkpHD48GFnh2SR+fPnC/7+/oK7u7swatQoYf78+cJ3333n7LB69OmnnwoAupXFixcLgnB5qcfTTz8t+Pn5CXK5XIiOjhYqKyudG/Sv9BT/pUuXhNmzZwsjR44U3NzchLFjxwopKSmCTqdzdthGYrEDELZt22as89NPPwl//vOfhWHDhglDhgwRfvvb3wrnzp1zXtBX6O0eqqqqhNtvv13w8fER5HK5MGHCBOHxxx/vN8sM/vCHPwhjx44V3N3dhZEjRwrR0dHCxx9/bPy8P/z+u5Z5DHIdKbgN8rOpDHIdyWUeZvB9kEREEtP1PkhXFx/IZLY9KRMEAzoN9XwfpIh+/QySiIjIWfr9M0giIjJHAGyehcpBRHOYIImIJMo+74NkgjSHQ6xEREQi2IMkIpKoy4v8bexBcojVLCZIIiLJsj1B8hmkeRxiJSIiEsEeJBGRVNlhkg44SccsJkgiIoniM0jH4hArERGRCPYgiYgki5N0HIk9SCIiyRIuP0O0pTgwQdbX1yMxMREKhQLe3t5ITk5Gc3Nzj+e89tprmDFjBhQKBWQyWbd3b1ra7vHjx3HbbbfBw8MDgYGBeOGFF6yOnwmSiIgcIjExESdPnkRRURH27duHgwcPYunSpT2ec+nSJcTFxWHFihV9brepqQmzZ8/G2LFjodVq8eKLL2L16tV47bXXrLsBJ79NhIiIrNT1uivAVQAG2VhcHfK6q2+++UYAIHzxxRfGYx9++KEgk8mEs2fP9np+16vr/vvf/1rd7quvvioMGzZMaGtrM9Z58sknheDgYKvugT1IIiJJM/sKTgvLZU1NTSalra3Npqg0Gg28vb0RERFhPBYTEwMXFxeUlZU5tF2NRoPbb78d7u7uxjqxsbGorKzEf//7X4uvxQRJRCQx7u7uUKlUADrtUjw9PREYGAilUmks2dnZNsWo0+ng6+trcmzQoEHw8fGBTqdzaLs6nQ5+fn4mdbp+tubanMVKRCQxHh4eOHPmDNrb2+3SniAIkMlMZ8PK5XLRuk899RSef/75HturqKiwS1zOxgRJRCRBHh4e8PDwuOrXfeyxx7BkyZIe64wfPx4qlQp1dXUmxzs6OlBfX/9z77dvLGlXpVKhtrbWpE7Xz9ZcmwmSiIgsNnLkSIwcObLXemq1Gg0NDdBqtQgPDwcAlJSUwGAwICoqqs/Xt6RdtVqNv/71r9Dr9XBzcwMAFBUVITg4GMOGDbP4WnwGSUREdhcSEoK4uDikpKTgyJEj+Pzzz5GWloYFCxYgICAAAHD27FlMmjQJR44cMZ6n0+lQXl6O7777DgDw9ddfo7y8HPX19Ra3+8ADD8Dd3R3Jyck4efIkdu/ejY0bNyIjI8O6m7BqzisREZGFLly4ICxcuFDw9PQUFAqFkJSUJFy8eNH4+ZkzZwQAwqeffmo8lpWVJTrddtu2bRa3KwiC8NVXXwm33nqrIJfLhVGjRglr1661On6ZIHArdyIioitxiJWIiEgEEyQREZEIJkgiIiIRTJBEREQimCCJiIhEMEESERGJYIIkIiISwQRJREQkggmSiIhIBBMkERGRCCZIIiIiEf8PsllLZ28TyJgAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# since we didn't perform yet any evolutionary step they are the same\n", "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" @@ -300,21 +236,10 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": null, "id": "da3d3aaa-17e1-492e-bcd3-b510f44a5391", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# diagonal part of the H target\n", "visualize_matrix(dbf.diagonal_h_matrix)" @@ -322,18 +247,10 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": null, "id": "24d0dfa1-7039-4d7d-8aa3-5a937b9ab0b8", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "HS norm of the off diagonal part of H: 1440.0\n" - ] - } - ], + "outputs": [], "source": [ "# Hilbert-Schmidt norm of the off-diagonal part\n", "# which we want to bring to be close to zero\n", @@ -352,19 +269,10 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": null, "id": "9a886261-8aa6-4df0-a31b-9c39847db124", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Initial value of the off-diagonal norm: 1440.0\n", - "One step later off-diagonal norm: 1168.2530943739996\n" - ] - } - ], + "outputs": [], "source": [ "# perform one evolution step\n", "\n", @@ -387,21 +295,10 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": null, "id": "cc74812d-7c2c-44e4-afc2-e235968801b4", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" ] @@ -416,18 +313,10 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": null, "id": "aad79966-7a11-4a45-aba5-4a4bb8315c50", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "100%|█████████████████████████████████████████████████████████████████████████| 1000/1000 [00:09<00:00, 100.75trial/s, best loss: 828.6241921617013]\n" - ] - } - ], + "outputs": [], "source": [ "# restart\n", "dbf.h = dbf.h0\n", @@ -445,42 +334,20 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": null, "id": "49483a47-d29d-440e-a4bc-143bfe6bb3cf", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "visualize_matrix(dbf.h.matrix)" ] }, { "cell_type": "code", - "execution_count": 83, + "execution_count": null, "id": "6bdaf7f9-7e49-4a16-8b29-ae1f9746cd9b", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" ] @@ -499,7 +366,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": null, "id": "59a6a485-a714-4e14-b27a-1df2930068ee", "metadata": {}, "outputs": [], @@ -522,21 +389,10 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": null, "id": "7e0b2f18-ca53-4f34-9fcf-0052dcc31dc5", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeAAAAF2CAYAAAC260vLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABbfUlEQVR4nO3deVhU5f//8ecM+44gq6LgkvuKSq5ZIG6VmmUW39IyzdTMbP9VblmmlR/TzKw+aotW2mJ9rFTc0xARdyRXVFIWFRGQbWDO7w9icgRkm+Ew8H5cF5fMmfvc53VuD7w5Z86iURRFQQghhBA1Sqt2ACGEEKI+kgIshBBCqEAKsBBCCKECKcBCCCGECqQACyGEECqQAiyEEEKoQAqwEEIIoQIpwEIIIYQKpAALIYQQKpACLEQtsXHjRjp37oy9vT0ajYb09HS1I5VKo9Ewa9asGl/u2LFjcXZ2rlBbtTKW5dy5c2g0GlatWqV2FFGLSAEWddqqVavQaDTs379f7Si3dfXqVUaNGoWDgwNLly7lq6++wsnJSbU8v/32W60qYDVhzZo1LFq0SO0Yoh6xVjuAEAJiYmLIzMzkrbfeIiwsTO04/PbbbyxdurTUIpyTk4O1de3+1VGVjGvWrOHYsWNMmzbN5HmaNm1KTk4ONjY2Ju9bWK7a/VMkRD2RmpoKgLu7u7pBKsDe3l7tCOWqLRkLCgrQ6/XY2trWmkyi9pBD0EIABw8eZPDgwbi6uuLs7ExoaCh79+41aqPT6Zg9ezYtW7bE3t4eT09P+vTpQ2RkpKFNcnIyTzzxBI0bN8bOzg4/Pz+GDRvGuXPnylx2//79GTNmDADdu3dHo9EwduxYAAIDAw3f3zpP//79Da937NiBRqNh7dq1vP322zRu3Bh7e3tCQ0M5ffp0ifmjo6MZMmQIDRo0wMnJiY4dO/Lhhx8CRZ+1Ll26FCj6LLX4q1hpn69WZPyKPw7Ys2cP06dPx8vLCycnJ0aMGMHly5fLHJ9bXbx4keHDh+Ps7IyXlxcvvvgihYWFRm1uzZiZmcm0adMIDAzEzs4Ob29vBgwYwIEDBwzj+euvv3L+/HnD+gYGBhrmT01NZdy4cfj4+GBvb0+nTp344osvjJZZ/Dnv+++/z6JFi2jevDl2dnYcP368zM+A//rrLx588EE8PDywt7enW7du/PLLL0ZtKrLdCcske8Ci3ouLi6Nv3764urry8ssvY2Njw/Lly+nfvz87d+4kJCQEgFmzZjFv3jyeeuopevToQUZGBvv37+fAgQMMGDAAgJEjRxIXF8ezzz5LYGAgqampREZGcuHCBaNf6Dd7/fXXadWqFZ9++ilz5swhKCiI5s2bV2ld3n33XbRaLS+++CLXr19nwYIFREREEB0dbWgTGRnJvffei5+fH8899xy+vr7Ex8ezYcMGnnvuOZ5++mkuXbpEZGQkX331lcnGr9izzz5LgwYNmDlzJufOnWPRokVMmTKF7777rtxlFRYWMnDgQEJCQnj//ffZsmULH3zwAc2bN+eZZ54pc76JEyfy/fffM2XKFNq2bcvVq1fZvXs38fHxdO3alddff53r16/z999/85///AfAcMJXTk4O/fv35/Tp00yZMoWgoCDWrVvH2LFjSU9P57nnnjNa1sqVK8nNzWXChAnY2dnh4eGBXq8vddx69+5No0aNePXVV3FycmLt2rUMHz6cH374gREjRgAV2+6EhVKEqMNWrlypAEpMTEyZbYYPH67Y2toqZ86cMUy7dOmS4uLiovTr188wrVOnTsrQoUPL7OfatWsKoLz33nsmy9m0aVNlzJgxJdrfddddyl133WV4vX37dgVQ2rRpo+Tl5Rmmf/jhhwqgHD16VFEURSkoKFCCgoKUpk2bKteuXTPqU6/XG76fPHmyUtavB0CZOXOm4XVFx694HcPCwoyW9fzzzytWVlZKenp6qcsrNmbMGAVQ5syZYzS9S5cuSnBw8G0zurm5KZMnT75t/0OHDlWaNm1aYvqiRYsUQPn6668N0/Lz85WePXsqzs7OSkZGhqIoipKQkKAAiqurq5KammrUR/F7K1euNEwLDQ1VOnTooOTm5hqm6fV6pVevXkrLli0N08rb7oTlkkPQol4rLCxk8+bNDB8+nGbNmhmm+/n58eijj7J7924yMjKAos9n4+LiOHXqVKl9OTg4YGtry44dO7h27VqN5L/VE088ga2treF13759ATh79ixQdKg4ISGBadOmlfi8+ebDzBVVmfErNmHCBKNl9e3bl8LCQs6fP1+hZU6cONHodd++fQ3rVxZ3d3eio6O5dOlShZZxs99++w1fX18eeeQRwzQbGxumTp1KVlYWO3fuNGo/cuRIvLy8bttnWloa27ZtY9SoUWRmZnLlyhWuXLnC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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "plot_histories(histories, labels)" ] @@ -551,37 +407,10 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": null, "id": "a6fd1e33-3620-4f3b-b705-a120f6da0027", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "100%|███████████████████████████████████████████████████████████████████████████| 500/500 [00:03<00:00, 139.16trial/s, best loss: 829.4328971659771]\n", - "New optimized step: 0.011402705976672802\n", - "New optimized step: 0.006325014072323076\n", - "New optimized step: 0.010001573165578734\n", - "New optimized step: 0.007316716304573426\n", - "New optimized step: 0.0076802187698581095\n", - "New optimized step: 0.005495896033227967\n", - "New optimized step: 0.007264060988945372\n", - "New optimized step: 0.01135271597899832\n", - "New optimized step: 0.006630479573440658\n", - "New optimized step: 0.012085489806130539\n", - "New optimized step: 0.005846928182131419\n", - "New optimized step: 0.008295938853037754\n", - "New optimized step: 0.0004088170011721827\n", - "New optimized step: 0.00036462944225239616\n", - "New optimized step: 0.0010186195535541141\n", - "New optimized step: 0.008008841699702174\n", - "New optimized step: 0.0018840493701289263\n", - "New optimized step: 0.005885553634458635\n", - "New optimized step: 0.0026508328880453513\n" - ] - } - ], + "outputs": [], "source": [ "# restart\n", "dbf_2 = DoubleBracketFlow(hamiltonian=deepcopy(h), mode=flowtype)\n", @@ -597,7 +426,7 @@ " space = hp.uniform,\n", " optimizer = tpe,\n", " max_evals = 500,\n", - " verbose = True \n", + " verbose = True\n", ")\n", "\n", "for s in range(NSTEPS):\n", @@ -607,7 +436,7 @@ " step_max = 1,\n", " space = hp.uniform,\n", " optimizer = tpe,\n", - " max_evals = 100, \n", + " max_evals = 100,\n", " )\n", " print(f\"New optimized step: {step}\")\n", " dbf_2(step=step)\n", @@ -619,21 +448,10 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": null, "id": "0f0212bf-b642-4fea-9203-037876e0b266", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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jvx+gNR48/0yClGdaHwCcWjc+d/fOzNq1KgR+/fv54477uDhhx+mQYMGjB07lnvuuYfdu3fj6+trVP7FF19k//79dOjQgffff5/333+fvn37Gva///77REZGEhISYli61Ry2bdtGfHw8zZs3JygoyPCza9euCtUXFhbGypUr+eWXX2jdujWLFy82jIJ2cnIq9hhvb28+//xzunTpQuvWrdm4cSO///674ZnnGTNmcP78eRo0aGDoxm/dujXbtm3j1KlTdOvWzbCkrX5NeD39de7RowezZs1i/vz5RtfZHKQL2krd+iiSxt3ntuU9/D0Jf7w72xdvIj83n+/GLUPRKAydM5xOw8Nve6wQomrVr1/f0NorjaenJz/++KOhy9zT09Nov747trBp06Yxbdo0w/vizqV/frewwku6hoaGGvW+Fbfca0nHAuTn55OWlma07dbne++//37uv/9+w/tZs2ZRt25dw8jkWw0ZMoQhQ4aUGMNdd93F4cOHi2zv1KkTGzZsuG38np6e/PDDD4ZrXBVLvUoL2EoZPYpUxskB2g41HlGo6lRWvfa9tISFEFbpk08+ISoqinPnzvHNN98wb948Ro0aZemwqoy0gK2UphyPIullJqcX2abmq9w4fx2voNu3oIUQoqqdPn2amTNnkpSURL169XjxxRd5/fXXLR1WlZEEbKUK34sqy0hoKHgkSdEoqLp/u40UO4VaobVNHp8QwvxK6/a1dR988AEffPCBpcMwXOfKPCJVEdIFbaU0FeiC9gryYegc4xlsuj/TS1q/QghhhSQBW6mKtIABOg0PZ+DUfx/wz0rNMmlcQliT8swoJYSpmOp7JwnYSikunuBY8JB+eVdo6TTibhxdHQE48vsBtNlak8cnhCXpZz3KzMy0cCSiJtJ/70qafaus5B6wlVIUBY13ILrEOMNkHCU9nH4rJzcnWgxoy8GV+8hOzeLExmO0us98zwcKUdXs7Ozw9vY2zCvs6upa5t8PPZ1OR25uLtnZ2VXyyEllSbzmV1rMqqqSmZlJYmIi3t7e2NmVfbrS4kgCtmIanwB0iXGQk4manY7iUvbpJdsP68TBlfsAOPDzPknAotrRr3hT2uIBJVFVlaysLFxcXMqdvC1B4jW/ssZcltWnykISsBUrPBBLTbkK5UjAd9zdCK9gH1KvJHNqSyzp12/K/NCiWlEUhaCg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ZCQADz30UInHVOX1zcjIoE2bNiU+wjd37lw++ugjPv30U/bu3Yubmxt9+/YlOzu7xDrL+ztgqngzMzM5cOAAb731FgcOHOCXX37h5MmT3H///aXWW57vlani1evXr5/Rub/77rvb1mmp6wsYxRkfH8+XX36JoiiGWQhLYo7rW5a/X6WtFV+cinznb0sVVebOO+9Ux48fb3ifn5+vBgcHq7Nnzy62/MMPP6wOHDjQaFvnzp3Vp59+2qxxFicxMVEF1G3btpVYZunSpaqXl1fVBVXI1KlT1TZt2pS5vDVdW72JEyeqDRo0UHU6XbH7LXl9AXXVqlWG9zqdTg0MDFTnzZtn2JaSkqI6OTmp3333XYn1lPd3wFTxFmffvn0qoF64cKHEMuX9XlVUcfGOGjVKHTx4cLnqsabrO3jwYPXee++9bZmqur63/v1KSUlRHRwc1J9++slQJjY2VgXU3bt3F1tHRb/ztyMt4CqSm5tLdHS00drEGo2GiIgIdu/eXewxu3fvNioPBWsVl1TenFJTUwHw9fW9bbn09HTq169PSEgIgwcPJiYmpirCA+D06dMEBwdzxx13MHLkSC5evFhiWWu6tlDw/fj222954oknbruYhyWvb2FxcXEkJCQYXUMvLy86d+5c4jWsyO+AOaWmpqIoSpHlSm9Vnu+VqW3duhV/f3+aNGnCs88+y40bN0osa03X9+rVq/zxxx+MGTOm1LJVcX1v/ftV2lrxxanId740koCryPXr18nPzy927eGS1h0uaa3i261TbA46nY5JkybRpUuXInNvF9akSRO+/PJLfv31V7799lt0Oh133303f//9t9lj7Ny5M8uWLWPdunUsXryYuLg4unXrxs2bN4stby3XVm/16tWkpKQwevToEstY8vreSn+dynMNK/I7YC7Z2dm8+uqrjBgx4raT7pf3e2VK/fr14+uvv2bTpk3MmTOHbdu20b9/f/Lz84stb03X96uvvsLDw6PULt2quL7F/f0qy1rxt6rId7401W4qSmF648eP59ixY6XemwkPDzesMgVw991306xZM5YsWcLbb79t1hj79+9veN26dWs6d+5M/fr1+fHHH8v0r3BL+9///kf//v1vu4SZJa9vdaLVann44YdRVZXFixfftqwlv1fDhw83vG7VqhWtW7emQYMGbN26lV69epn13JX15ZdfMnLkyFIHCVbF9S3r3y9LkBZwFalduzZ2dnZFRtkVXpv4VoGBgeUqbw4TJkxgzZo1bNmypdzLLTo4ONCuXTvOnDljpuhK5u3tTePGjUs8tzVcW70LFy6wceNGnnzyyXIdZ8nrq79O5bmGFfkdMDV98r1w4YJh2dHyKO17ZU533HEHtWvXLvHc1nB9Af766y9OnjxZ7u8zmP76lvT3KzAw0LBWfGGl/T3WlynrMaWRBFxFHB0d6dChA5s2bTJs0+l0bNq0yahVU1h4eLhReShYq7ik8qakqioTJkxg1apVbN68mbCwsHLXkZ+fz9GjRwkKCjJDhLeXnp7O2bNnSzy3Ja/trZYuXYq/vz8DBw4s13GWvL5hYWEEBgYaXcO0tDT27t1b4jWsyO+AKemT7+nTp9m4cSO1atUqdx2lfa/M6e+//+bGjRslntvS11fvf//7Hx06dKBNmzblPtZU17e0v18dOnQwrBWvd+ta8beqyHe+LIGKKvL999+rTk5O6rJly9Tjx4+rY8eOVb29vdWEhARVVVX10UcfVV977TVD+Z07d6r29vbqe++9p8bGxqpTp05VHRwc1KNHj5o91meffVb18vJSt27dqsbHxxt+MjMzDWVujXf69Onq+vXr1bNnz6rR0dHq8OHDVWdnZzUmJsbs8b744ovq1q1b1bi4OHXnzp1qRESEWrt2bTUxMbHYWC15bQvLz89X69Wrp7766qtF9ln6+t68eVM9ePCgevDgQRVQ58+frx48eNAwavjdd99Vvb291V9//VU9cuSIOnjwYDUsLEzNysoy1HHvvfeqCxcuNLwv7XfAXPHm5uaq999/v1q3bl310KFDRt/pnJycEuMt7Xtlrnhv3rypvvTSS+ru3bvVuLg4dePGjWr79u3VRo0aqdnZ2SXGa6nrq5eamqq6urqqixcvLraOqrq+Zfn79cwzz6j16tVTN2/erO7fv18NDw9Xw8PDjepp0qSJ+ssvvxjel+U7Xx6SgKvYwoUL1Xr16qmOjo7qnXfeqe7Zs8ewr0ePHuqoUaOMyv/4449q48aNVUdHR7VFixbqH3/8USVxAsX+LF26tMR4J02aZPhsAQEB6oABA9QDBw5USbz/+c9/1KCgINXR0VGtU6eO+p///Ec9c+ZMibGqquWubWHr169XAfXkyZNF9ln6+m7ZsqXY74A+Jp1Op7711ltqQECA6uTkpPbq1avI56hfv746depUo223+x0wV7xxcXElfqe3bNlSYrylfa/MFW9mZqbap08f1c/PT3VwcFDr16+vPvXUU0USqbVcX70lS5aoLi4uakpKSrF1VNX1Lcvfr6ysLHXcuHGqj4+P6urqqg4dOlSNj48vUk/hY8rynS8PWY5QCCGEsAC5ByyEEEJYgCRgIYQQwgIkAQshhBAWIAlYCCGEsABJwEIIIYQFSAIWQgghLEASsBBCCGEBkoCFEGYXGhrKggULLB2GEFZFErAQ1czo0aMZMmQIAD179mTSpElVdu5ly5YVu75uVFQUY8eOrbI4hLAFshyhEKJUubm5ODo6Vvh4Pz8/E0YjRPUgLWAhqqnRo0ezbds2PvzwQxRFQVEUzp8/D8CxY8fo378/7u7uBAQE8Oijj3L9+nXDsT179mTChAlMmjSJ2rVr07dvXwDmz59Pq1atcHNzIyQkhHHjxpGeng7A1q1befzxx0lNTTWcb9q0aUDRLuiLFy8yePBg3N3d8fT05OGHHzZa5m3atGm0bduWb775htDQULy8vBg+fLjRQu0rV66kVatWuLi4UKtWLSIiIsjIyDDT1RTC9CQBC1FNffjhh4SHh/PUU08RHx9PfHw8ISEhpKSkcO+999KuXTv279/PunXruHr1Kg8//LDR8V999RWOjo7s3LmTTz/9FACNRsNHH31ETEwMX331FZs3b+aVV14B4O6772bBggV4enoazvfSSy8ViUun0zF48GCSkpLYtm0bkZGRnDt3jv/85z9G5c6ePcvq1atZs2YNa9asYdu2bbz77rsAxMfHM2LECJ544gliY2PZunUrDzzwADK1vbAl0gUtRDXl5eWFo6Mjrq6uRguGf/zxx7Rr14533nnHsO3LL78kJCSEU6dO0bhxYwAaNWrE3LlzjeosfD85NDSUmTNn8swzz/DJJ5/g6OiIl5cXiqLcdoHyTZs2cfToUeLi4ggJCQHg66+/pkWLFkRFRdGpUyegIFEvW7YMDw8PAB599FE2bdrErFmziI+PJy8vjwceeID69esD0KpVq0pcLSGqnrSAhahhDh8+zJYtW3B3dzf8NG3aFChodep16NChyLEbN26kV69e1KlTBw8PDx599FFu3LhBZmZmmc8fGxtLSEiIIfkCNG/eHG9vb2JjYw3bQkNDDckXICgoiMTERADatGlDr169aNWqFQ899BCff/45ycnJZb8IQlgBScBC1DDp6ekMGjSIQ4cOGf2cPn2a7t27G8q5ubkZHXf+/Hnuu+8+Wrduzc8//0x0dDSLFi0CCgZpmZqDg4PRe0VR0Ol0ANjZ2REZGcmff/5J8+bNWbhwIU2aNCEuLs7kcQhhLpKAhajGHB0dyc/PN9rWvn17YmJiCA0NpWHDhkY/tybdwqKjo9HpdLz//vvcddddNG7cmCtXrpR6vls1a9aMS5cucenSJcO248ePk5KSQvPmzcv82RRFoUuXLkyfPp2DBw/i6OjIqlWryny8EJYmCViIaiw0NJS9e/dy/vx5rl+/jk6nY/z48SQlJTFixAiioqI4e/Ys69ev5/HHH79t8mzYsCFarZaFCxdy7tw5vvnmG8PgrMLnS09PZ9OmTVy/fr3YrumIiAhatWrFyJEjOXDgAPv27eOxxx6jR48edOzYsUyfa+/evbzzzjvs37+fixcv8ssvv3Dt2jWaNWtWvgskhAVJAhaiGnvppZews7OjefPm+Pn5cfHiRYKDg9m5cyf5+fn06dOHVq1aMWnSJLy9vdFoSv6T0KZNG+bPn8+cOXNo2bIly5cvZ/bs2UZl7r77bp555hn+85//4OfnV2QQFxS0XH/99Vd8fHzo3r07ERER3HHHHfzwww9l/lyenp5s376dAQMG0LhxY958803ef/99+vfvX/aLI4SFKaqM2xdCCCGqnLSAhRBCCAuQBCyEEEJYgCRgIYQQwgIkAQshhBAWIAlYCCGEsABJwEIIIYQFSAIWQgghLEASsBBCCGEBkoCFEEIIC5AELIQQQliAJGAhhBDCAiQBCyGEEBbw/wNjLO4T2EG5AAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "plot_histories(histories, labels)" ] @@ -648,42 +466,20 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": null, "id": "82b89092-07e5-4788-9ae0-8907df2428eb", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAacAAAGdCAYAAAC2DrxTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAzC0lEQVR4nO3dfXSUxb0H8O8mJJsgyUKAvKxsIIAFBRK8CDHFUpCUkFouEW4Llp4bQbFqoEJuq+YeAV+7iudUfKGhvXpBzzGi9BastEIxhXA8EizhRsDepgSDRCBBqWQhIZuXZ+4fMasLgZ3NM8nOs/l+PM857u5knnn2Sfw588z8xiaEECAiItJIRKgbQEREdCkGJyIi0g6DExERaYfBiYiItMPgRERE2mFwIiIi7TA4ERGRdhiciIhIO/1C3QAiIgpec3MzWlpalNQVHR2NmJgYJXWpwuBERGQxzc3NSEtLRl1dg5L6kpOTUVNTo1WAYnAiIrKYlpYW1NU14JNPn0N8fKypujyeixg5fCVaWloYnIiIyLz4+FjTwUlXDE5ERBYlRBuEaDNdh44YnIiILEqIdgjRbroOHXEqORERaYc9JyIiizJEGwyTw3Jmf76nMDgREVlUOD9z4rAeERFphz0nIiKL6pgQYbbnpOeECAYnIiKLEkYbhGEyOJn8+Z7CYT0iItIOe05ERFYl2joOs3VoiMGJiMiiOFuPiIioF7HnRERkVUYbYLSar0NDDE5ERBbVMawXaboOHXFYj4iItMOeExGRVRltgGGu58RhPSIiUiuMgxOH9YiISDvsORERWVa7gkW0zK1HREQK2Yw22AxzA2A2DusRERHJYc+JiMiqjDbAZM9J1wkRDE5ERFYVxsGJw3pERKQd9pyIiCzKJtpgEyYnRGiavojBiYjIqgwDMExOBTcMNW1RjMN6RESkHfaciIgsqmOdk810HTpicCIisiqjXcFsPT0zRHBYj4iItMOeExGRVRltgMlhPV3XOTE4ERFZlM1oV5Bbj8N6REREUrTrORmGgVOnTiEuLg42m8nuKhGRBoQQOH/+PJxOJyIiFPYJhIIJESK4ntPevXvx7LPPoqKiAqdPn8bWrVuRl5cHAGhtbcUjjzyCP/3pT/jkk0/gcDiQnZ2Np59+Gk6nM6jzaBecTp06BZfLFepmEBEpV1tbi2HDhimrz2YYpoflbEEuwm1sbERGRgaWLFmCefPm+X3W1NSEgwcPYtWqVcjIyMCXX36JBx54AP/6r/+KAwcOBHWeHgtO69evx7PPPou6ujpkZGTgxRdfxJQpUwL+XFxcHADg+InnER8fe9WyCQPvVdJWIiIzxsbOvern7aIVR5u3+/77ZmW5ubnIzc3t8jOHw4Fdu3b5vffSSy9hypQpOHHiBFJTU6XP0yPB6c0330RhYSE2bNiAzMxMrFu3Djk5OaiqqkJiYuJVf7ZzKC8+Phbx8f0DnInDfkQUepG2KKlyyh9VGO0KZut19Lw8Ho/f23a7HXa73VzdABoaGmCz2TBw4MCgfq5HJkT86le/wtKlS7F48WLccMMN2LBhA/r374///u//7onTERH1SR2z9cwfAOByueBwOHyH2+023b7m5mY89NBDuOOOOxAfHx/UzyrvObW0tKCiogJFRUW+9yIiIpCdnY19+/ZdVt7r9cLr9fpeXxq9iYio59XW1voFELO9ptbWVvzoRz+CEALFxcVB/7zyntMXX3yB9vZ2JCUl+b2flJSEurq6y8q73W6/aM3JEEREkox2NQeA+Ph4v8NMcOoMTJ9++il27doVdK8J0GCdU1FRERoaGnxHbW1tqJtERGQJKof1VOkMTEePHsV7772HwYMHd6se5cN6Q4YMQWRkJOrr6/3er6+vR3Jy8mXlVT10IyKinnfhwgVUV1f7XtfU1KCyshIJCQlISUnBv/3bv+HgwYPYvn072tvbfSNmCQkJiI6Olj6P8p5TdHQ0Jk2ahNLSUt97hmGgtLQUWVlZqk9HRNR3KRzWk3XgwAHceOONuPHGGwEAhYWFuPHGG7F69WqcPHkSf/jDH/DZZ59h4sSJSElJ8R0ffPBBUOfpkankhYWFyM/Px0033YQpU6Zg3bp1aGxsxOLFi3vidEREfZLNEEEvou2qjmBMnz4dQlz5Z672WTB6JDgtWLAAn3/+OVavXo26ujpMnDgRO3bsuGySxNV0LLC9+vz9GbF3B6xnv/Ge1Pmc/cZJlatu/KNUORmx0XIL0mw2uQ5uk/e4idZYh+z3JkP2uw3F74fOdP7dVfn7AQDeti8Dlvm46X8ClFDzH+y+pMcyRCxbtgzLli3rqeqJiMhoB8x1nLTdbFC73HpERCRJKAhOQSZ+7S0hn0pORER0KfaciIgsyiYM2IS53Ho2Ybbr1TMYnIiIrCqMnzlxWI+IiLTDnhMRkVUZhoItMzisR0REKjE46UlmgW1mRLZUXbU4LVWuv32EVDmZRYXXRk2QqiscFnbKLIy82HJCqq5QLOw8qfihsczvkc6LqmXvlcoFsaFYXAsA9n6DApa52HLebHPoEpYOTkREfZnNMGAz+f9NZtMf9RQGJyIiqzIMBbP19AxOnK1HRETaYc+JiMiqwrjnxOBERGRVYRycOKxHRETaYc+JiMiqRDsQ5GaBl9ehZ8+JwYmIyKLCeSo5h/WIiEg7lu45yWydLZv5wWWkSJU7KQ5LlZMhm/lh9DW3Ka3P6mQzJ8hkYRCSQxqyGRFkyfzuVmucIUI2W4PK7002M0hz61mpcjKZH7QXxhMiLB2ciIj6tDAOThzWIyIi7bDnRERkVYYw3/MxO9uvhzA4ERFZlSEUDOvpGZw4rEdERNphz4mIyKqUbDaoZ8+JwYmIyKrCODhxWI+IiLTDnhMRkVWF8YQISwcnmYwIMlkCAPnMDzdHzpIqtxsvBywjm/nhVNvHUuVkrlU2u4Jq10ZNCFimWnEWhlBdq4yTreoyjagmm/1BZV0ymSRkMz/ERA2WKheq7CBKCQMQJof1hJ7BicN6RESkHUv3nIiI+jShYFhP054TgxMRkVWF8TMnDusREZF22HMiIrKqMO45MTgREVmUMMzvsq7pLu0c1iMiIv2w50REZFUc1rMu1QsxZRbXAkB13pSAZUZv6/1t1WUXJcsuUJQls2A6HLajV7noVPZeyWz5Dsgv/A3FotOE/hkBy/yz6SOpupq85802xzoMKAhOKhqinvJhvUcffRQ2m83vGDt2rOrTEBFRGOuRntO4cePw3nvvfX2SfmHfQSMi6n1h3HPqkajRr18/JCcn90TVRETUSXx1mK1DQz0yW+/o0aNwOp0YOXIkFi1ahBMnrjyG7fV64fF4/A4iIurblAenzMxMbNq0CTt27EBxcTFqamrwne98B+fPd/2Q0u12w+Fw+A6Xy6W6SUREYUkYNiWHjpQHp9zcXPzwhz9Eeno6cnJy8Kc//Qnnzp3DW2+91WX5oqIiNDQ0+I7a2lrVTSIiCk+GokNDPT5TYeDAgfjWt76F6urqLj+32+2w2+093QwiIrKQHs8QceHCBRw7dgwpKSk9fSoior5F2ADD5GF2s8Ieojw4/fznP0dZWRmOHz+ODz74ALfffjsiIyNxxx13qD4VEVGfFopnTnv37sWcOXPgdDphs9mwbds2/zYJgdWrVyMlJQWxsbHIzs7G0aNHg7425cN6n332Ge644w6cPXsWQ4cOxS233ILy8nIMHTpU9amkVuPLbA8OyGcdkM1iIJP9YUbs3VJ11UaclionkwFA563LVd8DlZkkVGZ+kCV7r6oV31OZzBSyGUS8bV9KlZPJ/qD6HsjWZ7MF/n94nf+uVGtsbERGRgaWLFmCefPmXfb52rVr8cILL+DVV19FWloaVq1ahZycHPztb39DTEyM9HmUB6fNmzerrpKIiLrSOTRnqo7giufm5iI3N7fLz4QQWLduHR555BHMnTsXAPDaa68hKSkJ27Ztw8KFC6XPw6zkRERWJWxqDuCy9aZerzfo5tTU1KCurg7Z2dm+9xwOBzIzM7Fv376g6mJwIiIiuFwuvzWnbrc76Drq6uoAAElJSX7vJyUl+T6TxaR3REQWpWIRbefjw9raWsTHx/veD/USHwYnIiKrMiIUPHPqSK4XHx/vF5y6ozOnan19vd/yofr6ekycODGoujisR0RESqSlpSE5ORmlpaW+9zweD/bv34+srKyg6mLPiYjIqkIwW+/ChQt+GX9qampQWVmJhIQEpKamYsWKFXjyySdx3XXX+aaSO51O5OXlBXUeBiciIosSwgZhMsODCHLLjAMHDmDGjBm+14WFhQCA/Px8bNq0CQ8++CAaGxtxzz334Ny5c7jllluwY8eOoNY4AQxOREQUhOnTp0NcJaLZbDY8/vjjePzxx02dx9LBSWbltuqsA6faPpYqJ0M284PLkMtLeBKBM0SEA5X3VCarBqA284PunP3GBSzzycW9UnXZ+w2SKnexpestdbojVJkkQkLhhAjdWDo4ERH1ZcKAgqnkegYnztYjIiLtsOdERGRVQsFsPU23zGBwIiKyKDWz9fQMThzWIyIi7bDnRERkVUZEx2GqDjVNUY3BiYjIotQkfuWwHhERkRRL95xUbo0su7BTZgtrWbILQGUX194cOStgmd14Waou1WQWxKq+BzLfr8xCbiA0CztDtfBXZoHtyNhpUnWpXLQuS/X3pvMC7HCeEGHp4ERE1KeF8TMnDusREZF22HMiIrKocJ4QweBERGRR4fzMicN6RESkHfaciIisKownRDA4ERFZVDg/c+KwHhERaYc9JyIiiwrnCREMTkGSzUohk8VAZYYLQC77Q3XeFKm60t89I1VOZktvQC77g0wWCdm6QkVlJgnV24PHSm6Z/s+mjwKWUX0PdM6YoTWh4JmTnhvhcliPiIj0w54TEZFFhfOECAYnIiKLEsL8MyPBYT0iIiI57DkREVmVgmE9cFiPiIhUEiICQpgbABOajutxWI+IiLTDnhMRkVUZNvPDchzWIyIilZghgoImhJ6pfmUzPxzKTZQqN3uXmdb4O9l6WF1lIWKz9f5IuWzmh4ttX/ZwS7rv2qgJActUM0NEnxL0X9LevXsxZ84cOJ1O2Gw2bNu2ze9zIQRWr16NlJQUxMbGIjs7G0ePHlXVXiIi+krnIlyzh46CDk6NjY3IyMjA+vXru/x87dq1eOGFF7Bhwwbs378f11xzDXJyctDc3Gy6sURE9LXO2XpmDx0FPayXm5uL3NzcLj8TQmDdunV45JFHMHfuXADAa6+9hqSkJGzbtg0LFy4011oiIuoTlIbMmpoa1NXVITs72/eew+FAZmYm9u3b1+XPeL1eeDwev4OIiALjsJ6kuro6AEBSUpLf+0lJSb7PLuV2u+FwOHyHy+VS2SQiorDVOVvP7KGjkA82FhUVoaGhwXfU1taGuklERBRiSqeSJycnAwDq6+uRkpLie7++vh4TJ07s8mfsdjvsdrvKZhAR9QnhvM5Jac8pLS0NycnJKC0t9b3n8Xiwf/9+ZGVlqTwVEVGfJ4SCZ06aBqege04XLlxAdXW173VNTQ0qKyuRkJCA1NRUrFixAk8++SSuu+46pKWlYdWqVXA6ncjLy1PZbiIiCmNBB6cDBw5gxowZvteFhYUAgPz8fGzatAkPPvggGhsbcc899+DcuXO45ZZbsGPHDsTExKhrNXWbs984qXKymR92fO9zqXKjtwUuE4rsCqqpzAwSDpkfZJ1q+zjUTbCkcM5KHnRwmj59+lUvxmaz4fHHH8fjjz9uqmFERHR14bxNu/X/V5WIiMIOE78SEVlUOM/WY3AiIrKocA5OHNYjIiLtsOdERGRRwjA/oUHTrefYcyIisqpQ5NZrb2/HqlWrkJaWhtjYWIwaNQpPPPGE8inp7DkREZG0Z555BsXFxXj11Vcxbtw4HDhwAIsXL4bD4cDPfvYzZecJ++AUG52qtD6Z7aQBoLrxj0rPK2P0NbcFLKO6XTKLawFgRuzdAcvsvviy3DklrhOQW9ipctEsAFyU3Eo8IiIuYJl/Nn1ktjndIvM3I3udspq8xwOWkf1blv0blV34K9O2UFGzCDe4n//ggw8wd+5c3HZbx9/hiBEj8MYbb+DDDz801Y5LcViPiMiiDGFTcgC4bF89r9fb5Tm//e1vo7S0FP/4xz8AAB999BHef//9K25C211h33MiIqLALt1Lb82aNXj00UcvK/fwww/D4/Fg7NixiIyMRHt7O5566iksWrRIaXsYnIiIrErFTrZf/XxtbS3i4+N9b19pK6O33noLr7/+OkpKSjBu3DhUVlZixYoVcDqdyM/PN9eWb2BwIiKyKJWLcOPj4/2C05X84he/wMMPP4yFCxcCACZMmIBPP/0UbrdbaXDiMyciIpLW1NSEiAj/0BEZGQnDUDu5iD0nIiKLCkX6ojlz5uCpp55Camoqxo0bh//93//Fr371KyxZssRUOy7F4EREZFGhCE4vvvgiVq1ahfvvvx9nzpyB0+nET3/6U6xevdpUOy7F4ERERNLi4uKwbt06rFu3rkfPw+BERGRRhoiAYXIRrtmf7ylhH5xUr2SvlqwvFNkaZOqTza5wsvWwVDnZrdVlsj9U502Rqmv0tt7PviEroX+GVDmZ7A+yGRFk74FsNgzVfzMyVGalkP0bDQdCKNgJl1tmEBERyQn7nhMRUbgK580GGZyIiCwqnIMTh/WIiEg77DkREVnUN7OKm6lDRwxOREQWxWE9IiKiXsSeExGRRYVzz4nBiYjIovjMSVMyq8plV883eY+bbI0/ldkaZDNJ9LePUFaXajLXKpv5YUbs3VLlaiNOBywjmwnD2/alVDmZzA+A2owIqqlsm2yWC12zUgDAtVETApYJ1d9VOLN0cCIi6suEMD8sJ4SixijG4EREZFHh/MyJs/WIiEg77DkREVmUUDAhQteeE4MTEZFFcViPiIioF7HnRERkUeHcc2JwIiKyKC7CtTDZxbUyC1iDqU+G7MI91Vurh8Kpto+V1SWzuBYAXEZKwDKftO2Vqsveb5BUuYst56XK6Uxm4Xo4LK6VbdspyYX8pFbQ3/revXsxZ84cOJ1O2Gw2bNu2ze/zO++8Ezabze+YPXu2qvYSEdFXOof1zB46Crrn1NjYiIyMDCxZsgTz5s3rsszs2bOxceNG32u73d79FhIRUZc4rPcNubm5yM3NvWoZu92O5OTkbjeKiIj6th4ZTN2zZw8SExMxZswY3HfffTh79uwVy3q9Xng8Hr+DiIgCE7ApOXSkPDjNnj0br732GkpLS/HMM8+grKwMubm5aG9v77K82+2Gw+HwHS6XS3WTiIjCEp85BWHhwoW+f58wYQLS09MxatQo7NmzBzNnzrysfFFREQoLC32vPR4PAxQRUR/X41PJR44ciSFDhqC6urrL4GS32zlhgoioGzghwoTPPvsMZ8+eRUpK4DUnREQkjxkivuHChQuorq72va6pqUFlZSUSEhKQkJCAxx57DPPnz0dycjKOHTuGBx98EKNHj0ZOTo7ShhMRUfgKOjgdOHAAM2bM8L3ufF6Un5+P4uJiHDp0CK+++irOnTsHp9OJWbNm4YknnuiRoTvZLdhlCGEoq0s12cwPKr8P1VR+v7Lfh0z2h+/aF0jVJZuVoloy64DV75XM1uWA/PehkurvVuf/NhhQMKyn6Wy9oIPT9OnTIa6yr+/OnTtNNYiIiCjsc+sREYUrPnMiIiLtGLCZHpbTdVhP34FvIiLqs9hzIiKyKhUZHjisR0REKoXzIlwO6xERkXbYcyIisijO1iMiIu0YXx1m69CRpYOTs9+4gGVOSq7uvhiCleyx0alS5WTbJluf1XnbvpQqZ+83KGAZ2cwPLkMuN2R14CIA5H53q73HJWtTSybDQnXjH6XqGn3NbVLlZOuT0ST5vfW3j5Aqp3OGiHBm6eBERNSXcViPiIi0Ywjzs+2MK2ejCynO1iMiIu2w50REZFECNgiT6YfM/nxPYXAiIrIoLsIlIiL6ysmTJ/GTn/wEgwcPRmxsLCZMmIADBw4oPQd7TkREFtUxIcJ8HcH48ssvMXXqVMyYMQPvvvsuhg4diqNHj2LQoMBLN4LB4EREZFGheOb0zDPPwOVyYePGjb730tLSTLWhK5YOTioX7qkmsyBW9cJfmfpkF+rKbnUtu0BRpm0J/TOk6vpn00eS5zwfsIzsNuKyi2ur86ZIlRu9LfDvrupFotJbqyv8u1K5WFf137vsYt2+wuPx+L222+2w2+2XlfvDH/6AnJwc/PCHP0RZWRmuvfZa3H///Vi6dKnS9vCZExGRRXVOiDB7AIDL5YLD4fAdbre7y3N+8sknKC4uxnXXXYedO3fivvvuw89+9jO8+uqrSq/N0j0nIqK+TIiOw2wdAFBbW4v4+Hjf+131mgDAMAzcdNNN+OUvfwkAuPHGG3HkyBFs2LAB+fn55hrzDew5ERER4uPj/Y4rBaeUlBTccMMNfu9df/31OHFC7WMK9pyIiCxKwAajlydETJ06FVVVVX7v/eMf/8Dw4cNNteNSDE5ERBYVisSvK1euxLe//W388pe/xI9+9CN8+OGH+O1vf4vf/va3ptpxKQ7rERGRtMmTJ2Pr1q144403MH78eDzxxBNYt24dFi1apPQ87DkREVlUqNIX/eAHP8APfvADU+cNhMGJiMiixFeH2Tp0xGE9IiLSTtj3nGRX2ctsmw0AJ1sPS5XTddv3ULQLACIi4gKWkc38oHI7etlMGLK/HzKZHwBgRuzdAcvsvviyVF2yZLNhhCJbg0x9slu+y/6NygrV34yMcM5KHvbBiYgoXBlfHWbr0BGH9YiISDvsORERWVQo1jn1FgYnIiKLCudnThzWIyIi7bDnRERkUeG8zonBiYjIojisR0RE1IvYcyIisqhwXucU9sGpyXtcqly1ZDlZMpkpZNsmS2Ylu8rsCgAQ22+QVDmZ7A+ybQvFin3Z3w/ZjCQy2R+q86ZI1TV711CpcrJUZ3+QIXPvQ9Eu3YXzVPKghvXcbjcmT56MuLg4JCYmIi8v77JNp5qbm1FQUIDBgwdjwIABmD9/Purr65U2moiIwltQwamsrAwFBQUoLy/Hrl270NrailmzZqGxsdFXZuXKlXjnnXewZcsWlJWV4dSpU5g3b57yhhMR9XUCXw/tdfcIi9l6O3bs8Hu9adMmJCYmoqKiAtOmTUNDQwNeeeUVlJSU4NZbbwUAbNy4Eddffz3Ky8tx8803q2s5EVEfJ6BgWM/kNu89xdRsvYaGBgBAQkICAKCiogKtra3Izs72lRk7dixSU1Oxb9++Luvwer3weDx+BxER9W3dDk6GYWDFihWYOnUqxo8fDwCoq6tDdHQ0Bg4c6Fc2KSkJdXV1XdbjdrvhcDh8h8vl6m6TiIj6FEOoOXTU7eBUUFCAI0eOYPPmzaYaUFRUhIaGBt9RW1trqj4ior5CKDp01K2p5MuWLcP27duxd+9eDBs2zPd+cnIyWlpacO7cOb/eU319PZKTk7usy263w263d6cZREQUpoLqOQkhsGzZMmzduhV/+ctfkJaW5vf5pEmTEBUVhdLSUt97VVVVOHHiBLKystS0mIiIAHydvsjsoaOgek4FBQUoKSnB22+/jbi4ON9zJIfDgdjYWDgcDtx1110oLCxEQkIC4uPjsXz5cmRlZfW5mXoy23qrXvirkuzi2ottXyo7p+yW6ToTQt16e9nFtTu+97lUufR3z5hpDmmIGSK+UlxcDACYPn263/sbN27EnXfeCQB47rnnEBERgfnz58Pr9SInJwe//vWvlTSWiIj6hqCCkxCBH53FxMRg/fr1WL9+fbcbRUREgYVz+qKwz61HRBSuwnlYz/qD/EREFHbYcyIisighOg6zdeiIwYmIyKIM2GCYzI1n9ud7Cof1iIhIO+w5ERFZlIrceLrm1mNwIiKyKgXPnHRNrsfg1ENOth4OdRO6FIrMD7JUZlcIlWujJkiVq1a41bxs5odDuYlS5UZvO26iNd0TDtlBSC0GJyIiiwrnCREMTkREFhXOU8nZlyYiIu2w50REZFHhnL6IwYmIyKLCeSo5h/WIiEg77DkREVmUgPllSpp2nBiciIisqmNYz+RUck2jE4f1iIhIO+w5BSk2OlWq3EWJDAD97SOk6nL2GydV7pOLewOW+WfTR1J1qSbzvcl8Z7J1AXJZB2SzUshmMKhu/KNUudHX3KasLlmymR9mxN4dsEx5+59NtsZfk/d4wDKyfy8ydYWLcF7nxOBERGRR4TyVnMN6RESkHfaciIgsisN6RESkHQ7rERER9SIGJyIiixLi6xRG3T3MDOs9/fTTsNlsWLFihbJr6sRhPSIiiwplhoi//vWv+M1vfoP09HSTLegae05ERBSUCxcuYNGiRfiv//ovDBokt7t2sCzdcwrFwk6VZBeAyiyuBYCRsdMCllG9sFOW7H1QWZfMPZXeVl3x9xaq+yBDZoHtzZGzpOqqjTgtVU7ltvUyC5wB+Xsgs/g3VAt/VWYl93g8fu/b7XbY7fYuf6agoAC33XYbsrOz8eSTT5prwBWw50REZFGdU8nNHgDgcrngcDh8h9vt7vKcmzdvxsGDB6/4uSqW7jkREZEatbW1iI+P973uqtdUW1uLBx54ALt27UJMTEyPtofBiYjIolSuc4qPj/cLTl2pqKjAmTNn8C//8i++99rb27F371689NJL8Hq9iIyMNNmiDgxOREQW1ds74c6cOROHDx/2e2/x4sUYO3YsHnroIWWBCWBwIiIiSXFxcRg/frzfe9dccw0GDx582ftmMTgREVkUd8IlIiLt9PawXlf27NljroIr4FRyIiLSDntOREQWxS0zNCWzdbbKbdWDqU+Gt+1LqXL2fnLpQU61fWymOZah8p7KZiZQnXXA6mQzP7iMFKly1RJlnP3GydUleQ9k7+nJ1sOBC4UIt8z4itvtxuTJkxEXF4fExETk5eWhqqrKr8z06dNhs9n8jnvvvVdpo4mIKLwFFZzKyspQUFCA8vJy7Nq1C62trZg1axYaGxv9yi1duhSnT5/2HWvXrlXaaCIi+qrnZHbbjFBfxBUENay3Y8cOv9ebNm1CYmIiKioqMG3a10lH+/fvj+TkZDUtJCKiLoXzVHJTs/UaGhoAAAkJCX7vv/766xgyZAjGjx+PoqIiNDU1XbEOr9cLj8fjdxARUd/W7QkRhmFgxYoVmDp1qt/K4B//+McYPnw4nE4nDh06hIceeghVVVX4/e9/32U9brcbjz32WHebQUTUZwkFw3JhN1uvoKAAR44cwfvvv+/3/j333OP79wkTJiAlJQUzZ87EsWPHMGrUqMvqKSoqQmFhoe+1x+OBy+XqbrOIiPoMIRQM64VTcFq2bBm2b9+OvXv3YtiwYVctm5mZCQCorq7uMjhdbUMrIiLqm4IKTkIILF++HFu3bsWePXuQlpYW8GcqKysBACkpcusdiIhITjivcwoqOBUUFKCkpARvv/024uLiUFdXBwBwOByIjY3FsWPHUFJSgu9///sYPHgwDh06hJUrV2LatGlIT0/vkQsgIuqrOqaCmxuXM5tbr6fYhJAfcbTZbF2+v3HjRtx5552ora3FT37yExw5cgSNjY1wuVy4/fbb8cgjjwTcxKqTx+OBw+FAx0TCrs9nBQn9MwKW+WfTR73QEn+y2RWujZogVU42K0WT93jAMqqzeYSCykwSKrORAHIZVQC5e6Vadd6UgGVGb/uwF1rSUwQAAw0NDdL/Lbyazv9O5sX/FFG2aFN1tYoWbPP8RlnbVAl6WO9qXC4XysrKTDWIiIjkhPM6J0vn1iMi6stUZHjQdViPW2YQEZF22HMiIrIo8dU/ZuvQEYMTEZFFcViPiIioF7HnRERkUVyES0RE2hFCwTMnTZPrcViPiIi0E/Y9J9lV9rKr55tbz0qVk8n+oDoDgAzZ7ArVirMwyFyrzpkfZMlkfgDkMknI1qVaf/sIZXU5+42TKjd6W+BrnRF7t1Rd5e1/liqnc8YMWRzWIyIi7XBYj4iIqBex50REZFEd6WTN16EjBiciIosyhFCwZYae4YnDekREpB32nIiILIq59YiISDvhPJWcw3pERKQdS/ecVC5ilV1cGxM1WKpck/d8wDKyi07DYftymW3fQ7HwN1QLMU+2HlZan0oy16pyO3pZsotrb46cJVWuNuK03IklFhKHasG0AQUTIjisR0REKnG2HhERUS9iz4mIyKI4W4+IiLQTzs+cOKxHRETaYc+JiMiiwrnnxOBERGRR4fzMicN6RESkHfaciIgsSigY1tO15xT2wcnb9qVUOXu/QVLlhFCXiSocMj/IOtX2sbK6QvG9yW5drvOW3iqp3I5etj7ZbB6ymR9cRopUuf3Ge1LlQsGwGbDZzP03ydA0ux6H9YiISDth33MiIgpXBgRsnK1HREQ6EV9NJjdbh444rEdERNphcCIisqiOzQaFySM4brcbkydPRlxcHBITE5GXl4eqqirl18bgRERkUYbNUHIEo6ysDAUFBSgvL8euXbvQ2tqKWbNmobGxUem18ZkTERFJ27Fjh9/rTZs2ITExERUVFZg2bZqy8zA4ERFZlAEDNpMTGjrXOXk8Hr/37XY77HZ7wJ9vaGgAACQkJJhqx6U4rEdEZFGGon8AwOVyweFw+A632x34/IaBFStWYOrUqRg/frzSawuq51RcXIzi4mIcP34cADBu3DisXr0aubm5AIDm5mb8x3/8BzZv3gyv14ucnBz8+te/RlJSktJGd5LJ/iCb+UGWyqwDsivewyGThMrMCddGTZAqd0ri+5XN+KEyMwig972SIZsx42TrYWXnlP4d6jdOqphs5ofMiOyAZXbjZam6dFZbW4v4+Hjfa5leU0FBAY4cOYL3339feXuC6jkNGzYMTz/9NCoqKnDgwAHceuutmDt3Lj7+uCM1zcqVK/HOO+9gy5YtKCsrw6lTpzBv3jzljSYiIpiep/fN+Xrx8fF+R6DgtGzZMmzfvh27d+/GsGHDlF9bUD2nOXPm+L1+6qmnUFxcjPLycgwbNgyvvPIKSkpKcOuttwIANm7ciOuvvx7l5eW4+eab1bWaiIhCkltPCIHly5dj69at2LNnD9LS0kyd/0q6PSGivb0dW7ZsQWNjI7KyslBRUYHW1lZkZ3/dBR47dixSU1Oxb9++KwYnr9cLr9fre33pQzkiItJHQUEBSkpK8PbbbyMuLg51dXUAAIfDgdjYWGXnCXpCxOHDhzFgwADY7Xbce++92Lp1K2644QbU1dUhOjoaAwcO9CuflJTka3xX3G6330M4l8sV9EUQEfVFQsFkiGCX4RYXF6OhoQHTp09HSkqK73jzzTeVXlvQPacxY8agsrISDQ0N+N3vfof8/HyUlZV1uwFFRUUoLCz0vfZ4PAxQREQSBNohTE66FmgPrrzonUSxQQen6OhojB49GgAwadIk/PWvf8Xzzz+PBQsWoKWlBefOnfPrPdXX1yM5OfmK9cnOpScior7D9DonwzDg9XoxadIkREVFobS01PdZVVUVTpw4gaysLLOnISKiS6hc56SboHpORUVFyM3NRWpqKs6fP4+SkhLs2bMHO3fuhMPhwF133YXCwkIkJCQgPj4ey5cvR1ZWFmfqERH1gI69mMzO1guD/ZzOnDmDf//3f8fp06fhcDiQnp6OnTt34nvf+x4A4LnnnkNERATmz5/vtwi3O8bGzkWkLeqqZT5u+p+A9VxsOd+t8/eGvrKlt2qyW4RTz9H5d1f174fMAts249Wrfu7xNCFh4D2qmtQnBBWcXnnllat+HhMTg/Xr12P9+vWmGkVERIF1TIiwma5DR0z8SkRkUR3Pi3p3EW5vYeJXIiLSDntOREQW1b29bC+vQ0cMTkREFmWgHTD5zMnQ9JkTh/WIiEg77DkREVkUh/WIiEg7hlAwrCf0HNbTLjh1JhVsF60ypXu2MUREEjyepgCfXwTQe0lTw4F2wen8+Y6MDkebt4e4JUREcmSzP5w/fx4Oh0PZeTms14ucTidqa2sRFxcHm62ju9q5jcale9xbidWvwertB6x/DWx/6HX3GoQQOH/+PJxOp9L2dAQnc8NyDE6SIiIirrgffefe9lZm9WuwevsB618D2x963bkGlT2mvkC74ERERHKEMGCYza0n2HMiIiKFOobkzCZ+1TM4WWIRrt1ux5o1ayy9Y67Vr8Hq7Qesfw1sf+iFwzVYhU1wbiMRkaV4PB44HA44Ym6AzRZpqi4h2tHQ/Dc0NDRo9SyQw3pERBbV8cSJw3pERES9gj0nIiKL6phpx9l6RESkERVbrOu6TbslhvXWr1+PESNGICYmBpmZmfjwww9D3SQpjz76KGw2m98xduzYUDfrqvbu3Ys5c+bA6XTCZrNh27Ztfp8LIbB69WqkpKQgNjYW2dnZOHr0aGga24VA7b/zzjsvuyezZ88OTWO74Ha7MXnyZMTFxSExMRF5eXmoqqryK9Pc3IyCggIMHjwYAwYMwPz581FfXx+iFl9O5hqmT59+2X249957Q9Rif8XFxUhPT/cttM3KysK7777r+1z37z9caB+c3nzzTRQWFmLNmjU4ePAgMjIykJOTgzNnzoS6aVLGjRuH06dP+473338/1E26qsbGRmRkZGD9+vVdfr527Vq88MIL2LBhA/bv349rrrkGOTk5aG5u7uWWdi1Q+wFg9uzZfvfkjTfe6MUWXl1ZWRkKCgpQXl6OXbt2obW1FbNmzUJjY6OvzMqVK/HOO+9gy5YtKCsrw6lTpzBv3rwQttqfzDUAwNKlS/3uw9q1a0PUYn/Dhg3D008/jYqKChw4cAC33nor5s6di48//hiAXt+/EAJCGCYPTSdsC81NmTJFFBQU+F63t7cLp9Mp3G53CFslZ82aNSIjIyPUzeg2AGLr1q2+14ZhiOTkZPHss8/63jt37pyw2+3ijTfeCEELr+7S9gshRH5+vpg7d25I2tMdZ86cEQBEWVmZEKLj+46KihJbtmzxlfm///s/AUDs27cvVM28qkuvQQghvvvd74oHHnggdI0K0qBBg8TLL7+szfff0NAgAIjY6BGiv32kqSM2eoQAIBoaGnqt/TK07jm1tLSgoqIC2dnZvvciIiKQnZ2Nffv2hbBl8o4ePQqn04mRI0di0aJFOHHiRKib1G01NTWoq6vzux8OhwOZmZmWuR8AsGfPHiQmJmLMmDG47777cPbs2VA36YoaGhoAAAkJCQCAiooKtLa2+t2DsWPHIjU1Vdt7cOk1dHr99dcxZMgQjB8/HkVFRWhquvq2E6HQ3t6OzZs3o7GxEVlZWZb8/q1K6wkRX3zxBdrb25GUlOT3flJSEv7+97+HqFXyMjMzsWnTJowZMwanT5/GY489hu985zs4cuQI4uLiQt28oNXV1QFAl/ej8zPdzZ49G/PmzUNaWhqOHTuG//zP/0Rubi727duHyEhzixlVMwwDK1aswNSpUzF+/HgAHfcgOjoaAwcO9Cur6z3o6hoA4Mc//jGGDx8Op9OJQ4cO4aGHHkJVVRV+//vfh7C1Xzt8+DCysrLQ3NyMAQMGYOvWrbjhhhtQWVmp1fcvRDvM7mvH2Xp9UG5uru/f09PTkZmZieHDh+Ott97CXXfdFcKW9V0LFy70/fuECROQnp6OUaNGYc+ePZg5c2YIW3a5goICHDlyRPvnlFdzpWu4556v9z+aMGECUlJSMHPmTBw7dgyjRo3q7WZeZsyYMaisrERDQwN+97vfIT8/H2VlZaFu1mVUBBZdg5PWw3pDhgxBZGTkZTNh6uvrkZycHKJWdd/AgQPxrW99C9XV1aFuSrd0fufhcj8AYOTIkRgyZIh292TZsmXYvn07du/e7beFTHJyMlpaWnDu3Dm/8jregytdQ1cyMzMBQJv7EB0djdGjR2PSpElwu93IyMjA888/b6nv3+q0Dk7R0dGYNGkSSktLfe8ZhoHS0lJkZWWFsGXdc+HCBRw7dgwpKSmhbkq3pKWlITk52e9+eDwe7N+/35L3AwA+++wznD17Vpt7IoTAsmXLsHXrVvzlL39BWlqa3+eTJk1CVFSU3z2oqqrCiRMntLkHga6hK5WVlQCgzX24lGEY8Hq92n3/nTvhmj10pP2wXmFhIfLz83HTTTdhypQpWLduHRobG7F48eJQNy2gn//855gzZw6GDx+OU6dOYc2aNYiMjMQdd9wR6qZd0YULF/z+77WmpgaVlZVISEhAamoqVqxYgSeffBLXXXcd0tLSsGrVKjidTuTl5YWu0d9wtfYnJCTgsccew/z585GcnIxjx47hwQcfxOjRo5GTkxPCVn+toKAAJSUlePvttxEXF+d7juFwOBAbGwuHw4G77roLhYWFSEhIQHx8PJYvX46srCzcfPPNIW59h0DXcOzYMZSUlOD73/8+Bg8ejEOHDmHlypWYNm0a0tPTQ9x6oKioCLm5uUhNTcX58+dRUlKCPXv2YOfOndp9/+E8rKf9VHIhhHjxxRdFamqqiI6OFlOmTBHl5eWhbpKUBQsWiJSUFBEdHS2uvfZasWDBAlFdXR3qZl3V7t27BTqesPod+fn5QoiO6eSrVq0SSUlJwm63i5kzZ4qqqqrQNvobrtb+pqYmMWvWLDF06FARFRUlhg8fLpYuXSrq6upC3WyfrtoOQGzcuNFX5uLFi+L+++8XgwYNEv379xe33367OH36dOgafYlA13DixAkxbdo0kZCQIOx2uxg9erT4xS9+oc1U5iVLlojhw4eL6OhoMXToUDFz5kzx5z//2fe5Dt9/51TyqMgkEd0vxdQRFZmk5VRybplBRGQxnVtm9IscCpvN3NMZIQy0tX/OLTOIiEiNcJ5KrvWECCIi6pvYcyIisiwBmJ5tp+eTHQYnIiKLUrOfk57BicN6RESkHfaciIgsqmMBrcmeE4f1iIhILfPBSddnThzWIyIi7bDnRERkVQomREDTCREMTkREFhXOz5w4rEdERNphcCIisixD0RG89evXY8SIEYiJiUFmZiY+/PBDc5dyCQYnIiLLEh3PjMwc3RjWe/PNN1FYWIg1a9bg4MGDyMjIQE5ODs6cOaPsypiVnIjIYjqzkgP9YFPyzKktqKzkmZmZmDx5Ml566SUAHZsxulwuLF++HA8//LCp9nRiz4mIyLKE6X+C7Tm1tLSgoqIC2dnZvvciIiKQnZ2Nffv2KbsyztYjIrI0NYNfHo/H77Xdbofdbr+s3BdffIH29nYkJSX5vZ+UlIS///3vStoCsOdERGQ50dHRSE5OBtCu5BgwYABcLhccDofvcLvdvX1ZfthzIiKymJiYGNTU1KClpUVJfUII2Gz+z6666jUBwJAhQxAZGYn6+nq/9+vr678KmGowOBERWVBMTAxiYmJ6/bzR0dGYNGkSSktLkZeXB6BjQkRpaSmWLVum7DwMTkREFJTCwkLk5+fjpptuwpQpU7Bu3To0NjZi8eLFys7B4EREREFZsGABPv/8c6xevRp1dXWYOHEiduzYcdkkCTO4zomIiLTD2XpERKQdBiciItIOgxMREWmHwYmIiLTD4ERERNphcCIiIu0wOBERkXYYnIiISDsMTkREpB0GJyIi0g6DExERaYfBiYiItPP/iN3BNtmcJVIAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "visualize_matrix(dbf_1.h.matrix)" ] }, { "cell_type": "code", - "execution_count": 67, + "execution_count": null, "id": "ac8ed320-04a8-42af-a980-48ab4f1fff7c", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "visualize_matrix(dbf_2.h.matrix)" ] @@ -713,7 +509,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.0" + "version": "3.10.12" } }, "nbformat": 4, From 0b7b7dc6e9f65a812b178b8eeb6315a80109a674 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Wed, 15 Nov 2023 09:13:46 +0100 Subject: [PATCH 036/143] test constructors with flow mode --- tests/test_models_dbf.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/tests/test_models_dbf.py b/tests/test_models_dbf.py index 71e428178b..31bd77c62f 100644 --- a/tests/test_models_dbf.py +++ b/tests/test_models_dbf.py @@ -15,10 +15,12 @@ @pytest.mark.parametrize("nqubits", [3, 4, 5]) def test_double_bracket_flow_canonical(backend, nqubits): h0 = random_hermitian(2**nqubits, backend=backend) - dbf = DoubleBracketFlow(Hamiltonian(nqubits, h0, backend=backend)) + dbf = DoubleBracketFlow( + Hamiltonian(nqubits, h0, backend=backend), mode=FlowGeneratorType.canonical + ) initial_off_diagonal_norm = dbf.off_diagonal_norm for _ in range(NSTEPS): - dbf(mode=FlowGeneratorType.canonical, step=np.sqrt(0.001)) + dbf(step=np.sqrt(0.001)) assert initial_off_diagonal_norm > dbf.off_diagonal_norm @@ -27,14 +29,17 @@ def test_double_bracket_flow_canonical(backend, nqubits): def test_double_bracket_flow_group_commutator(backend, nqubits): h0 = random_hermitian(2**nqubits, backend=backend) d = backend.cast(np.diag(np.diag(backend.to_numpy(h0)))) - dbf = DoubleBracketFlow(Hamiltonian(nqubits, h0, backend=backend)) + dbf = DoubleBracketFlow( + Hamiltonian(nqubits, h0, backend=backend), + mode=FlowGeneratorType.group_commutator, + ) initial_off_diagonal_norm = dbf.off_diagonal_norm with pytest.raises(ValueError): dbf(mode=FlowGeneratorType.group_commutator, step=0.01) for _ in range(NSTEPS): - dbf(mode=FlowGeneratorType.group_commutator, step=0.01, d=d) + dbf(step=0.01, d=d) assert initial_off_diagonal_norm > dbf.off_diagonal_norm @@ -43,14 +48,17 @@ def test_double_bracket_flow_group_commutator(backend, nqubits): def test_double_bracket_flow_single_commutator(backend, nqubits): h0 = random_hermitian(2**nqubits, backend=backend) d = backend.cast(np.diag(np.diag(backend.to_numpy(h0)))) - dbf = DoubleBracketFlow(Hamiltonian(nqubits, h0, backend=backend)) + dbf = DoubleBracketFlow( + Hamiltonian(nqubits, h0, backend=backend), + mode=FlowGeneratorType.single_commutator, + ) initial_off_diagonal_norm = dbf.off_diagonal_norm with pytest.raises(ValueError): dbf(mode=FlowGeneratorType.single_commutator, step=0.01) for _ in range(NSTEPS): - dbf(mode=FlowGeneratorType.single_commutator, step=0.01, d=d) + dbf(step=0.01, d=d) assert initial_off_diagonal_norm > dbf.off_diagonal_norm From 08db7125458389566803380103d81e8973ead0c6 Mon Sep 17 00:00:00 2001 From: simone bordoni Date: Wed, 15 Nov 2023 16:00:18 +0400 Subject: [PATCH 037/143] general idea --- src/qibo/transpiler/decompositions.py | 367 +++++++++++++++++++++ src/qibo/transpiler/pipeline.py | 14 +- src/qibo/transpiler/unroller.py | 388 +++-------------------- tests/test_transpiler_pipeline.py | 6 +- tests/test_transpiler_unroller.py | 184 ----------- tests/test_transpilers_decompositions.py | 198 ++++++++++++ 6 files changed, 627 insertions(+), 530 deletions(-) create mode 100644 src/qibo/transpiler/decompositions.py create mode 100644 tests/test_transpilers_decompositions.py diff --git a/src/qibo/transpiler/decompositions.py b/src/qibo/transpiler/decompositions.py new file mode 100644 index 0000000000..c4fea72b8c --- /dev/null +++ b/src/qibo/transpiler/decompositions.py @@ -0,0 +1,367 @@ +import numpy as np + +from qibo import gates +from qibo.backends import NumpyBackend +from qibo.transpiler.unitary_decompositions import ( + two_qubit_decomposition, + u3_decomposition, +) + +backend = NumpyBackend() + + +class GateDecompositions: + """Abstract data structure that holds decompositions of gates.""" + + def __init__(self): + self.decompositions = {} + + def add(self, gate, decomposition): + """Register a decomposition for a gate.""" + self.decompositions[gate] = decomposition + + def count_2q(self, gate): + """Count the number of two-qubit gates in the decomposition of the given gate.""" + if gate.parameters: + decomposition = self.decompositions[gate.__class__](gate) + else: + decomposition = self.decompositions[gate.__class__] + return len(tuple(g for g in decomposition if len(g.qubits) > 1)) + + def count_1q(self, gate): + """Count the number of single qubit gates in the decomposition of the given gate.""" + if gate.parameters: + decomposition = self.decompositions[gate.__class__](gate) + else: + decomposition = self.decompositions[gate.__class__] + return len(tuple(g for g in decomposition if len(g.qubits) == 1)) + + def __call__(self, gate): + """Decompose a gate.""" + decomposition = self.decompositions[gate.__class__] + if callable(decomposition): + decomposition = decomposition(gate) + return [ + g.on_qubits({i: q for i, q in enumerate(gate.qubits)}) + for g in decomposition + ] + + +gpi2_dec = GateDecompositions() +gpi2_dec.add(gates.H, [gates.U3(0, 7 * np.pi / 2, np.pi, 0)]) +gpi2_dec.add(gates.X, [gates.U3(0, np.pi, 0, np.pi)]) +gpi2_dec.add(gates.Y, [gates.U3(0, np.pi, 0, 0)]) +# apply virtually by changing ``phase`` instead of using pulses +gpi2_dec.add(gates.Z, [gates.Z(0)]) +gpi2_dec.add(gates.S, [gates.RZ(0, np.pi / 2)]) +gpi2_dec.add(gates.SDG, [gates.RZ(0, -np.pi / 2)]) +gpi2_dec.add(gates.T, [gates.RZ(0, np.pi / 4)]) +gpi2_dec.add(gates.TDG, [gates.RZ(0, -np.pi / 4)]) +gpi2_dec.add( + gates.RX, lambda gate: [gates.U3(0, gate.parameters[0], -np.pi / 2, np.pi / 2)] +) +gpi2_dec.add(gates.RY, lambda gate: [gates.U3(0, gate.parameters[0], 0, 0)]) +# apply virtually by changing ``phase`` instead of using pulses +gpi2_dec.add(gates.RZ, lambda gate: [gates.RZ(0, gate.parameters[0])]) +# apply virtually by changing ``phase`` instead of using pulses +gpi2_dec.add(gates.GPI2, lambda gate: [gates.GPI2(0, gate.parameters[0])]) +# implemented as single RX90 pulse +gpi2_dec.add(gates.U1, lambda gate: [gates.RZ(0, gate.parameters[0])]) +gpi2_dec.add( + gates.U2, + lambda gate: [gates.U3(0, np.pi / 2, gate.parameters[0], gate.parameters[1])], +) +gpi2_dec.add( + gates.U3, + lambda gate: [ + gates.U3(0, gate.parameters[0], gate.parameters[1], gate.parameters[2]) + ], +) +gpi2_dec.add( + gates.Unitary, + lambda gate: [gates.U3(0, *u3_decomposition(gate.parameters[0]))], +) +gpi2_dec.add( + gates.FusedGate, + lambda gate: [gates.U3(0, *u3_decomposition(gate.matrix(backend)))], +) + + +u3_dec = GateDecompositions() +u3_dec.add(gates.H, [gates.U3(0, 7 * 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)]) +# apply virtually by changing ``phase`` instead of using pulses +u3_dec.add(gates.Z, [gates.Z(0)]) +u3_dec.add(gates.S, [gates.RZ(0, np.pi / 2)]) +u3_dec.add(gates.SDG, [gates.RZ(0, -np.pi / 2)]) +u3_dec.add(gates.T, [gates.RZ(0, np.pi / 4)]) +u3_dec.add(gates.TDG, [gates.RZ(0, -np.pi / 4)]) +u3_dec.add( + gates.RX, lambda gate: [gates.U3(0, gate.parameters[0], -np.pi / 2, np.pi / 2)] +) +u3_dec.add(gates.RY, lambda gate: [gates.U3(0, gate.parameters[0], 0, 0)]) +# apply virtually by changing ``phase`` instead of using pulses +u3_dec.add(gates.RZ, lambda gate: [gates.RZ(0, gate.parameters[0])]) +# apply virtually by changing ``phase`` instead of using pulses +u3_dec.add(gates.GPI2, lambda gate: [gates.GPI2(0, gate.parameters[0])]) +# implemented as single RX90 pulse +u3_dec.add(gates.U1, lambda gate: [gates.RZ(0, gate.parameters[0])]) +u3_dec.add( + gates.U2, + lambda gate: [gates.U3(0, np.pi / 2, gate.parameters[0], gate.parameters[1])], +) +u3_dec.add( + gates.U3, + lambda gate: [ + gates.U3(0, gate.parameters[0], gate.parameters[1], gate.parameters[2]) + ], +) +u3_dec.add( + gates.Unitary, + lambda gate: [gates.U3(0, *u3_decomposition(gate.parameters[0]))], +) +u3_dec.add( + gates.FusedGate, + lambda gate: [gates.U3(0, *u3_decomposition(gate.matrix(backend)))], +) + +# register the iSWAP decompositions +iswap_dec = GateDecompositions() +iswap_dec.add( + gates.CNOT, + [ + gates.U3(0, 3 * np.pi / 2, np.pi, 0), + gates.U3(1, np.pi / 2, -np.pi, -np.pi), + gates.iSWAP(0, 1), + gates.U3(0, np.pi, 0, np.pi), + gates.U3(1, np.pi / 2, -np.pi, -np.pi), + gates.iSWAP(0, 1), + gates.U3(0, np.pi / 2, np.pi / 2, -np.pi), + gates.U3(1, np.pi / 2, -np.pi, -np.pi / 2), + ], +) +iswap_dec.add( + gates.CZ, + [ + gates.U3(0, 7 * np.pi / 2, np.pi, 0), + gates.U3(1, 7 * np.pi / 2, np.pi, 0), + gates.U3(1, np.pi / 2, -np.pi, -np.pi), + gates.iSWAP(0, 1), + gates.U3(0, np.pi, 0, np.pi), + gates.U3(1, np.pi / 2, -np.pi, -np.pi), + gates.iSWAP(0, 1), + gates.U3(0, np.pi / 2, np.pi / 2, -np.pi), + gates.U3(1, np.pi / 2, -np.pi, -np.pi / 2), + gates.U3(1, 7 * np.pi / 2, np.pi, 0), + ], +) +iswap_dec.add( + gates.SWAP, + [ + gates.iSWAP(0, 1), + gates.U3(1, np.pi / 2, -np.pi / 2, np.pi / 2), + gates.iSWAP(0, 1), + gates.U3(0, np.pi / 2, -np.pi / 2, np.pi / 2), + gates.iSWAP(0, 1), + gates.U3(1, np.pi / 2, -np.pi / 2, np.pi / 2), + ], +) +iswap_dec.add(gates.iSWAP, [gates.iSWAP(0, 1)]) + +# register CZ decompositions +cz_dec = GateDecompositions() +cz_dec.add(gates.CNOT, [gates.H(1), gates.CZ(0, 1), gates.H(1)]) +cz_dec.add(gates.CZ, [gates.CZ(0, 1)]) +cz_dec.add( + gates.SWAP, + [ + gates.H(1), + gates.CZ(0, 1), + gates.H(1), + gates.H(0), + gates.CZ(1, 0), + gates.H(0), + gates.H(1), + gates.CZ(0, 1), + gates.H(1), + ], +) +cz_dec.add( + gates.iSWAP, + [ + gates.U3(0, np.pi / 2.0, 0, -np.pi / 2.0), + gates.U3(1, np.pi / 2.0, 0, -np.pi / 2.0), + gates.CZ(0, 1), + gates.H(0), + gates.H(1), + gates.CZ(0, 1), + gates.H(0), + gates.H(1), + ], +) +cz_dec.add( + gates.CRX, + lambda gate: [ + gates.RX(1, gate.parameters[0] / 2.0), + gates.CZ(0, 1), + gates.RX(1, -gate.parameters[0] / 2.0), + gates.CZ(0, 1), + ], +) +cz_dec.add( + gates.CRY, + lambda gate: [ + gates.RY(1, gate.parameters[0] / 2.0), + gates.CZ(0, 1), + gates.RY(1, -gate.parameters[0] / 2.0), + gates.CZ(0, 1), + ], +) +cz_dec.add( + gates.CRZ, + lambda gate: [ + gates.RZ(1, gate.parameters[0] / 2.0), + gates.H(1), + gates.CZ(0, 1), + gates.RX(1, -gate.parameters[0] / 2.0), + gates.CZ(0, 1), + gates.H(1), + ], +) +cz_dec.add( + gates.CU1, + lambda gate: [ + gates.RZ(0, gate.parameters[0] / 2.0), + gates.H(1), + gates.CZ(0, 1), + gates.RX(1, -gate.parameters[0] / 2.0), + gates.CZ(0, 1), + gates.H(1), + gates.RZ(1, gate.parameters[0] / 2.0), + ], +) +cz_dec.add( + gates.CU2, + lambda gate: [ + gates.RZ(1, (gate.parameters[1] - gate.parameters[0]) / 2.0), + gates.H(1), + gates.CZ(0, 1), + gates.H(1), + gates.U3(1, -np.pi / 4, 0, -(gate.parameters[1] + gate.parameters[0]) / 2.0), + gates.H(1), + gates.CZ(0, 1), + gates.H(1), + gates.U3(1, np.pi / 4, gate.parameters[0], 0), + ], +) +cz_dec.add( + gates.CU3, + lambda gate: [ + gates.RZ(1, (gate.parameters[2] - gate.parameters[1]) / 2.0), + gates.H(1), + gates.CZ(0, 1), + gates.H(1), + gates.U3( + 1, + -gate.parameters[0] / 2.0, + 0, + -(gate.parameters[2] + gate.parameters[1]) / 2.0, + ), + gates.H(1), + gates.CZ(0, 1), + gates.H(1), + gates.U3(1, gate.parameters[0] / 2.0, gate.parameters[1], 0), + ], +) +cz_dec.add( + gates.FSWAP, + [ + gates.U3(0, np.pi / 2, -np.pi / 2, -np.pi), + gates.U3(1, np.pi / 2, np.pi / 2, np.pi / 2), + gates.CZ(0, 1), + gates.U3(0, np.pi / 2, 0, -np.pi / 2), + gates.U3(1, np.pi / 2, 0, np.pi / 2), + gates.CZ(0, 1), + gates.U3(0, np.pi / 2, np.pi / 2, -np.pi), + gates.U3(1, np.pi / 2, 0, -np.pi), + ], +) +cz_dec.add( + gates.RXX, + lambda gate: [ + gates.H(0), + gates.CZ(0, 1), + gates.RX(1, gate.parameters[0]), + gates.CZ(0, 1), + gates.H(0), + ], +) +cz_dec.add( + gates.RYY, + lambda gate: [ + gates.RX(0, np.pi / 2), + gates.U3(1, np.pi / 2, np.pi / 2, -np.pi), + gates.CZ(0, 1), + gates.RX(1, gate.parameters[0]), + gates.CZ(0, 1), + gates.RX(0, -np.pi / 2), + gates.U3(1, np.pi / 2, 0, np.pi / 2), + ], +) +cz_dec.add( + gates.RZZ, + lambda gate: [ + gates.H(1), + gates.CZ(0, 1), + gates.RX(1, gate.parameters[0]), + gates.CZ(0, 1), + gates.H(1), + ], +) +cz_dec.add( + gates.TOFFOLI, + [ + gates.CZ(1, 2), + gates.RX(2, -np.pi / 4), + gates.CZ(0, 2), + gates.RX(2, np.pi / 4), + gates.CZ(1, 2), + gates.RX(2, -np.pi / 4), + gates.CZ(0, 2), + gates.RX(2, np.pi / 4), + gates.RZ(1, np.pi / 4), + gates.H(1), + gates.CZ(0, 1), + gates.RZ(0, np.pi / 4), + gates.RX(1, -np.pi / 4), + gates.CZ(0, 1), + gates.H(1), + ], +) +cz_dec.add( + gates.Unitary, + lambda gate: two_qubit_decomposition(0, 1, gate.parameters[0], backend=backend), +) +cz_dec.add( + gates.fSim, + lambda gate: two_qubit_decomposition(0, 1, gate.matrix(backend), backend=backend), +) +cz_dec.add( + gates.GeneralizedfSim, + lambda gate: two_qubit_decomposition(0, 1, gate.matrix(backend), backend=backend), +) + +# register other optimized gate decompositions +opt_dec = GateDecompositions() +opt_dec.add( + gates.SWAP, + [ + gates.H(0), + gates.SDG(0), + gates.SDG(1), + gates.iSWAP(0, 1), + gates.CZ(0, 1), + gates.H(1), + ], +) diff --git a/src/qibo/transpiler/pipeline.py b/src/qibo/transpiler/pipeline.py index ecc1b8b687..a473aa061a 100644 --- a/src/qibo/transpiler/pipeline.py +++ b/src/qibo/transpiler/pipeline.py @@ -3,6 +3,7 @@ import networkx as nx import numpy as np +from qibo import gates from qibo.backends import NumpyBackend from qibo.config import raise_error from qibo.models import Circuit @@ -97,7 +98,8 @@ def assert_transpiling( connectivity: nx.Graph, initial_layout: dict, final_layout: dict, - native_gates: NativeType = NativeType.CZ, + two_qubit_natives: NativeType = NativeType.CZ, + single_qubit_natives: tuple = (gates.I, gates.Z, gates.RZ, gates.U3), check_circuit_equivalence=True, ): """Check that all transpiler passes have been executed correctly. @@ -108,10 +110,16 @@ def assert_transpiling( connectivity (networkx.Graph): chip qubits connectivity. initial_layout (dict): initial physical-logical qubit mapping. final_layout (dict): final physical-logical qubit mapping. - native_gates: (NativeType): native gates supported by the hardware. + two_qubit_natives (NativeType): two qubit native gates supported by the hardware. + single_qubit_natives (tuple): single qubit native gates supported by the hardware. + check_circuit_equivalence (Bool): use simulations to check if the transpiled circuit is the same as the original. """ assert_connectivity(circuit=transpiled_circuit, connectivity=connectivity) - assert_decomposition(circuit=transpiled_circuit, two_qubit_natives=native_gates) + assert_decomposition( + circuit=transpiled_circuit, + two_qubit_natives=two_qubit_natives, + single_qubit_natives=single_qubit_natives, + ) if original_circuit.nqubits != transpiled_circuit.nqubits: qubit_matcher = Preprocessing(connectivity=connectivity) original_circuit = qubit_matcher(circuit=original_circuit) diff --git a/src/qibo/transpiler/unroller.py b/src/qibo/transpiler/unroller.py index 74f42ace99..03ec73dcfd 100644 --- a/src/qibo/transpiler/unroller.py +++ b/src/qibo/transpiler/unroller.py @@ -1,17 +1,9 @@ -import numpy as np - from qibo import gates -from qibo.backends import NumpyBackend from qibo.config import raise_error from qibo.models import Circuit from qibo.transpiler.abstract import NativeType, Unroller +from qibo.transpiler.decompositions import cz_dec, gpi2_dec, iswap_dec, opt_dec, u3_dec from qibo.transpiler.exceptions import DecompositionError -from qibo.transpiler.unitary_decompositions import ( - two_qubit_decomposition, - u3_decomposition, -) - -backend = NumpyBackend() # TODO: Make setting single-qubit native gates more flexible @@ -24,6 +16,7 @@ class NativeGates(Unroller): single_qubit_natives (tuple): single qubit native gates. two_qubit_natives (:class:`qibo.transpiler.abstract.NativeType`): two-qubit native gates supported by the quantum hardware. + single_qubit_natives (tuple): single qubit native gates. Returns: (:class:`qibo.models.circuit.Circuit`): equivalent circuit with native gates. @@ -32,7 +25,7 @@ class NativeGates(Unroller): def __init__( self, two_qubit_natives: NativeType, - single_qubit_natives=(gates.I, gates.Z, gates.RZ, gates.U3), + single_qubit_natives=(gates.I, gates.Z, gates.RZ, gates.GPI2), translate_single_qubit: bool = True, ): self.two_qubit_natives = two_qubit_natives @@ -45,30 +38,53 @@ def __call__(self, circuit: Circuit): for gate in circuit.queue: if len(gate.qubits) > 1 or self.translate_single_qubit: two_qubit_translated_circuit.add( - translate_gate(gate, self.two_qubit_natives) + translate_gate( + gate, + self.two_qubit_natives, + single_qubit_natives=self.single_qubit_natives, + ) ) else: two_qubit_translated_circuit.add(gate) if self.translate_single_qubit: for gate in two_qubit_translated_circuit.queue: if len(gate.qubits) == 1: - translated_circuit.add(translate_gate(gate, self.two_qubit_natives)) + translated_circuit.add( + translate_gate( + gate, + self.two_qubit_natives, + single_qubit_natives=self.single_qubit_natives, + ) + ) else: translated_circuit.add(gate) else: translated_circuit = two_qubit_translated_circuit return translated_circuit + def is_satisfied(self, circuit: Circuit): + """Return True if a circuit is correctly decomposed into native gates, otherwise False.""" + try: + assert_decomposition( + circuit, self.two_qubit_natives, self.single_qubit_natives + ) + except DecompositionError: + return False + return True + def assert_decomposition( circuit: Circuit, two_qubit_natives: NativeType, - single_qubit_natives=(gates.I, gates.Z, gates.RZ, gates.U3), + single_qubit_natives=(gates.I, gates.Z, gates.RZ, gates.GPI2), ): """Checks if a circuit has been correctly decmposed into native gates. Args: circuit (:class:`qibo.models.circuit.Circuit`): circuit model to check. + two_qubit_natives (:class:`qibo.transpiler.abstract.NativeType`): + two-qubit native gates supported by the quantum hardware. + single_qubit_natives (tuple): single qubit native gates. """ for gate in circuit.queue: if isinstance(gate, gates.M): @@ -85,11 +101,11 @@ def assert_decomposition( if not (native_type_gate in two_qubit_natives): raise_error( DecompositionError, - f"{gate.name} is not a two qubit native gate.", + f"{gate.name} is not a two qubits native gate.", ) except ValueError: raise_error( - DecompositionError, f"{gate.name} is not a two qubit native gate." + DecompositionError, f"{gate.name} is not a two qubits native gate." ) else: raise_error( @@ -97,13 +113,18 @@ def assert_decomposition( ) -def translate_gate(gate, native_gates: NativeType): +def translate_gate( + gate, + two_qubit_natives: NativeType, + single_qubit_natives=(gates.I, gates.Z, gates.RZ, gates.GPI2), +): """Maps gates to a hardware-native implementation. Args: gate (:class:`qibo.gates.abstract.Gate`): gate to be decomposed. - native_gates (:class:`qibo.transpiler.abstract.NativeType`): + two_qubit_natives (:class:`qibo.transpiler.abstract.NativeType`): two-qubit native gates supported by the quantum hardware. + single_qubit_natives (tuple): single qubit native gates. Returns: (list): List of native gates @@ -112,9 +133,14 @@ def translate_gate(gate, native_gates: NativeType): return gate if len(gate.qubits) == 1: - return onequbit_dec(gate) + if gates.U3 in single_qubit_natives: + return u3_dec(gate) + if gates.GPI2 in single_qubit_natives: + return gpi2_dec(gate) + else: + raise DecompositionError("Use U3 or GPI2 as single qubit native gates") - if native_gates is NativeType.CZ | NativeType.iSWAP: + if two_qubit_natives is NativeType.CZ | NativeType.iSWAP: # Check for a special optimized decomposition. if gate.__class__ in opt_dec.decompositions: return opt_dec(gate) @@ -133,9 +159,9 @@ def translate_gate(gate, native_gates: NativeType): return cz_dec(gate) else: # pragma: no cover return iswap_dec(gate) - elif native_gates is NativeType.CZ: + elif two_qubit_natives is NativeType.CZ: return cz_dec(gate) - elif native_gates is NativeType.iSWAP: + elif two_qubit_natives is NativeType.iSWAP: if gate.__class__ in iswap_dec.decompositions: return iswap_dec(gate) else: @@ -149,322 +175,4 @@ def translate_gate(gate, native_gates: NativeType): iswap_decomposed.append(g_translated) return iswap_decomposed else: # pragma: no cover - raise_error(NotImplementedError, "Use only CZ and/or iSWAP as native gates") - - -class GateDecompositions: - """Abstract data structure that holds decompositions of gates.""" - - def __init__(self): - self.decompositions = {} - - def add(self, gate, decomposition): - """Register a decomposition for a gate.""" - self.decompositions[gate] = decomposition - - def count_2q(self, gate): - """Count the number of two-qubit gates in the decomposition of the given gate.""" - if gate.parameters: - decomposition = self.decompositions[gate.__class__](gate) - else: - decomposition = self.decompositions[gate.__class__] - return len(tuple(g for g in decomposition if len(g.qubits) > 1)) - - def count_1q(self, gate): - """Count the number of single qubit gates in the decomposition of the given gate.""" - if gate.parameters: - decomposition = self.decompositions[gate.__class__](gate) - else: - decomposition = self.decompositions[gate.__class__] - return len(tuple(g for g in decomposition if len(g.qubits) == 1)) - - def __call__(self, gate): - """Decompose a gate.""" - decomposition = self.decompositions[gate.__class__] - if callable(decomposition): - decomposition = decomposition(gate) - return [ - g.on_qubits({i: q for i, q in enumerate(gate.qubits)}) - for g in decomposition - ] - - -onequbit_dec = GateDecompositions() -onequbit_dec.add(gates.H, [gates.U3(0, 7 * np.pi / 2, np.pi, 0)]) -onequbit_dec.add(gates.X, [gates.U3(0, np.pi, 0, np.pi)]) -onequbit_dec.add(gates.Y, [gates.U3(0, np.pi, 0, 0)]) -# apply virtually by changing ``phase`` instead of using pulses -onequbit_dec.add(gates.Z, [gates.Z(0)]) -onequbit_dec.add(gates.S, [gates.RZ(0, np.pi / 2)]) -onequbit_dec.add(gates.SDG, [gates.RZ(0, -np.pi / 2)]) -onequbit_dec.add(gates.T, [gates.RZ(0, np.pi / 4)]) -onequbit_dec.add(gates.TDG, [gates.RZ(0, -np.pi / 4)]) -onequbit_dec.add( - gates.RX, lambda gate: [gates.U3(0, gate.parameters[0], -np.pi / 2, np.pi / 2)] -) -onequbit_dec.add(gates.RY, lambda gate: [gates.U3(0, gate.parameters[0], 0, 0)]) -# apply virtually by changing ``phase`` instead of using pulses -onequbit_dec.add(gates.RZ, lambda gate: [gates.RZ(0, gate.parameters[0])]) -# apply virtually by changing ``phase`` instead of using pulses -onequbit_dec.add(gates.GPI2, lambda gate: [gates.GPI2(0, gate.parameters[0])]) -# implemented as single RX90 pulse -onequbit_dec.add(gates.U1, lambda gate: [gates.RZ(0, gate.parameters[0])]) -onequbit_dec.add( - gates.U2, - lambda gate: [gates.U3(0, np.pi / 2, gate.parameters[0], gate.parameters[1])], -) -onequbit_dec.add( - gates.U3, - lambda gate: [ - gates.U3(0, gate.parameters[0], gate.parameters[1], gate.parameters[2]) - ], -) -onequbit_dec.add( - gates.Unitary, - lambda gate: [gates.U3(0, *u3_decomposition(gate.parameters[0]))], -) -onequbit_dec.add( - gates.FusedGate, - lambda gate: [gates.U3(0, *u3_decomposition(gate.matrix(backend)))], -) - -# register the iSWAP decompositions -iswap_dec = GateDecompositions() -iswap_dec.add( - gates.CNOT, - [ - gates.U3(0, 3 * np.pi / 2, np.pi, 0), - gates.U3(1, np.pi / 2, -np.pi, -np.pi), - gates.iSWAP(0, 1), - gates.U3(0, np.pi, 0, np.pi), - gates.U3(1, np.pi / 2, -np.pi, -np.pi), - gates.iSWAP(0, 1), - gates.U3(0, np.pi / 2, np.pi / 2, -np.pi), - gates.U3(1, np.pi / 2, -np.pi, -np.pi / 2), - ], -) -iswap_dec.add( - gates.CZ, - [ - gates.U3(0, 7 * np.pi / 2, np.pi, 0), - gates.U3(1, 7 * np.pi / 2, np.pi, 0), - gates.U3(1, np.pi / 2, -np.pi, -np.pi), - gates.iSWAP(0, 1), - gates.U3(0, np.pi, 0, np.pi), - gates.U3(1, np.pi / 2, -np.pi, -np.pi), - gates.iSWAP(0, 1), - gates.U3(0, np.pi / 2, np.pi / 2, -np.pi), - gates.U3(1, np.pi / 2, -np.pi, -np.pi / 2), - gates.U3(1, 7 * np.pi / 2, np.pi, 0), - ], -) -iswap_dec.add( - gates.SWAP, - [ - gates.iSWAP(0, 1), - gates.U3(1, np.pi / 2, -np.pi / 2, np.pi / 2), - gates.iSWAP(0, 1), - gates.U3(0, np.pi / 2, -np.pi / 2, np.pi / 2), - gates.iSWAP(0, 1), - gates.U3(1, np.pi / 2, -np.pi / 2, np.pi / 2), - ], -) -iswap_dec.add(gates.iSWAP, [gates.iSWAP(0, 1)]) - -# register CZ decompositions -cz_dec = GateDecompositions() -cz_dec.add(gates.CNOT, [gates.H(1), gates.CZ(0, 1), gates.H(1)]) -cz_dec.add(gates.CZ, [gates.CZ(0, 1)]) -cz_dec.add( - gates.SWAP, - [ - gates.H(1), - gates.CZ(0, 1), - gates.H(1), - gates.H(0), - gates.CZ(1, 0), - gates.H(0), - gates.H(1), - gates.CZ(0, 1), - gates.H(1), - ], -) -cz_dec.add( - gates.iSWAP, - [ - gates.U3(0, np.pi / 2.0, 0, -np.pi / 2.0), - gates.U3(1, np.pi / 2.0, 0, -np.pi / 2.0), - gates.CZ(0, 1), - gates.H(0), - gates.H(1), - gates.CZ(0, 1), - gates.H(0), - gates.H(1), - ], -) -cz_dec.add( - gates.CRX, - lambda gate: [ - gates.RX(1, gate.parameters[0] / 2.0), - gates.CZ(0, 1), - gates.RX(1, -gate.parameters[0] / 2.0), - gates.CZ(0, 1), - ], -) -cz_dec.add( - gates.CRY, - lambda gate: [ - gates.RY(1, gate.parameters[0] / 2.0), - gates.CZ(0, 1), - gates.RY(1, -gate.parameters[0] / 2.0), - gates.CZ(0, 1), - ], -) -cz_dec.add( - gates.CRZ, - lambda gate: [ - gates.RZ(1, gate.parameters[0] / 2.0), - gates.H(1), - gates.CZ(0, 1), - gates.RX(1, -gate.parameters[0] / 2.0), - gates.CZ(0, 1), - gates.H(1), - ], -) -cz_dec.add( - gates.CU1, - lambda gate: [ - gates.RZ(0, gate.parameters[0] / 2.0), - gates.H(1), - gates.CZ(0, 1), - gates.RX(1, -gate.parameters[0] / 2.0), - gates.CZ(0, 1), - gates.H(1), - gates.RZ(1, gate.parameters[0] / 2.0), - ], -) -cz_dec.add( - gates.CU2, - lambda gate: [ - gates.RZ(1, (gate.parameters[1] - gate.parameters[0]) / 2.0), - gates.H(1), - gates.CZ(0, 1), - gates.H(1), - gates.U3(1, -np.pi / 4, 0, -(gate.parameters[1] + gate.parameters[0]) / 2.0), - gates.H(1), - gates.CZ(0, 1), - gates.H(1), - gates.U3(1, np.pi / 4, gate.parameters[0], 0), - ], -) -cz_dec.add( - gates.CU3, - lambda gate: [ - gates.RZ(1, (gate.parameters[2] - gate.parameters[1]) / 2.0), - gates.H(1), - gates.CZ(0, 1), - gates.H(1), - gates.U3( - 1, - -gate.parameters[0] / 2.0, - 0, - -(gate.parameters[2] + gate.parameters[1]) / 2.0, - ), - gates.H(1), - gates.CZ(0, 1), - gates.H(1), - gates.U3(1, gate.parameters[0] / 2.0, gate.parameters[1], 0), - ], -) -cz_dec.add( - gates.FSWAP, - [ - gates.U3(0, np.pi / 2, -np.pi / 2, -np.pi), - gates.U3(1, np.pi / 2, np.pi / 2, np.pi / 2), - gates.CZ(0, 1), - gates.U3(0, np.pi / 2, 0, -np.pi / 2), - gates.U3(1, np.pi / 2, 0, np.pi / 2), - gates.CZ(0, 1), - gates.U3(0, np.pi / 2, np.pi / 2, -np.pi), - gates.U3(1, np.pi / 2, 0, -np.pi), - ], -) -cz_dec.add( - gates.RXX, - lambda gate: [ - gates.H(0), - gates.CZ(0, 1), - gates.RX(1, gate.parameters[0]), - gates.CZ(0, 1), - gates.H(0), - ], -) -cz_dec.add( - gates.RYY, - lambda gate: [ - gates.RX(0, np.pi / 2), - gates.U3(1, np.pi / 2, np.pi / 2, -np.pi), - gates.CZ(0, 1), - gates.RX(1, gate.parameters[0]), - gates.CZ(0, 1), - gates.RX(0, -np.pi / 2), - gates.U3(1, np.pi / 2, 0, np.pi / 2), - ], -) -cz_dec.add( - gates.RZZ, - lambda gate: [ - gates.H(1), - gates.CZ(0, 1), - gates.RX(1, gate.parameters[0]), - gates.CZ(0, 1), - gates.H(1), - ], -) -cz_dec.add( - gates.TOFFOLI, - [ - gates.CZ(1, 2), - gates.RX(2, -np.pi / 4), - gates.CZ(0, 2), - gates.RX(2, np.pi / 4), - gates.CZ(1, 2), - gates.RX(2, -np.pi / 4), - gates.CZ(0, 2), - gates.RX(2, np.pi / 4), - gates.RZ(1, np.pi / 4), - gates.H(1), - gates.CZ(0, 1), - gates.RZ(0, np.pi / 4), - gates.RX(1, -np.pi / 4), - gates.CZ(0, 1), - gates.H(1), - ], -) -cz_dec.add( - gates.Unitary, - lambda gate: two_qubit_decomposition(0, 1, gate.parameters[0], backend=backend), -) -cz_dec.add( - gates.fSim, - lambda gate: two_qubit_decomposition(0, 1, gate.matrix(backend), backend=backend), -) -cz_dec.add( - gates.GeneralizedfSim, - lambda gate: two_qubit_decomposition(0, 1, gate.matrix(backend), backend=backend), -) - - -# register other optimized gate decompositions -opt_dec = GateDecompositions() -opt_dec.add( - gates.SWAP, - [ - gates.H(0), - gates.SDG(0), - gates.SDG(1), - gates.iSWAP(0, 1), - gates.CZ(0, 1), - gates.H(1), - ], -) + raise_error(DecompositionError, "Use only CZ and/or iSWAP as native gates") diff --git a/tests/test_transpiler_pipeline.py b/tests/test_transpiler_pipeline.py index f887d4b964..685959eec4 100644 --- a/tests/test_transpiler_pipeline.py +++ b/tests/test_transpiler_pipeline.py @@ -84,7 +84,7 @@ def test_pipeline_default(ngates): connectivity=star_connectivity(), initial_layout=initial_layout, final_layout=final_layout, - native_gates=NativeType.CZ, + two_qubit_natives=NativeType.CZ, check_circuit_equivalence=False, ) @@ -178,7 +178,7 @@ def test_custom_passes(circ): connectivity=star_connectivity(), initial_layout=initial_layout, final_layout=final_layout, - native_gates=NativeType.iSWAP, + two_qubit_natives=NativeType.iSWAP, ) @@ -208,7 +208,7 @@ def test_custom_passes_reverse(circ): connectivity=star_connectivity(), initial_layout=initial_layout, final_layout=final_layout, - native_gates=NativeType.iSWAP, + two_qubit_natives=NativeType.iSWAP, ) diff --git a/tests/test_transpiler_unroller.py b/tests/test_transpiler_unroller.py index 15afe7aed8..4b2a3c16a5 100644 --- a/tests/test_transpiler_unroller.py +++ b/tests/test_transpiler_unroller.py @@ -1,199 +1,15 @@ -import numpy as np import pytest from qibo import gates -from qibo.backends import NumpyBackend from qibo.models import Circuit -from qibo.quantum_info.random_ensembles import random_unitary from qibo.transpiler.abstract import NativeType from qibo.transpiler.unroller import ( DecompositionError, NativeGates, assert_decomposition, - translate_gate, ) -def assert_matrices_allclose(gate, two_qubit_natives, backend): - target_matrix = gate.matrix(backend) - target_matrix = backend.cast(target_matrix, dtype=target_matrix.dtype) - # Remove global phase from target matrix - normalisation = np.power( - np.linalg.det(target_matrix), 1 / float(target_matrix.shape[0]), dtype=complex - ) - normalisation = backend.cast(normalisation, dtype=normalisation.dtype) - target_unitary = target_matrix / normalisation - - circuit = Circuit(len(gate.qubits)) - circuit.add(translate_gate(gate, two_qubit_natives)) - native_matrix = circuit.unitary(backend) - # Remove global phase from native matrix - normalisation = np.power( - np.linalg.det(native_matrix), 1 / float(native_matrix.shape[0]), dtype=complex - ) - normalisation = backend.cast(normalisation, dtype=normalisation.dtype) - native_unitary = native_matrix / normalisation - - # There can still be phase differences of -1, -1j, 1j - c = 0 - for phase in [1, -1, 1j, -1j]: - if np.allclose(phase * native_unitary, target_unitary, atol=1e-12): - c = 1 - backend.assert_allclose(c, 1) - - -@pytest.mark.parametrize("gatename", ["H", "X", "Y", "I"]) -def test_pauli_to_native(backend, gatename): - gate = getattr(gates, gatename)(0) - assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) - - -@pytest.mark.parametrize("gatename", ["RX", "RY", "RZ"]) -def test_rotations_to_native(backend, gatename): - gate = getattr(gates, gatename)(0, theta=0.1) - assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) - - -@pytest.mark.parametrize("gatename", ["S", "SDG", "T", "TDG"]) -def test_special_single_qubit_to_native(backend, gatename): - gate = getattr(gates, gatename)(0) - assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) - - -def test_u1_to_native(backend): - gate = gates.U1(0, theta=0.5) - assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) - - -def test_u2_to_native(backend): - gate = gates.U2(0, phi=0.1, lam=0.3) - assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) - - -def test_u3_to_native(backend): - gate = gates.U3(0, theta=0.2, phi=0.1, lam=0.3) - assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) - - -def test_gpi2_to_native(backend): - gate = gates.GPI2(0, phi=0.123) - assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) - - -@pytest.mark.parametrize("gatename", ["CNOT", "CZ", "SWAP", "iSWAP", "FSWAP"]) -@pytest.mark.parametrize( - "natives", - [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], -) -def test_two_qubit_to_native(backend, gatename, natives): - gate = getattr(gates, gatename)(0, 1) - assert_matrices_allclose(gate, natives, backend) - - -@pytest.mark.parametrize( - "natives", - [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], -) -@pytest.mark.parametrize("gatename", ["CRX", "CRY", "CRZ"]) -def test_controlled_rotations_to_native(backend, gatename, natives): - gate = getattr(gates, gatename)(0, 1, 0.3) - assert_matrices_allclose(gate, natives, backend) - - -@pytest.mark.parametrize( - "natives", - [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], -) -def test_cu1_to_native(backend, natives): - gate = gates.CU1(0, 1, theta=0.4) - assert_matrices_allclose(gate, natives, backend) - - -@pytest.mark.parametrize( - "natives", - [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], -) -def test_cu2_to_native(backend, natives): - gate = gates.CU2(0, 1, phi=0.2, lam=0.3) - assert_matrices_allclose(gate, natives, backend) - - -@pytest.mark.parametrize( - "natives", - [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], -) -def test_cu3_to_native(backend, natives): - gate = gates.CU3(0, 1, theta=0.2, phi=0.3, lam=0.4) - assert_matrices_allclose(gate, natives, backend) - - -@pytest.mark.parametrize( - "natives", - [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], -) -def test_fSim_to_native(backend, natives): - gate = gates.fSim(0, 1, theta=0.3, phi=0.1) - assert_matrices_allclose(gate, natives, backend) - - -@pytest.mark.parametrize("seed", [None, 10, np.random.default_rng(10)]) -@pytest.mark.parametrize( - "natives", - [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], -) -def test_GeneralizedfSim_to_native(backend, natives, seed): - unitary = random_unitary(2, seed=seed, backend=backend) - gate = gates.GeneralizedfSim(0, 1, unitary, phi=0.1) - assert_matrices_allclose(gate, natives, backend) - - -@pytest.mark.parametrize( - "natives", - [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], -) -@pytest.mark.parametrize("gatename", ["RXX", "RZZ", "RYY"]) -def test_rnn_to_native(backend, gatename, natives): - gate = getattr(gates, gatename)(0, 1, theta=0.1) - assert_matrices_allclose(gate, natives, backend) - - -@pytest.mark.parametrize( - "natives", - [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], -) -def test_TOFFOLI_to_native(backend, natives): - gate = gates.TOFFOLI(0, 1, 2) - assert_matrices_allclose(gate, natives, backend) - - -@pytest.mark.parametrize("seed", [None, 10, np.random.default_rng(10)]) -@pytest.mark.parametrize( - "natives", - [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], -) -@pytest.mark.parametrize("nqubits", [1, 2]) -def test_unitary_to_native(backend, nqubits, natives, seed): - u = random_unitary(2**nqubits, seed=seed, backend=NumpyBackend()) - # transform to SU(2^nqubits) form - u = u / np.sqrt(np.linalg.det(u)) - gate = gates.Unitary(u, *range(nqubits)) - assert_matrices_allclose(gate, natives, backend) - - -def test_count_1q(): - from qibo.transpiler.unroller import cz_dec - - np.testing.assert_allclose(cz_dec.count_1q(gates.CNOT(0, 1)), 2) - np.testing.assert_allclose(cz_dec.count_1q(gates.CRX(0, 1, 0.1)), 2) - - -def test_count_2q(): - from qibo.transpiler.unroller import cz_dec - - np.testing.assert_allclose(cz_dec.count_2q(gates.CNOT(0, 1)), 1) - np.testing.assert_allclose(cz_dec.count_2q(gates.CRX(0, 1, 0.1)), 2) - - def test_assert_decomposition(): circuit = Circuit(2) circuit.add(gates.CZ(0, 1)) diff --git a/tests/test_transpilers_decompositions.py b/tests/test_transpilers_decompositions.py new file mode 100644 index 0000000000..682d317eb9 --- /dev/null +++ b/tests/test_transpilers_decompositions.py @@ -0,0 +1,198 @@ +import numpy as np +import pytest + +from qibo import gates +from qibo.backends import NumpyBackend +from qibo.models import Circuit +from qibo.quantum_info.random_ensembles import random_unitary +from qibo.transpiler.abstract import NativeType +from qibo.transpiler.unroller import translate_gate + + +def assert_matrices_allclose( + gate, + two_qubit_natives, + backend, + single_qubit_natives=(gates.I, gates.Z, gates.RZ, gates.U3), +): + target_matrix = gate.matrix(backend) + target_matrix = backend.cast(target_matrix, dtype=target_matrix.dtype) + # Remove global phase from target matrix + normalisation = np.power( + np.linalg.det(target_matrix), 1 / float(target_matrix.shape[0]), dtype=complex + ) + normalisation = backend.cast(normalisation, dtype=normalisation.dtype) + target_unitary = target_matrix / normalisation + + circuit = Circuit(len(gate.qubits)) + circuit.add( + translate_gate( + gate, two_qubit_natives, single_qubit_natives=single_qubit_natives + ) + ) + native_matrix = circuit.unitary(backend) + # Remove global phase from native matrix + normalisation = np.power( + np.linalg.det(native_matrix), 1 / float(native_matrix.shape[0]), dtype=complex + ) + normalisation = backend.cast(normalisation, dtype=normalisation.dtype) + native_unitary = native_matrix / normalisation + + # There can still be phase differences of -1, -1j, 1j + c = 0 + for phase in [1, -1, 1j, -1j]: + if np.allclose(phase * native_unitary, target_unitary, atol=1e-12): + c = 1 + backend.assert_allclose(c, 1) + + +@pytest.mark.parametrize("gatename", ["H", "X", "Y", "I"]) +def test_pauli_to_native(backend, gatename): + gate = getattr(gates, gatename)(0) + assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) + + +@pytest.mark.parametrize("gatename", ["RX", "RY", "RZ"]) +def test_rotations_to_native(backend, gatename): + gate = getattr(gates, gatename)(0, theta=0.1) + assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) + + +@pytest.mark.parametrize("gatename", ["S", "SDG", "T", "TDG"]) +def test_special_single_qubit_to_native(backend, gatename): + gate = getattr(gates, gatename)(0) + assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) + + +def test_u1_to_native(backend): + gate = gates.U1(0, theta=0.5) + assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) + + +def test_u2_to_native(backend): + gate = gates.U2(0, phi=0.1, lam=0.3) + assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) + + +def test_u3_to_native(backend): + gate = gates.U3(0, theta=0.2, phi=0.1, lam=0.3) + assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) + + +def test_gpi2_to_native(backend): + gate = gates.GPI2(0, phi=0.123) + assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) + + +@pytest.mark.parametrize("gatename", ["CNOT", "CZ", "SWAP", "iSWAP", "FSWAP"]) +@pytest.mark.parametrize( + "natives", + [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], +) +def test_two_qubit_to_native(backend, gatename, natives): + gate = getattr(gates, gatename)(0, 1) + assert_matrices_allclose(gate, natives, backend) + + +@pytest.mark.parametrize( + "natives", + [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], +) +@pytest.mark.parametrize("gatename", ["CRX", "CRY", "CRZ"]) +def test_controlled_rotations_to_native(backend, gatename, natives): + gate = getattr(gates, gatename)(0, 1, 0.3) + assert_matrices_allclose(gate, natives, backend) + + +@pytest.mark.parametrize( + "natives", + [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], +) +def test_cu1_to_native(backend, natives): + gate = gates.CU1(0, 1, theta=0.4) + assert_matrices_allclose(gate, natives, backend) + + +@pytest.mark.parametrize( + "natives", + [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], +) +def test_cu2_to_native(backend, natives): + gate = gates.CU2(0, 1, phi=0.2, lam=0.3) + assert_matrices_allclose(gate, natives, backend) + + +@pytest.mark.parametrize( + "natives", + [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], +) +def test_cu3_to_native(backend, natives): + gate = gates.CU3(0, 1, theta=0.2, phi=0.3, lam=0.4) + assert_matrices_allclose(gate, natives, backend) + + +@pytest.mark.parametrize( + "natives", + [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], +) +def test_fSim_to_native(backend, natives): + gate = gates.fSim(0, 1, theta=0.3, phi=0.1) + assert_matrices_allclose(gate, natives, backend) + + +@pytest.mark.parametrize("seed", [None, 10, np.random.default_rng(10)]) +@pytest.mark.parametrize( + "natives", + [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], +) +def test_GeneralizedfSim_to_native(backend, natives, seed): + unitary = random_unitary(2, seed=seed, backend=backend) + gate = gates.GeneralizedfSim(0, 1, unitary, phi=0.1) + assert_matrices_allclose(gate, natives, backend) + + +@pytest.mark.parametrize( + "natives", + [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], +) +@pytest.mark.parametrize("gatename", ["RXX", "RZZ", "RYY"]) +def test_rnn_to_native(backend, gatename, natives): + gate = getattr(gates, gatename)(0, 1, theta=0.1) + assert_matrices_allclose(gate, natives, backend) + + +@pytest.mark.parametrize( + "natives", + [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], +) +def test_TOFFOLI_to_native(backend, natives): + gate = gates.TOFFOLI(0, 1, 2) + assert_matrices_allclose(gate, natives, backend) + + +@pytest.mark.parametrize("seed", [None, 10, np.random.default_rng(10)]) +@pytest.mark.parametrize( + "natives", + [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], +) +@pytest.mark.parametrize("nqubits", [1, 2]) +def test_unitary_to_native(backend, nqubits, natives, seed): + u = random_unitary(2**nqubits, seed=seed, backend=NumpyBackend()) + # transform to SU(2^nqubits) form + u = u / np.sqrt(np.linalg.det(u)) + gate = gates.Unitary(u, *range(nqubits)) + assert_matrices_allclose(gate, natives, backend) + + +def test_count_1q(): + from qibo.transpiler.unroller import cz_dec + + np.testing.assert_allclose(cz_dec.count_1q(gates.CNOT(0, 1)), 2) + np.testing.assert_allclose(cz_dec.count_1q(gates.CRX(0, 1, 0.1)), 2) + + +def test_count_2q(): + from qibo.transpiler.unroller import cz_dec + + np.testing.assert_allclose(cz_dec.count_2q(gates.CNOT(0, 1)), 1) + np.testing.assert_allclose(cz_dec.count_2q(gates.CRX(0, 1, 0.1)), 2) From 25f90f79ad45f95f4956fdd3b1bbef6671979df9 Mon Sep 17 00:00:00 2001 From: simone bordoni Date: Fri, 17 Nov 2023 13:25:12 +0400 Subject: [PATCH 038/143] split translate gate function --- src/qibo/transpiler/unroller.py | 48 ++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/src/qibo/transpiler/unroller.py b/src/qibo/transpiler/unroller.py index 03ec73dcfd..7c7b5c6b97 100644 --- a/src/qibo/transpiler/unroller.py +++ b/src/qibo/transpiler/unroller.py @@ -78,7 +78,7 @@ def assert_decomposition( two_qubit_natives: NativeType, single_qubit_natives=(gates.I, gates.Z, gates.RZ, gates.GPI2), ): - """Checks if a circuit has been correctly decmposed into native gates. + """Checks if a circuit has been correctly decomposed into native gates. Args: circuit (:class:`qibo.models.circuit.Circuit`): circuit model to check. @@ -127,19 +127,49 @@ def translate_gate( single_qubit_natives (tuple): single qubit native gates. Returns: - (list): List of native gates + (list): List of native gates that decompose the input gate. """ if isinstance(gate, (gates.M, gates.I, gates.Align)): return gate + elif len(gate.qubits) == 1: + return _translate_single_qubit_gates(gate, single_qubit_natives) + else: + return _translate_two_qubit_gates(gate, two_qubit_natives) - if len(gate.qubits) == 1: - if gates.U3 in single_qubit_natives: - return u3_dec(gate) - if gates.GPI2 in single_qubit_natives: - return gpi2_dec(gate) - else: - raise DecompositionError("Use U3 or GPI2 as single qubit native gates") +def _translate_single_qubit_gates(gate: gates.Gate, single_qubit_natives): + """Helper method for :meth:`translate_gate`. + + Maps single qubit gates to a hardware-native implementation. + + Args: + gate (:class:`qibo.gates.abstract.Gate`): gate to be decomposed. + single_qubit_natives (tuple): single qubit native gates. + + Returns: + (list): List of native gates that decompose the input gate. + """ + if gates.U3 in single_qubit_natives: + return u3_dec(gate) + elif gates.GPI2 in single_qubit_natives: + return gpi2_dec(gate) + else: + raise DecompositionError("Use U3 or GPI2 as single qubit native gates") + + +def _translate_two_qubit_gates(gate: gates.Gate, two_qubit_natives): + """Helper method for :meth:`translate_gate`. + + Maps two qubit gates to a hardware-native implementation. + + Args: + gate (:class:`qibo.gates.abstract.Gate`): gate to be decomposed. + two_qubit_natives (:class:`qibo.transpiler.abstract.NativeType`): + two-qubit native gates supported by the quantum hardware. + + Returns: + (list): List of native gates that decompose the input gate. + """ if two_qubit_natives is NativeType.CZ | NativeType.iSWAP: # Check for a special optimized decomposition. if gate.__class__ in opt_dec.decompositions: From f2ada67fe64c1d6265de11373b6fcb6f9b13f1cb Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Fri, 17 Nov 2023 16:57:06 +0100 Subject: [PATCH 039/143] add energy fluctuation and fix bug in dbf tutorial --- examples/dbf/dbf.ipynb | 371 ++++++++++++++++++++++++++++++++++------- 1 file changed, 315 insertions(+), 56 deletions(-) diff --git a/examples/dbf/dbf.ipynb b/examples/dbf/dbf.ipynb index 1bf8d058e2..a34daf3e8c 100644 --- a/examples/dbf/dbf.ipynb +++ b/examples/dbf/dbf.ipynb @@ -16,7 +16,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 90, + "id": "c12a5b8c-328f-4127-b91d-2df776f05908", + "metadata": {}, + "outputs": [], + "source": [ + "# install extra dependence\n", + "!pip install seaborn" + ] + }, + { + "cell_type": "code", + "execution_count": 66, "id": "f270b1ea-ee6a-4eac-a0ff-3d7dae296cf0", "metadata": {}, "outputs": [], @@ -43,7 +54,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 67, "id": "4aec7b46-19b9-4004-93c0-a90255e58fd9", "metadata": {}, "outputs": [], @@ -95,16 +106,38 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 68, "id": "2c4ed408-68ed-4054-825c-2a7df0979a4f", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Qibo 0.2.2|INFO|2023-11-17 16:55:09]: Using qibojit (numba) backend on /CPU:0\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# set the qibo backend (we suggest qibojit if N >= 20)\n", - "set_backend(\"qibojit\", \"qibojit\")\n", + "set_backend(\"qibojit\", \"numba\")\n", + "\n", + "# hamiltonian parameters\n", + "nqubits = 5\n", + "h = 3\n", "\n", "# define the hamiltonian\n", - "h = hamiltonians.TFIM(nqubits=5, h=3)\n", + "h = hamiltonians.TFIM(nqubits=nqubits, h=h)\n", "\n", "# vosualize the matrix\n", "visualize_matrix(h.matrix, title=\"Target hamiltonian\")" @@ -132,10 +165,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 69, "id": "26a487e9-366b-4203-b660-e3d4af2bcb68", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "FlowGeneratorType.canonical\n", + "FlowGeneratorType.single_commutator\n", + "FlowGeneratorType.group_commutator\n" + ] + } + ], "source": [ "# we have a look inside the FlowGeneratorType class\n", "for generator in FlowGeneratorType:\n", @@ -144,7 +187,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 70, "id": "da8dce89-27f6-403d-982a-58d531fade48", "metadata": {}, "outputs": [], @@ -165,7 +208,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 71, "id": "055870ec-55f2-4b99-a622-e3aa4c7dd0e9", "metadata": {}, "outputs": [], @@ -183,10 +226,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 72, "id": "9e278c3d-9f34-4a40-b453-4e030c751ef5", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Backend: qibojit (numba)\n" + ] + } + ], "source": [ "# on which qibo backend am I running the algorithm?\n", "print(f\"Backend: {dbf.backend}\")" @@ -194,10 +245,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 73, "id": "5b8e142b-a0a2-41bd-a16a-265a420b7360", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initial form of the target hamiltonian:\n", + "[[-5.-0.j -3.-0.j -3.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", + " [-3.-0.j -1.-0.j -0.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", + " [-3.-0.j -0.-0.j -1.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", + " ...\n", + " [-0.-0.j -0.-0.j -0.-0.j ... -1.-0.j -0.-0.j -3.-0.j]\n", + " [-0.-0.j -0.-0.j -0.-0.j ... -0.-0.j -1.-0.j -3.-0.j]\n", + " [-0.-0.j -0.-0.j -0.-0.j ... -3.-0.j -3.-0.j -5.-0.j]]\n" + ] + } + ], "source": [ "# the initial target hamiltonian is a qibo hamiltonian\n", "# thus the matrix can be accessed typing h.matrix\n", @@ -206,10 +272,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 74, "id": "4f9d1d41-3df7-49cf-96ca-fa1019c00c33", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# let's visualize it in a more graphical way\n", "visualize_matrix(dbf.h0.matrix, r\"$H_0$\")" @@ -217,10 +294,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 75, "id": "7b864712-219c-44b6-8337-19ef0100e318", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# since we didn't perform yet any evolutionary step they are the same\n", "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" @@ -236,10 +324,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 76, "id": "da3d3aaa-17e1-492e-bcd3-b510f44a5391", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# diagonal part of the H target\n", "visualize_matrix(dbf.diagonal_h_matrix)" @@ -247,16 +346,63 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 77, "id": "24d0dfa1-7039-4d7d-8aa3-5a937b9ab0b8", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "HS norm of the off diagonal part of H: 1440.0\n" + ] + } + ], "source": [ "# Hilbert-Schmidt norm of the off-diagonal part\n", "# which we want to bring to be close to zero\n", "print(f\"HS norm of the off diagonal part of H: {dbf.off_diagonal_norm}\")" ] }, + { + "cell_type": "markdown", + "id": "d75e35ab-66f4-49f9-af19-679c20065a11", + "metadata": {}, + "source": [ + "Finally, the energy fluctuation of the system at step $k$ over a given state $\\mu$\n", + "\n", + "$$ \\Xi(\\mu) = \\sqrt{\\langle \\mu | \\hat{H}_k^2 | \\mu \\rangle - \\langle \\mu | \\hat{H}_k | \\mu \\rangle^2} $$\n", + "\n", + "can be computed:" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "95f8d86f-07d4-498c-acb1-f6f6a4614c24", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "6.708203932499369" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# define a quantum state\n", + "# for example the ground state of a multi-qubit Z hamiltonian\n", + "Z = hamiltonians.Z(nqubits=nqubits)\n", + "state = Z.ground_state()\n", + "\n", + "# compute energy fluctuations using current H and given state\n", + "dbf.energy_fluctuation(state)" + ] + }, { "cell_type": "markdown", "id": "3d5b37f3-2477-49a0-9f80-7da5ddda1fff", @@ -269,10 +415,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 79, "id": "9a886261-8aa6-4df0-a31b-9c39847db124", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initial value of the off-diagonal norm: 1440.0\n", + "One step later off-diagonal norm: 1168.2530943739996\n" + ] + } + ], "source": [ "# perform one evolution step\n", "\n", @@ -295,10 +450,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 80, "id": "cc74812d-7c2c-44e4-afc2-e235968801b4", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" ] @@ -313,10 +479,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 81, "id": "aad79966-7a11-4a45-aba5-4a4bb8315c50", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "100%|█████████████████████████████████████████████████████████████████████████| 1000/1000 [00:06<00:00, 144.50trial/s, best loss: 828.4068645826136]\n" + ] + } + ], "source": [ "# restart\n", "dbf.h = dbf.h0\n", @@ -334,20 +508,42 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 82, "id": "49483a47-d29d-440e-a4bc-143bfe6bb3cf", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZ4AAAGiCAYAAADXxKDZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAqe0lEQVR4nO3df3CV5Z3//9cByQlKcjD8yI+SIIhCFYNtKmlGy4KkhGyHwcofaJ1pdCkObmCKWbeanVbQbSesnVFsm8aOdaGdKWJxCo52hNVIwrhLrEQYpN3NAJ+0xEJC5TskEOUAua/vH5FjD4TkPrnv3OdcyfPhXDOcO/e57vc5d+Dtdd3Xj5AxxggAgICMSnYAAICRhcQDAAgUiQcAECgSDwAgUCQeAECgSDwAgECReAAAgSLxAAACReIBAASKxAMACBSJBwDg2vr16xUKheLKrFmzEqrjmiGKDQAwTN166616++23Y6+vuSaxVELiAQAk5JprrlFOTs7g3+9jLACAgJw7d07nz5/3pS5jjEKhUNyxcDiscDjc5/mHDx9WXl6e0tPTVVJSopqaGhUUFLi+XohtEQDALufOndO0aTlqb+/0pb5x48bp7NmzccfWrVun9evXX3Hum2++qbNnz2rmzJk6ceKEnnrqKf31r3/VoUOHlJGR4ep6JB4AsExXV5cikYj+31+eU2bmWI91farpUx9VW1ubMjMzY8f7a/H8vdOnT2vq1Kl69tlntWLFClfXpKsNACyVmTnWc+L5vK7MuMTj1vjx43XzzTfryJEjrt/DcGoAsJQxF30pXpw9e1ZHjx5Vbm6u6/eQeADAUsb0+FIS8dhjj6mxsVF//vOf9T//8z/65je/qdGjR+v+++93XQddbQAA1z766CPdf//9OnXqlCZNmqS77rpLTU1NmjRpkus6SDwAYCnHXJTjsass0fdv3brV0/UkEg8AWMuPZzRe3z8YPOMBAASKFg8AWKp3cIDXFk9igwv8QOIBAEsZ56KM4zHxeHz/YNDVBgAIFC0eALCVudhbvNYRMBIPAFiKUW0AALhAiwcAbOVclJwL3usIGIkHACzV29U22nMdQaOrDQAQKFo8AGAr56LkeGvx0NUGAHDP0sRDVxsAIFC0eADAWj0+TABlrTYAgEsh56JCjreOqxBdbQCA4Y4WDwDYyrkoeWzxMKoNAOCepYmHrjYAQKBo8QCApULmokLG4+ACtkUAALjmOJLjcTi04/gTSwLoagMABIoWDwBYqnceT8hzHUEj8QCArZweH0a1Bb9yAV1tAIBA0eIBAFs5FyWPXW1MIAUAuBZyenxYq42uNgDAMJdyLR7HcXT8+HFlZGQoFPLYhASAFGCM0ZkzZ5SXl6dRo3z8/33jw+ACw7YIOn78uPLz85MdBgD4rq2tTVOmTPGtvpDjeO4qCyVhAumQJZ7a2lr9+Mc/Vnt7u+bMmaOf/vSnmjt37oDvy8jIkCT9+djzyswc2++5f3ngRV9ilaQv/b7Z1Xn7v1Hka31+chNbMuJKZal8PzGcGEkm9u/bSDckieeVV15RVVWVXnjhBRUXF2vjxo0qKytTS0uLJk+e3O97L3WvZWaOVWbmtf2emzHGz/Dddeu5v2bw3YTuYqP78u+l8v3EcGP8f3zg9Pgwqm2YDC549tlntXLlSj300EO65ZZb9MILL+jaa6/Vf/7nfw7F5QBgROod1ea9BM33xHP+/Hk1NzertLT084uMGqXS0lLt3bv3ivOj0ai6urriCgBg+PI98Xz88cfq6elRdnZ23PHs7Gy1t7dfcX5NTY0ikUisMLAAAFxyevwpAUv6PJ7q6mp1dnbGSltbW7JDAgAr2NrV5vvggokTJ2r06NHq6OiIO97R0aGcnJwrzg+HwwqHw36HAQBIUb63eNLS0lRUVKT6+vrYMcdxVF9fr5KSEr8vBwAjl6VdbUMynLqqqkoVFRX6yle+orlz52rjxo3q7u7WQw89NBSXA4ARKeQYzxNAQ47xKRr3hiTxLF++XH/729/05JNPqr29Xbfffrt27tx5xYCD/vzlgRcHnGOxclfhgPXs/vSXrq535J6BJ7dK0owdf/CtPrd1ueWmPr8/p+38vJ+J1AeMZEO2csHq1au1evXqoaoeAOD0SF5XvBkuXW0AgAAYHxJPEhYJTfpwagDAyEKLBwAsFTKOQsbbWm0hM4xWpwYADDFLn/HQ1QYACBQtHgCwleP4sC0CXW0AALdIPMFzMzl0wdjvuKztoLdgLpOqkzmZMDk4fG+Af6xOPAAwkoUcRyGPDRavS+4MBokHAGzlOD6Mags+8TCqDQAQKFo8AGArS1s8JB4AsJWliYeuNgBAoGjxAICtTI/kdSM31moDALhl63BqutoAAIFK2RbPl37fLKn/pSDczRJ3tyKBm220e42MVQRSObZUlspbo2MYsnRwQcomHgDAACxNPHS1AQACRYsHAGzlGO8tFq+j4gaBxAMAtnKMD11twSceutoAAIGixQMAtvJlIzhaPAAAtxzHnzJIGzZsUCgU0tq1axN6H4kHAJCw999/X7/4xS9UWOh2DuTnSDwAYCvH+FMSdPbsWT3wwAN68cUXdf311yf8/pR9xrP/G0XKGNN/eP7O7HZX14Kx33F13otl7lZMcCOVZ7AzU39w3HxWVoXAgIwjGY/PeExv4unq6oo7HA6HFQ6H+3xLZWWlvvGNb6i0tFQ//OEPE74kLR4AgPLz8xWJRGKlpqamz/O2bt2qDz744Ko/dyNlWzwAgAEYH+bxfNbiaWtrU2ZmZuxwX62dtrY2ffe739Vbb72l9PT0QV+SxAMAtvJxAmlmZmZc4ulLc3OzTp48qS9/+cuxYz09PdqzZ49+9rOfKRqNavTo0QNeksQDAHBl4cKF+vDDD+OOPfTQQ5o1a5Yef/xxV0lHIvEAgL0CXjInIyNDs2fPjjt23XXXacKECVcc7w+JBwAsZRzvO1cnYedrEg8AYPAaGhoSfg+JBwBsZenq1CmbePza+trvyXXJmBg6HCYSMmEycSPp9wOD5MiHxONHIIlhAikAIFC+J57169crFArFlVmzZvl9GQCA41MJ2JB0td166616++23P7/INSnbowcA9jKfFa91BGxIMsI111yjnJwcV+dGo1FFo9HY68sXqgMADC9D8ozn8OHDysvL0/Tp0/XAAw/o2LFjVz23pqYmbmG6/Pz8oQgJAIYd44R8KUHzPfEUFxdr8+bN2rlzp+rq6tTa2qqvfe1rOnPmTJ/nV1dXq7OzM1ba2tr8DgkAhiee8fQqLy+P/bmwsFDFxcWaOnWqfvvb32rFihVXnN/fng8AgOFnyJ/6jx8/XjfffLOOHDky1JcCgJHFhCSvXWVJGFww5PN4zp49q6NHjyo3N3eoLwUAI4qtz3h8b/E89thjWrJkiaZOnarjx49r3bp1Gj16tO6//36/L5XSs+Hd1Od2G23Jv9USUhkz9QeH7w228T3xfPTRR7r//vt16tQpTZo0SXfddZeampo0adIkvy8FACOb40NX23AYXLB161a/qwQA9MWEeounOvwJJRGs1QYACBRr2QCApfwYHMBGcAAA95xRPjzjCb6vja42AECgaPEAgK0Y1QYACJIxIRmPo9oMo9oAAMPdsG/xJGtWt7v63K1IsHJXoavzpJEx49zPezCSZunzvQ1Dlg4uGPaJBwCGK+PIh+HUjGoDAAxztHgAwFa+bIswDFanBgAEw59RbcNg62sAAPpDiwcAbOWM6i2e6vAnlESQeADAUv4sEkpXGwBgmAsZk4wFE66uq6tLkUhE+79xhzLG9N8gYxJbPDdbab9Y5u822kxKHJnYRjtRRpKjzs5OZWZmeq7t0r+Tf300W5lhb+2HrqijLzzX4VtsbtDVBgC2svQZD11tAIBA0eIBAEvZOriAxAMAlmICKQAALtDiAQBbWTq4gMQDAJay9RkPXW0AgEDR4gEAS9k6uCBlE8+Xft8sqf8vhNnw8fxclSAZW4YzG94eydpSHpcxPjzjScLaNXS1AQAClbItHgBA/2wdXEDiAQBLGeP9GU0ylommqw0AEChaPABgKx+62kRXGwDALWNGyRhvHVfJ2JKNrjYAQKBo8QCArZyQ964yutoAAG6xckESMBs+cX7POPcTs+GHHz/vKfdz+Ej4Gc+ePXu0ZMkS5eXlKRQKaceOHXE/N8boySefVG5ursaOHavS0lIdPnzYr3gBAJ+5NIHUawlawomnu7tbc+bMUW1tbZ8/f+aZZ/STn/xEL7zwgt577z1dd911Kisr07lz5zwHCwD43KVRbV5L0BLuaisvL1d5eXmfPzPGaOPGjfr+97+vpUuXSpJ+/etfKzs7Wzt27NB9993nLVoAgPV8TXWtra1qb29XaWlp7FgkElFxcbH27t3b53ui0ai6urriCgBgYCOmq60/7e3tkqTs7Oy449nZ2bGfXa6mpkaRSCRW8vPz/QwJAIatS6PavJagJX0CaXV1tTo7O2Olra0t2SEBAIaQr8Opc3JyJEkdHR3Kzc2NHe/o6NDtt9/e53vC4bDC4bCfYQDAiGDrPB5fWzzTpk1TTk6O6uvrY8e6urr03nvvqaSkxM9LAcCIZ4wPz3hsmEB69uxZHTlyJPa6tbVVBw4cUFZWlgoKCrR27Vr98Ic/1E033aRp06bpBz/4gfLy8nTPPff4GTcAwFIJJ559+/ZpwYIFsddVVVWSpIqKCm3evFnf+9731N3drYcfflinT5/WXXfdpZ07dyo9Pd2/qBMwkmbD+7mSQypjNvzwwyokg2Pr6tQJJ5758+f3G2goFNLTTz+tp59+2lNgAID+2br1ddJHtQEARharFwkFgJHM1lFtJB4AsJStiYeuNgBAoEg8AGAp4/ixXlti16yrq1NhYaEyMzOVmZmpkpISvfnmmwnVQVcbAFgqGV1tU6ZM0YYNG3TTTTfJGKNf/epXWrp0qfbv369bb73VVR0kHgCAa0uWLIl7/aMf/Uh1dXVqamoi8SRqOEw0TeUJkwvGfmfAc14sO+jrNUfSRMKRYDj8HfWbPxNIe99/+ZY0btbR7Onp0bZt29Td3Z3Qsmg84wEASzkm5EuRpPz8/Lgtampqaq563Q8//FDjxo1TOBzWqlWrtH37dt1yyy2u46bFAwBQW1ubMjMzY6/7a+3MnDlTBw4cUGdnp1599VVVVFSosbHRdfIh8QCArfzYQfSz918apeZGWlqaZsyYIUkqKirS+++/r+eff16/+MUvXL2fxAMAlkqVCaSO4ygajbo+n8QDAHCturpa5eXlKigo0JkzZ7RlyxY1NDRo165drusg8QCApZLR4jl58qS+/e1v68SJE4pEIiosLNSuXbv09a9/3XUdJB4AsFQyEs9LL73k6XoSw6kBAAGjxQMAlnLMKDkeJ5B6ff9gkHgSlMrbLqfy9sF+rkqQyvcAyTeSVjgwxocdSNkWAQAw3NHiAQBLpco8nkSReADAUrYmHrraAACBosUDAJb6+9WlvdQRNBIPAFiKrjYAAFygxQMAlrK1xUPiAQBL8YwHcVJ1FYFUntXttq4FY7/jskb/VkvA8MMKGMlD4gEASxnjvavMGJ+CSQCJBwAsZeszHka1AQACRYsHACxlfBhcwKg2AIBrdLUBAOACLR4AsJStLR4SDwBYigmkSNhwmMzpZ2xu63I7MXTlrkIXZzHxD/3z43f3zIWL+tLv3/crJOuReADAUrZ2tSU8uGDPnj1asmSJ8vLyFAqFtGPHjrifP/jggwqFQnFl8eLFfsULAPjMpa42ryVoCSee7u5uzZkzR7W1tVc9Z/HixTpx4kSsvPzyy56CBAAMHwl3tZWXl6u8vLzfc8LhsHJyclzVF41GFY1GY6+7uroSDQkARiSjkIw8drV5fP9gDMk8noaGBk2ePFkzZ87UI488olOnTl313JqaGkUikVjJz88fipAAYNi59IzHawma74ln8eLF+vWvf636+nr9x3/8hxobG1VeXq6enp4+z6+urlZnZ2estLW1+R0SACCF+D6q7b777ov9+bbbblNhYaFuvPFGNTQ0aOHChVecHw6HFQ6H/Q4DAIY9W+fxDPmSOdOnT9fEiRN15MiRob4UAIwodLVdxUcffaRTp04pNzd3qC8FALBAwl1tZ8+ejWu9tLa26sCBA8rKylJWVpaeeuopLVu2TDk5OTp69Ki+973vacaMGSorK0voOvu/UaSMMf2HN1K2m03lz5mM1RLcG7g+t9tov1jm7zbaqbo1ulupHFsyDPw5h2abT0c+dLUlYVRbwoln3759WrBgQex1VVWVJKmiokJ1dXU6ePCgfvWrX+n06dPKy8vTokWL9O///u88xwEASBpE4pk/f75MP5t079q1y1NAAAB3bF0yh7XaAMBSjkKeu8qS0dXGRnAAgEDR4gEAW/kxHJquNgCAW0wgBQDABVo8AGApRrUBAALlfFa81hG0lE08X/p9szTAMD83s6dHysxpDI7bFQlW7ip0dd7uT3/p6jw/f3eTsYpAKseG1JeyiQcA0D+62gAAgXKM91FpztAsI9cvRrUBAAJFiwcALGUUkvG45I3X9w8GiQcALMUEUgAAXKDFAwCW6h1c4L2OoJF4AMBSPONJAtu3D4Y9/JwY6rdUnszpZ2z8HR0+rE48ADCS2Tq4gMQDAJYyprd4rSNojGoDAASKFg8AWMooJIfBBQCAoNi6SChdbQCAQNHiAQBLMaoNABAo81nxWkfQ6GoDAARq2Ld4UnlWN5LP798Pt9xtpe3v71oqryLAKiSDQ1cbACBQzmfFax1Bo6sNABAoWjwAYClb5/GQeADAUrY+46GrDQAQKBIPAFjK+FQSUVNTozvuuEMZGRmaPHmy7rnnHrW0tCRUB4kHACx1qavNa0lEY2OjKisr1dTUpLfeeksXLlzQokWL1N3d7boOnvEAAFzbuXNn3OvNmzdr8uTJam5u1rx581zVQeIBAEv5OY+nq6sr7ng4HFY4HB7w/Z2dnZKkrKws19ck8XyGFQ5GpuTdT/9m6vstVX93+Tt6JT+HU+fn58cdX7dundavX9/vex3H0dq1a3XnnXdq9uzZrq+Z0DMeNw+Vzp07p8rKSk2YMEHjxo3TsmXL1NHRkchlAAABa2trU2dnZ6xUV1cP+J7KykodOnRIW7duTehaCSUeNw+VHn30Ub3++uvatm2bGhsbdfz4cd17770JBQUAGJjR591tgy2XRrVlZmbGlYG62VavXq033nhDu3fv1pQpUxKKO6GutoEeKnV2duqll17Sli1bdPfdd0uSNm3apC9+8YtqamrSV7/61YSCAwBcnZEPXW0Jbn1tjNGaNWu0fft2NTQ0aNq0aQlf09MznssfKjU3N+vChQsqLS2NnTNr1iwVFBRo7969fSaeaDSqaDQae335Ay4AQOqorKzUli1b9NprrykjI0Pt7e2SpEgkorFjx7qqY9DzePp6qNTe3q60tDSNHz8+7tzs7OxYcJerqalRJBKJlcsfcAEA+uYYf0oi6urq1NnZqfnz5ys3NzdWXnnlFdd1DLrFc+mh0rvvvjvYKiRJ1dXVqqqqir3u6uoi+QCAC8nYgdQY73uWDirxXHqotGfPnriHSjk5OTp//rxOnz4d1+rp6OhQTk5On3W5HSsOABgeEupqM8Zo9erV2r59u955550rHioVFRVpzJgxqq+vjx1raWnRsWPHVFJS4k/EAABJyVkyxw8JtXgGeqgUiUS0YsUKVVVVKSsrS5mZmVqzZo1KSkqGzYi2VN4+GIkbSZMSR8rv7ki6p7buQJpQ4qmrq5MkzZ8/P+74pk2b9OCDD0qSnnvuOY0aNUrLli1TNBpVWVmZfv7zn/sSLADAfgklHjcPldLT01VbW6va2tpBBwUAGBg7kAIAAmVrVxv78QAAAkWLBwAsZUxv8VpH0Eg8AGApRyE5Ca611lcdQaOrDQAQKFo8AGCpway11lcdQSPxAICtfHjG43mxt0Eg8QwRN7Odh8PM6ZEilWfD+x3bSDFSVnJIRSQeALCUrYMLSDwAYClbh1Mzqg0AEChaPABgKVuXzCHxAIClbB1OTVcbACBQtHgAwFJG3qfhJKHBQ+IBAFv1drV5HE5NVxsAYLijxZNEqTwbHoOTjNnwfq9IsHJXoYuzRs7vmh+rkJy5cFFf+v37foUUY+s8HhIPAFjK1uHUdLUBAAJFiwcALEVXGwAgUHS1AQDgAi0eALCU8WHJHLraAACu2bpyAV1tAIBA0eKxAFv0Dp1kTc5NxtbX7g1c34Kx33FV04tlB70GE5PKE64Hrmto2hW2rk5N4gEAS9k6nJquNgBAoGjxAIClbJ3HQ+IBAEvZ+oyHrjYAQKBo8QCApWydx0PiAQBL0dUGAIALtHgAwFK2zuMh8QwjfmzRm0hdw0Eqz4ZPZW5XJHC3jba0+9NfDniO3/dgONxTW4dT09UGAAhUQomnpqZGd9xxhzIyMjR58mTdc889amlpiTtn/vz5CoVCcWXVqlW+Bg0A+KzFYzyWJMSdUOJpbGxUZWWlmpqa9NZbb+nChQtatGiRuru7485buXKlTpw4ESvPPPOMr0EDAD4fTu21BC2hZzw7d+6Me71582ZNnjxZzc3NmjdvXuz4tddeq5ycHFd1RqNRRaPR2Ouurq5EQgIAWMbTM57Ozk5JUlZWVtzx3/zmN5o4caJmz56t6upqffLJJ1eto6amRpFIJFby8/O9hAQAI4YZbPfa3xWrRrU5jqO1a9fqzjvv1OzZs2PHv/Wtb2nq1KnKy8vTwYMH9fjjj6ulpUW/+93v+qynurpaVVVVsdddXV0kHwBwwRgfVi6wKfFUVlbq0KFDevfdd+OOP/zww7E/33bbbcrNzdXChQt19OhR3XjjjVfUEw6HFQ6HBxsGAMAyg+pqW716td544w3t3r1bU6ZM6ffc4uJiSdKRI0cGcykAwFU4PpWgJdTiMcZozZo12r59uxoaGjRt2rQB33PgwAFJUm5u7qACBAD0rXc4tLe+spTf+rqyslJbtmzRa6+9poyMDLW3t0uSIpGIxo4dq6NHj2rLli36x3/8R02YMEEHDx7Uo48+qnnz5qmw0N0MZgytkTSr2098b4PjZkUCyf335ic/7+lIuZ9+SSjx1NXVSeqdJPr3Nm3apAcffFBpaWl6++23tXHjRnV3dys/P1/Lli3T97//fd8CBgD0GhHbIpgBhj/k5+ersbHRU0AAAHf8WHmAbREAAMMeq1MDgKXMZ/95rSNoJB4AsBRdbQAAuECLBwAsZetGcCQeALCUMT4840nCYm10tQEAAkWLB31ipv7gjJTZ8H7/frixcpfb1U/8/d7cfNaBPueZCxf1pd+/71dIMXS1AQACRVcbAAAu0OIBAEsZee8qS/m12gAAqcMxxodtEehqAwCksD179mjJkiXKy8tTKBTSjh07Eq6DxAMAljI+/ZeI7u5uzZkzR7W1tYOOm642ALBUMoZTl5eXq7y83NM1STwAAHV1dcW9DofDCofDQ3ItEg88GSkTJv3mx6TEROryW3Jic1fXgrHfcXXei2UHvQQTZ+DPOTQP8B35MLjgs/fn5+fHHV+3bp3Wr1/vqe6rIfEAgKX8HNXW1tamzMzM2PGhau1IJB4AgKTMzMy4xDOUSDwAYCl2IAUABMrPZzxunT17VkeOHIm9bm1t1YEDB5SVlaWCggJXdZB4AACu7du3TwsWLIi9rqqqkiRVVFRo8+bNruog8QCApZLR4pk/f77nFa1JPABgKVuf8bBkDgAgULR4AMBSxoeuNka1YdiyfaZ+MqTy9uOpHJvbFQncbqW9+9NfDnhO0ra+DjkKhbyt1uYkYfNrutoAAIGixQMAlnJkFAp4VJsfSDwAYCnz2YBqr3UEja42AECgaPEAgKUcyYeutuCReADAUoxqAwDABVo8AGApR45CHlssyWjxkHgAwFIkHsCjVJ4Nn8pS+XvzMza/76ebFQkkacHY77g4y91qCeiV0DOeuro6FRYWxrZILSkp0Ztvvhn7+blz51RZWakJEyZo3LhxWrZsmTo6OnwPGgDw+TweryVoCSWeKVOmaMOGDWpubta+fft09913a+nSpfrjH/8oSXr00Uf1+uuva9u2bWpsbNTx48d17733DkngADDSOSHHlxK0hLralixZEvf6Rz/6kerq6tTU1KQpU6bopZde0pYtW3T33XdLkjZt2qQvfvGLampq0le/+tU+64xGo4pGo7HXXV1diX4GAIBFBj2cuqenR1u3blV3d7dKSkrU3NysCxcuqLS0NHbOrFmzVFBQoL179161npqaGkUikVjJz88fbEgAMKIYOZ7/S/muNkn68MMPNW7cOIXDYa1atUrbt2/XLbfcovb2dqWlpWn8+PFx52dnZ6u9vf2q9VVXV6uzszNW2traEv4QADASGfX4UoKW8Ki2mTNn6sCBA+rs7NSrr76qiooKNTY2DjqAcDiscDg86PcDAOyScOJJS0vTjBkzJElFRUV6//339fzzz2v58uU6f/68Tp8+Hdfq6ejoUE5Ojm8BAwB69c7BsW8ej+clcxzHUTQaVVFRkcaMGaP6+vrYz1paWnTs2DGVlJR4vQwA4DKOT095gpZQi6e6ulrl5eUqKCjQmTNntGXLFjU0NGjXrl2KRCJasWKFqqqqlJWVpczMTK1Zs0YlJSVXHdEGDEYqT0pMZan8vSVja3S39bmZHHrD7yr7/XlX1yfSeP+3vrZVQonn5MmT+va3v60TJ04oEomosLBQu3bt0te//nVJ0nPPPadRo0Zp2bJlikajKisr089//vMhCRwARrrewQEhz3UELaHE89JLL/X78/T0dNXW1qq2ttZTUACAgY3YZzwAACSCRUIBwFJ+rLWWjAmkJB4AsJSjHsnjMx4nCc946GoDAASKFg8AWIquNgBAoBzjQ1ebSfHh1EEw5tIs2uBn02J4OXPhoouz+D27XKp+b+7iktzG5r6+gXV1fTLAzz+V9Pf/vo1sIZNi38RHH33E1ggAhqW2tjZNmTLFcz1dXV2KRCKacG2RRoW8tR8cc1GnPmlWZ2enMjMzPcfmRsq1ePLy8tTW1qaMjAyFQr1NyK6uLuXn56utrS2wL8Zvtn8G2+OX7P8MxJ98g/0MxhidOXNGeXl5vsbT+4zHW1cZz3gkjRo16qr/R5CZmWntL+wltn8G2+OX7P8MxJ98g/kMkUhkiKKxT8olHgCAO8Y4cryu1WZo8QAAXOrtJvO6SChrtfUpHA5r3bp1Vu9UavtnsD1+yf7PQPzJNxw+QypIuVFtAID+XRrVFkm/RaHQaE91GdOjznN/Gtmj2gAA7vQ+4aGrDQCAftHiAQBL9Y5IY1QbACAgfmxbnYytr+lqAwAEyorEU1tbqxtuuEHp6ekqLi7WH/7wh2SH5Mr69esVCoXiyqxZs5IdVr/27NmjJUuWKC8vT6FQSDt27Ij7uTFGTz75pHJzczV27FiVlpbq8OHDyQm2DwPF/+CDD15xTxYvXpycYPtQU1OjO+64QxkZGZo8ebLuuecetbS0xJ1z7tw5VVZWasKECRo3bpyWLVumjo6OJEV8JTefYf78+Vfch1WrViUp4nh1dXUqLCyMrU5QUlKiN998M/bzVPr+jTEyxvFYgh/YnPKJ55VXXlFVVZXWrVunDz74QHPmzFFZWZlOnjyZ7NBcufXWW3XixIlYeffdd5MdUr+6u7s1Z84c1dbW9vnzZ555Rj/5yU/0wgsv6L333tN1112nsrIynTt3LuBI+zZQ/JK0ePHiuHvy8ssvBxhh/xobG1VZWammpia99dZbunDhghYtWqTu7u7YOY8++qhef/11bdu2TY2NjTp+/LjuvffeJEYdz81nkKSVK1fG3YdnnnkmSRHHmzJlijZs2KDm5mbt27dPd999t5YuXao//vGPklLr+7+0H4/XEnzgKW7u3LmmsrIy9rqnp8fk5eWZmpqaJEblzrp168ycOXOSHcagSTLbt2+PvXYcx+Tk5Jgf//jHsWOnT5824XDYvPzyy0mIsH+Xx2+MMRUVFWbp0qVJiWcwTp48aSSZxsZGY0zv9z1mzBizbdu22Dn/+7//aySZvXv3JivMfl3+GYwx5h/+4R/Md7/73eQFlaDrr7/e/PKXv0yZ77+zs9NIMmPTbjDXhqd7KmPTbjCSTGdnZ2Dxp3SL5/z582publZpaWns2KhRo1RaWqq9e/cmMTL3Dh8+rLy8PE2fPl0PPPCAjh07luyQBq21tVXt7e1x9yMSiai4uNia+yFJDQ0Nmjx5smbOnKlHHnlEp06dSnZIV9XZ2SlJysrKkiQ1NzfrwoULcfdg1qxZKigoSNl7cPlnuOQ3v/mNJk6cqNmzZ6u6ulqffNL/njbJ0NPTo61bt6q7u1slJSUp9/0b0+NLCVpKj2r7+OOP1dPTo+zs7Ljj2dnZ+r//+78kReVecXGxNm/erJkzZ+rEiRN66qmn9LWvfU2HDh1SRkZGssNLWHt7uyT1eT8u/SzVLV68WPfee6+mTZumo0eP6t/+7d9UXl6uvXv3avRobzPA/eY4jtauXas777xTs2fPltR7D9LS0jR+/Pi4c1P1HvT1GSTpW9/6lqZOnaq8vDwdPHhQjz/+uFpaWvS73/0uidF+7sMPP1RJSYnOnTuncePGafv27brlllt04MCBlPr+/RgKzXDqYaa8vDz258LCQhUXF2vq1Kn67W9/qxUrViQxspHrvvvui/35tttuU2FhoW688UY1NDRo4cKFSYzsSpWVlTp06FDKPxfsz9U+w8MPPxz782233abc3FwtXLhQR48e1Y033hh0mFeYOXOmDhw4oM7OTr366quqqKhQY2NjssMaNlK6q23ixIkaPXr0FSNGOjo6lJOTk6SoBm/8+PG6+eabdeTIkWSHMiiXvvPhcj8kafr06Zo4cWLK3ZPVq1frjTfe0O7du+P2p8rJydH58+d1+vTpuPNT8R5c7TP0pbi4WJJS5j6kpaVpxowZKioqUk1NjebMmaPnn38+5b5/WwcXpHTiSUtLU1FRkerr62PHHMdRfX29SkpKkhjZ4Jw9e1ZHjx5Vbm5uskMZlGnTpiknJyfufnR1dem9996z8n5IvVutnzp1KmXuiTFGq1ev1vbt2/XOO+9o2rRpcT8vKirSmDFj4u5BS0uLjh07ljL3YKDP0JcDBw5IUsrch8s5jqNoNJpy37/3odROUrraUn5U29atW004HDabN282f/rTn8zDDz9sxo8fb9rb25Md2oD+5V/+xTQ0NJjW1lbz3//936a0tNRMnDjRnDx5MtmhXdWZM2fM/v37zf79+40k8+yzz5r9+/ebv/zlL8YYYzZs2GDGjx9vXnvtNXPw4EGzdOlSM23aNPPpp58mOfJe/cV/5swZ89hjj5m9e/ea1tZW8/bbb5svf/nL5qabbjLnzp1LdujGGGMeeeQRE4lETENDgzlx4kSsfPLJJ7FzVq1aZQoKCsw777xj9u3bZ0pKSkxJSUkSo4430Gc4cuSIefrpp82+fftMa2uree2118z06dPNvHnzkhx5ryeeeMI0Njaa1tZWc/DgQfPEE0+YUChk/uu//ssYkxrf/6VRbWNGZ5u0a3I9lTGjswMf1ZbyiccYY37605+agoICk5aWZubOnWuampqSHZIry5cvN7m5uSYtLc184QtfMMuXLzdHjhxJdlj92r17t5F0RamoqDDG9A6p/sEPfmCys7NNOBw2CxcuNC0tLckN+u/0F/8nn3xiFi1aZCZNmmTGjBljpk6dalauXJlS/xPTV+ySzKZNm2LnfPrpp+af//mfzfXXX2+uvfZa881vftOcOHEieUFfZqDPcOzYMTNv3jyTlZVlwuGwmTFjhvnXf/3XQP/h688//dM/malTp5q0tDQzadIks3DhwljSMSY1vv9Lieea0ZPMmGuyPZVrRk8KPPGwHw8AWObSfjyjR2UpFPL2xMQYRz3O/xfofjwp/YwHADD8MJwaAKxlJM+j0oLv9CLxAICl/NmPh0VCAQDDHC0eALBU7+RPjy0eutoAAO55TzzJeMZDVxsAIFC0eADAVj4MLlASBheQeADAUrY+46GrDQAQKFo8AGAtBhcAAAJlep/ReCmDTDy1tbW64YYblJ6eruLiYv3hD39w/V4SDwAgIa+88oqqqqq0bt06ffDBB5ozZ47Kysp08uRJV+9ndWoAsMyl1aml0fKnq60nodWpi4uLdccdd+hnP/uZpN6N8vLz87VmzRo98cQTA76fFg8AWO2qWyC5LL26urriSjQa7fNq58+fV3Nzs0pLS2PHRo0apdLSUu3du9dVxCQeALBMWlqacnJyJPX4UsaNG6f8/HxFIpFYqamp6fPaH3/8sXp6epSdnR13PDs7W+3t7a7iZ1QbAFgmPT1dra2tOn/+vC/1GWMUCsV32YXDYV/q7guJBwAslJ6ervT09MCvO3HiRI0ePVodHR1xxzs6Oj5rhQ2MrjYAgGtpaWkqKipSfX197JjjOKqvr1dJSYmrOmjxAAASUlVVpYqKCn3lK1/R3LlztXHjRnV3d+uhhx5y9X4SDwAgIcuXL9ff/vY3Pfnkk2pvb9ftt9+unTt3XjHg4GqYxwMACBTPeAAAgSLxAAACReIBAASKxAMACBSJBwAQKBIPACBQJB4AQKBIPACAQJF4AACBIvEAAAJF4gEABOr/B3tglwUGPsrTAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "visualize_matrix(dbf.h.matrix)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 83, "id": "6bdaf7f9-7e49-4a16-8b29-ae1f9746cd9b", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZ4AAAGdCAYAAAAi6BWhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA/tklEQVR4nO3de3RU1b0H8O8hJpOQZAbCIw8ZIKCCPAKIEFN8gEQgt1JQLr5oG5CrFwxaDW01Xgv4IlQXSq0YWi8FbQsIIqAuReWRcFsBJYCAaASMEgoJijIDQ17M7PtHzNghYc5vMiczc+D7cZ21ZOY3++yZM8nO3mfv39aUUgpEREQh0ibcFSAioosLGx4iIgopNjxERBRSbHiIiCik2PAQEVFIseEhIqKQYsNDREQhxYaHiIhC6pJwV4CIiAJXU1ODuro6Q8qKiYlBbGysIWVJsOEhIjKZmpoapKenoLLSYUh5KSkpKC8vD1njw4aHiMhk6urqUFnpwJdfPw+rNS6ospzOavTo9hDq6urY8BARkX9Wa1zQDU84sOEhIjIppc5CqbNBlxFqbHiIiExKKTeUcgddRqhxOjUREYUUezxERCblUWfhCXKoLNjXtwQbHiIikzLrPR4OtREBmD9/Pt55551wV8MvM9SRSII9HrrorVq1CnPmzEF0dDQOHDiADh06hLtKTZihjhR6DZMLgu3xcHIBUUjV1tbi4YcfxuLFi3HTTTdh9uzZ4a5SE2aoI4WH8pw15Ag1Njx0UVuwYAH69euH2267DS+88AJWrlyJ/fv3h7taPsxQR6JAaEopFe5KEBGRnNPphM1mw7+OzYLVGlyaG6ezBpemPgGHwwGr1WpQDf3jPR4iIpPirDYiHUuXLoWmafjqq698Hv/444/xk5/8BPHx8dA0Dbt37zbsnN27d8ecOXMMK8+M+BlQpGHDQ341NhaNR2xsLNLS0jB69Gi88MILOHXqVFDl19fXY+LEifjuu+/w/PPP469//Su6deuGDz/8EHPmzMHJkyeNeSPneO+996BpGpYtW9bs8z/72c8QHx8Pj8fTKueXMEMdKcw8ZwFPfZAHF5BShHriiSeQnp6O+vp6VFZWori4GA8++CCee+45vPnmm8jIyNAt4xe/+AXuuOMOWCwW72OHDh3C119/jZdffhn/9V//5X38ww8/xOOPP47JkyejXbt2hr+fTz75BABw9dVXN/t8aWkp+vXrhzZtwve3mRnqSOHVMNQWFXQZocaGh0RycnJ8fgEWFBRg06ZNuPnmm/Gzn/0Mn332GeLimk/P7nK5EB8fj6ioKERF+f6QHD9+HABapXHxZ8+ePbBarbj88subPFdZWYmjR4/ipz/9aUjrdC4z1JGoJfinErXYjTfeiN/97nf4+uuv8be//Q0AMGfOHGiahv379+Ouu+5C+/btce211wJoeo9n8uTJuOGGGwAAEydOhKZpGD58OObMmYPf/OY3AID09HTvMF/j6z7//HMcPnw4qLp/8sknGDRoEDRNa/JcaWkpAGDAgAFBnSNYZqgjhZnnrDFHALp37+4z/N545OXlictgj4eC8otf/AKPPvoo3n//fdxzzz3exydOnIjLL78cc+fOxflm7P/3f/83Lr30UsydOxcPPPAAhgwZguTkZCQnJ+OLL77A8uXL8fzzz6Njx44AgE6dOgEArrzyStxwww0oLi5uUZ3r6upQVlaGO++8EwcPHmzy/KZNmwBANHzYWsxQR4oAnrOAJ7ihtkAbno8//hhu94/ZDvbt24ebbroJEydOFJfBhoeC0qVLF9hsNhw6dMjn8QEDBpz3pnijrKws1NbWYu7cubjuuuvwn//5n97nrrrqKixfvhzjx49H9+7dDa3z/v37UV9fj1dffRWvvvrqeePC+UvdDHWki1PjH4CN5s2bh549e3pHLyTY8FDQEhISmsxumzZtWqudL9g1z3v27AHQkBHg0ksvbfL8tGnTkJiYCJvNFnDZHo8HdXV1oliLxdLsMFpr15EuJG4g6MkBDb0Xp9Pp86jFYvGZCNScuro6/O1vf0N+fv55v8vNYcNDQTt9+jQ6d+7s81h6enqYaqPvk08+QVRUFKZNm9bkB6u6uhrff/+9974UAHzzzTeYPHkyiouL0aVLF7z00ksYOXJks2Vv2bIFI0aMENXjs88+Q+/evQ2pIwBMmTIF+/btw/bt2znT7SKhec5C8wR3rbUfhtrsdrvP47Nnz9Zd/7V27VqcPHkSkydPDuicbHgoKEeOHIHD4cBll13m8/j5ZrhFgj179qBnz57N/jX32WefwePx+Axh5eXlISUlBd988w02bNiA2267DQcOHEBSUlKT1/fu3RtLliwR1SM1NdWwOn744Yc4efIkNE1DfX297l+qROeqqKjwSZkj+Q4tXrwYOTk5SEtLC+hcbHgoKH/9618BAKNHjza03EC67YHas2cPhg0b1uxzn376KYAfZ4udPn0aa9euxZdffom2bdviZz/7Gfr3749169ZhypQpTV6fkpIS8F9/wdYRANatW4dx48bhxRdfZKNzMfGcBYLs8TROLrBarQHlavv666+xYcMGvPHGGwGfkv1xarFNmzbhySefRHp6OiZNmmRo2fHx8QDQbOaCYKZTV1ZW4vjx4+jbt2+zz5/7S/3AgQNISEhAly5dvDH9+/f3xrWGQOsIAMXFxXC73bjppptarV4UgcIwnbrRkiVL0Llz5xatJWOPh0TeffddfP755zh79iyqqqqwadMmfPDBB+jWrRvefPNNxMYGlyH3XIMHDwYA/M///A/uuOMOREdHY+zYsYiPjw9qOnVjNgB/v9QTEhLQs2dPAA09nnP/CrRarThx4kTA526tOrrdbhw9ehSbN29mTjYKCY/HgyVLliA3NxeXXBJ4M8KGh0RmzZoFAIiJiUFSUhL69++PBQsWYMqUKUhMTDT8fEOGDMGTTz6JRYsWYf369fB4PCgvL/f2hFqqcbaYv1/q/fr18w71JSQkNJnt43Q6kZCQEFQ9jKxjVVUV2rRpg+jo6Cb32ujCpqmz0FSQkwtaMCtuw4YNOHz4MO6+++4WnpP78dAFrHv37pg8eXKLewKnT59GUlISysvLvdOaR4wYgV/+8pfN3uMJhy+++AIDBw7E559/jq5duzZ5PtjPgCKPdz+e/RNhTYwOrqxT9bi0z6qQ7sfDezxEfiQkJGDcuHGYPXs2qqur8fbbb2PPnj0YN25cuKvmtXPnTlxxxRWw2+3YuHFjuKtDpIsND5GOl156CUePHkWHDh2Qn5+P1157rdmp1OFQV1eHd955B6NGjcLw4cObDAvSha1hHU/wR6jxHg+Rjk6dOuGdd94JdzWaFRMT4zelDl3gPG4DplO79WMMxoaHLmjn7nZ6MeJnQJGGDQ8RkVl5zgKeIBdbc6iNiIikNI/bgFxtoR9q4+QCIiIKqYjr8Xg8Hhw9ehSJiYmtmq+LiChUlFI4deoU0tLSjM0crgyYXKA4uQBHjx5tkp6biOhCUFFR4ZP3L1iaxxP0UJnm8RhUG7lWa3gWLlyIZ599FpWVlRgwYAD++Mc/YujQobqva0y/8tXhP8Bq9Z9av/bpAkPqCgAjXxwuits4o1gUl/rs97oxfeJuEZV1RH0miiu7v0o3RlKv1iB5r/ur14jKssY2v4fNudLRXzdm/f0bRGVJvx9Gvgdnzeeisow2IFZ/C+N6TXZDWvrdlbxXSb0AoBx7RXGS74fU8p/6r//pejeGvrmvVdJLmVGrNDyvvfYa8vPzsWjRImRmZmLBggUYPXo0ysrKmmwYdq7G4TWrNQ5Wa1u/sbUW47qsUZos7YRVfE79YULpOTXI9lSX1S08w5ey9yqrm6bJPo8oxOjGSK+n9FoZ+x7Cda30PzePcBhc+t2V/bzo1yuQc0q+H1KJ0bJzGn77wOM2YFbbBTK54LnnnsM999yDKVOmoE+fPli0aBHatm2Lv/zlL61xOiKii1LDrLbgj1AzvOGpq6tDaWkpsrOzfzxJmzbIzs7G1q1bm8TX1tbC6XT6HEREdOEyvOH59ttv4Xa7kZyc7PN4cnIyKisrm8QXFhbCZrN5D04sICIS8riNOUIs7Ot4CgoK4HA4vEdFRUW4q0REZApmHWozfHJBx44dERUVhaoq3xlWVVVVSElJaRJvsVi4RzwR0UXE8B5PTEwMBg8e7LMviMfjwcaNG5GVlWX06YiILl4mHWprlenU+fn5yM3NxdVXX42hQ4diwYIFcLlcEbNjIxHRhUDzqKAXgGqe0G9C3SoNz+23345vvvkGs2bNQmVlJQYOHIj169c3mXDgT+3TBbrrdG6ef6tuOT3iZcN407vUiOLin/pOFOd6TH+jsAcW+V/T1GgoZHHxTy3UjZHUq6Es2fuU2ntmlW5M/7ayBYIVwkWJg+Lb68Y8sOhOUVnS70dBRR9RnKN6vyjOSFfF3SWK21m9TDdmasc8UVnS7+4uDNSNkdQLANrF9RPFSb4fALChpkw3Zty6vn6fd6s6AJ+IzncxaLXMBTNmzMCMGTNaq3giIvK4gWAz3lwoQ21ERBQCyoCGJwxJQsM+nZqIiC4u7PEQEZmUpjzQVHC52jR1AWWnJiKiVmbSezwcaiMiopBij4eIyKw8HgO2ReBQGxERSbHhCT3J4tAvXbWisgbL1lWKF86lzd+sG1Noly1KvO+LxaI4CSMXwAZSnuRz2+WS7Y46If4GUdzib/UX1MrJrvvRmU0zsDfngUX65Unrb+TCUClp3aSLOe3albox0p+91a4SUZxkYSgAZMf20o2RfnepgakbHiKii5nm8UALssMSbMqdlmDDQ0RkVh6PAbPaQt/wcFYbERGFFHs8RERmZdIeDxseIiKzMmnDw6E2IiIKKfZ4iIjMSrmBYDdyY642IiKSMut0ag61ERFRSEVsj2fki8MRpUX7jZFsRyzNSLCqQpZ2oke8rLyumv+tcAF5RoKXrpgqiovkDAeXztdfTa6Ed0l3fivbNlq60l1CulL/o+dk23dLvru7XKHPSCAlzUhwsnqfKE7F6V976TbatqgUUZzDLcsysdqlH6f33VVopQzQJp1cELENDxER6TBpw8OhNiIiCin2eIiIzMqjgu+xBDsrrgXY4yEiMiuPMuYI0L/+9S/8/Oc/R4cOHRAXF4f+/ftjx44d4tezx0NERGLff/89hg0bhhEjRuDdd99Fp06dcODAAbRv315cBhseIiKzMmQjuMB6PL///e9ht9uxZMkS72Pp6ekBlcGhNiIis/J4jDkAOJ1On6O2tvlNNN98801cffXVmDhxIjp37oxBgwbh5ZdfDqjabHiIiAh2ux02m817FBYWNhv35ZdfoqioCJdffjnee+89TJ8+HQ888ABeeeUV8bk41EZEZFYeZcA6noahtoqKClitVu/DFoul+XCPB1dffTXmzp0LABg0aBD27duHRYsWITc3V3TKiG14Ns4ohtXiv0MmWV0vXb0uzUjwpav57ue5ts3cqBvzykpZRoLS72JFcZL3Kl2Bb4vrI4q7bv5AUdxce5xujJGZFwD5ezXS3jOrRHGPVuiv/P/XzKOisq4RZkuQ1s3IjA+rhXE9kKEbs6GmTFRWdmwv4VllcZLv0VVx/rNMuFGHTyDLuBEQ5QFUkPd4VEPDY7VafRqe80lNTUWfPr6/H6688kqsXi292hxqIyKiAAwbNgxlZb5/BHzxxRfo1q2buIyI7fEQEZEOZcBQmwpsVttDDz2En/zkJ5g7dy5uu+02fPTRR/jzn/+MP//5z+Iy2OMhIjKrMCwgHTJkCNasWYPly5ejX79+ePLJJ7FgwQJMmjRJXAZ7PEREFJCbb74ZN998c4tfz4aHiMisDJzVFkpseIiITEp5gt+5Ogw7X/MeDxERhRZ7PEREZsWhNmOlPvs9AP8LoyTbLqfN3yw6n2SrakC2MBQAju27TDem6IhTds78NaI4IxfUrnbpb1UNAIPiZRlp7/tCfxFeOLb4NpqRW0I/sEh2rSTbaANA6Xey8oxYMNlIup35bSmJujErZTtV43WXsT/zkveqv/14K/1y98CAhseIigTG8KG2OXPmQNM0n6N3795Gn4aIiEyqVXo8ffv2xYYNG348ySUR27EiIjIvk/Z4WqVFuOSSS5CSktIaRRMRUSOF4EfxQn+Lp3VmtR04cABpaWno0aMHJk2ahMOHD583tra2tsk+EEREdOEyvOHJzMzE0qVLsX79ehQVFaG8vBzXXXcdTp061Wx8YWGhzx4Qdrvd6CoREV2QlEcz5Ag1wxuenJwcTJw4ERkZGRg9ejTeeecdnDx5EitXrmw2vqCgAA6Hw3tUVFQYXSUioguTx6AjxFr9rn+7du1wxRVX4ODBg80+b7FYzrvhEBERXXhaPXPB6dOncejQIaSmprb2qYiILi5KAzxBHsFuJNcChjc8v/71r1FSUoKvvvoKH374IW655RZERUXhzjvvNPpUREQXNbPe49GUCnAXIB133HEHtmzZghMnTqBTp0649tpr8fTTT6Nnz56i1zudTthsNvSJm4AoLdpv7NC2nXXLG5wkW9UtXQ0vXV0vyUrQUdlEZU20yy6RZIvsXa7vRWXVa/WiOOl2ykYKR4YDIzMSGE26TfnRmbKl/w8s0v8jUZrZwhYlW1Zx0q2/zbcm/DtZeg2k13RC/A26MXrZEpRyw1mzHw6HQ7S9tJ7G35PfzI2FNTa4hsNZo9Dp0RrD6iZh+D2eFStWGF0kERE1p3G4LKgyjKlKIJhSgIjIrJQB92gulAWkRERE58MeDxGRSRkxOSAcG8Gx4SEiMitPGwPu8YR+rI1DbUREFFLs8RARmRVntRERUSgppUEFOavN2JWcMhxqIyKikIrYHs8R9Rk0RPmNGQr9zAVGZySQZAcAgG35a3RjXll5i6isVRWyv2h2QX81uRL2qx1n9ovi+redKIozMsOBkdf00YrtorIiOSOBo1p2ra55TnatpnfRz/axoUaWkcDhlmVL6ImBujGD4tuLylotigrgmgoyF3TV+vp93o167IfsOgXEpJMLIrbhISIi/5QHBkyn5qw2IiK6wLHHQ0RkVsqAWW1h2BaBDQ8RkUkZM6vtAtiPh4iIyB/2eIiIzMrTpuEIqgxjqhIINjxERCZlTJJQDrUREdEFLmJ7PGX3V8Fq8d8uxj+10LDzSRclTu2YJ4qLf+o7QVmyxaiShaEAMAjX6Ma8PfMNUVlAkijqmudkpUkWcxp9DUr1L4FoW2MAokWEALD4W9l3UrLtsnSx71Vxd4nipBt+/f7o17oxD6d1E5VV+l0vUZzkcxsUL7vuRi/2ldRN7xq0aaW8NGadXBCxDQ8REekw6T0eDrUREVFIscdDRGRSZp1cwIaHiMikzHqPh0NtREQUUuzxEBGZlUknF7DhISIyKbPe4+FQGxERic2ZMweapvkcvXv3DqgM9niIiEwqXJML+vbtiw0bNnj/fcklgTUlEdvwpD77PQD/H4jrMf3V9ZIMAoGQrkyXrK7f5fpeVJZ0BbskK8GxfZeJyir8xxBRnGSbZECWlUC6/XhBxWZRnN52xABwWH1qWFmALCMBIFtdLy1LuiX05YlnRXErBbtVFx1xisqSbAEPAFik//Mi/dkzmiQzxM7qZToRrbTLpzLgHk8LqnbJJZcgJUW2/XlzONRGRERwOp0+R21t7XljDxw4gLS0NPTo0QOTJk3C4cOHAzoXGx4iIpNqnFwQ7AEAdrsdNpvNexQWFjZ7zszMTCxduhTr169HUVERysvLcd111+HUqVPiekfsUBsREfmnVPALQBvzl1ZUVMBqtXoft1gszcbn5OR4/z8jIwOZmZno1q0bVq5cialTZcPlbHiIiAhWq9Wn4ZFq164drrjiChw8eFD8Gg61ERGZlRHDbEGu4zl9+jQOHTqE1NRU8WvY8BARmZRSbQw5AvHrX/8aJSUl+Oqrr/Dhhx/illtuQVRUFO68805xGRxqIyIisSNHjuDOO+/EiRMn0KlTJ1x77bXYtm0bOnXqJC6DDQ8RkVkZMFQW6OtXrFgR3PnAhoeIyLTMui2CqRseSVYCSXYDaVkAYIvrI4pb7SrRjbFrV4rKcpzZL4oD9N+rNCNBwbUfi+Le399fFNe/7UTdmNLvYkVlHZ0pWFoPIP4p6eemLzpuoChuQvwNorjXDUwJLM1IcOCUcT/ue8+sEsWlzZf9vBTa9TNgfHRG/zsEyOsmyUgASLISUKACnlywZcsWjB07FmlpadA0DWvXrvV5XimFWbNmITU1FXFxccjOzsaBAweMqi8REf3AyAWkoRRww+NyuTBgwAAsXNh83qRnnnkGL7zwAhYtWoTt27cjPj4eo0ePRk2NLKcXERHJhGNWmxEC7nvn5OT4rFz9d0opLFiwAI899hjGjRsHAHj11VeRnJyMtWvX4o477giutkREZHqGNnXl5eWorKxEdna29zGbzYbMzExs3bq12dfU1tY2SU5HRET6LpqhNn8qKxtu+iYnJ/s8npyc7H3uXIWFhT6J6ex2u5FVIiK6YDXOagv2CLWwZy4oKCiAw+HwHhUVFeGuEhERtSJDp1M3bgxUVVXlk7enqqoKAwcObPY1FovlvFlQiYjo/My6jsfQHk96ejpSUlKwceNG72NOpxPbt29HVlaWkaciIrroKWXAPR4zLCA9ffq0T/rr8vJy7N69G0lJSejatSsefPBBPPXUU7j88suRnp6O3/3ud0hLS8P48eONrDcREZlUwA3Pjh07MGLECO+/8/PzAQC5ublYunQpfvvb38LlcuHee+/FyZMnce2112L9+vWIjZWtSjeaNCOBNMPBdfMHiuIGxbfXjZHuIS9Z9Q8A1zynHzO9i2w9lTQjwag+e0VxBRWndWOGorOoLCOv6XXzx4jKkq5eHxSfJ4rrqvXVjZmULPtOzqv8pyhOSgmyKkgzeDiqZdkjSr8boRuzLX+NqKzr5l88GQmMWIejGneCC6GAG57hw4f7raimaXjiiSfwxBNPBFUxIiLyz4jp0KafTk1ERKTH1ElCiYguZmad1caGh4jIpMza8HCojYiIQoo9HiIik1Ke4CcHKOO2hhJjw0NEZFIcaiMiIhLQVDhWD/nhdDphs9nQJ24CorRov7GSLW6ndpQt6JNsVQ0Ac+2Zorj7vlgsijPSS1dM1Y2R1ku6aPWw+lQUdxV+ohvz9sw3RGW9svIWUZx0K20J6fejBzJEcSeijuvGWD36i5AB+TWQLuZsF9dPN+Zk9T5RWUaS1AuQ/4xKvx+Shd56C2qVcsNZsx8OhwNWq1V0Xn8af0/uvnkoEqODG7g6VX8WA9/+yLC6SXCojYjIpDxKgyfIobJgX98SHGojIqKQYo+HiMisjNhBNAwpc9jwEBGZFGe1ERERCbDHQ0RkUmbt8bDhISIyKbM2PBxqIyKikGKPh4jIpDyqDTxB7kAa7OtbImIbnv3VawD47wJKVtfvcn0vOp9ku19AvvLfyCwCUpLyJPUC5Ku6pdtVvzBtuW7MsX2XicoqOuIUxUm2SpZufS39ftyWkiiKW1mpHyPZPh2QX4PVwgGOSM1KIK1X0ZErRXHSrbRfn6+/zbd+VojWSRCjlAE7kHKojYiILnQR2+MhIiL/zDq5gA0PEZFJmbXh4VAbERGFFHs8REQmZdbs1Gx4iIhMikNtREREAuzxEBGZlFl7PGx4iIhMyqz3eDSlVOssqW2hxr3ErbF9oGlRfmM1wUjhhPgbROeV7KtuNGkWAWmGg6kd83RjXndtFpV1dKZgaT2A+Ke+E8VJ3qs0I0FHZRPFTbTrf7UfrdguKssWlSKKO+k+KoqTfHelK/WvirtLFFev1YvihrbVz4Qg/XmRZCQAwpMtQfLzAgCDk2p0Y/S+u25Vj/3Vq+FwOGC1WkXn9afx92Tx9dlIuCS4/sPps2cxfMsGw+omwXs8REQmpdSPw20tP1p+/nnz5kHTNDz44IMBvY5DbUREJhXOezwff/wx/vSnPyEjIyPg17LHQ0REATl9+jQmTZqEl19+Ge3by5LZ/js2PEREJqV+mFwQzNHY43E6nT5HbW3tec+bl5eHn/70p8jOzm5RvdnwEBGZVPD3d35seOx2O2w2m/coLCxs9pwrVqzAzp07z/u8BO/xEBERKioqfGa1WSyWZmN+9atf4YMPPkBsrGzPruaw4SEiMikjJxdYrVbd6dSlpaU4fvw4rrrqKu9jbrcbW7ZswYsvvoja2lpERflfBgOw4SEiMq1QLyAdOXIk9u7d6/PYlClT0Lt3bzz88MOiRgeI4IYnHf0RhRi/MZKtgaUL3aSLyYxcaGrkNtoAUCpYy9lV6ysqK/4pva18G7geSxLFPbBIv1su3Yr4lZW3iOJWVej/QEkXhjrcsgW1PTFQFCf57u6CbJrqzuplojhbnP4WzoBsK+0LYWGo/GdZvzy9766z1oPUZ4Wni2CJiYno18/32sfHx6NDhw5NHvcn4MkFW7ZswdixY5GWlgZN07B27Vqf5ydPngxN03yOMWNk+9oTEZGckZMLQingHo/L5cKAAQNw991349Zbb202ZsyYMViyZIn3383dpCIiouBEQq624uLigF8TcMOTk5ODnJwcvzEWiwUpKbIhDCIiuri0yjqe4uJidO7cGb169cL06dNx4sSJ88bW1tY2WbhERET6FDRDjlAzvOEZM2YMXn31VWzcuBG///3vUVJSgpycHLjd7mbjCwsLfRYt2e12o6tERHRBumju8ei54447vP/fv39/ZGRkoGfPniguLsbIkSObxBcUFCA/P9/7b6fTycaHiOgC1urTqXv06IGOHTvi4MGDzTY8FouFkw+IiFogEiYXtESrNzxHjhzBiRMnkJqa2tqnIiK6qFw0W1+fPn0aBw8e9P67vLwcu3fvRlJSEpKSkvD4449jwoQJSElJwaFDh/Db3/4Wl112GUaPHm1oxYmIyJwCbnh27NiBESNGeP/deH8mNzcXRUVF2LNnD1555RWcPHkSaWlpGDVqFJ588smAh9PW378BVov/uQ8PLLoz0OqbknR7Zsk234fVp8FWx8d182WLgwfFG1fWlzBuu+oe7u6isibau4nicm+TZV+QfHf/b+Z6UVnxT4nCxFkrJObaM0Vx930R+swF4aD33XWrOgCvGX5eDwwYagvDrLaAG57hw4dD+dkr9b333guqQkREdGGL2FxtRETk30Vzj4eIiCKDB1rQQ2XhGGrjDqRERBRS7PEQEZmVEZkHONRGRERSZl1AyqE2IiIKKfZ4iIhMirPaiIgopDw/HMGWEWoR2/CMfHE4orRovzHTu9QISjJ6/3XjGL5vvSBzgXT1enTcQFHczuplorgvof9elfBHoF1UmijO4a7UjZFmJFhVIfursOi5polwmyP57sY/9Z2oLNdjSaK4tPmyrBVD0Vk35r4vFovKeumKqaI4aXkS0p/lqR1lvxtWu0p0Y/S+uwrNbwtzsYrYhoeIiPzjUBsREYWURwU/K81z/gxorYaz2oiIKKTY4yEiMikFDSrIlDfBvr4l2PAQEZkUF5ASEREJsMdDRGRSDZMLgi8j1NjwEBGZlFnv8WjK33aiYeB0OmGz2dAwCuj/A7HF9dEt7+hM/UWEAHCNcOHf3jOrRHGSxaHihaEGki5alWyjHYhdru91Y25LSRSVVVj5f6K4nhioGyPdXlr6/Vgz6mtRXGq/g7oxRm/tPjhJsuDa2MWcUpKFptJ6SX4vALLvBwDUa/W6Mfq/FxQADxwOB6xWq+i8/jT+nvxL3zvRNiomqLLOuOtw96fLDaubBHs8REQmZdbJBWx4iIhMSqmGI9gyQo2z2oiIKKTY4yEiMikFDR4TTi5gw0NEZFJmTRLKoTYiIgop9niIiEyKs9qIiCik1A9HsGWEGofaiIgopCK2x2ON7Q1Ni/Ib46jer1vOA4tk29vKttEGHq0weLtqAxmZLeF14TbU0q20nVH6mQtWypJMQBP+vTQovr1ujDQ7gPT7IclIAAA3z79VN2YnNovKkl6Dxd/Ksm4YmUVASlKedBvtRyu2i+Ik3w9AtpV2/7YT/T7vVvXYX71adL5AcKiNiIhCyvPDEWwZocahNiIiCin2eIiITIrreIiIKKQa7/EEewSiqKgIGRkZsFqtsFqtyMrKwrvvvhtQGWx4iIhIrEuXLpg3bx5KS0uxY8cO3HjjjRg3bhw+/fRTcRkcaiMiMqlwrOMZO3asz7+ffvppFBUVYdu2bejbVzbDkg0PEZFJGTmd2ul0+jxusVhgsVj8vtbtdmPVqlVwuVzIysoSn5NDbUREBLvdDpvN5j0KCwvPG7t3714kJCTAYrFg2rRpWLNmDfr0ke38CrDHQ0RkWkau46moqPDZ+tpfb6dXr17YvXs3HA4HXn/9deTm5qKkpETc+GhKhWP/ufNr3Eu8oTMWuml+V8XdJYr7v5nrRXGSFfGSFdGAfA95Cemqf6lHUoaJ4v5e9Z1uzNC2nUVlST83yTWVXs/4p/TrDwBTO8oyZbzu0s9KUDo6QVTW+/v7i+Kkio449YOE9p6RZUuQfG67XPrZLwDjr6kxFAAPHA6Hzy/3lmr8Pfn7HncjLiomqLKq3XV4+Mu/BFW37Oxs9OzZE3/6059E8QH9FiosLMSQIUOQmJiIzp07Y/z48SgrK/OJqampQV5eHjp06ICEhARMmDABVVVVgZyGiIhMxOPxoLa2VhwfUMNTUlKCvLw8bNu2DR988AHq6+sxatQouFwub8xDDz2Et956C6tWrUJJSQmOHj2KW2/Vz0tFRESBaehHBXcEOuRVUFCALVu24KuvvsLevXtRUFCA4uJiTJo0SVxGQPd41q/37cIuXboUnTt3RmlpKa6//no4HA4sXrwYy5Ytw4033ggAWLJkCa688kps27YN11xzTSCnIyIiPxQMyFwQ4C2N48eP45e//CWOHTsGm82GjIwMvPfee7jpppvEZQQ1ucDhcAAAkpKSAAClpaWor69Hdna2N6Z3797o2rUrtm7d2mzDU1tb69NFO3dKHxERRY7Fi4PPTN7iO80ejwcPPvgghg0bhn79GtLxV1ZWIiYmBu3atfOJTU5ORmVl8znvCwsLfabw2e32llaJiOii4lHGHKHW4oYnLy8P+/btw4oVK4KqQEFBARwOh/eoqKgIqjwioouFMugItRYNtc2YMQNvv/02tmzZgi5dungfT0lJQV1dHU6ePOnT66mqqkJKSkqzZUlWxxIR0YUjoB6PUgozZszAmjVrsGnTJqSnp/s8P3jwYERHR2Pjxo3ex8rKynD48OGA0ikQEZG+cGSnNkJAPZ68vDwsW7YM69atQ2Jiove+jc1mQ1xcHGw2G6ZOnYr8/HwkJSXBarXi/vvvR1ZWVthmtEkXhu6sXiaKu+Y5/1vcNpJslfy6S7YwVLLFNyB7r9Ltfi9PPCuKm1f5T1GcEqyvHgrZAlIjr2n8U6Ki4HosSRT3wCJZeZLtqt/fL1vMN6rPXlFc4T+GiOK25a/RjZEuvtTbErrRaleJbozkOwTI6ya9pqFdaBoYs+5AGlDDU1RUBAAYPny4z+NLlizB5MmTAQDPP/882rRpgwkTJqC2thajR4/GSy+9ZEhliYjI/AJqeCTZdWJjY7Fw4UIsXChLa0JERC1j1h1ImSSUiMikzDrUxm0RiIgopNjjISIyKaUajmDLCDU2PEREJuWBBk+Q28cE+/qW4FAbERGFFHs8REQmZUSutXDkamPDQ0RkVgbc4wlHsjZTNzySFezSjARS0q18S7/T38r36MzmM3afS5otQfIFkmYkOHDK2K+GJPvCauHIr127UhQn2TJckkEAANLmfyqKK7TrZ6wAgMXfSr5HU2XnFGYkKLj2Y1GchHQ79mgVLYqbEH+Dbox0y3MpIzMcRHJ2g0hk6oaHiOhiZtbJBWx4iIhMyqzTqTmrjYiIQoo9HiIikzJryhw2PEREJmXW6dQcaiMiopBij4eIyKQUgl+GE4YODxseIiKzahhqC3I6NYfaiIjoQhexPZ4BsRMRpcX4jTE6K4HE1I76GQkA4SrrRbKypneRrYb//dGvdWNWypIliCnhnJh2cf10Y05W7xOVNaGj/ip3ABiKzqI4I8u67wvZ6vqXrtDPSlB0xCkqa1v+GlGc1M3zb9WN0bBNVNag+PaiOMnPi6E/ewGQZCXQy27grPUg9dkTRlXJy6zreCK24SEiIv/MOp2aQ21ERBRS7PEQEZkUh9qIiCikONRGREQkwB4PEZFJKQNS5nCojYiIxMyauYBDbUREFFIR2+Op187Co/lPBSFZUCZdTCZZ4BgIybbcq10lorI21KSI4h5O66YbI12UKN3iW7oFsnRxqISR13SuPVNU1n1fLBbFSUnK699WtuW5dNtl6bWSLA4dhGtEZQ1Oki1+fmGa/vbSDywSFSVanAvIr6nk90za/M1+n1fKDcD4BaRmzU4dsQ0PERH5Z9bp1BxqIyKikGKPh4jIpMy6jocNDxGRSZn1Hg+H2oiIKKTY4yEiMimzruNhw0NEZFIcaiMiogteYWEhhgwZgsTERHTu3Bnjx49HWVlZQGWw4SEiMqnGdTzBHoEoKSlBXl4etm3bhg8++AD19fUYNWoUXC6XuIyIHWo7oj6Dhii/MZLtiKUZCaQr61eLomRbQreLShOV5XDL9qsu/a6Xbox0m+S0+bJV7o7q/aI4Ixl5Te/7QnbdjV4NLyHNHiHNcBCtokVxku2qpRkJVlX4zz7SqOi5kbox0i3gpddAek1LBYkhump9/T7vRj32w/iflXBMp16/fr3Pv5cuXYrOnTujtLQU119/vaiMgHo8ki7W8OHDoWmazzFt2rRATkNERCHmdDp9jtraWtHrHA4HACApST/tUaOAGh5pF+uee+7BsWPHvMczzzwTyGmIiEjAgx8nGLT4+KEsu90Om83mPQoLC/XP7/HgwQcfxLBhw9CvnzzfZUBDbdIuVtu2bZGSIktsSURELWPkdOqKigpYrVbv4xaLRfe1eXl52LdvH/7xj38EdM6gJhecr4v197//HR07dkS/fv1QUFCAM2fOnLeM2traJl08IiIKLavV6nPoNTwzZszA22+/jc2bN6NLly4BnavFkwvO18W666670K1bN6SlpWHPnj14+OGHUVZWhjfeeKPZcgoLC/H444+3tBpERBctpYKfXBDorDalFO6//36sWbMGxcXFSE9PD/icLW54ztfFuvfee73/379/f6SmpmLkyJE4dOgQevbs2aScgoIC5Ofne//tdDpht9tbWi0ioouGUgYMtQVYQF5eHpYtW4Z169YhMTERlZUNs25tNhvi4uJEZbSo4WnsYm3ZskW3i5WZ2bDR1sGDB5tteCwWi2gskYiIwq+oqAhAwwzmf7dkyRJMnjxZVEZADU9Luli7d+8GAKSmpgZyKiIi0hGOdTzKgJ3jAmp49LpYhw4dwrJly/Af//Ef6NChA/bs2YOHHnoI119/PTIyMoKuLBER/ahhOnRwDUE4crVpKoDmS9OaX4Xc2MWqqKjAz3/+c+zbtw8ulwt2ux233HILHnvsMZ9pev44nU7YbDY0TLjzv+r5qri7dMur1+pF5z2sPhXF9cRAUdxtKYm6MYWV/2foOXdWL9ONkewfD8hXppd+FyuKW/ztQt0Yo7NMhIORGQ6k12q1q0QUNyH+BlGc5Fq5HpMtFrxGkJEAANaM+lo3JrXfQUPPKf2ZPzpTP3NI/FN66Q0UAA8cDof4d6E/jb8nx1v/G9FaTFBl1as6rHX+ybC6SQQ81OaP3W5HSYnsh4CIiILDbRGIiCikPAZMp+a2CEREdMFjj4eIyKTUD/8FW0aoseEhIjIpDrUREREJsMdDRGRS4VhAagQ2PEREJqWUAfd4DMhEECgOtRERUUgFlLkgFBpX5A6IvR1ROityjVypL7Whpkw/CEAHd2fdmC+xR1SWdMW5hGRVOgD0bztRFLctf6Mo7tL5aboxkZyRwGiSDAf/W1EtKusQdoviHNX7RXFG/sxIM2Dk3rZGN+bm+beKyuoRb2zSYSMyOThrPUh99oThmQtuir/HkMwFH7hejtzMBUREFDk41EZERCTAHg8RkUk1pB4NvoxQY8NDRGRSHqUM2BaBQ21ERHSBY4+HiMikmKuNiIhCyqyZCzjURkREIRWxC0itsX2gaVF+YzUD201bVIooLju2lyjudddm3Rjpgr5I3hJasv04APyXPU43puiIU1TW3jOrRHFGLoSULry1xfURxUm+u/+aeVRUlv62y8YzcotvQLZgeWhb/UXZAPClq1YUN9Fu3K8+ve+uW9Vjf/VqwxeQXhs3BZcEuYD0rKrDP6qXcAEpERHp46w2IiIiAfZ4iIhMirPaiIgopDwwYKgtDA0Ph9qIiCik2OMhIjIps/Z42PAQEZmUWe/xcKiNiIhCij0eIiKTUgYMtXFW279JR39Ewf+K3EHx7XXLkW5V7XBXiuIAWeaCrlpf3ZiKOFmHM5IzEki2HweA0u/0swhsy9ff/hgAHlgky0ggzTYgIc2CsMv1vShO8t2Nf0pWf71tl38sz7gMB9KMBNIMBwUVW3VjhkKWuUCakWBVhSaKk2ylrffdbdj6WnS6gHg0DzQtuGxrnjBka+NQGxERhVTE9niIiMg/DxQ0zmojIqJQUT9MqA62jFDjUBsREYUUezxERCblAQwYags9NjxERCbFWW1EREQC7PEQEZmUBx5oQfZYwtHjYcNDRGRSF0XDU1RUhKKiInz11VcAgL59+2LWrFnIyckBANTU1GDmzJlYsWIFamtrMXr0aLz00ktITk42vOKALCtBdqws08BqlyxzgXQ1vGTl/4T4G0RlQRgnqZvRGQmkJHV7fX4fUVmF9hrhWWXZBiRWu0pEcXbtSlGckVkVpBkJjMxwIM3kUCpMlnB0pv7PnzSTw+AkWbYESUYCAPjSVSuKI7mA7vF06dIF8+bNQ2lpKXbs2IEbb7wR48aNw6effgoAeOihh/DWW29h1apVKCkpwdGjR3Hrrbe2SsWJiC52yrsxQnBHILZs2YKxY8ciLS0NmqZh7dq1Adc7oB7P2LFjff799NNPo6ioCNu2bUOXLl2wePFiLFu2DDfeeCMAYMmSJbjyyiuxbds2XHPNNQFXjoiIzi8cs9pcLhcGDBiAu+++u8Udixbf43G73Vi1ahVcLheysrJQWlqK+vp6ZGdne2N69+6Nrl27YuvWredteGpra1Fb+2NX1ul0trRKRETUynJycry3V1oq4IZn7969yMrKQk1NDRISErBmzRr06dMHu3fvRkxMDNq1a+cTn5ycjMrK84/fFhYW4vHHHw+44kREFzsFT9CTAxqH2s79o99iscBikd0HC1TA63h69eqF3bt3Y/v27Zg+fTpyc3Oxf//+FlegoKAADofDe1RUVLS4LCKii4mC25ADAOx2O2w2m/coLCxstXoH3OOJiYnBZZddBgAYPHgwPv74Y/zhD3/A7bffjrq6Opw8edKn11NVVYWUlJTzltearSoREclUVFTAarV6/92av5eDzlzg8XhQW1uLwYMHIzo6Ghs3bvQ+V1ZWhsOHDyMrKyvY0xAR0Tk8Bv0HAFar1edozYYnoB5PQUEBcnJy0LVrV5w6dQrLli1DcXEx3nvvPdhsNkydOhX5+flISkqC1WrF/fffj6ysLM5oIyJqBQ176QQ7qy3C9+M5fvw4fvnLX+LYsWOw2WzIyMjAe++9h5tuugkA8Pzzz6NNmzaYMGGCzwLSllj+08+RGB3lN2bcOv3tpaVbEUvnshu5APMQZAsmJdtoA7K6Gb0wVMoWp/9eHdWye4VFR2Sfh2Qr7evmjxGVJf1+7D2zShTXv+1Ew8qSMnKhadr8zaKypN9dSd2kC2CveU42M1a61bqE5Ynn/T/vPAM8e69h5wun06dP4+DBg95/l5eXY/fu3UhKSkLXrl1FZQTU8Cxe7H+f9djYWCxcuBALFxq3KpuIiJrXMDlAC7qMQOzYsQMjRozw/js/Px8AkJubi6VLl4rKYK42IiKTarg/E9oFpMOHD4dSwQ3PcVsEIiIKKfZ4iIhMqiW51porI9TY8BARmZQHbiDIezyeAO/xGIFDbUREFFLs8RARmRSH2oiIKKQ8yoChNhX6obaIa3gap+mdrtf/MNyqzrjzCsc53ZCeU3+6oRJecDfqRXFtRFMcQ79KGZC+V1nd3Er2eThr9f+Sk36H5GsdjHwP4blWks/N6O+u5L1K6gUY+/2QsjjP+D+XsxoAgp6GfKHQVIR9EkeOHIHdbg93NYiIDFdRUYEuXboEXY7T6YTNZkOHtoPRRguu/+BRZ3HiTCkcDodPktDWFHE9nrS0NFRUVCAxMRGa1tCFdDqdsNvtTbKnmonZ34PZ6w+Y/z2w/uHX0veglMKpU6eQlpZmaH0a7vEEN1TGezwA2rRpc96/CBqzppqZ2d+D2esPmP89sP7h15L3YLPZWqk25hNxDQ8REcko5YEn2Fxtij0eIiISahgmCzZJaOgbHlMsILVYLJg9e7apdyo1+3swe/0B878H1j/8LoT3EAkiblYbERH51zirzRbbB5rmf98yPUq54ajZf3HPaiMiIpmGOzwcaiMiIvKLPR4iIpNqmJHGWW1ERBQiwS4eNaqMQJliqG3hwoXo3r07YmNjkZmZiY8++ijcVRKZM2cONE3zOXr37h3uavm1ZcsWjB07FmlpadA0DWvXrvV5XimFWbNmITU1FXFxccjOzsaBAwfCU9lm6NV/8uTJTa7JmDFjwlPZZhQWFmLIkCFITExE586dMX78eJSVlfnE1NTUIC8vDx06dEBCQgImTJiAqqqqMNW4Kcl7GD58eJPrMG3atDDV2FdRUREyMjK8i0SzsrLw7rvvep+P9M/fDCK+4XnttdeQn5+P2bNnY+fOnRgwYABGjx6N48ePh7tqIn379sWxY8e8xz/+8Y9wV8kvl8uFAQMGYOHChc0+/8wzz+CFF17AokWLsH37dsTHx2P06NGoqakJcU2bp1d/ABgzZozPNVm+fHkIa+hfSUkJ8vLysG3bNnzwwQeor6/HqFGj4HK5vDEPPfQQ3nrrLaxatQolJSU4evQobr311jDW2pfkPQDAPffc43MdnnnmmTDV2FeXLl0wb948lJaWYseOHbjxxhsxbtw4fPrppwAi6/NXSkEpT5BHGCY2qwg3dOhQlZeX5/232+1WaWlpqrCwMIy1kpk9e7YaMGBAuKvRYgDUmjVrvP/2eDwqJSVFPfvss97HTp48qSwWi1q+fHkYaujfufVXSqnc3Fw1bty4sNSnJY4fP64AqJKSEqVUw+cdHR2tVq1a5Y357LPPFAC1devWcFXTr3Pfg1JK3XDDDepXv/pV+CoVoPbt26v//d//jZjP3+FwKAAqLqa7amvpEdQRF9NdAVAOhyNk9Y/oHk9dXR1KS0uRnZ3tfaxNmzbIzs7G1q1bw1gzuQMHDiAtLQ09evTApEmTcPjw4XBXqcXKy8tRWVnpcz1sNhsyMzNNcz0AoLi4GJ07d0avXr0wffp0nDhxItxVOi+HwwEASEpKAgCUlpaivr7e5xr07t0bXbt2jdhrcO57aPT3v/8dHTt2RL9+/VBQUIAzZ/xvLRAObrcbK1asgMvlQlZWlik//0gU0ZMLvv32W7jdbiQnJ/s8npycjM8//zxMtZLLzMzE0qVL0atXLxw7dgyPP/44rrvuOuzbtw+JiYnhrl7AKisrAaDZ69H4XKQbM2YMbr31VqSnp+PQoUN49NFHkZOTg61btyIqKriFeEbzeDx48MEHMWzYMPTr1w9AwzWIiYlBu3btfGIj9Ro09x4A4K677kK3bt2QlpaGPXv24OGHH0ZZWRneeOONMNb2R3v37kVWVhZqamqQkJCANWvWoE+fPti9e3dEff4N+yIFN1TGWW0XmJycHO//Z2RkIDMzE926dcPKlSsxderUMNbs4nXHHXd4/79///7IyMhAz549UVxcjJEjR4axZk3l5eVh3759EX9f0J/zvYd7773X+//9+/dHamoqRo4ciUOHDqFnz56hrmYTvXr1wu7du+FwOPD6668jNzcXJSUl4a5WE0Y0GuFoeCJ6qK1jx46IiopqMmOkqqoKKSkpYapVy7Vr1w5XXHEFDh48GO6qtEjjZ36hXA8A6NGjBzp27Bhx12TGjBl4++23sXnzZp9tQlJSUlBXV4eTJ0/6xEfiNTjfe2hOZmYmAETMdYiJicFll12GwYMHo7CwEAMGDMAf/vAHU33+kSyiG56YmBgMHjwYGzdu9D7m8XiwceNGZGVlhbFmLXP69GkcOnQIqamp4a5Ki6SnpyMlJcXnejidTmzfvt2U1wNo2PH2xIkTEXNNlFKYMWMG1qxZg02bNiE9Pd3n+cGDByM6OtrnGpSVleHw4cMRcw303kNzdu/eDQARcx3O5fF4UFtbG3Gff8NGcMEfoa94hFuxYoWyWCxq6dKlav/+/eree+9V7dq1U5WVleGumq6ZM2eq4uJiVV5erv75z3+q7Oxs1bFjR3X8+PFwV+28Tp06pXbt2qV27dqlAKjnnntO7dq1S3399ddKKaXmzZun2rVrp9atW6f27Nmjxo0bp9LT01V1dXWYa97AX/1PnTqlfv3rX6utW7eq8vJytWHDBnXVVVepyy+/XNXU1IS76koppaZPn65sNpsqLi5Wx44d8x5nzpzxxkybNk117dpVbdq0Se3YsUNlZWWprKysMNbal957OHjwoHriiSfUjh07VHl5uVq3bp3q0aOHuv7668Nc8waPPPKIKikpUeXl5WrPnj3qkUceUZqmqffff18pFRmff+OstuioZBVzSWpQR3RUcshntUV8w6OUUn/84x9V165dVUxMjBo6dKjatm1buKskcvvtt6vU1FQVExOjLr30UnX77bergwcPhrtafm3evFmh4W6lz5Gbm6uUaphS/bvf/U4lJycri8WiRo4cqcrKysJb6X/jr/5nzpxRo0aNUp06dVLR0dGqW7du6p577omoP2KaqzsAtWTJEm9MdXW1uu+++1T79u1V27Zt1S233KKOHTsWvkqfQ+89HD58WF1//fUqKSlJWSwWddlll6nf/OY3If3F58/dd9+tunXrpmJiYlSnTp3UyJEjvY2OUpHx+Zu94eG2CEREJtO4LcIlUZ2gacHdMVHKg7Pub7gtAhER6TPrdOqInlxAREQXHvZ4iIhMSwFBz0oL/d0WNjxERCZlzH48oW94ONRGREQhxR4PEZFJNSz+DLLHw6E2IiKSC77hCcc9Hg61ERFRSLHHQ0RkVgZMLkAYJhew4SEiMimz3uPhUBsREYUUGx4iItPyGHQEbuHChejevTtiY2ORmZmJjz76SPxaNjxERKalGu7RBHO0YKjttddeQ35+PmbPno2dO3diwIABGD16NI4fPy56PbNTExGZTGN2auASaIbc4zkbUHbqzMxMDBkyBC+++CKAho3y7HY77r//fjzyyCO6r2ePh4jItFTQ/wXa46mrq0NpaSmys7O9j7Vp0wbZ2dnYunWrqAzOaiMiMjVjBq2cTqfPvy0WCywWS5O4b7/9Fm63G8nJyT6PJycn4/PPPxediz0eIiKTiYmJQUpKCgC3IUdCQgLsdjtsNpv3KCwsbLX6s8dDRGQysbGxKC8vR11dnSHlKaWgab73iprr7QBAx44dERUVhaqqKp/Hq6qqfmgM9bHhISIyodjYWMTGxob8vDExMRg8eDA2btyI8ePHA2iYXLBx40bMmDFDVAYbHiIiCkh+fj5yc3Nx9dVXY+jQoViwYAFcLhemTJkiej0bHiIiCsjtt9+Ob775BrNmzUJlZSUGDhyI9evXN5lwcD5cx0NERCHFWW1ERBRSbHiIiCik2PAQEVFIseEhIqKQYsNDREQhxYaHiIhCig0PERGFFBseIiIKKTY8REQUUmx4iIgopNjwEBFRSLHhISKikPp/EgSP89Np9xYAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" ] @@ -366,7 +562,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 84, "id": "59a6a485-a714-4e14-b27a-1df2930068ee", "metadata": {}, "outputs": [], @@ -389,10 +585,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 85, "id": "7e0b2f18-ca53-4f34-9fcf-0052dcc31dc5", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeAAAAF2CAYAAAC260vLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABbfUlEQVR4nO3deVhU5f//8ecM+44gq6LgkvuKSq5ZIG6VmmUW39IyzdTMbP9VblmmlR/TzKw+aotW2mJ9rFTc0xARdyRXVFIWFRGQbWDO7w9icgRkm+Ew8H5cF5fMmfvc53VuD7w5Z86iURRFQQghhBA1Sqt2ACGEEKI+kgIshBBCqEAKsBBCCKECKcBCCCGECqQACyGEECqQAiyEEEKoQAqwEEIIoQIpwEIIIYQKpAALIYQQKpACLEQtsXHjRjp37oy9vT0ajYb09HS1I5VKo9Ewa9asGl/u2LFjcXZ2rlBbtTKW5dy5c2g0GlatWqV2FFGLSAEWddqqVavQaDTs379f7Si3dfXqVUaNGoWDgwNLly7lq6++wsnJSbU8v/32W60qYDVhzZo1LFq0SO0Yoh6xVjuAEAJiYmLIzMzkrbfeIiwsTO04/PbbbyxdurTUIpyTk4O1de3+1VGVjGvWrOHYsWNMmzbN5HmaNm1KTk4ONjY2Ju9bWK7a/VMkRD2RmpoKgLu7u7pBKsDe3l7tCOWqLRkLCgrQ6/XY2trWmkyi9pBD0EIABw8eZPDgwbi6uuLs7ExoaCh79+41aqPT6Zg9ezYtW7bE3t4eT09P+vTpQ2RkpKFNcnIyTzzxBI0bN8bOzg4/Pz+GDRvGuXPnylx2//79GTNmDADdu3dHo9EwduxYAAIDAw3f3zpP//79Da937NiBRqNh7dq1vP322zRu3Bh7e3tCQ0M5ffp0ifmjo6MZMmQIDRo0wMnJiY4dO/Lhhx8CRZ+1Ll26FCj6LLX4q1hpn69WZPyKPw7Ys2cP06dPx8vLCycnJ0aMGMHly5fLHJ9bXbx4keHDh+Ps7IyXlxcvvvgihYWFRm1uzZiZmcm0adMIDAzEzs4Ob29vBgwYwIEDBwzj+euvv3L+/HnD+gYGBhrmT01NZdy4cfj4+GBvb0+nTp344osvjJZZ/Dnv+++/z6JFi2jevDl2dnYcP368zM+A//rrLx588EE8PDywt7enW7du/PLLL0ZtKrLdCcske8Ci3ouLi6Nv3764urry8ssvY2Njw/Lly+nfvz87d+4kJCQEgFmzZjFv3jyeeuopevToQUZGBvv37+fAgQMMGDAAgJEjRxIXF8ezzz5LYGAgqampREZGcuHCBaNf6Dd7/fXXadWqFZ9++ilz5swhKCiI5s2bV2ld3n33XbRaLS+++CLXr19nwYIFREREEB0dbWgTGRnJvffei5+fH8899xy+vr7Ex8ezYcMGnnvuOZ5++mkuXbpEZGQkX331lcnGr9izzz5LgwYNmDlzJufOnWPRokVMmTKF7777rtxlFRYWMnDgQEJCQnj//ffZsmULH3zwAc2bN+eZZ54pc76JEyfy/fffM2XKFNq2bcvVq1fZvXs38fHxdO3alddff53r16/z999/85///AfAcMJXTk4O/fv35/Tp00yZMoWgoCDWrVvH2LFjSU9P57nnnjNa1sqVK8nNzWXChAnY2dnh4eGBXq8vddx69+5No0aNePXVV3FycmLt2rUMHz6cH374gREjRgAV2+6EhVKEqMNWrlypAEpMTEyZbYYPH67Y2toqZ86cMUy7dOmS4uLiovTr188wrVOnTsrQoUPL7OfatWsKoLz33nsmy9m0aVNlzJgxJdrfddddyl133WV4vX37dgVQ2rRpo+Tl5Rmmf/jhhwqgHD16VFEURSkoKFCCgoKUpk2bKteuXTPqU6/XG76fPHmyUtavB0CZOXOm4XVFx694HcPCwoyW9fzzzytWVlZKenp6qcsrNmbMGAVQ5syZYzS9S5cuSnBw8G0zurm5KZMnT75t/0OHDlWaNm1aYvqiRYsUQPn6668N0/Lz85WePXsqzs7OSkZGhqIoipKQkKAAiqurq5KammrUR/F7K1euNEwLDQ1VOnTooOTm5hqm6fV6pVevXkrLli0N08rb7oTlkkPQol4rLCxk8+bNDB8+nGbNmhmm+/n58eijj7J7924yMjKAos9n4+LiOHXqVKl9OTg4YGtry44dO7h27VqN5L/VE088ga2treF13759ATh79ixQdKg4ISGBadOmlfi8+ebDzBVVmfErNmHCBKNl9e3bl8LCQs6fP1+hZU6cONHodd++fQ3rVxZ3d3eio6O5dOlShZZxs99++w1fX18eeeQRwzQbGxumTp1KVlYWO3fuNGo/cuRIvLy8bttnWloa27ZtY9SoUWRmZnLlyhWuXLnC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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "plot_histories(histories, labels)" ] @@ -407,10 +614,37 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 86, "id": "a6fd1e33-3620-4f3b-b705-a120f6da0027", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "100%|███████████████████████████████████████████████████████████████████████████| 500/500 [00:02<00:00, 193.41trial/s, best loss: 828.5188174589957]\n", + "New optimized step at iteration 1/20: 0.00988216174433494\n", + "New optimized step at iteration 2/20: 0.007178128589748405\n", + "New optimized step at iteration 3/20: 0.006586283123947156\n", + "New optimized step at iteration 4/20: 0.008496240698896648\n", + "New optimized step at iteration 5/20: 0.010639601305560622\n", + "New optimized step at iteration 6/20: 0.009688893201482675\n", + "New optimized step at iteration 7/20: 0.006959809497968054\n", + "New optimized step at iteration 8/20: 0.007079825908277573\n", + "New optimized step at iteration 9/20: 0.0025106878857708115\n", + "New optimized step at iteration 10/20: 0.007351003028447434\n", + "New optimized step at iteration 11/20: 0.005865305934025375\n", + "New optimized step at iteration 12/20: 0.007990929593067532\n", + "New optimized step at iteration 13/20: 0.011404539807978897\n", + "New optimized step at iteration 14/20: 0.0008194053292830093\n", + "New optimized step at iteration 15/20: 0.000292389939095989\n", + "New optimized step at iteration 16/20: 0.0067294371737333086\n", + "New optimized step at iteration 17/20: 0.0038227993688979764\n", + "New optimized step at iteration 18/20: 0.0019157593296632823\n", + "New optimized step at iteration 19/20: 0.003853751908247154\n" + ] + } + ], "source": [ "# restart\n", "dbf_2 = DoubleBracketFlow(hamiltonian=deepcopy(h), mode=flowtype)\n", @@ -438,7 +672,7 @@ " optimizer = tpe,\n", " max_evals = 100,\n", " )\n", - " print(f\"New optimized step: {step}\")\n", + " print(f\"New optimized step at iteration {s}/{NSTEPS}: {step}\")\n", " dbf_2(step=step)\n", " off_diagonal_norm_history.append(dbf_2.off_diagonal_norm)\n", "\n", @@ -448,10 +682,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 87, "id": "0f0212bf-b642-4fea-9203-037876e0b266", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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nq+7u7uVIxFVkfG8K0vfg/wkAduIY7OnoswfSGTCUpg/kKMfvW/tkISwefZyb1FULuY67yQB24DkY0epduIbjP+nOgWqH/uK5GNHrRuYEEIIi5EEbANSYg+ju+0PKp0OUo/EWicgIYRVdO3albFjx1p0H5MmTaJly5YW3YcoGUnANsCnSVMMqukygwG8GzexTkBCCIsZNmwYiqIU+Dl58iS//vor7777rrVDLNKZM2dQFIX9+/dbO5RKQRKwDfBt0JBr9Z9G/ScJqypExzZD51u+Lu5CCNvUq1cvLl++bPITERGBv79/iWbREZWDJGAb0fDlNyCkAQCKArHnQtgwb42VoxKiaki5fINT246TcvlGhezPxcWF4OBgkx8HBweTJuijR4/i7u7O0qVLte2WL1+Oh4cHR44cASA5OZlnnnmGgIAAvL29uf/++zlw4IDJvt5//32CgoLw8vJi+PDhZGZm3jG2GzduMGTIEAICAnBzc6NevXosWrQIgIiICABatWqFoih07dpV2+7LL7+kUaNGuLq60rBhQxYsWKCtM145//DDD9x77724urrStGlTNm3aVOZjWBlIArYhTsG1tdeeLpnsXrqNGxeSrBiREJXfnh92MOOeSXz5n0+Ycc8kdv+w3dohAdCwYUM++OADRo4cyblz57hw4QLjxo3j/fffp3HjxgA88sgjJCYm8tdffxETE0Pr1q3p1q0bSUl53xs//fQTkyZN4r333mPPnj2EhITw6aef3nG/77zzDkeOHOGvv/4iLi6OBQsWUL16dQB27doFwNq1a7l8+TK//vorAEuWLGHChAlMmzaNuLg43nvvPSZMmMD3339vUvf48eN55ZVX2LdvH5GRkfTr14/r16+b9bjZExmIw4YoPkHaa0+3TFKS3Fk/ZxWDPnjcilEJYT8+6TOLm1dTS1w+R59LxvU07b1qUPl1/PesmbkSnUPJr0+8ArwZ/ef4EpdfuXIlnp6e2vvevXvz888/Fyg3cuRI/vzzT/7v//4PZ2dnWrduzejRowHYsmULu3btIjExERcXFwA++OADVqxYwbJlyxgxYgRz5sxh+PDhDB8+HICpU6eydu3aO14Fnzt3jlatWtG2bVsAwsPDtXUBAQEAVKtWjeDgYG35xIkT+fDDD3nooYeAvCvl2NhYFi1axHPPPaeVGz16NIMGDQJgwYIFrFq1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bIPyzwt8e0csoxrNa9GkV3MAbiamsvObLRUSmxCVkeFGAvpjO4r8fTOnUaNG4ezszJo1a+jSpQu1atWid+/erF27losXL/LWW29pZcPDw3n33Xd57LHH8PLyonHjxnz66acm6wEGDhyoTUgDBZughw0bxoABA3jvvfcICgrC19eXKVOmkJOTw/jx4/H396dmzZosWrRI2+b2Juhhw4ahKEqBn40bN2qx5L/6dHBw4JtvvuGhhx7C3d2devXq8fvvv5sci99//5169erh6urKfffdx9dff42iKCQnJxd67FRVZdKkSdSqVQsXFxdCQ0N56aWXgLzHVs+ePcvLL7+sxWa0ZcsWOnXqhJubG2FhYbz00kukp6cXOM6PP/44NWrUICwsjPnz59/x/9EcJAHbIJ3Pv2NQF3UFDND91b7aSbbp02iy0jItHpsQlU3WtmUkv92Vmx8/SfLbXcna+rPF9pWUlMTq1asZOXIkbm5uJuuCg4MZMmQIP/74o8n4B7NmzaJFixbExMRos71FR0cDec2+AIsWLeLy5cva+8KsX7+eS5cusXnzZmbPns3EiRN54IEH8PPzY+fOnTz//PM899xzXLhwodDtP/74Yy5fvqz9jBkzhsDAQBo2bFjkPmfMmMEjjzzCwYMH6dOnD0OGDNGu8OPj43n44YcZMGAABw4c4LnnnjP546Mwv/zyCx999BELFy7kxIkTrFixQptd6ddff6VmzZpMmTJFixHg1KlT9OrVi0GDBnHw4EF+/PFHtmzZwujRo03qNh7nTZs28frrrzNmzBjtOFuKTQ/EUVWZXAEX0hPaKKhBCC0GtGH/8j2kJ6Wz5cuNdBvbqyJCFMImpbz/EIbUqyUur+bkcCst331X1UD6krdI/99HKDqHoje8jc47AJ83fi223IkTJ1BVtchpThs1asSNGze4evUqgYF5nTE7dOjAG2+8gcFgYMSIEcTExPDRRx/RvXt3AgICAPD19b3j5DGQNyjR3Llz0el0NGjQgJkzZ5KRkcH/+3//D8ib4e39999ny5YtDB48uMD2Pj4++PjkPSb566+/snDhQtauXXvH/T7++OM89thj6HQ63nvvPebOncuuXbvo1asXCxcupEGDBsyaNQuABg0acPjwYaZNm1ZkfefOnSM4OJioqCicnJyoVasWd999t/b5HBwc8PLyMolp+vTpDBky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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "plot_histories(histories, labels)" ] @@ -461,36 +706,50 @@ "id": "32341937-4178-41d2-a10e-5e4d2634098e", "metadata": {}, "source": [ - "The hyperoptimization can lead to a faster convergence of the algor" + "The hyperoptimization can lead to a faster convergence of the algorithm." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 88, "id": "82b89092-07e5-4788-9ae0-8907df2428eb", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "visualize_matrix(dbf_1.h.matrix)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 89, "id": "ac8ed320-04a8-42af-a980-48ab4f1fff7c", "metadata": {}, - "outputs": [], - "source": [ - "visualize_matrix(dbf_2.h.matrix)" + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "visualize_matrix(.h.matrix)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bd90001b-23a2-4fdf-b8d8-d53718d145bc", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -509,7 +768,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.10.0" } }, "nbformat": 4, From 416bf7b200a57e5acebbf3d25bd9f1f376e060bd Mon Sep 17 00:00:00 2001 From: simone bordoni Date: Mon, 20 Nov 2023 13:09:32 +0400 Subject: [PATCH 040/143] native gates class rename --- src/qibo/transpiler/abstract.py | 20 ++++++++----- src/qibo/transpiler/unroller.py | 52 ++++++++++++++------------------- 2 files changed, 35 insertions(+), 37 deletions(-) diff --git a/src/qibo/transpiler/abstract.py b/src/qibo/transpiler/abstract.py index d9daae15b0..4d5423c313 100644 --- a/src/qibo/transpiler/abstract.py +++ b/src/qibo/transpiler/abstract.py @@ -9,16 +9,16 @@ from qibo.models import Circuit -class NativeType(Flag): - """Define available types of native gates. +class NativeGates(Flag): + """Define native gates supported by the unroller. + A native gate set should contain at least one two-qubit gate (CZ or iSWAP) + and at least one single qubit gate (GPI2 or U3). Should have the same names with qibo gates. """ - M = auto() - Z = auto() - RZ = auto() GPI2 = auto() + U3 = auto() CZ = auto() iSWAP = auto() @@ -29,6 +29,12 @@ def from_gate(cls, gate: gates.Gate): except AttributeError: raise ValueError(f"Gate {gate} cannot be used as native.") + def single_qubit_natives(self): + return (self.GPI2, self.U3) + + def two_qubit_natives(self): + return (self.CZ, self.iSWAP) + class Placer(ABC): @abstractmethod @@ -72,7 +78,7 @@ class Optimizer(ABC): @abstractmethod def __call__(self, circuit: Circuit, *args) -> Circuit: - """Find initial qubit mapping + """Optimize transpiled circuit. Args: circuit (:class:`qibo.models.circuit.Circuit`): circuit to be optimized @@ -84,7 +90,7 @@ def __call__(self, circuit: Circuit, *args) -> Circuit: class Unroller(ABC): @abstractmethod - def __init__(self, native_gates: NativeType, *args): + def __init__(self, native_gates: NativeGates, *args): """An unroller decomposes gates into native gates.""" @abstractmethod diff --git a/src/qibo/transpiler/unroller.py b/src/qibo/transpiler/unroller.py index 7c7b5c6b97..83d6982cb1 100644 --- a/src/qibo/transpiler/unroller.py +++ b/src/qibo/transpiler/unroller.py @@ -1,22 +1,20 @@ from qibo import gates from qibo.config import raise_error from qibo.models import Circuit -from qibo.transpiler.abstract import NativeType, Unroller +from qibo.transpiler.abstract import NativeGates, Unroller from qibo.transpiler.decompositions import cz_dec, gpi2_dec, iswap_dec, opt_dec, u3_dec from qibo.transpiler.exceptions import DecompositionError # TODO: Make setting single-qubit native gates more flexible -class NativeGates(Unroller): +class DefaultUnroller(Unroller): """Translates a circuit to native gates. Args: circuit (:class:`qibo.models.circuit.Circuit`): circuit model to translate into native gates. single_qubit_natives (tuple): single qubit native gates. - two_qubit_natives (:class:`qibo.transpiler.abstract.NativeType`): two-qubit native gates - supported by the quantum hardware. - single_qubit_natives (tuple): single qubit native gates. + native_gates (:class:`qibo.transpiler.abstract.NativeGates`): native gates Returns: (:class:`qibo.models.circuit.Circuit`): equivalent circuit with native gates. @@ -24,12 +22,10 @@ class NativeGates(Unroller): def __init__( self, - two_qubit_natives: NativeType, - single_qubit_natives=(gates.I, gates.Z, gates.RZ, gates.GPI2), + native_gates: NativeGates, translate_single_qubit: bool = True, ): - self.two_qubit_natives = two_qubit_natives - self.single_qubit_natives = single_qubit_natives + self.native_gates = native_gates self.translate_single_qubit = translate_single_qubit def __call__(self, circuit: Circuit): @@ -40,8 +36,7 @@ def __call__(self, circuit: Circuit): two_qubit_translated_circuit.add( translate_gate( gate, - self.two_qubit_natives, - single_qubit_natives=self.single_qubit_natives, + self.native_gates, ) ) else: @@ -52,8 +47,7 @@ def __call__(self, circuit: Circuit): translated_circuit.add( translate_gate( gate, - self.two_qubit_natives, - single_qubit_natives=self.single_qubit_natives, + self.native_gates, ) ) else: @@ -66,7 +60,7 @@ def is_satisfied(self, circuit: Circuit): """Return True if a circuit is correctly decomposed into native gates, otherwise False.""" try: assert_decomposition( - circuit, self.two_qubit_natives, self.single_qubit_natives + circuit, self.native_gates, native_gates=self.native_gates ) except DecompositionError: return False @@ -75,14 +69,13 @@ def is_satisfied(self, circuit: Circuit): def assert_decomposition( circuit: Circuit, - two_qubit_natives: NativeType, - single_qubit_natives=(gates.I, gates.Z, gates.RZ, gates.GPI2), + native_gates: NativeGates, ): """Checks if a circuit has been correctly decomposed into native gates. Args: circuit (:class:`qibo.models.circuit.Circuit`): circuit model to check. - two_qubit_natives (:class:`qibo.transpiler.abstract.NativeType`): + native_gates (:class:`qibo.transpiler.abstract.NativeGates`): two-qubit native gates supported by the quantum hardware. single_qubit_natives (tuple): single qubit native gates. """ @@ -90,15 +83,15 @@ def assert_decomposition( if isinstance(gate, gates.M): continue if len(gate.qubits) == 1: - if not isinstance(gate, single_qubit_natives): + if not isinstance(gate, native_gates): raise_error( DecompositionError, f"{gate.name} is not a single qubit native gate.", ) elif len(gate.qubits) == 2: try: - native_type_gate = NativeType.from_gate(gate) - if not (native_type_gate in two_qubit_natives): + native_type_gate = NativeGates.from_gate(gate) + if not (native_type_gate in native_gates): raise_error( DecompositionError, f"{gate.name} is not a two qubits native gate.", @@ -115,14 +108,13 @@ def assert_decomposition( def translate_gate( gate, - two_qubit_natives: NativeType, - single_qubit_natives=(gates.I, gates.Z, gates.RZ, gates.GPI2), + native_gates: NativeGates, ): """Maps gates to a hardware-native implementation. Args: gate (:class:`qibo.gates.abstract.Gate`): gate to be decomposed. - two_qubit_natives (:class:`qibo.transpiler.abstract.NativeType`): + two_qubit_natives (:class:`qibo.transpiler.abstract.NativeGates`): two-qubit native gates supported by the quantum hardware. single_qubit_natives (tuple): single qubit native gates. @@ -132,9 +124,9 @@ def translate_gate( if isinstance(gate, (gates.M, gates.I, gates.Align)): return gate elif len(gate.qubits) == 1: - return _translate_single_qubit_gates(gate, single_qubit_natives) + return _translate_single_qubit_gates(gate, native_gates.single_qubit_natives()) else: - return _translate_two_qubit_gates(gate, two_qubit_natives) + return _translate_two_qubit_gates(gate, native_gates.two_qubit_natives()) def _translate_single_qubit_gates(gate: gates.Gate, single_qubit_natives): @@ -164,13 +156,13 @@ def _translate_two_qubit_gates(gate: gates.Gate, two_qubit_natives): Args: gate (:class:`qibo.gates.abstract.Gate`): gate to be decomposed. - two_qubit_natives (:class:`qibo.transpiler.abstract.NativeType`): + native_gates (:class:`qibo.transpiler.abstract.NativeGates`): two-qubit native gates supported by the quantum hardware. Returns: (list): List of native gates that decompose the input gate. """ - if two_qubit_natives is NativeType.CZ | NativeType.iSWAP: + if two_qubit_natives is NativeGates.CZ | NativeGates.iSWAP: # Check for a special optimized decomposition. if gate.__class__ in opt_dec.decompositions: return opt_dec(gate) @@ -189,9 +181,9 @@ def _translate_two_qubit_gates(gate: gates.Gate, two_qubit_natives): return cz_dec(gate) else: # pragma: no cover return iswap_dec(gate) - elif two_qubit_natives is NativeType.CZ: + elif two_qubit_natives is NativeGates.CZ: return cz_dec(gate) - elif two_qubit_natives is NativeType.iSWAP: + elif two_qubit_natives is NativeGates.iSWAP: if gate.__class__ in iswap_dec.decompositions: return iswap_dec(gate) else: @@ -201,7 +193,7 @@ def _translate_two_qubit_gates(gate: gates.Gate, two_qubit_natives): iswap_decomposed = [] for g in cz_decomposed: # Need recursive function as gates.Unitary is not in iswap_dec - for g_translated in translate_gate(g, NativeType.iSWAP): + for g_translated in translate_gate(g, NativeGates.iSWAP): iswap_decomposed.append(g_translated) return iswap_decomposed else: # pragma: no cover From e7bdf5001598b61dbdaacb870b8bb4e1d24f1be4 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Mon, 20 Nov 2023 16:53:42 +0100 Subject: [PATCH 041/143] remove hyperopt dependence and added try except --- src/qibo/models/double_bracket.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/qibo/models/double_bracket.py b/src/qibo/models/double_bracket.py index 31f3803bd3..f29a1f427f 100644 --- a/src/qibo/models/double_bracket.py +++ b/src/qibo/models/double_bracket.py @@ -2,7 +2,6 @@ from enum import Enum, auto from functools import partial -import hyperopt import numpy as np from qibo.backends.numpy import NumpyBackend @@ -120,8 +119,8 @@ def hyperopt_step( step_min: float = 1e-5, step_max: float = 1, max_evals: int = 1000, - space: callable = hyperopt.hp.uniform, - optimizer: callable = hyperopt.tpe, + space: callable = None, + optimizer: callable = None, look_ahead: int = 1, verbose: bool = False, ): @@ -140,6 +139,17 @@ def hyperopt_step( Returns: (float): optimized best flow step. """ + try: + import hyperopt + except: + raise_error( + ImportError, "hyperopt_step function requires hyperopt to be installed." + ) + + if space is None: + space = hyperopt.hp.uniform + if optimizer is None: + optimizer = hyperopt.tpe space = space("step", step_min, step_max) best = hyperopt.fmin( From b548d4be00ad0b682cfca74919cdec67d65554e9 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Tue, 21 Nov 2023 09:54:03 +0100 Subject: [PATCH 042/143] add hyperopt installation --- examples/dbf/dbf.ipynb | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/examples/dbf/dbf.ipynb b/examples/dbf/dbf.ipynb index a34daf3e8c..3cec183f92 100644 --- a/examples/dbf/dbf.ipynb +++ b/examples/dbf/dbf.ipynb @@ -16,13 +16,16 @@ }, { "cell_type": "code", - "execution_count": 90, - "id": "c12a5b8c-328f-4127-b91d-2df776f05908", + "execution_count": null, + "id": "5bf7f589-dee5-4ce5-96c2-ee81ea6222e5", "metadata": {}, "outputs": [], "source": [ - "# install extra dependence\n", - "!pip install seaborn" + "# install extra dependences\n", + "# seaborn is a plotting library\n", + "!pip install seaborn \n", + "# hyperopt is required to optimize the DBF step\n", + "!pip install hyperopt" ] }, { From 05f4dcea7121edce38c4ad653287475c7e2fb817 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Tue, 21 Nov 2023 12:53:58 +0100 Subject: [PATCH 043/143] fix dbf symbolic link --- doc/source/code-examples/tutorials/dbf/dbf.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/code-examples/tutorials/dbf/dbf.ipynb b/doc/source/code-examples/tutorials/dbf/dbf.ipynb index 1a4dac7946..d61f4300d3 120000 --- a/doc/source/code-examples/tutorials/dbf/dbf.ipynb +++ b/doc/source/code-examples/tutorials/dbf/dbf.ipynb @@ -1 +1 @@ -/home/matteo/Documents/PhD/qibo/examples/dbf/dbf.ipynb \ No newline at end of file +../../../../../examples/dbf/dbf.ipynb \ No newline at end of file From 6aa8d73e6677542349439e7ec870199eea28ceaa Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Tue, 21 Nov 2023 13:00:18 +0100 Subject: [PATCH 044/143] from dbf to dbi notation --- .../code-examples/tutorials/dbf/dbf.ipynb | 1 - examples/dbf/dbf.ipynb | 779 ------------------ src/qibo/models/double_bracket.py | 193 ----- tests/test_models_dbf.py | 106 --- 4 files changed, 1079 deletions(-) delete mode 120000 doc/source/code-examples/tutorials/dbf/dbf.ipynb delete mode 100644 examples/dbf/dbf.ipynb delete mode 100644 src/qibo/models/double_bracket.py delete mode 100644 tests/test_models_dbf.py diff --git a/doc/source/code-examples/tutorials/dbf/dbf.ipynb b/doc/source/code-examples/tutorials/dbf/dbf.ipynb deleted file mode 120000 index d61f4300d3..0000000000 --- a/doc/source/code-examples/tutorials/dbf/dbf.ipynb +++ /dev/null @@ -1 +0,0 @@ -../../../../../examples/dbf/dbf.ipynb \ No newline at end of file diff --git a/examples/dbf/dbf.ipynb b/examples/dbf/dbf.ipynb deleted file mode 100644 index 3cec183f92..0000000000 --- a/examples/dbf/dbf.ipynb +++ /dev/null @@ -1,779 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "cb748c1a-2ecd-44a2-91d8-c1255a00615b", - "metadata": {}, - "source": [ - "## Double-Bracket Flow diagonalization algorithm\n", - "\n", - "In this example we present the `Qibo`'s implementation of the Double-Bracket Flow (DBF) algorithm, which can be used to prepare the eigenstates of a quantum system. \n", - "\n", - "#### The initial setup\n", - "\n", - "At first we import some useful packages." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5bf7f589-dee5-4ce5-96c2-ee81ea6222e5", - "metadata": {}, - "outputs": [], - "source": [ - "# install extra dependences\n", - "# seaborn is a plotting library\n", - "!pip install seaborn \n", - "# hyperopt is required to optimize the DBF step\n", - "!pip install hyperopt" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "id": "f270b1ea-ee6a-4eac-a0ff-3d7dae296cf0", - "metadata": {}, - "outputs": [], - "source": [ - "from copy import deepcopy\n", - "\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "import seaborn as sns\n", - "\n", - "from hyperopt import hp, tpe\n", - "\n", - "from qibo import hamiltonians, set_backend\n", - "from qibo.models.double_bracket import FlowGeneratorType, DoubleBracketFlow" - ] - }, - { - "cell_type": "markdown", - "id": "ba6e5402-ea34-4979-bb79-fd395567f77d", - "metadata": {}, - "source": [ - "Here we define a simple plotting function useful to keep track of the diagonalization process." - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "id": "4aec7b46-19b9-4004-93c0-a90255e58fd9", - "metadata": {}, - "outputs": [], - "source": [ - "def visualize_matrix(matrix, title=\"\"):\n", - " \"\"\"Visualize hamiltonian in a heatmap form.\"\"\"\n", - " fig, ax = plt.subplots(figsize=(5,5))\n", - " ax.set_title(title)\n", - " try:\n", - " im = ax.imshow(np.absolute(matrix), cmap=\"inferno\")\n", - " except TypeError:\n", - " im = ax.imshow(np.absolute(matrix.get()), cmap=\"inferno\")\n", - " fig.colorbar(im, ax=ax)\n", - "\n", - "def visualize_drift(h0, h):\n", - " \"\"\"Visualize drift of the evolved hamiltonian w.r.t. h0.\"\"\"\n", - " fig, ax = plt.subplots(figsize=(5,5))\n", - " ax.set_title(r\"Drift: $|\\hat{H}_0 - \\hat{H}_{\\ell}|$\")\n", - " try:\n", - " im = ax.imshow(np.absolute(h0 - h), cmap=\"inferno\")\n", - " except TypeError:\n", - " im = ax.imshow(np.absolute((h0 - h).get()), cmap=\"inferno\")\n", - "\n", - " fig.colorbar(im, ax=ax)\n", - "\n", - "def plot_histories(histories, labels):\n", - " \"\"\"Plot off-diagonal norm histories over a sequential evolution.\"\"\"\n", - " colors = sns.color_palette(\"inferno\", n_colors=len(histories)).as_hex()\n", - " plt.figure(figsize=(5,5*6/8))\n", - " for i, (h, l) in enumerate(zip(histories, labels)):\n", - " plt.plot(h, lw=2, color=colors[i], label=l, marker='.')\n", - " plt.legend()\n", - " plt.xlabel(\"Iterations\")\n", - " plt.ylabel(r\"$\\| \\sigma(\\hat{H}) \\|^2$\")\n", - " plt.title(\"Loss function histories\")\n", - " plt.grid(True)\n", - " plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "9f4cd7cc-9952-4da4-baef-e916300a9365", - "metadata": {}, - "source": [ - "We need to define a target hamiltonian which we aim to diagonalize. As an example, we consider the Transverse Field Ising Model (TFIM):\n", - "$$ H_{\\rm TFIM} = - \\sum_{q=0}^{N}\\bigl( Z_i Z_{i+1} + h X_i \\bigr),$$\n", - "which is already implemented in `Qibo`. For this tutorial we set $N=6$ and $h=3$." - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "id": "2c4ed408-68ed-4054-825c-2a7df0979a4f", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Qibo 0.2.2|INFO|2023-11-17 16:55:09]: Using qibojit (numba) backend on /CPU:0\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# set the qibo backend (we suggest qibojit if N >= 20)\n", - "set_backend(\"qibojit\", \"numba\")\n", - "\n", - "# hamiltonian parameters\n", - "nqubits = 5\n", - "h = 3\n", - "\n", - "# define the hamiltonian\n", - "h = hamiltonians.TFIM(nqubits=nqubits, h=h)\n", - "\n", - "# vosualize the matrix\n", - "visualize_matrix(h.matrix, title=\"Target hamiltonian\")" - ] - }, - { - "cell_type": "markdown", - "id": "4794e779-bf2d-4ab5-97ce-f876d9522a35", - "metadata": {}, - "source": [ - "#### The generator of the evolution\n", - "\n", - "The model is implemented following the procedure presented in [1], and the first practical step is to define the generator of the flow $\\hat{\\mathcal{U}}_{\\ell}$, which executes one diagonalization step $$\\hat{H}_{\\ell} = \\hat{\\mathcal{U}}_{\\ell}^{\\dagger} \\hat{H} \\hat{\\mathcal{U}}_{\\ell}.$$\n", - "In `Qibo`, we define the flow type through a `FlowGeneratorType` object, which can be chosen between one of the following:\n", - "- `canonical`: the generator of the flow at step $k+1$ is defined using the commutator between the off diagonal part $\\sigma(\\hat{H_k})$ and the diagonal part $\\Delta(\\hat{H}_k)$ of the target evolved hamiltonian:\n", - " $$\\hat{\\mathcal{U}}_{k+1}=\\exp\\bigl\\{s[\\Delta(\\hat{H}_k), \\sigma(\\hat{H}_k)]\\bigr\\}.$$ \n", - "- `single_commutator`: the evolution follows a similar procedure of the previous point in this list, but any additional matrix $D_k$ can be used to control the evolution at each step:\n", - " $$ \\hat{\\mathcal{U}}_{k+1}=\\exp\\bigl\\{s[D_k, \\hat{H}_k]\\bigr\\}. $$\n", - "- `group_commutator`: the following group commutator is used to compute the evolution:\n", - " $$ \\hat{\\mathcal{U}}_{k+1}= e^{is\\hat{H_k}} e^{isD_k} e^{-is\\hat{H_k}} e^{-isD_k}, $$\n", - "which approximates the canonical commutator for small $s$.\n", - "\n", - "In order to set one of this evolution generators one can do as follow:" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "id": "26a487e9-366b-4203-b660-e3d4af2bcb68", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "FlowGeneratorType.canonical\n", - "FlowGeneratorType.single_commutator\n", - "FlowGeneratorType.group_commutator\n" - ] - } - ], - "source": [ - "# we have a look inside the FlowGeneratorType class\n", - "for generator in FlowGeneratorType:\n", - " print(generator)" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "id": "da8dce89-27f6-403d-982a-58d531fade48", - "metadata": {}, - "outputs": [], - "source": [ - "# here we set the canonical generator\n", - "flowtype = FlowGeneratorType.canonical" - ] - }, - { - "cell_type": "markdown", - "id": "fc4f9f75-0548-4533-a13c-3aba3191e608", - "metadata": {}, - "source": [ - "#### The `DoubleBracketFlow` class\n", - "\n", - "A `DoubleBracketFlow` object can be initialize by calling the `qibo.models.double_braket.DoubleBracketFlow` model and passing the target hamiltonian and the generator type we want to use to perform the evolutionary steps." - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "id": "055870ec-55f2-4b99-a622-e3aa4c7dd0e9", - "metadata": {}, - "outputs": [], - "source": [ - "dbf = DoubleBracketFlow(hamiltonian=deepcopy(h), mode=flowtype)" - ] - }, - { - "cell_type": "markdown", - "id": "b38cf803-60b4-467a-be8e-cbad5d81f14a", - "metadata": {}, - "source": [ - "#### `DoubleBracketFlow` features" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "id": "9e278c3d-9f34-4a40-b453-4e030c751ef5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Backend: qibojit (numba)\n" - ] - } - ], - "source": [ - "# on which qibo backend am I running the algorithm?\n", - "print(f\"Backend: {dbf.backend}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "id": "5b8e142b-a0a2-41bd-a16a-265a420b7360", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Initial form of the target hamiltonian:\n", - "[[-5.-0.j -3.-0.j -3.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", - " [-3.-0.j -1.-0.j -0.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", - " [-3.-0.j -0.-0.j -1.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", - " ...\n", - " [-0.-0.j -0.-0.j -0.-0.j ... -1.-0.j -0.-0.j -3.-0.j]\n", - " [-0.-0.j -0.-0.j -0.-0.j ... -0.-0.j -1.-0.j -3.-0.j]\n", - " [-0.-0.j -0.-0.j -0.-0.j ... -3.-0.j -3.-0.j -5.-0.j]]\n" - ] - } - ], - "source": [ - "# the initial target hamiltonian is a qibo hamiltonian\n", - "# thus the matrix can be accessed typing h.matrix\n", - "print(f\"Initial form of the target hamiltonian:\\n{dbf.h0.matrix}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "id": "4f9d1d41-3df7-49cf-96ca-fa1019c00c33", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# let's visualize it in a more graphical way\n", - "visualize_matrix(dbf.h0.matrix, r\"$H_0$\")" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "id": "7b864712-219c-44b6-8337-19ef0100e318", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# since we didn't perform yet any evolutionary step they are the same\n", - "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" - ] - }, - { - "cell_type": "markdown", - "id": "5e576bc4-4e79-4c71-9ea0-b3012e9f2ba1", - "metadata": {}, - "source": [ - "which shows $\\hat{H}$ is now identical to $\\hat{H}_0$ since no evolution step has been performed yet." - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "id": "da3d3aaa-17e1-492e-bcd3-b510f44a5391", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZ4AAAGiCAYAAADXxKDZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAn2klEQVR4nO3df3BV9Z3/8dclkBuU5GL4kR9LgiAKVUycppJmtBQkBbI7DFT+QOtMo0t1cANTzLrV7LSCbjth7YxiWxo7WxfsTBGLU3B0RliNJIy7RCWaQdrdDGHTEhcSKt8hgWgumPP5/hG49kpIzs05OTef5PlgPjPck3M/531zHd5+3p/P+ZyQMcYIAICAjEt2AACAsYXEAwAIFIkHABAoEg8AIFAkHgBAoEg8AIBAkXgAAIEi8QAAAkXiAQAEisQDAAgUiQcA4NrmzZsVCoXi2rx58xLqY/wwxQYAGKVuueUWvfXWW7HX48cnlkpIPACAhIwfP17Z2dlDf7+PsQAAAtLT06MLFy740pcxRqFQKO5YOBxWOBzu9/xjx44pNzdXaWlpKikpUXV1tfLz811fL8RjEQDALj09PZo1K1vt7Z2+9Ddp0iSdP38+7timTZu0efPmK8594403dP78ec2dO1enTp3Sk08+qf/7v//T0aNHlZ6e7up6JB4AsExXV5cikYj+98/PKiNjose+PtPsmY+ora1NGRkZseMDjXj+2tmzZzVz5kw988wzWrt2ratrUmoDAEtlZEz0nHi+6CsjLvG4NXnyZN10001qaWlx/R6WUwOApYz53Jfmxfnz53X8+HHl5OS4fg+JBwAsZUyvLy0Rjz76qOrr6/WnP/1J//Vf/6Vvf/vbSklJ0b333uu6D0ptAADXPv74Y9177706c+aMpk2bpjvvvFMNDQ2aNm2a6z5IPABgKcd8LsdjqSzR9+/atcvT9SQSDwBYy485Gq/vHwrmeAAAgWLEAwCW6lsc4HXEk9jiAj+QeADAUsb5XMbxmHg8vn8oKLUBAALFiAcAbGU+72te+wgYiQcALMWqNgAAXGDEAwC2cj6XnIve+wgYiQcALNVXakvx3EfQKLUBAALFiAcAbOV8LjneRjyU2gAA7lmaeCi1AQACxYgHAKzV68MNoOzVBgBwKeR8rpDjrXAVotQGABjtGPEAgK2czyWPIx5WtQEA3LM08VBqAwAEihEPAFgqZD5XyHhcXMBjEQAArjmO5HhcDu04/sSSAEptAIBAMeIBAEv13ccT8txH0Eg8AGArp9eHVW3B71xAqQ0AEChGPABgK+dzyWOpjRtIAQCuhZxeH/Zqo9QGABjlRtyIx3EcnTx5Uunp6QqFPA4hAWAEMMbo3Llzys3N1bhxPv7/vvFhcYHhsQg6efKk8vLykh0GAPiura1NM2bM8K2/kON4LpWFknAD6bAlnm3btumnP/2p2tvbVVhYqJ///OdasGDBoO9LT0+XJP3pxHPKyJg44LmZk9f5EisADC8jycT+fRvrhiXxvPzyy6qsrNTzzz+v4uJibd26VcuWLVNzc7OmT58+4Hsvl9cyMiYqI+OaQa5EKQ6ALYz/0wdOrw+r2kbJ4oJnnnlGDz74oB544AHdfPPNev7553XNNdfo3//934fjcgAwJvWtavPeguZ74rlw4YIaGxtVWlr6xUXGjVNpaakOHTp0xfnRaFRdXV1xDQAwevmeeD755BP19vYqKysr7nhWVpba29uvOL+6ulqRSCTWWFgAAC45vf60gCX9Pp6qqip1dnbGWltbW7JDAgAr2Fpq831xwdSpU5WSkqKOjo644x0dHcrOzr7i/HA4rHA47HcYAIARyvcRT2pqqoqKilRbWxs75jiOamtrVVJS4vflAGDssrTUNizLqSsrK1VeXq6vfe1rWrBggbZu3aru7m498MADw3E5ABiTQo7xfANoyDE+RePesCSeNWvW6C9/+YueeOIJtbe367bbbtO+ffuuWHAwkL6bQwden7544vcG7efAZ792fU0AwPAbtp0L1q9fr/Xr1w9X9wAAp1fyuuPNaCm1AQACYHxIPEnYJDTpy6kBAGMLIx4AsFTIOAoZb3u1hcwo2p0aADDMLJ3jodQGAAgUIx4AsJXj+PBYBEptAAC3SDzBc3NzqJubTN32BQDwzurEAwBjWchxFPI4YPG65c5QkHgAwFaO48OqtuATD6vaAACBYsQDALaydMRD4gEAW1maeCi1AQACxYgHAGxleiWvD3JjrzYAgFu2Lqem1AYACNSoH/G43ZGAHQ4AWMfSxQWjPvEAwKhlaeKh1AYACBQjHgCwlWO8j1i8roobAhIPANjKMT6U2oJPPJTaAACBYsQDALby5UFwjHgAAG45jj9tiLZs2aJQKKSNGzcm9D4SDwAgYe+//75+9atfqaCgIOH3kngAwFaO8acl6Pz587rvvvv0b//2b7ruuusSfj9zPJewwwEA6xhHMh7neExf4unq6oo7HA6HFQ6H+31LRUWF/u7v/k6lpaX68Y9/nPAlGfEAAJSXl6dIJBJr1dXV/Z63a9cuffDBB1f9uRuMeADAVsaH+3gujXja2tqUkZERO9zfaKetrU3f//739eabbyotLW3IlyTxAICtfLyBNCMjIy7x9KexsVGnT5/WV7/61dix3t5eHTx4UL/4xS8UjUaVkpIy6CVJPAAAV5YsWaKPPvoo7tgDDzygefPm6bHHHnOVdCQSDwDYK+Atc9LT0zV//vy4Y9dee62mTJlyxfGBkHgAwFLG8f7k6iQ8+ZrEAwAYurq6uoTfQ+IBAFtZujs1iSdBbm8MbVm1YNBz5ux9z2s4AMYyRz4kHj8CSQw3kAIAAuV74tm8ebNCoVBcmzdvnt+XAQA4PrWADUup7ZZbbtFbb731xUXGU9EDAN+ZS81rHwEblowwfvx4ZWdnuzo3Go0qGo3GXn95ozoAwOgyLHM8x44dU25urmbPnq377rtPJ06cuOq51dXVcRvT5eXlDUdIADDqGCfkSwua74mnuLhYO3bs0L59+1RTU6PW1lZ94xvf0Llz5/o9v6qqSp2dnbHW1tbmd0gAMDoxx9OnrKws9veCggIVFxdr5syZ+t3vfqe1a9decf5Az3wAAIw+wz7rP3nyZN10001qaWkZ7ksBwNhiQpLXUlkSFhcM+30858+f1/Hjx5WTkzPclwKAMcXWOR7fRzyPPvqoVqxYoZkzZ+rkyZPatGmTUlJSdO+99/p9qRHNza4EPEYbwFjke+L5+OOPde+99+rMmTOaNm2a7rzzTjU0NGjatGl+XwoAxjbHh1LbaFhcsGvXLr+7BAD0x4T6mqc+/AklEezVBgAIFHvZAICl/FgcwIPgAADuOeN8mOMJvtZGqQ0AEChGPABgK1a1AQCCZExIxuOqNsOqNgDAaMeIJ4nc7kjADgcA+mXp4gISDwBYyjjyYTk1q9oAAKMcIx4AsJUvj0UYBbtTAwCC4c+qtlHw6GsAAAbCiAcAbOWM62ue+vAnlESQeADAUv5sEkqpDQAwyjHisYCfN5pykykweti6uIDEAwC2snSOh1IbACBQjHgAwFK2Li4g8QCApWyd46HUBgAIFCMeALCVpYsLSDwAYClb53gotQEAAsWIBwAsZeviAhLPKOJmV4KWVQtc9TVn73tewwEw3IwPczzBP4CUUhsAIFiMeADAUrYuLiDxAICljPE+R2MotQEARjtGPABgKx9KbaLUBgBwy5hxMsZb4cokodZGqQ0AEChGPABgKyfkvVRGqQ0A4BY7F8AKbnckYIcDAMMl4TmegwcPasWKFcrNzVUoFNLevXvjfm6M0RNPPKGcnBxNnDhRpaWlOnbsmF/xAgAuuXwDqdcWtIQTT3d3twoLC7Vt27Z+f/7000/rZz/7mZ5//nm9++67uvbaa7Vs2TL19PR4DhYA8IXLq9q8tqAlXGorKytTWVlZvz8zxmjr1q364Q9/qJUrV0qSfvOb3ygrK0t79+7VPffc4y1aAID1fE11ra2tam9vV2lpaexYJBJRcXGxDh061O97otGourq64hoAYHBjptQ2kPb2dklSVlZW3PGsrKzYz76surpakUgk1vLy8vwMCQBGrcur2ry2oCX9BtKqqip1dnbGWltbW7JDAgAMI1+XU2dnZ0uSOjo6lJOTEzve0dGh2267rd/3hMNhhcNhP8MAgDHB1vt4fB3xzJo1S9nZ2aqtrY0d6+rq0rvvvquSkhI/LwUAY54xPszx2HAD6fnz59XS0hJ73draqqamJmVmZio/P18bN27Uj3/8Y914442aNWuWfvSjHyk3N1erVq3yM24AgKUSTjyHDx/W4sWLY68rKyslSeXl5dqxY4d+8IMfqLu7Ww899JDOnj2rO++8U/v27VNaWpp/UWPYscMBMPLZujt1woln0aJFAwYaCoX01FNP6amnnvIUGABgYLY++jrpq9oAAGMLm4QCgKVsXdVG4gEAS9maeCi1AQACReIBAEsZx4/92hK7Zk1NjQoKCpSRkaGMjAyVlJTojTfeSKgPSm0AYKlklNpmzJihLVu26MYbb5QxRi+++KJWrlypDz/8ULfccourPkg8AADXVqxYEff6Jz/5iWpqatTQ0EDiQTDc3hi6eOL3Bj3nwGe/9hoOMKb4cwNp3/u//EgaN/to9vb2avfu3eru7k5oWzTmeADAUo4J+dIkKS8vL+4RNdXV1Ve97kcffaRJkyYpHA5r3bp12rNnj26++WbXcTPiAQCora1NGRkZsdcDjXbmzp2rpqYmdXZ26pVXXlF5ebnq6+tdJx8SDwDYyo8niF56/+VVam6kpqZqzpw5kqSioiK9//77eu655/SrX/3K1ftJPABgqZFyA6njOIpGo67PJ/EAAFyrqqpSWVmZ8vPzde7cOe3cuVN1dXXav3+/6z5IPABgqWSMeE6fPq3vfve7OnXqlCKRiAoKCrR//35961vfct0HiQcALJWMxPPCCy94up7EcmoAQMAY8QCApRwzTo7HG0i9vn8oSDwIhJtdCXiMNpAYY3x4AimPRQAAjHaMeADAUiPlPp5EkXgAwFK2Jh5KbQCAQDHiAQBL/fXu0l76CBqJBwAsRakNAAAXGPEAgKVsHfGQeADAUszxAB653ZFg8cTvuTrPzW4JAIJH4gEASxnjvVRmjE/BJIDEAwCWsnWOh1VtAIBAMeIBAEsZHxYXsKoNAOAapTYAAFxgxAMAlrJ1xEPiAQBLcQMpEBC3N4a6udGUm0yB4JF4AMBStpbaEl5ccPDgQa1YsUK5ubkKhULau3dv3M/vv/9+hUKhuLZ8+XK/4gUAXHK51Oa1BS3hxNPd3a3CwkJt27btqucsX75cp06dirWXXnrJU5AAgNEj4VJbWVmZysrKBjwnHA4rOzvbVX/RaFTRaDT2uqurK9GQAGBMMgrJyGOpzeP7h2JY7uOpq6vT9OnTNXfuXD388MM6c+bMVc+trq5WJBKJtby8vOEICQBGnctzPF5b0HxPPMuXL9dvfvMb1dbW6l//9V9VX1+vsrIy9fb29nt+VVWVOjs7Y62trc3vkAAAI4jvq9ruueee2N9vvfVWFRQU6IYbblBdXZ2WLFlyxfnhcFjhcNjvMABg1LP1Pp5h3zJn9uzZmjp1qlpaWob7UgAwplBqu4qPP/5YZ86cUU5OznBfCgBggYRLbefPn48bvbS2tqqpqUmZmZnKzMzUk08+qdWrVys7O1vHjx/XD37wA82ZM0fLli3zNXBgMG52JeAx2rCZIx9KbUlY1ZZw4jl8+LAWL14ce11ZWSlJKi8vV01NjY4cOaIXX3xRZ8+eVW5urpYuXap/+Zd/YR4HACBpCIln0aJFMgM8pHv//v2eAgIAuGPrljns1QYAlnIU8lwqS0apjQfBAQACxYgHAGzlx3JoSm0AALe4gRQAABcY8QCApVjVBgAIlHOpee0jaCQejGludyRghwPAPyQeALAUpTYAQKAc431VmnP1jWiGDavaAACBYsQDAJYyCsl43PLG6/uHgsQDAJbiBlIAAFxgxAMAlupbXOC9j6CReADAUszxAKOY2xtDW1YtcHXenL3veQkHsBqJBwAsZeviAhIPAFjKmL7mtY+gsaoNABAoRjwAYCmjkBwWFwAAgmLrJqGU2gAAgWLEAwCWYlUbACBQ5lLz2kfQKLUBAALFiAfwkdsdCdw8SpvHaGMwlNoAAIFyLjWvfQSNUhsAIFCMeADAUrbex0PiAQBL2TrHQ6kNABAoEg8AWMr41BJRXV2t22+/Xenp6Zo+fbpWrVql5ubmhPog8QCApS6X2ry2RNTX16uiokINDQ168803dfHiRS1dulTd3d2u+2COBwDg2r59++Je79ixQ9OnT1djY6MWLlzoqg8SDwBYys/7eLq6uuKOh8NhhcPhQd/f2dkpScrMzHR9TRIPkARudiVoWbXAVV9ud0vA6OPncuq8vLy445s2bdLmzZsHfK/jONq4caPuuOMOzZ8/3/U1E5rjcTOp1NPTo4qKCk2ZMkWTJk3S6tWr1dHRkchlAAABa2trU2dnZ6xVVVUN+p6KigodPXpUu3btSuhaCSUeN5NKjzzyiF577TXt3r1b9fX1OnnypO6+++6EggIADM7oi3LbUNvlVW0ZGRlxbbAy2/r16/X666/rwIEDmjFjRkJxJ1RqG2xSqbOzUy+88IJ27typu+66S5K0fft2feUrX1FDQ4O+/vWvJxQcAODqjHwotSX46GtjjDZs2KA9e/aorq5Os2bNSvianuZ4vjyp1NjYqIsXL6q0tDR2zrx585Sfn69Dhw71m3ii0aii0Wjs9ZcnuAAAI0dFRYV27typV199Venp6Wpvb5ckRSIRTZw40VUfQ76Pp79Jpfb2dqWmpmry5Mlx52ZlZcWC+7Lq6mpFIpFY+/IEFwCgf47xpyWipqZGnZ2dWrRokXJycmLt5Zdfdt3HkEc8lyeV3nnnnaF2IUmqqqpSZWVl7HVXVxfJBwBcSMYTSI3x/szSISWey5NKBw8ejJtUys7O1oULF3T27Nm4UU9HR4eys7P77cvtWnEAwOiQUKnNGKP169drz549evvtt6+YVCoqKtKECRNUW1sbO9bc3KwTJ06opKTEn4gBAJKSs2WOHxIa8Qw2qRSJRLR27VpVVlYqMzNTGRkZ2rBhg0pKSljRBiTI7Y2h3Gg6dtn6BNKEEk9NTY0kadGiRXHHt2/frvvvv1+S9Oyzz2rcuHFavXq1otGoli1bpl/+8pe+BAsAsF9CicfNpFJaWpq2bdumbdu2DTkoAMDgeAIpACBQtpbaeB4PACBQjHgAwFLG9DWvfQSNxAMAlnIUkpPgXmv99RE0Sm0AgEAx4gEASw1lr7X++ggaiQcAbOXDHI/nzd6GgMQDWI4dDmAbEg8AWMrWxQUkHgCwlK3LqVnVBgAIFCMeALCUrVvmkHgAwFK2Lqem1AYACBQjHgCwlJH323CSMOAh8QCArfpKbR6XU1NqAwCMdox4gDHC7Y4Eiyd+b9BzDnz2a6/hwAe23sdD4gEAS9m6nJpSGwAgUIx4AMBSlNoAAIGi1AYAgAuMeADAUsaHLXMotQEAXLN15wJKbQCAQDHiARDHzc2hbm4yddsXhs7W3alJPABgKVuXU1NqAwAEihEPAFjK1vt4SDwAYClb53gotQEAAsWIBwAsZet9PCQeALAUpTYAAFxgxAMAlrL1Ph4SD4CEud2RgB0Ohpety6kptQEAApVQ4qmurtbtt9+u9PR0TZ8+XatWrVJzc3PcOYsWLVIoFIpr69at8zVoAMClEY/x2JIQd0KJp76+XhUVFWpoaNCbb76pixcvaunSperu7o4778EHH9SpU6di7emnn/Y1aADAF8upvbagJTTHs2/fvrjXO3bs0PTp09XY2KiFCxfGjl9zzTXKzs521Wc0GlU0Go297urqSiQkAIBlPM3xdHZ2SpIyMzPjjv/2t7/V1KlTNX/+fFVVVenTTz+9ah/V1dWKRCKxlpeX5yUkABgzzFDLa3/VrFrV5jiONm7cqDvuuEPz58+PHf/Od76jmTNnKjc3V0eOHNFjjz2m5uZm/f73v++3n6qqKlVWVsZed3V1kXwAwAVjfNi5wKbEU1FRoaNHj+qdd96JO/7QQw/F/n7rrbcqJydHS5Ys0fHjx3XDDTdc0U84HFY4HB5qGAAAywyp1LZ+/Xq9/vrrOnDggGbMmDHgucXFxZKklpaWoVwKAHAVjk8taAmNeIwx2rBhg/bs2aO6ujrNmjVr0Pc0NTVJknJycoYUIACgf33Lob3Vykb8o68rKiq0c+dOvfrqq0pPT1d7e7skKRKJaOLEiTp+/Lh27typv/3bv9WUKVN05MgRPfLII1q4cKEKCgqG5QMAGLnc7kjQsmrBoOfM2fue13AwQiSUeGpqaiT13ST617Zv3677779fqampeuutt7R161Z1d3crLy9Pq1ev1g9/+EPfAgYA9BkTj0Uwgyx/yMvLU319vaeAAADu+LHzAI9FAACMeuxODQCWMpf+eO0jaCQeALAUpTYAAFxgxAMAlrL1QXAkHgCwlDE+zPEkYbM2Sm0AgEAx4gGQdG52JVg88Xuu+nK7W8JoQKkNABAoSm0AALjAiAcALGXkvVQ24vdqAwCMHI4xPjwWgVIbAGAEO3jwoFasWKHc3FyFQiHt3bs34T5IPABgKePTn0R0d3ersLBQ27ZtG3LclNoAwFLJWE5dVlamsrIyT9ck8QAA1NXVFfc6HA4rHA4Py7VIPACs4PbG0LF0o6kjHxYXXHp/Xl5e3PFNmzZp8+bNnvq+GhIPAFjKz1VtbW1tysjIiB0frtGOROIBAEjKyMiISzzDicQDAJbiCaQAgED5Ocfj1vnz59XS0hJ73draqqamJmVmZio/P99VHyQeAIBrhw8f1uLFi2OvKysrJUnl5eXasWOHqz5IPABgqWSMeBYtWuR5R2sSDwBYytY5HrbMAQAEihEPAFjK+FBqY1UbAHg0lnY4cEKOQiFvu7U5SXj4NaU2AECgGPEAgKUcGYUCXtXmBxIPAFjKXFpQ7bWPoFFqAwAEihEPAFjKkXwotQWPxAMAlmJVGwAALjDiAQBLOXIU8jhiScaIh8QDAJYi8QCARfzc4WAk724wEiU0x1NTU6OCgoLYI1JLSkr0xhtvxH7e09OjiooKTZkyRZMmTdLq1avV0dHhe9AAgC/u4/HagpZQ4pkxY4a2bNmixsZGHT58WHfddZdWrlypP/zhD5KkRx55RK+99pp2796t+vp6nTx5UnffffewBA4AY50TcnxpQUuo1LZixYq41z/5yU9UU1OjhoYGzZgxQy+88IJ27typu+66S5K0fft2feUrX1FDQ4O+/vWv99tnNBpVNBqNve7q6kr0MwAALDLk5dS9vb3atWuXuru7VVJSosbGRl28eFGlpaWxc+bNm6f8/HwdOnToqv1UV1crEonEWl5e3lBDAoAxxcjx/GfEl9ok6aOPPtKkSZMUDoe1bt067dmzRzfffLPa29uVmpqqyZMnx52flZWl9vb2q/ZXVVWlzs7OWGtra0v4QwDAWGTU60sLWsKr2ubOnaumpiZ1dnbqlVdeUXl5uerr64ccQDgcVjgcHvL7AQB2STjxpKamas6cOZKkoqIivf/++3ruuee0Zs0aXbhwQWfPno0b9XR0dCg7O9u3gAEAffruwbHvPh7PW+Y4jqNoNKqioiJNmDBBtbW1sZ81NzfrxIkTKikp8XoZAMCXOD7N8gQtoRFPVVWVysrKlJ+fr3Pnzmnnzp2qq6vT/v37FYlEtHbtWlVWViozM1MZGRnasGGDSkpKrrqiDQBGOjc3h37uvDjgz7u6PlXm5If8Csl6CSWe06dP67vf/a5OnTqlSCSigoIC7d+/X9/61rckSc8++6zGjRun1atXKxqNatmyZfrlL385LIEDwFjXtzgg5LmPoIWMMcGPswbQ1dWlSCSiviqgt18oAATB7Yins7NTGRkZnq93+d/J3Gu/qXEhbzufOeZzneyu9y02N3gsAgAgUGwSCgCW8mOvtWTcQEriAQBLOeqV1ykJJwlzPJTaAACBYsQDAJai1AYACJRjfCi1GQv2ahtuX6zuHlGrvAHgqrq6Ph3k559J+ut/38a2EZd4zp07d+lvRiQfADZwuyvBuXPnLt2n6A9KbT7Jzc1VW1ub0tPTFQr1DSG7urqUl5entra2wG5w8pvtn8H2+CX7PwPxJ99QP4MxRufOnVNubq6v8fQlHm+lMhKPpHHjxmnGjBn9/iwjI8Pa/2Avs/0z2B6/ZP9nIP7kG8pn8HOkY7sRl3gAAO4Y48jxulebYcQDAHCpr0zmdZNQC5/HE4RwOKxNmzZZ/aRS2z+D7fFL9n8G4k++0fAZRoIRtzs1AGBgl3enjqTdrFAoxVNfxvSqs+ePge5OTakNACzVN8NDqQ0AgAEx4gEAS/WtSGNVGwAgIH48tjoZj76m1AYACJQViWfbtm26/vrrlZaWpuLiYr333nvJDsmVzZs3KxQKxbV58+YlO6wBHTx4UCtWrFBubq5CoZD27t0b93NjjJ544gnl5ORo4sSJKi0t1bFjx5ITbD8Gi//++++/4jtZvnx5coLtR3V1tW6//Xalp6dr+vTpWrVqlZqbm+PO6enpUUVFhaZMmaJJkyZp9erV6ujoSFLEV3LzGRYtWnTF97Bu3bokRRyvpqZGBQUFsd0JSkpK9MYbb8R+PpJ+/8YYGeN4bMEvbB7xiefll19WZWWlNm3apA8++ECFhYVatmyZTp8+nezQXLnlllt06tSpWHvnnXeSHdKAuru7VVhYqG3btvX786efflo/+9nP9Pzzz+vdd9/Vtddeq2XLlqmnpyfgSPs3WPyStHz58rjv5KWXXgowwoHV19eroqJCDQ0NevPNN3Xx4kUtXbpU3d3dsXMeeeQRvfbaa9q9e7fq6+t18uRJ3X333UmMOp6bzyBJDz74YNz38PTTTycp4ngzZszQli1b1NjYqMOHD+uuu+7SypUr9Yc//EHSyPr9X94k1GsLPvARbsGCBaaioiL2ure31+Tm5prq6uokRuXOpk2bTGFhYbLDGDJJZs+ePbHXjuOY7Oxs89Of/jR27OzZsyYcDpuXXnopCREO7MvxG2NMeXm5WblyZVLiGYrTp08bSaa+vt4Y0/f7njBhgtm9e3fsnP/+7/82ksyhQ4eSFeaAvvwZjDHmm9/8pvn+97+fvKASdN1115lf//rXI+b339nZaSSZianXm2vCsz21ianXG0mms7MzsPhH9IjnwoULamxsVGlpaezYuHHjVFpaqkOHDiUxMveOHTum3NxczZ49W/fdd59OnDiR7JCGrLW1Ve3t7XHfRyQSUXFxsTXfhyTV1dVp+vTpmjt3rh5++GGdOXMm2SFdVWdnpyQpMzNTktTY2KiLFy/GfQfz5s1Tfn7+iP0OvvwZLvvtb3+rqVOnav78+aqqqtKnnw78TJtk6O3t1a5du9Td3a2SkpIR9/s3pteXFrQRvartk08+UW9vr7KysuKOZ2Vl6X/+53+SFJV7xcXF2rFjh+bOnatTp07pySef1De+8Q0dPXpU6enpyQ4vYe3t7ZLU7/dx+Wcj3fLly3X33Xdr1qxZOn78uP75n/9ZZWVlOnTokFJSvN0B7jfHcbRx40bdcccdmj9/vqS+7yA1NVWTJ0+OO3ekfgf9fQZJ+s53vqOZM2cqNzdXR44c0WOPPabm5mb9/ve/T2K0X/joo49UUlKinp4eTZo0SXv27NHNN9+spqamEfX792MpNMupR5mysrLY3wsKClRcXKyZM2fqd7/7ndauXZvEyMaue+65J/b3W2+9VQUFBbrhhhtUV1enJUuWJDGyK1VUVOjo0aMjfl5wIFf7DA899MWD02699Vbl5ORoyZIlOn78uG644Yagw7zC3Llz1dTUpM7OTr3yyisqLy9XfX19ssMaNUZ0qW3q1KlKSUm5YsVIR0eHsrOzkxTV0E2ePFk33XSTWlpakh3KkFz+nY+W70OSZs+eralTp46472T9+vV6/fXXdeDAgbjnU2VnZ+vChQs6e/Zs3Pkj8Tu42mfoT3FxsSSNmO8hNTVVc+bMUVFRkaqrq1VYWKjnnntuxP3+bV1cMKITT2pqqoqKilRbWxs75jiOamtrVVJSksTIhub8+fM6fvy4cnJykh3KkMyaNUvZ2dlx30dXV5feffddK78PSfr444915syZEfOdGGO0fv167dmzR2+//bZmzZoV9/OioiJNmDAh7jtobm7WiRMnRsx3MNhn6E9TU5MkjZjv4cscx1E0Gh1xv3/vS6mdpJTaRvyqtl27dplwOGx27Nhh/vjHP5qHHnrITJ482bS3tyc7tEH94z/+o6mrqzOtra3mP//zP01paamZOnWqOX36dLJDu6pz586ZDz/80Hz44YdGknnmmWfMhx9+aP785z8bY4zZsmWLmTx5snn11VfNkSNHzMqVK82sWbPMZ599luTI+wwU/7lz58yjjz5qDh06ZFpbW81bb71lvvrVr5obb7zR9PT0JDt0Y4wxDz/8sIlEIqaurs6cOnUq1j799NPYOevWrTP5+fnm7bffNocPHzYlJSWmpKQkiVHHG+wztLS0mKeeesocPnzYtLa2mldffdXMnj3bLFy4MMmR93n88cdNfX29aW1tNUeOHDGPP/64CYVC5j/+4z+MMSPj9395VduElCyTOj7HU5uQkhX4qrYRn3iMMebnP/+5yc/PN6mpqWbBggWmoaEh2SG5smbNGpOTk2NSU1PN3/zN35g1a9aYlpaWZIc1oAMHDhhJV7Ty8nJjTN+S6h/96EcmKyvLhMNhs2TJEtPc3JzcoP/KQPF/+umnZunSpWbatGlmwoQJZubMmebBBx8cUf8T01/sksz27dtj53z22WfmH/7hH8x1111nrrnmGvPtb3/bnDp1KnlBf8lgn+HEiRNm4cKFJjMz04TDYTNnzhzzT//0T4H+wzeQv//7vzczZ840qampZtq0aWbJkiWxpGPMyPj9X04841OmmQnjszy18SnTAk88PI8HACxz+Xk8KeMyFQp5mzExxlGv8/8CfR7PiJ7jAQCMPiynBgBrGcnzqrTgi14kHgCwlD/P42GTUADAKMeIBwAs1Xfzp8cRD6U2AIB73hNPMuZ4KLUBAALFiAcAbOXD4gIlYXEBiQcALGXrHA+lNgBAoBjxAIC1WFwAAAiU6Zuj8dKGmHi2bdum66+/XmlpaSouLtZ7773n+r0kHgBAQl5++WVVVlZq06ZN+uCDD1RYWKhly5bp9OnTrt7P7tQAYJnLu1NLKfKn1Nab0O7UxcXFuv322/WLX/xCUt+D8vLy8rRhwwY9/vjjg76fEQ8AWO2qj0By2fp0dXXFtWg02u/VLly4oMbGRpWWlsaOjRs3TqWlpTp06JCriEk8AGCZ1NRUZWdnS+r1pU2aNEl5eXmKRCKxVl1d3e+1P/nkE/X29iorKyvueFZWltrb213Fz6o2ALBMWlqaWltbdeHCBV/6M8YoFIov2YXDYV/67g+JBwAslJaWprS0tMCvO3XqVKWkpKijoyPueEdHx6VR2OAotQEAXEtNTVVRUZFqa2tjxxzHUW1trUpKSlz1wYgHAJCQyspKlZeX62tf+5oWLFigrVu3qru7Ww888ICr95N4AAAJWbNmjf7yl7/oiSeeUHt7u2677Tbt27fvigUHV8N9PACAQDHHAwAIFIkHABAoEg8AIFAkHgBAoEg8AIBAkXgAAIEi8QAAAkXiAQAEisQDAAgUiQcAECgSDwAgUP8f9K/LTOoz7FUAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# diagonal part of the H target\n", - "visualize_matrix(dbf.diagonal_h_matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "id": "24d0dfa1-7039-4d7d-8aa3-5a937b9ab0b8", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "HS norm of the off diagonal part of H: 1440.0\n" - ] - } - ], - "source": [ - "# Hilbert-Schmidt norm of the off-diagonal part\n", - "# which we want to bring to be close to zero\n", - "print(f\"HS norm of the off diagonal part of H: {dbf.off_diagonal_norm}\")" - ] - }, - { - "cell_type": "markdown", - "id": "d75e35ab-66f4-49f9-af19-679c20065a11", - "metadata": {}, - "source": [ - "Finally, the energy fluctuation of the system at step $k$ over a given state $\\mu$\n", - "\n", - "$$ \\Xi(\\mu) = \\sqrt{\\langle \\mu | \\hat{H}_k^2 | \\mu \\rangle - \\langle \\mu | \\hat{H}_k | \\mu \\rangle^2} $$\n", - "\n", - "can be computed:" - ] - }, - { - "cell_type": "code", - "execution_count": 78, - "id": "95f8d86f-07d4-498c-acb1-f6f6a4614c24", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "6.708203932499369" - ] - }, - "execution_count": 78, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# define a quantum state\n", - "# for example the ground state of a multi-qubit Z hamiltonian\n", - "Z = hamiltonians.Z(nqubits=nqubits)\n", - "state = Z.ground_state()\n", - "\n", - "# compute energy fluctuations using current H and given state\n", - "dbf.energy_fluctuation(state)" - ] - }, - { - "cell_type": "markdown", - "id": "3d5b37f3-2477-49a0-9f80-7da5ddda1fff", - "metadata": {}, - "source": [ - "#### Call the `DoubleBracketFlow` to perform a DBF iteration\n", - "\n", - "If the DBF object is called, a Double Bracket Flow iteration is performed. This can be done customizing the flow by setting the flow step and the desired `FlowGeneratorType`. If no generator is provided, the one passed at the initialization time is used (default is `FlowGeneratorType.canonical`)." - ] - }, - { - "cell_type": "code", - "execution_count": 79, - "id": "9a886261-8aa6-4df0-a31b-9c39847db124", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Initial value of the off-diagonal norm: 1440.0\n", - "One step later off-diagonal norm: 1168.2530943739996\n" - ] - } - ], - "source": [ - "# perform one evolution step\n", - "\n", - "# initial value of the off-diagonal norm\n", - "print(f\"Initial value of the off-diagonal norm: {dbf.off_diagonal_norm}\")\n", - "\n", - "dbf(step=0.01, mode=flowtype)\n", - "\n", - "# after one step\n", - "print(f\"One step later off-diagonal norm: {dbf.off_diagonal_norm}\")" - ] - }, - { - "cell_type": "markdown", - "id": "b78dd05d-ffe3-435a-b5ec-2a42f28066b2", - "metadata": {}, - "source": [ - "We can check now if something happened by plotting the drift:" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "id": "cc74812d-7c2c-44e4-afc2-e235968801b4", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" - ] - }, - { - "cell_type": "markdown", - "id": "3465a422-eebf-4e80-ae96-bba894132330", - "metadata": {}, - "source": [ - "The set step can be good, but maybe not the best one. In order to do this choice in a wiser way, we can call the DBF hyperoptimization routine to search for a better initial step. The `dbf.hyperopt_step` method is built on top of the [`hyperopt`](https://hyperopt.github.io/hyperopt/) package. Any algorithm or sampling space provided by the official package can be used. We are going to use the default options (we sample new steps from a uniform space following a _Tree of Parzen estimators algorithm_)." - ] - }, - { - "cell_type": "code", - "execution_count": 81, - "id": "aad79966-7a11-4a45-aba5-4a4bb8315c50", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "100%|█████████████████████████████████████████████████████████████████████████| 1000/1000 [00:06<00:00, 144.50trial/s, best loss: 828.4068645826136]\n" - ] - } - ], - "source": [ - "# restart\n", - "dbf.h = dbf.h0\n", - "\n", - "# optimization of the step, we allow to search in [1e-5, 1]\n", - "step = dbf.hyperopt_step(\n", - " step_min = 1e-5,\n", - " step_max = 1,\n", - " space = hp.uniform,\n", - " optimizer = tpe,\n", - " max_evals = 1000,\n", - " verbose = True\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 82, - "id": "49483a47-d29d-440e-a4bc-143bfe6bb3cf", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "visualize_matrix(dbf.h.matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": 83, - "id": "6bdaf7f9-7e49-4a16-8b29-ae1f9746cd9b", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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f8NGcMEfoa94hFuxYoWyWCxq6dKlav/+/eree+9V7dq1U5WVleGumq6ZM2eq4uJiVV5erv75z3+q7Oxs1bFjR3X8+PFwV+28Tp06pXbt2qV27dqlAKjnnntO7dq1S3399ddKKaXmzZun2rVrp9atW6f27Nmjxo0bp9LT01V1dXWYa97AX/1PnTqlfv3rX6utW7eq8vJytWHDBnXVVVepyy+/XNXU1IS76koppaZPn65sNpsqLi5Wx44d8x5nzpzxxkybNk117dpVbdq0Se3YsUNlZWWprKysMNbal957OHjwoHriiSfUjh07VHl5uVq3bp3q0aOHuv7668Nc8waPPPKIKikpUeXl5WrPnj3qkUceUZqmqffff18pFRmff+OstuioZBVzSWpQR3RUcshntUV8w6OUUn/84x9V165dVUxMjBo6dKjatm1buKskcvvtt6vU1FQVExOjLr30UnX77bergwcPhrtafm3evFmh4W6lz5Gbm6uUaphS/bvf/U4lJycri8WiRo4cqcrKysJb6X/jr/5nzpxRo0aNUp06dVLR0dGqW7du6p577omoP2KaqzsAtWTJEm9MdXW1uu+++1T79u1V27Zt1S233KKOHTsWvkqfQ+89HD58WF1//fUqKSlJWSwWddlll6nf/OY3If3F58/dd9+tunXrpmJiYlSnTp3UyJEjvY2OUpHx+Zu94eG2CEREJtO4LcIlUZ2gacHdMVHKg7Pub7gtAhER6TPrdOqInlxAREQXHvZ4iIhMSwFBz0oL/d0WNjxERCZlzH48oW94ONRGREQhxR4PEZFJNSz+DLLHw6E2IiKSC77hCcc9Hg61ERFRSLHHQ0RkVgZMLkAYJhew4SEiMimz3uPhUBsREYUUGx4iItPyGHQEbuHChejevTtiY2ORmZmJjz76SPxaNjxERKalGu7RBHO0YKjttddeQ35+PmbPno2dO3diwIABGD16NI4fPy56PbNTExGZTGN2auASaIbc4zkbUHbqzMxMDBkyBC+++CKAho3y7HY77r//fjzyyCO6r2ePh4jItFTQ/wXa46mrq0NpaSmys7O9j7Vp0wbZ2dnYunWrqAzOaiMiMjVjBq2cTqfPvy0WCywWS5O4b7/9Fm63G8nJyT6PJycn4/PPPxediz0eIiKTiYmJQUpKCgC3IUdCQgLsdjtsNpv3KCwsbLX6s8dDRGQysbGxKC8vR11dnSHlKaWgab73iprr7QBAx44dERUVhaqqKp/Hq6qqfmgM9bHhISIyodjYWMTGxob8vDExMRg8eDA2btyI8ePHA2iYXLBx40bMmDFDVAYbHiIiCkh+fj5yc3Nx9dVXY+jQoViwYAFcLhemTJkiej0bHiIiCsjtt9+Ob775BrNmzUJlZSUGDhyI9evXN5lwcD5cx0NERCHFWW1ERBRSbHiIiCik2PAQEVFIseEhIqKQYsNDREQhxYaHiIhCig0PERGFFBseIiIKKTY8REQUUmx4iIgopNjwEBFRSLHhISKikPp/EgSP89Np9xYAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" - ] - }, - { - "cell_type": "markdown", - "id": "b5f1d00e-e763-40d9-822f-e0e8d4c57d9a", - "metadata": {}, - "source": [ - "#### Let's evolve the model for `NSTEPS`\n", - "\n", - "We know recover the initial hamiltonian, and we perform a sequence of DBF iteration steps, in order to show how this mechanism can lead to a proper diagonalization of the target hamiltonian.\n", - "\n", - "#### Method 1: fixed step" - ] - }, - { - "cell_type": "code", - "execution_count": 84, - "id": "59a6a485-a714-4e14-b27a-1df2930068ee", - "metadata": {}, - "outputs": [], - "source": [ - "# restart\n", - "dbf_1 = DoubleBracketFlow(hamiltonian=deepcopy(h), mode=flowtype)\n", - "off_diagonal_norm_history = [dbf_1.off_diagonal_norm]\n", - "histories, labels = [], [\"Fixed step\"]\n", - "\n", - "# set the number of evolution steps\n", - "NSTEPS = 20\n", - "step = 0.005\n", - "\n", - "for s in range(NSTEPS):\n", - " dbf_1(step=step)\n", - " off_diagonal_norm_history.append(dbf_1.off_diagonal_norm)\n", - "\n", - "histories.append(off_diagonal_norm_history)" - ] - }, - { - "cell_type": "code", - "execution_count": 85, - "id": "7e0b2f18-ca53-4f34-9fcf-0052dcc31dc5", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeAAAAF2CAYAAAC260vLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABbfUlEQVR4nO3deVhU5f//8ecM+44gq6LgkvuKSq5ZIG6VmmUW39IyzdTMbP9VblmmlR/TzKw+aotW2mJ9rFTc0xARdyRXVFIWFRGQbWDO7w9icgRkm+Ew8H5cF5fMmfvc53VuD7w5Z86iURRFQQghhBA1Sqt2ACGEEKI+kgIshBBCqEAKsBBCCKECKcBCCCGECqQACyGEECqQAiyEEEKoQAqwEEIIoQIpwEIIIYQKpAALIYQQKpACLEQtsXHjRjp37oy9vT0ajYb09HS1I5VKo9Ewa9asGl/u2LFjcXZ2rlBbtTKW5dy5c2g0GlatWqV2FFGLSAEWddqqVavQaDTs379f7Si3dfXqVUaNGoWDgwNLly7lq6++wsnJSbU8v/32W60qYDVhzZo1LFq0SO0Yoh6xVjuAEAJiYmLIzMzkrbfeIiwsTO04/PbbbyxdurTUIpyTk4O1de3+1VGVjGvWrOHYsWNMmzbN5HmaNm1KTk4ONjY2Ju9bWK7a/VMkRD2RmpoKgLu7u7pBKsDe3l7tCOWqLRkLCgrQ6/XY2trWmkyi9pBD0EIABw8eZPDgwbi6uuLs7ExoaCh79+41aqPT6Zg9ezYtW7bE3t4eT09P+vTpQ2RkpKFNcnIyTzzxBI0bN8bOzg4/Pz+GDRvGuXPnylx2//79GTNmDADdu3dHo9EwduxYAAIDAw3f3zpP//79Da937NiBRqNh7dq1vP322zRu3Bh7e3tCQ0M5ffp0ifmjo6MZMmQIDRo0wMnJiY4dO/Lhhx8CRZ+1Ll26FCj6LLX4q1hpn69WZPyKPw7Ys2cP06dPx8vLCycnJ0aMGMHly5fLHJ9bXbx4keHDh+Ps7IyXlxcvvvgihYWFRm1uzZiZmcm0adMIDAzEzs4Ob29vBgwYwIEDBwzj+euvv3L+/HnD+gYGBhrmT01NZdy4cfj4+GBvb0+nTp344osvjJZZ/Dnv+++/z6JFi2jevDl2dnYcP368zM+A//rrLx588EE8PDywt7enW7du/PLLL0ZtKrLdCcske8Ci3ouLi6Nv3764urry8ssvY2Njw/Lly+nfvz87d+4kJCQEgFmzZjFv3jyeeuopevToQUZGBvv37+fAgQMMGDAAgJEjRxIXF8ezzz5LYGAgqampREZGcuHCBaNf6Dd7/fXXadWqFZ9++ilz5swhKCiI5s2bV2ld3n33XbRaLS+++CLXr19nwYIFREREEB0dbWgTGRnJvffei5+fH8899xy+vr7Ex8ezYcMGnnvuOZ5++mkuXbpEZGQkX331lcnGr9izzz5LgwYNmDlzJufOnWPRokVMmTKF7777rtxlFRYWMnDgQEJCQnj//ffZsmULH3zwAc2bN+eZZ54pc76JEyfy/fffM2XKFNq2bcvVq1fZvXs38fHxdO3alddff53r16/z999/85///AfAcMJXTk4O/fv35/Tp00yZMoWgoCDWrVvH2LFjSU9P57nnnjNa1sqVK8nNzWXChAnY2dnh4eGBXq8vddx69+5No0aNePXVV3FycmLt2rUMHz6cH374gREjRgAV2+6EhVKEqMNWrlypAEpMTEyZbYYPH67Y2toqZ86cMUy7dOmS4uLiovTr188wrVOnTsrQoUPL7OfatWsKoLz33nsmy9m0aVNlzJgxJdrfddddyl133WV4vX37dgVQ2rRpo+Tl5Rmmf/jhhwqgHD16VFEURSkoKFCCgoKUpk2bKteuXTPqU6/XG76fPHmyUtavB0CZOXOm4XVFx694HcPCwoyW9fzzzytWVlZKenp6qcsrNmbMGAVQ5syZYzS9S5cuSnBw8G0zurm5KZMnT75t/0OHDlWaNm1aYvqiRYsUQPn6668N0/Lz85WePXsqzs7OSkZGhqIoipKQkKAAiqurq5KammrUR/F7K1euNEwLDQ1VOnTooOTm5hqm6fV6pVevXkrLli0N08rb7oTlkkPQol4rLCxk8+bNDB8+nGbNmhmm+/n58eijj7J7924yMjKAos9n4+LiOHXqVKl9OTg4YGtry44dO7h27VqN5L/VE088ga2treF13759ATh79ixQdKg4ISGBadOmlfi8+ebDzBVVmfErNmHCBKNl9e3bl8LCQs6fP1+hZU6cONHodd++fQ3rVxZ3d3eio6O5dOlShZZxs99++w1fX18eeeQRwzQbGxumTp1KVlYWO3fuNGo/cuRIvLy8bttnWloa27ZtY9SoUWRmZnLlyhWuXLnC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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_histories(histories, labels)" - ] - }, - { - "cell_type": "markdown", - "id": "eb797d6c-0eba-4da4-b492-8b5d70f9123f", - "metadata": {}, - "source": [ - "#### Method 2: optimizing the step" - ] - }, - { - "cell_type": "code", - "execution_count": 86, - "id": "a6fd1e33-3620-4f3b-b705-a120f6da0027", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "100%|███████████████████████████████████████████████████████████████████████████| 500/500 [00:02<00:00, 193.41trial/s, best loss: 828.5188174589957]\n", - "New optimized step at iteration 1/20: 0.00988216174433494\n", - "New optimized step at iteration 2/20: 0.007178128589748405\n", - "New optimized step at iteration 3/20: 0.006586283123947156\n", - "New optimized step at iteration 4/20: 0.008496240698896648\n", - "New optimized step at iteration 5/20: 0.010639601305560622\n", - "New optimized step at iteration 6/20: 0.009688893201482675\n", - "New optimized step at iteration 7/20: 0.006959809497968054\n", - "New optimized step at iteration 8/20: 0.007079825908277573\n", - "New optimized step at iteration 9/20: 0.0025106878857708115\n", - "New optimized step at iteration 10/20: 0.007351003028447434\n", - "New optimized step at iteration 11/20: 0.005865305934025375\n", - "New optimized step at iteration 12/20: 0.007990929593067532\n", - "New optimized step at iteration 13/20: 0.011404539807978897\n", - "New optimized step at iteration 14/20: 0.0008194053292830093\n", - "New optimized step at iteration 15/20: 0.000292389939095989\n", - "New optimized step at iteration 16/20: 0.0067294371737333086\n", - "New optimized step at iteration 17/20: 0.0038227993688979764\n", - "New optimized step at iteration 18/20: 0.0019157593296632823\n", - "New optimized step at iteration 19/20: 0.003853751908247154\n" - ] - } - ], - "source": [ - "# restart\n", - "dbf_2 = DoubleBracketFlow(hamiltonian=deepcopy(h), mode=flowtype)\n", - "off_diagonal_norm_history = [dbf_2.off_diagonal_norm]\n", - "\n", - "# set the number of evolution steps\n", - "NSTEPS = 20\n", - "\n", - "# optimize first step\n", - "step = dbf_2.hyperopt_step(\n", - " step_min = 1e-5,\n", - " step_max = 1,\n", - " space = hp.uniform,\n", - " optimizer = tpe,\n", - " max_evals = 500,\n", - " verbose = True\n", - ")\n", - "\n", - "for s in range(NSTEPS):\n", - " if s != 0:\n", - " step = dbf_2.hyperopt_step(\n", - " step_min = 1e-5,\n", - " step_max = 1,\n", - " space = hp.uniform,\n", - " optimizer = tpe,\n", - " max_evals = 100,\n", - " )\n", - " print(f\"New optimized step at iteration {s}/{NSTEPS}: {step}\")\n", - " dbf_2(step=step)\n", - " off_diagonal_norm_history.append(dbf_2.off_diagonal_norm)\n", - "\n", - "histories.append(off_diagonal_norm_history)\n", - "labels.append(\"Optimizing step\")" - ] - }, - { - "cell_type": "code", - "execution_count": 87, - "id": "0f0212bf-b642-4fea-9203-037876e0b266", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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nq+7u7uVIxFVkfG8K0vfg/wkAduIY7OnoswfSGTCUpg/kKMfvW/tkISwefZyb1FULuY67yQB24DkY0epduIbjP+nOgWqH/uK5GNHrRuYEEIIi5EEbANSYg+ju+0PKp0OUo/EWicgIYRVdO3albFjx1p0H5MmTaJly5YW3YcoGUnANsCnSVMMqukygwG8GzexTkBCCIsZNmwYiqIU+Dl58iS//vor7777rrVDLNKZM2dQFIX9+/dbO5RKQRKwDfBt0JBr9Z9G/ScJqypExzZD51u+Lu5CCNvUq1cvLl++bPITERGBv79/iWbREZWDJGAb0fDlNyCkAQCKArHnQtgwb42VoxKiaki5fINT246TcvlGhezPxcWF4OBgkx8HBweTJuijR4/i7u7O0qVLte2WL1+Oh4cHR44cASA5OZlnnnmGgIAAvL29uf/++zlw4IDJvt5//32CgoLw8vJi+PDhZGZm3jG2GzduMGTIEAICAnBzc6NevXosWrQIgIiICABatWqFoih07dpV2+7LL7+kUaNGuLq60rBhQxYsWKCtM145//DDD9x77724urrStGlTNm3aVOZjWBlIArYhTsG1tdeeLpnsXrqNGxeSrBiREJXfnh92MOOeSXz5n0+Ycc8kdv+w3dohAdCwYUM++OADRo4cyblz57hw4QLjxo3j/fffp3HjxgA88sgjJCYm8tdffxETE0Pr1q3p1q0bSUl53xs//fQTkyZN4r333mPPnj2EhITw6aef3nG/77zzDkeOHOGvv/4iLi6OBQsWUL16dQB27doFwNq1a7l8+TK//vorAEuWLGHChAlMmzaNuLg43nvvPSZMmMD3339vUvf48eN55ZVX2LdvH5GRkfTr14/r16+b9bjZExmIw4YoPkHaa0+3TFKS3Fk/ZxWDPnjcilEJYT8+6TOLm1dTS1w+R59LxvU07b1qUPl1/PesmbkSnUPJr0+8ArwZ/ef4EpdfuXIlnp6e2vvevXvz888/Fyg3cuRI/vzzT/7v//4PZ2dnWrduzejRowHYsmULu3btIjExERcXFwA++OADVqxYwbJlyxgxYgRz5sxh+PDhDB8+HICpU6eydu3aO14Fnzt3jlatWtG2bVsAwsPDtXUBAQEAVKtWjeDgYG35xIkT+fDDD3nooYeAvCvl2NhYFi1axHPPPaeVGz16NIMGDQJgwYIFrFq1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bIPyzwt8e0csoxrNa9GkV3MAbiamsvObLRUSmxCVkeFGAvpjO4r8fTOnUaNG4ezszJo1a+jSpQu1atWid+/erF27losXL/LWW29pZcPDw3n33Xd57LHH8PLyonHjxnz66acm6wEGDhyoTUgDBZughw0bxoABA3jvvfcICgrC19eXKVOmkJOTw/jx4/H396dmzZosWrRI2+b2Juhhw4ahKEqBn40bN2qx5L/6dHBw4JtvvuGhhx7C3d2devXq8fvvv5sci99//5169erh6urKfffdx9dff42iKCQnJxd67FRVZdKkSdSqVQsXFxdCQ0N56aWXgLzHVs+ePcvLL7+sxWa0ZcsWOnXqhJubG2FhYbz00kukp6cXOM6PP/44NWrUICwsjPnz59/x/9EcJAHbIJ3Pv2NQF3UFDND91b7aSbbp02iy0jItHpsQlU3WtmUkv92Vmx8/SfLbXcna+rPF9pWUlMTq1asZOXIkbm5uJuuCg4MZMmQIP/74o8n4B7NmzaJFixbExMRos71FR0cDec2+AIsWLeLy5cva+8KsX7+eS5cusXnzZmbPns3EiRN54IEH8PPzY+fOnTz//PM899xzXLhwodDtP/74Yy5fvqz9jBkzhsDAQBo2bFjkPmfMmMEjjzzCwYMH6dOnD0OGDNGu8OPj43n44YcZMGAABw4c4LnnnjP546Mwv/zyCx999BELFy7kxIkTrFixQptd6ddff6VmzZpMmTJFixHg1KlT9OrVi0GDBnHw4EF+/PFHtmzZwujRo03qNh7nTZs28frrrzNmzBjtOFuKTQ/EUVWZXAEX0hPaKKhBCC0GtGH/8j2kJ6Wz5cuNdBvbqyJCFMImpbz/EIbUqyUur+bkcCst331X1UD6krdI/99HKDqHoje8jc47AJ83fi223IkTJ1BVtchpThs1asSNGze4evUqgYF5nTE7dOjAG2+8gcFgYMSIEcTExPDRRx/RvXt3AgICAPD19b3j5DGQNyjR3Llz0el0NGjQgJkzZ5KRkcH/+3//D8ib4e39999ny5YtDB48uMD2Pj4++PjkPSb566+/snDhQtauXXvH/T7++OM89thj6HQ63nvvPebOncuuXbvo1asXCxcupEGDBsyaNQuABg0acPjwYaZNm1ZkfefOnSM4OJioqCicnJyoVasWd999t/b5HBwc8PLyMolp+vTpDBkyRJumtl69esydO5cuXbqwYMECbTajDh068Prrr5Oamkrr1q3Ztm2bdpwtRa6AbVBJmqCNur3cG51D3n/j35+vJ+NG+h3LC1GZGVKvoiZfKfEPaUV0ekq9Vqp6SpP0gVKN8BcZGVngfVxcXKn2B9CkSROTkfOCgoJM5uZ1cHCgWrVqBWaQu92+fft44okn+OSTT+jQoUOx+zQyTkVorP/YsWO0a9fOpLwxmRblkUce4datW9x11108++yzLF++vMB8vLc7cOAAixcvxtPTU/vp2bMnBoOB+Ph4rZy5jnNpyBWwDdL55m+CLvoKGKB6RABtHm3P7u+3k3Uzk78XrqfnG/0sHaIQNknnHYCh+GIaNSen8CTsXb3UV8AlUbduXRRFIS4ujoEDBxZYHxcXh5+fn3Zla063T5NnnE7v9mUGQ9FHMCEhgQcffJBnnnmG4cOHl2mfd6q/OGFhYRw7doy1a9cSHR3NyJEjmTVrFps2bSpyGsC0tDSee+457V5xfvmns7UGScA2SHH1QHH1RM1Mu+M9YKP7x/Rk7y+7yM3OZetXm+jwTFc8q3tVQKRC2JaSNAMbGQwGUlNTcTm8hls/TACDAXQ6PB57F5cOj1gkvmrVqtG9e3c+/fRTXn75ZZP7wAkJCSxZsoQnn3zSpAPRjh2mjxnu2LHDpAnbycmJ3FzLj4iXmZlJ//79adiwIbNnzy53fQ0aNODPP/80WXane9hGbm5u9OvXj379+jFq1CgaNmzIoUOHaN26Nc7OzgWORevWrTly5Ah169a9Y73FHWdLkCZoG2VshjbcSCi2ucq3hj93D8lrCtLfymbjJ5btOCBEZeJy78P4vrsRr7Hf4vvuRoslX6NPPvmErKwsevbsyebNmzl//jyrVq2ie/fu1KhRo8A90K1btzJz5kyOHz/OF198wbJlyxgzZoy2Pjw8nHXr1pGQkMCNGzcsFvdzzz3H+fPnmTt3LlevXiUhIYGEhASys8v2CORzzz3H0aNHef311zl+/Dg//fQTixcvBjD5AyS/xYsX89///pfDhw9z+vRpvvvuO9zc3KhdO2+M/PDwcDZv3szFixe5du0aAK+//jrbtm1j9OjR7N+/nxMnTvDbb78V6IS1detWZs2axcmTJ/n000/5+eefTY6zJUgCtlFaM7Q+EzUjpdjy943ugZNrXhPMjm//5uD/9pJy2XK/jEJUJjq/YJzqt0fnd+eOTOZQr1499uzZw1133cWjjz5KnTp1GDFiBPfddx/bt2/H39/fpPwrr7zCnj17aNOmDR9++CEffvghPXv21NZ/+OGHREdHExYWpk3dagmbNm3i8uXLNG7cmJCQEO1n27ZtZaovIiKCZcuW8euvv9K8eXMWLFig9YJ2cXEpdBtfX1+++OILOnToQPPmzVm7di3/+9//tGeep0yZwpkzZ6hTp47WjN+8eXM2bdrE8ePH6dSpkzalrXFOeCPjce7SpQvTpk1j9uzZJsfZEqQJ2kbl/yIw3EhA98/40EXxCvQm8qnObF6wjtzsXL4fuRhFpzBwxmDaDY6847ZCiIpVu3Zt7WqvON7e3vz0009ak7m3t7fJemNzbH6TJk1i0qRJ2vvC9mV8fje//FO6hoeHm7S+FTbda1HbAuTm5pKammqy7Pbnex988EEefPBB7f20adOoWbOm1jP5dgMGDGDAgAFFxnDPPfdw4MCBAsvbtWvHmjVr7hi/t7c3P/74o3aMK2KqV7kCtlGmHbFKNjhAy4GmPQpVg8ryN36QK2EhhE369NNP2b17N6dPn+bbb79l1qxZDB061NphVRi5ArZROr+SPQucX8aNtALL1FyV62eu4RPiZ7bYhBDCHE6cOMHUqVNJSkqiVq1avPLKK7z55pvWDqvCSAK2UWW5Aq4eEYCiU1AN/zYbKQ4K1cKrmz0+IYTlFdfsa+8++ugjPvroI2uHoR3n8jwiVRbSBG2jTBLwjZJdAfuE+DFwhukINp2f7yZXv0IIYYMkAdsok05YJbwCBmg3OJK+E/99wP9Wyi2zxiWELSnNiFJCmIu5zjtJwDZKcfcBp7yu+GopEjBAu8fuxdndGYCD/9uLPlNv9viEsCbjqEcZGRlWjkRURcbzrqjRt0pK7gHbKEVR0PkGY7h6ttRTpLl4uNCkT0v2LdtFZsotjq49TLMHLPd8oBAVzcHBAV9fX21cYXd39yIHbyiKwWAgOzubzMzMCnnkpLwkXssrLmZVVcnIyCAxMRFfX18cHEo+XGlhJAHbMGMCVjPTUG+lobh5lnjb1oPasW/ZLgD2/rJLErCodIwz3hQ3eUBRVFXl1q1buLm5lTp5W4PEa3kljbkks0+VhCRgG2b6KFICDm53Hss0v7vurYdPqB8pl25wfEMcadduyvjQolJRFIWQkBACAwPR60t/m0Wv17N582Y6d+5c7qbEiiDxWl5JYnZycir3la+RJGAbdvusSA4hJU/AOp2OVgPbsnF+NIZcA/tX7KHjM/dZIkwhrMrBwaFMX4gODg7k5OTg6upqFwlC4rW8io7ZPhrmqyjTntAlexQpv1YP/zu35r5fip9lRAghRMWRBGzDyjIYR36BdYOo2TJvlpBLhy+QEHfJbLEJIYQoH0nANuz2CRnKovWgf8eH3vvLrnLHJIQQwjwkAduw8l4BAzTv3wYHp7z7Y/uX7yE3x/ITdwshhCieJGAbpnj6g0NeR4CyJmAPPw8admsCwM3EVE5tOW62+IQQQpSdJGAbpuh06HwCgbI3QQO0GvRvZ6y9y6QZWgghbIEkYBtnfBZYTU9Gzc4sUx0N7m+Mu58HALGrDpJ5U8aHFkIIa5MEbONufxa4LBydHWnRvw0AOVl6Dv2x3xyhCSGEKAdJwDbOHAkYoFW+3tD7pBlaCCGsThKwjSvrtIS3q9miFgF185qz43eeIunc9XLHJoQQouwkAds4czyKBHnj5rbOPzLWr3IVLIQQ1iQJ2MaZYzAOo5YD22ozfOxdtlsmMxdCCCuSBGzjFB/TGZHKwzfUj7s61AMg6ew1zsXEl6s+IYQQZScJ2MbpfKqDkvffVN4rYMCkGVqeCRZCCOuRBGzjFAcnFO/qQPl6QRs16dUCZ3dnAA7+bx/6zNLPoyqEEKL8JAHbAeN9YPXmNdSc7HLV5eLhQtM+LQHITL3F0bWHyxueEEKIMrDpBLx582b69etHaGgoiqKwYsUKbZ1er+f111+nWbNmeHh4EBoaypNPPsmlS6ZT7iUlJTFkyBC8vb3x9fVl+PDhpKWlmZQ5ePAgnTp1wtXVlbCwMGbOnFkRH6/EtJ7Qqooh5Wq568vfDB0jzdBCCGEVNp2A09PTadGiBfPnzy+wLiMjg7179/LOO++wd+9efv31V44dO8aDDz5oUm7IkCHExsYSHR3NypUr2bx5MyNGjNDWp6am0qNHD2rXrk1MTAyzZs1i0qRJfP755xb/fCVlrsE4jCIi6+IT6gfAiY1x3LyaWu46hRBClI6jtQO4k969e9O7d+9C1/n4+BAdHW2y7JNPPuHuu+/m3Llz1KpVi7i4OFatWsXu3btp27YtAPPmzaNPnz588MEHhIaGsmTJErKzs/nqq69wdnamSZMm7N+/n9mzZ5skamsy12AcWn06Ha0easfGT9ZgyDVw4LcYOj5zX7nrFUIIUXI2fQVcWikpKSiKgq+vLwDbt2/H19dXS74AUVFR6HQ6du7cqZXp3Lkzzs7OWpmePXty7Ngxbty4UaHxF8Vcg3Hkl39oSukNLYQQFc+mr4BLIzMzk9dff53HHnsMb29vABISEggMDDQp5+joiL+/PwkJCVqZiIgIkzJBQUHaOj8/v0L3l5WVRVZWlvY+NTWvGVev16PXl61nsXG727c3eFXXXudcv1Tm+vPzq+1PjRa1uHjgHJdjL3L+4FmCG4WaJV5bJfFalsRrWRKv5Zkj5tJsWykSsF6v59FHH0VVVRYsWFAh+5w+fTqTJ08usHzNmjW4u7uXq+7bm9ZdM65jvF69FLefoy5/lqt+I6cGbnAg7/Xy2T9Te2C9MtVze7y2TuK1LInXsiReyytPzBkZGSUua/cJ2Jh8z549y/r167WrX4Dg4GASExNNyufk5JCUlERwcLBW5soV045NxvfGMoV58803GTdunPY+NTWVsLAwevToYRJDaT9LdHQ03bt3x8nJSVuu6rNI+/t9AILcdNzVp0+Z6r9dRmQ6s5ZPJlefy82DN+i5oCcOjg7ljtdWSbyWJfFalsRreeaI2dgaWhJ2nYCNyffEiRNs2LCBatWqmayPjIwkOTmZmJgY2rTJmw93/fr1GAwG2rdvr5V566230Ov12gGPjo6mQYMGRTY/A7i4uODi4lJguZOTU7lPtgJ1ODmhePqjpiVByhWzncw+gb407NaE2FUHSbt6k7M7TtPgvsblj9fGSbyWJfFalsRreeWJuTTb2XQnrLS0NPbv38/+/fsBiI+PZ//+/Zw7dw69Xs/DDz/Mnj17WLJkCbm5uSQkJJCQkEB2dt5gFY0aNaJXr148++yz7Nq1i61btzJ69GgGDx5MaGje/c7HH38cZ2dnhg8fTmxsLD/++CMff/yxydWtLTD2hDakJKIacs1WrwxNKYQQ1mHTCXjPnj20atWKVq1aATBu3DhatWrFhAkTuHjxIr///jsXLlygZcuWhISEaD/btm3T6liyZAkNGzakW7du9OnTh44dO5o84+vj48OaNWuIj4+nTZs2vPLKK0yYMMFmHkEy0npCG3JRb5pvLt/69zXG3c8DgCOrD5GZestsdQshhCiaTTdBd+3a9Y5T5pVkOj1/f3+WLl16xzLNmzfn77//LnV8FcnkUaQbCeh8Au9QuuQcnR1p0b8N2xdvJidLz6E/99NucKRZ6hZCCFE0m74CFv/S+ZlvWsLbmTRD/yzN0EIIUREkAduJ26+AzalG8zAC6+Ul+DO7TpF09ppZ6xdCCFGQJGA7ofPNfwVc/vGg81MUhVaD/r0K3rd8t1nrF0IIUZAkYDth7vGgb9fqobYoigLA3mW7S3R/XQghRNlJArYTOp98V8BmboIG8Anxo07H+gAknb3G2T3xZt+HEEKIf0kCthOKqweKW94IW5a4AgbTzlj7fpHOWEIIYUmSgO2INhhH8hWLNBE36dUcZ/e8WaEO/m8f+lvZZt+HEEKIPJKA7YjWESsnGzXd/FMlOru70LRPSwAyU28Rt/aw2fchhBAijyRgO2LSEcsC94EBWj+S75ngX6Q3tBBCWIokYDti8iywmR9FMoq4py4+oXmTUBzfcISLh89bZD9CCFHVSQK2I5YcjEPbh05HcMMQAFSDyid9ZrH7h+0W2ZcQQlRlkoDtiOJrueEojVIu3+D4xrh/F6iw/I0fSLls/nvOQghRlUkCtiOWHowD4Fr8VVSDaQ9rNVfl+hkZnlIIIcxJErAdqYgm6OoRASg6xXSholAtvLpF9ieEEFWVJGA7orh5gYs7YLkrYJ8QPwbOGGyShP1r+eMT4meR/QkhRFUlCdiOKIqiPQtsqcE4ANoNjuT1HZPwC6sGQNLZ66RcTrbIvoQQoqqSBGxntGborAzUzDSL7ccnxI/WD7fT3h9ZfdBi+xJCiKpIErCdqYjBOIya9G6hvT781wGL7ksIIaoaScB2xnQwDssm4OCGoVQLDwAgfsdJ0pMsd8UthBBVjSRgO6PL9yywauErYEVRaNK7ed6+DCpxaw5ZdH9CCFGVSAK2MxV5BQzQtHdL7bU0QwshhPlIArYzFTEYR341WoThE+ILwMktx8hMvWXxfQohRFUgCdjOVMRgHCb70+m0zli52bkcXRdr8X0KIURVIAnYziiefuDoBFhuRqTbNenVXHsdu0qaoYUQwhwkAduZvME48q6CKyoBh99dB49qngAc2xBH9q3sCtmvEEJUZpKA7ZAxAasZKahZGZbfn4OOxj3zroL1t7I5kX+2JCGEEGUiCdgOmXbEqvhm6MPSDC2EEOUmCdgOVfSjSAB1OtTH1dsNgKNrY8nJzqmQ/QohRGUlCdgO5R+MoyJ6QgM4OjvSMKoJAJmptzi19XiF7FcIISorScB2yCQBV9AVMJgOyhErg3IIIUS5SAK2Q6YTMlTMPWCAel0a4uTmDOTNjmTINVTYvoUQorKRBGyHrHEPGMDZzZkG9zcGID0pnbO7T1fYvoUQorKRBGyHFO/qoHMAKq4XtFGTXv9OUXhktUzOIIQQZSUJ2A4pOgd0PoFAxV4BAzTs1hgH57zkH7f6EKpBrdD9CyFEZSEJ2E5pg3HcvI6qr7iRqVy93KjbqSEAqQkppJ1LrbB9CyFEZSIJ2E6ZdMRKqdhm6Ka9/22GTtp/tUL3LYQQlYUkYDulWOlRJIBG3Zuic8g7dZL2J6Kq0gwthBClVeoEfOvWLS5evFhgeWysTFNXkUwH46jYK2APf08i7qkLQNa1W1w5erlC9y+EEJVBqRLwsmXLqFevHn379qV58+bs3LlTW/fEE0+YPThRNGs9imTUJF8z9JFVByt8/0IIYe9KlYCnTp1KTEwM+/fvZ9GiRQwfPpylS5cCSDNkBTMdjMMKCbjnv5MzyONIQghReo6lKazX6wkKymv6bNOmDZs3b2bgwIGcPHkSRVEsEqAonLWvgL2DfQhrE875mDMkHk/g6ulEAu4KrPA4hBDCXpXqCjgwMJCDB/9tbvT39yc6Opq4uDiT5cLydD4B8M8fPRU9GIdR457NtNcyNrQQQpROqRLwt99+S2Cg6VWOs7Mz33//PZs2bTJrYACbN2+mX79+hIaGoigKK1asMFmvqioTJkwgJCQENzc3oqKiOHHihEmZpKQkhgwZgre3N76+vgwfPpy0tDSTMgcPHqRTp064uroSFhbGzJkzzf5ZzE1xdEbxqg5Y5woYTBPw4T8lAQshRGmUKgHXrFmT4ODgQtd16NDBLAHll56eTosWLZg/f36h62fOnMncuXP57LPP2LlzJx4eHvTs2ZPMzEytzJAhQ4iNjSU6OpqVK1eyefNmRowYoa1PTU2lR48e1K5dm5iYGGbNmsWkSZP4/PPPzf55zM3YE1pNuYqaW/Hz8/qFVcO9phcAFw+eI/liUoXHIIQQ9qpU94ArWu/evendu3eh61RVZc6cObz99tv0798fgG+++YagoCBWrFjB4MGDiYuLY9WqVezevZu2bdsCMG/ePPr06cMHH3xAaGgoS5YsITs7m6+++gpnZ2eaNGnC/v37mT17tkmitkU6v2Byzx0G1YCaeg3Fr/A/jiypWssAMi7cBCB21UE6DO9a4TEIIYQ9KnMCPnfuXJm28/X1xdvbu6y71cTHx5OQkEBUVJS2zMfHh/bt27N9+3YGDx7M9u3b8fX11ZIvQFRUFDqdjp07dzJw4EC2b99O586dcXZ21sr07NmTGTNmcOPGDfz8/Ardf1ZWFllZWdr71NS8IRn1ej16vb5Mn8m4XYm39w7QXmZfu4CDZ7Uy7bes9Ho9/i0DOb8yb1akQ3/s5+4nzd8SYi6lPr5WJvFalsRrWfYWL5gn5tJsW+YEHB4eXuptFEVh4sSJTJgwoay71SQk5N33NPbKNgoKCtLWJSQkFLhn7ejoiL+/v0mZiIiIAnUY1xWVgKdPn87kyZMLLF+zZg3u7u5l+ET/io6OLlG5mgnJGCOPWf8X14ILDpBiaW7BHrgGuZN5JYOze06z4oflOHu7VHgcpVHS42srJF7Lkngty97ihfLFnJGRUeKyZU7ABkPVnoz9zTffZNy4cdr71NRUwsLC6NGjR5mv8PV6PdHR0XTv3h0nJ6fiy+/OJfPEXwC0vCsU5659yrTfsjLG23Zge7Z8tgFUqGEIpl2fyAqNo6RKe3ytTeK1LInXsuwtXjBPzMbW0JIocwKOiIgo07O/Y8eO5aWXXirrbjXGzmBXrlwhJCREW37lyhVatmyplUlMTDTZLicnh6SkJG374OBgrlwxfYzH+L6oDmcALi4uuLgUvNJzcnIq98lW4jqq18DY3UxJvWq1k7xpn5Z5CRg4uuYw9w7tbJU4Ssoc/0cVSeK1LInXsuwtXihfzKXZrswJePHixWXarixN14WJiIggODiYdevWaQk3NTWVnTt38sILLwAQGRlJcnIyMTExtGnTBoD169djMBho3769Vuatt95Cr9drBy46OpoGDRoU2fxsK0wG46jgGZHyC2lSA78wf26cT+LUtuPcSs7Azbd8zfBCCFHZlTkBd+nSxZxxFCotLY2TJ09q7+Pj49m/fz/+/v7UqlWLsWPHMnXqVOrVq0dERATvvPMOoaGhDBgwAIBGjRrRq1cvnn32WT777DP0ej2jR49m8ODBhIaGAvD4448zefJkhg8fzuuvv87hw4f5+OOP+eijjyz++crLdEIG6zwLDHn39pv0asGWLzZgyDEQt/YwrR++22rxCCGEPTDbdIR6vZ7z589z7NgxkpLM8zzonj17aNWqFa1atQJg3LhxtGrVSuvE9dprr/Hiiy8yYsQI2rVrR1paGqtWrcLV1VWrY8mSJTRs2JBu3brRp08fOnbsaPKMr4+PD2vWrCE+Pp42bdrwyiuvMGHCBJt/BAlAcXZF8fAFrDcallHTPv9OziCjYgkhRPHK9RzwzZs3+e677/jhhx/YtWsX2dnZqKqKoijUrFmTHj16aMmxLLp27XrHSR4URWHKlClMmTKlyDL+/v7ahBFFad68OX///XeZYrQ2nV8wuenJGJKvoBoMKDrrTPEc1jocr0BvbiamcnzTUbLSs3DxsO3e0EIIYU1l/raePXs24eHhLFq0iKioKFasWMH+/fs5fvw427dvZ+LEieTk5NCjRw969epVYIhIYR46n3+aoXP1qGnWG4lKp9PRpFfeDEk5WXqObzhitViEEMIelPkKePfu3WzevJkmTZoUuv7uu+/m6aef5rPPPmPRokX8/fff1KtXr8yBisKZTEuYnIDOu7rVYmnSuwU7vtkC5I0N3eyBVlaLRQghbF2ZE/D3339fonIuLi48//zzZd2NKIZJT+gbCVCrqdViibinLm6+7txKzuDo+lj0mXqcXO3r8QMhhKgo5bph6OXlRefOnXn55Zf59ttviY2NveM9W2F+t18BW5ODowONe+TNkJSdnsXJv49aNR4hhLBlpUrAt1/1zpgxg3r16rF+/XqefvppmjdvjpeXF/feey8vvvgiixYt4sAB6RFrSQWugK2sSe/8vaFljmghhChKiZqgExISGDlyJL6+vjz22GPa8pEjR2qvb926hYeHBy+++CJJSUns2LGDL7/8kuzsbHJzc80fuQBuexbYyo8iAdTt2AAXTxey0rI4suYQufpcHJwcrB2WEELYnBIl4M8//xy9Xs9XX31VZBk3NzcAHnvsMZo3/6c3bE4OR45Ib1hLMm2Ctn4CdnJ1osH9TTj4+15upWQQv+MkdTs1sHZYQghhc0rUBP3SSy/h7+/PoEGDSlW5o6OjloyFZSiuniiunoD17wEb5R+U47AMyiGEEIUqUQL29fXl66+/Zvjw4ZaOR5SB8k8ztOFGgk10gqvftTGOLnm9n4+sPljlZ84SQojClKoTVp8+ptPdPfPMMyxYsIDdu3drk9OXZYYkUT5aRyx9JmpGinWDAVw8XKjftREANxNTORdzxroBCSGEDSrXY0gnTpzgjTfeoH379nh5eQEwefJkPvnkE7Zt21aqiYlF2ZncB7aBntAATXr/e+vh8J/7rReIEELYqHKNBb1p0yYgLxHHxMSwd+9e9u7dy4QJE0hOTsbBwYH69esTGxtrlmBF4UweRUpOgJoNrRhNnkZRTdE56jDkGNi/IoaOz96Hb6htT+8ohBAVqVwJ2KhevXrUq1ePwYMHa8vi4+PZs2cP+/btM8cuxB3o/PI/imQbV8BuPu5UvyuQxOMJpF+7ycx7JjFw5mDaDY60dmhCCGETzJKACxMREUFERASPPPKIpXYh/mF6BWz9R5EAUi7fIPHEv38MqKrK8jd+oH6XhviEyJWwEEKU+R7wuXPnSlX+4sWLZd2VKIbpaFi2kYCvxV+F2zpkq7kq189cs05AQghhY8qcgNu1a8dzzz3H7t27iyyTkpLCF198QdOmTfnll1/KuitRDFsaD9qoekQAis60R7yiU6gWbr3ZmoQQwpaUuQn6yJEjTJs2je7du+Pq6kqbNm0IDQ3F1dWVGzducOTIEWJjY2ndujUzZ84s8AiTMB/F3QecXPMeQ7KRBOwT4sfAGYNZ/toP2rPJdTrUl+ZnIYT4R5mvgKtVq8bs2bO5fPkyn3zyCfXq1ePatWucOHECgCFDhhATE8P27dsl+VqYoijamNC28hgSQLvBkYyJfgOdQ95plng8QQblEEKIf5S7E5abmxu9evXi4YcfNkc8oox0vsEYrp5FzUxDvZWG4uZp7ZAACGoQQoP7GxMXfZjUKymc3XWaiHvqWjssIYSwunINxGHk4+Mj93itzBYfRTJq/mAb7fWB3/daMRIhhLAdZknAqqqycOFCOnToQMeOHRk7duwdO2cJ87PFR5GMGnVvipNr3tjQh//YR26OTE8phBBmScAA+/bto3Xr1nTs2JHY2Fg6derEq6++aq7qRTFssSe0kYuHCw2jmgKQnpTOqa3HrRyREEJYn9kG4li6dCndu3fX3h88eJD+/ftTo0YNXn75ZXPtRhTBlq+AAVo82JpDK/NGRTv4+17qd2lk5YiEEMK6zHIF7O/vT1hYmMmy5s2b88knn7BgwQJz7EIUwxYnZMiv/n2NcfF0ASB21UFysvRWjkgIIazLLAm4ZcuWLFq0qMDyunXrlnrELFE2BSZksDFOrk407pk3Q1Jm6i1ObD5q5YiEEMK6zJKAp06dyty5c3niiSfYvn076enpJCYm8t577xEREWGOXYhiKJ7+4JDX0ckWEzBA8wdba6+lN7QQoqozyz3ge+65hx07djBmzBg6deqkjXzk6urKzz//bI5diGIoOh06n0AMSRdtsgkaoG7HBrj5unMrOYO4NYfIvpWNs5uztcMSQgirMFsv6BYtWrBx40YuXbrEypUr+f333zl79qyMglWBjM8Cq+nJqNmZVo6mIEdnR5r2aQlAdkY2x9bJPNFCiKqrzFfAd7q326RJEwAyMjIKlPP19cXb27usuxV3cHtPaIfA2laMpnAtHmzN7qXbgLxm6GYPtLJyREIIYR1lTsDh4eGl3kZRFCZOnMiECRPKultxB7d3xLLFBBxxT108A7xIu3qTY+tjybx5C1cvN2uHJYQQFa7MCVgG1bc9poNx2N6zwAA6Bx3NHmjF9kWbycnK4ciaQ7QedLe1wxJCiApX5gQcERGBoijFF7zN2LFjeemll8q6W3EHtv4oklGLB1uzfdFmIG9QDknAQoiqqMwJePHixWXarixN16JkbH0wDqOw1uH4hPqRcukGJzYfJf1GOh5+HtYOSwghKlSZE3CXLl3MGYcwA3u5AtbpdDTv14q/F67HkGPgyKoDtHvsXmuHJYQQFcpsjyEJ61O8q4OS919qy1fAkNcMbSSDcgghqiJJwJWI4uCYl4Sx3U5YRqHNwqgWHgDA6W0nuJmYauWIhBCiYkkCrmSM94HV1KvkXrXdcbgVRdGGplQNKof+3G/dgIQQooJJAq5scnO0lymTepC11XaHAs3fDH1QmqGFEFWMJOBKxHAjgdzzcf8uUA2kf/+Ozd4PDmoQQlCDEADO7j5N8sUkK0ckhBAVRxJwJZKbeAZQTRcaDORePWuNcErE5Cr4f/usGIkQQlQsScCViENgONw+OIpOh0OA7Q1JadSsnzRDCyGqJknAlYjOLxj3R94xWebx2LsmA3TYmuoRAdRoFgbAxUPnuRZ/1coRCSFExbD7BJybm8s777xDREQEbm5u1KlTh3fffVebkxhAVVUmTJhASEgIbm5uREVFceLECZN6kpKSGDJkCN7e3vj6+jJ8+HDS0tIq+uOUm2vX/0OpVjPvjaMzzvcMtG5AJdA8XzP0of/JVbAQomqw+wQ8Y8YMFixYwCeffEJcXBwzZsxg5syZzJs3Tyszc+ZM5s6dy2effcbOnTvx8PCgZ8+eZGb+O2fukCFDiI2NJTo6mpUrV7J582ZGjBhhjY9Ubk61m+W9yMnGkHjGqrGURPN+/05JKINyCCGqCrtPwNu2baN///707duX8PBwHn74YXr06MGuXbuAvKvfOXPm8Pbbb9O/f3+aN2/ON998w6VLl1ixYgUAcXFxrFq1ii+//JL27dvTsWNH5s2bxw8//MClS5es+OnKxqFmQ+11zoW4O5S0Db41/Knd7i4Arhy7TMJR+zvmQghRWmUeC9pW3HvvvXz++eccP36c+vXrc+DAAbZs2cLs2bMBiI+PJyEhgaioKG0bHx8f2rdvz/bt2xk8eDDbt2/H19eXtm3bamWioqLQ6XTs3LmTgQMLNuNmZWWRlZWlvU9NzRvJSa/Xo9fry/RZjNuVdXtNcH3tZfbZw+ha9ipffUUwW7xA074tOLv7NAD7f9tDtzq9y13n7cwZb0WQeC1L4rUse4sXzBNzaba1+wT8xhtvkJqaSsOGDXFwcCA3N5dp06YxZMgQABIS8p6BDQoKMtkuKChIW5eQkEBgYKDJekdHR/z9/bUyt5s+fTqTJ08usHzNmjW4u7uX6zNFR0eXa3unrFTu+ed14oEtHHZqXK76ilPeeAGynbNAAVTY+eNWMhsYyjTdZUmYI96KJPFalsRrWfYWL5Qv5oyMjBKXtfsE/NNPP7FkyRKWLl1KkyZN2L9/P2PHjiU0NJShQ4dabL9vvvkm48aN096npqYSFhZGjx498Pb2LlOder2e6OhounfvjpOTU5ljU1WV9D2foqZdxz/zGr1797ZIMjNXvEbJK69wetsJMq/eolWt5oT+0zvaXMwdr6VJvJYl8VqWvcUL5onZ2BpaEnafgMePH88bb7zB4MGDAWjWrBlnz55l+vTpDB06lODgvEdwrly5QkhIiLbdlStXaNmyJQDBwcEkJiaa1JuTk0NSUpK2/e1cXFxwcXEpsNzJyancJ5s56sgMa0RO3BbU9Bs4pidZ9FEkc8QL0HJAG05vy+udHvvnQWq3vqvcdRbGXPFWFInXsiRey7K3eKF8MZdmO7vvhJWRkYFOZ/oxHBwcMBgMAERERBAcHMy6deu09ampqezcuZPIyEgAIiMjSU5OJiYmRiuzfv16DAYD7du3r4BPYX6OYY201/bQEQugSa8W6Bzz/i8P/m+f9n8ohBCVkd0n4H79+jFt2jT++OMPzpw5w/Lly5k9e7bWcUpRFMaOHcvUqVP5/fffOXToEE8++SShoaEMGDAAgEaNGtGrVy+effZZdu3axdatWxk9ejSDBw8mNDTUip+u7Bxq/puAc+0kAbv7eVCvc14P7pRLNzi/94x1AxJCCAuy+yboefPm8c477zBy5EgSExMJDQ3lueeeY8KECVqZ1157jfT0dEaMGEFycjIdO3Zk1apVuLq6amWWLFnC6NGj6datGzqdjkGDBjF37lxrfCSzcMyXgHPOH7FiJKXT/MHWHFufF++B3/dSu61lmqGFEMLa7D4Be3l5MWfOHObMmVNkGUVRmDJlClOmTCmyjL+/P0uXLrVAhNahCwwHZzfIvmU3V8AAjXs0w9HFkZysHA6t3McDEx9C52D3DTVCCFGAfLNVUorOAYcaDQAwXDuP4dZNK0dUMq5ebjS4vwkAaVdvEr/jpJUjEkIIy5AEXIk5mtwHPmrFSEon/xSFMjSlEKKykgRciTmE2V9HLIAG3Zrg7O4MwOE/95OTnWPliIQQwvwkAVdiJh2x7CgBO7s506hH3oQSt5IzOLnlmJUjEkII85MEXIk5hNYHJe+/ONeOekIDNO/3bzP0QWmGFkJUQpKAKzHF2Q2H4LzHeHIvn0TNybZyRCVXv0tDXL3dADiy+iD6TPsZ0F0IIUpCEnAlpw3IkasnN+GUdYMpBUcXJ5r0ag5AVloWxzfY1xW8EEIURxJwJWcyItZ5+7kPDHmDchhJb2ghRGUjCbiSs8cxoY3qdKiPh78HAEfXHiYrPauYLYQQwn5IAq7kHGrY56NIAA6ODjTt2woAfaaejfOjSbl8w8pRCSGEeUgCruR0Xv4ovkFAXgJWVdXKEZVO/kE5Ns5bw4x7JrH7h+1WjEgIIcxDEnAV4FizMQDqrZsYrl+wcjSl4xvmb/JeNagsf+MHuRIWQtg9ScBVgL2OiAWQdPZagWVqrsr1MwWXCyGEPZEEXAWYTk1oXwm4ekQAik4xWaboFKqFV7dSREIIYR6SgKsAe74C9gnxY+CMwZAvB7ca1A6fED/rBSWEEGYgCbgK0PnXRHH1BOwvAQO0GxzJk/8dob2/eOC83XUmE0KI20kCrgIUnQ6Hmg0BMNy4jCHN/jowNerelNrt8obVvHL8Mic22c/0ikIIURhJwFWEwz89ocE+r4IBOj57n/Z6yxcbrBiJEEKUnyTgKsKeR8QyatyjGX61qgFwYvNREo5esnJEQghRdpKAqwh7HhPaSOego8Pwrtr7rV9utFosQghRXpKAqwiHkLrg4ATYbxM0QNtH22vTFO5bvpubV1OtHJEQQpSNJOAqQnF0xiGkDgC5V06jZmdaOaKycfF05e4h9wKQm53Ljm+2WDkiIYQoG0nAVYjWDG3IJffScesGUw73PtUZnWPeqbvzm7/R38q2ckRCCFF6koCrEJMRsey4GdonxI9mD+TNkpSelM6+X3dbOSIhhCg9ScBVSGV4FMmo4zP5Hkn6ciMGg8GK0QghROlJAq5CjINxgP32hDaq2aIWEe3z7mlfPXmF4xvt+/MIIaoeScBViM7dG121mgDkXDqGasi1ckTlIwNzCCHsmSTgKkbriJWVgeHqOesGU04NuzelWngAAKe2HOfykYtWjkgIIUpOEnAVUxlGxDLS6XR0eKar9v5vuQoWQtgRScBVjOmIWEesGIl5tHnkbtx83AE4+FsMqQkpVo5ICCFKRhJwFVOZekIDOLu70P7/OgCQq89l+9d/WzkiIYQoGUnAVYzOLxjFwxeAnAuVY0q/yGGdcXByAGDnd1vIzsiyckRCCFE8ScBVjKIo2uNIaupVDClXrRxR+XkH+9D8wdYA3ErOYO+yXVaOSAghiicJuApyzNcMbe8dsYxMHkmSgTmEEHZAEnAVZNIRq5Ik4NAmNanToT4A1+OvcnRtrJUjEkKIO5MEXAU5hFWuntBGMjCHEMKeSAKughyC7gJHZ6DydMQCqH9fIwLqBAIQv+MkFw/a90AjQojKTRJwFaQ4OOIQmtdca7h6BjUz3coRmUfewBym94KFEMJWSQKuorQRsVSVnIvHrBuMGbUe1A53Pw8ADv5vLymXb1g5IiGEKJwk4Cqqsg3IYeTk5sw9T3YEwJBjYNuizVaOSAghCicJuIqqjD2hje55shMOznkDc+xaso2sdBmYQwhheyQBV1GONRqAogCQU4l6QgN4BXrTckBbADJTbxHz0w4rRySEEAVVigR88eJF/u///o9q1arh5uZGs2bN2LNnj7ZeVVUmTJhASEgIbm5uREVFceLECZM6kpKSGDJkCN7e3vj6+jJ8+HDS0tIq+qNUGMXVA11AOAC5l46j5uZYNyAz65ivM9bWLzdiyJWBOYQQtsXuE/CNGzfo0KEDTk5O/PXXXxw5coQPP/wQPz8/rczMmTOZO3cun332GTt37sTDw4OePXuSmZmplRkyZAixsbFER0ezcuVKNm/ezIgRI6zxkSqM4z9DUpKTTe6VeOsGY2bBjUKp26kBAEnnrhO35pCVIxJCCFN2n4BnzJhBWFgYixYt4u677yYiIoIePXpQp04dIO/qd86cObz99tv079+f5s2b880333Dp0iVWrFgBQFxcHKtWreLLL7+kffv2dOzYkXnz5vHDDz9w6dIlK346y6psUxPertOI+7XXMjCHEMLWOFo7gPL6/fff6dmzJ4888gibNm2iRo0ajBw5kmeffRaA+Ph4EhISiIqK0rbx8fGhffv2bN++ncGDB7N9+3Z8fX1p27atViYqKgqdTsfOnTsZOHBggf1mZWWRlfVv557U1FQA9Ho9er2+TJ/FuF1Zty+1f54FBsg+F4uudZ9SbV7h8ZZS+L11CKgXxNUTVziz+zRnYk4Dthvv7Wz9+N5O4rUsidfyzBFzaba1+wR8+vRpFixYwLhx4/h//+//sXv3bl566SWcnZ0ZOnQoCQkJAAQFBZlsFxQUpK1LSEggMDDQZL2joyP+/v5amdtNnz6dyZMnF1i+Zs0a3N3dy/WZoqOjy7V9STllpXLPP68TD2zhsHOTMtVTUfGWhVc7f66euALAb9N/pt7TzWw63sJIvJYl8VqWvcUL5Ys5IyOjxGXtPgEbDAbatm3Le++9B0CrVq04fPgwn332GUOHDrXYft98803GjRunvU9NTSUsLIwePXrg7e1dpjr1ej3R0dF0794dJycnc4V6R2kxn6LevI5f5lV69+6N8k/P6JKwRrylpe+mZ/bqqaRfTyPpwDWykm7xwH8etNl487OH45ufxGtZEq/lmSNmY2toSdh9Ag4JCaFx48Ymyxo1asQvv/wCQHBwMABXrlwhJCREK3PlyhVatmyplUlMTDSpIycnh6SkJG3727m4uODi4lJguZOTU7lPNnPUUVKOYY3RH/kbMlJwSLuOg39I8RvdpiLjLS0nJyfuGdqJdbP/Qs01cHb5STK6pVO9VoC1QysxWz6+hZF4LUvitbzyxFya7ey+E1aHDh04dsx0KMXjx49Tu3ZtACIiIggODmbdunXa+tTUVHbu3ElkZCQAkZGRJCcnExMTo5VZv349BoOB9u3bV8CnsJ7KPCCH0T1PdETnmHeqJ+1LZHanqez+YbuVoxJCVHV2n4BffvllduzYwXvvvcfJkydZunQpn3/+OaNGjQJAURTGjh3L1KlT+f333zl06BBPPvkkoaGhDBgwAMi7Yu7VqxfPPvssu3btYuvWrYwePZrBgwcTGhpqxU9neaYJuPL1hAbI1edgyPn3OWDVoLL8jR9knGghhFXZfRN0u3btWL58OW+++SZTpkwhIiKCOXPmMGTIEK3Ma6+9Rnp6OiNGjCA5OZmOHTuyatUqXF1dtTJLlixh9OjRdOvWDZ1Ox6BBg5g7d641PlKFcgz7t/k+53zlvAK+Fn+1wDI1V+X6mWv4hPgVsoUQQlie3SdggAceeIAHHnigyPWKojBlyhSmTJlSZBl/f3+WLl1qifBsmi6gFri4Q1ZGpW2Crh4RgKJTUA2qyXI3Xw8rRSSEEJWgCVqUj6JzwDE0b8Qow/ULGDJK3oPPXviE+DFwxmAUnWkP77+mrZAhKoUQViMJWOAQlv8+8FErRmI57QZHMu7vt6n7dFPcfPOe0z6x6SjrPvrLypEJIaoqScCiSvSEBvAJ8aV66yD+M3+odjW8/uPVxK09bOXIhBBVkSRggWO+BJxTSXtC53dXZF16vfmg9v6nMd8W2lFLCCEsSRKwwCG0PujyJrCvzFfA+XV67n6a9mkB5M0ZvGTEf8m+lW3lqIQQVYkkYIHi7IpD0F0A5F4+hZpT+RORoig8/OEQAurmjRGecPQSy9/4AVVVi9lSCCHMQxKwAPLdB87Vk3v5pHWDqSAunq783+fDcfbIG1J0/6972PH131aOSghRVUgCFkDV6Yh1u8B6wTz8wePa+5WTf+XsntNWjEgIUVVIAhYAOOZ7FKmyjohVlGYPtKLTiPsBMOQYWPr8Im4mVr7noYUQtkUSsADAoWZD7XVlHRP6Tnq+2Y+Ie+oCkHolhe9HLiJXn2vlqIQQlZkkYAGAztMfnW/e1Is5F+JQDVVrhCgHRwce+3QY3kE+AMTvPMXq9/9n5aiEEJWZJGChcTBOzJCZjiHpgnWDsQKvAG8eX/g0Dk55j2T9/fl6Dq3cZ+WohBCVlSRgoTHpiFXF7gMb1W4TQd8JA7X3y15ZQuKJBCtGJISorCQBC41jvvvAOVWoJ/Tt7hnaiZYPtQUgOyOb7579ksybt6wclRCispEELDQO+eYGrqpXwJA3SMfA9wcT3CgUgKunEln2ylIZpEMIYVaSgIVGV60miqsnUDXGhL4TZzdnhiwcjqu3GwCxfx3g74XrrRyVEKIykQQsNIqiaPeB1eQrGG4mWTki66oeEcCjHz+hvV81/XdObT1uxYiEEJWJJGBhwqQZ+mLVbYY2ahTVlPvH9ARANah8P2oxKZdvWDkqIURlIAlYmDCZmrAK3wfOr9vLvanXJa+DWvr1NL5+6nOOb4yTRCyEKBdJwMKE6YhYkoABdA46/jNvKL41/QG4HHuRRU8sYMY9k9j9w3YrRyeEsFeSgIUJh5C64OAESALOz8PPgwHTHjFZphpUlr/+AzcuVu175UKIspEELEwojs55SRjITTiNmi3Pvxo5ujoVWKYaVL54ZC6H/9yPoYoN3ymEKB9JwKIAbUQs1UDuJen1a1Q9IgBFpxRYfuN8Ekue+4pPes/iyOqD8rywEKJEJAGLAhzz9YTOPr7DipHYFp8QPwbOGIzikJeEFZ2CXy1/bf3lIxf59pkv+aTvLOLWHpZELIS4I0drByBsT27yFe115ooPcfDwx6XDI3fYoupoNziS+l0acv3MNaqFV8c72JdjG46w9sO/uHjwHACXDl3gm6c+p2aLWkS90of6XRuhKAWvnIUQVZskYGHCcCOBrLX/NVmWvuRtFJ8AnJt2tU5QNsYnxA+fED/tfcP7m9DgvsYcXXuYtbP/4tLhvJmkLhw4x+InPyOsdTjdX+lD3U4NJBELITTSBC1M5CaeAfX2zkQqaZ+OIOW9/mRu+g5DRoo1QrNpiqLQqHszRv85nv/74hltHGmA83vP8NWQT1k46GNObT0uTdNCCECugMVtHALDQdEVkoTzHkvK+HEKGb/OwLlVTxzaPwSSTEwoikKTXs1p1KMpR1YdZO2Hf3Hl+GUAzu4+zZeDPyHinrpEjetNtfDqXIu/SvWIAJMraiFE1SAJWJjQ+QXj8fi7pH//DhgMoOhwvvtBcq+cJvfMwbxC+iyyd/0Ou36njXt1slwu43Dvw+h8AqwbvA3R6XQ07dOSxr2ac3jlftZ+9BdXT+bdW4/fcZIvHp2nlVUUhV7/70E6PXe/NFELUYVIAhYFuHR4BKfGnci9ehaHgNro/IIByLlwlKxty8je9RvqP83Q7hnXyP7fR2T/MRenZvfhcm/etoqDnFqQl4ibP9iapn1bcvD3vaybs4prpxNNyqiqyl/TfmPt7L8IrBdMQJ1AAuoE4R9ejYyLaeiz9Dg5FXwGWQhh3+RbUhRK5xesJV4jx5oNcXz0bdwHjid7fzSZW34k98TOvJWGXPQH1qI/sBbFNwiXyEG4RA5CcXAiN/EMDoHhBeqrSnQOOloObEuzfq2I/uAPNs1fW6CM/lY2Fw+e03pTGx16fxd+Yf5UrxNEQJ1AAusGEVAniOp1AsnV53L9TPmbsVMu35DmcCEqmCRgUWqKkwsu7R5A17In65d9QwfXG+h3rUBNybuyU5OvkPnXp2T+9Wm+jRRcOj6GU9MuKE7O4OiC4uQCjs7//Jv3XnF0BidncHAyaY413EgodyI3JCfgc/0khuQECAgr8+cvTywOjg5EDu3E5gXr8HC+hZ9HOjfSPUjLdMU31JeUyykFOmmpqkrSuesknbvO8Q2m8zR7umZqdbjXCiegThDO7s44uznj7O6Ck7szzm5OOLm7/LMsb7mzuzNO/7w/ujaWrR//hK9bOsm3PLj/rSdoOzgSnYMORaeUuFk85dhxHA/sI6VOXao3bVKq45Jf8rGjpMQexqdJU3wbNCx+AwvWY0uxyPG1fD3mOsYlpajSJdMsUlNT8fHxISUlBW9v7zLVodfr+fPPP+nTp49dNDnmj9dRp6A/8jdZW39Cf3gjGHLLV7mi5CVnRxdU1QCZaf+u8vRHcfcGFFD4519josh7ra3757UhPRn1xuV/6/APRefpT2kZ0pJQky6Vu57MKwk4Zl5DUfL6seW4Vsc1KBhVVcnJyiEnS48+U09GWgY6g0JOVk6BoS7dnLPxccvU6ki55cqtbOdSx1JcPQqK8UXeO+W214CLYybeLre0Om5muZNlcCNfJRSexk1XOCsZeDln/FtPtgd61bSeknDiFl7O6Vo9adkeZONWoFxubi4ODg6F1uHMLTwL1OFesgBM6skodz3mqKPi61HzHd+C/3G2/JkMKlyr/zQNX36j1PWUJhdIAjaTqp6A88drSEkk438fk73tZytGJ4QQZWcwgOPLv5f6iro0uUCaoIXZ6XwCce/7ItnbfzF9nElRcO32NDg6gz4LNScbcrJQ9Vmo+mzIyUbVZ+Uty8kGfRaG9BTU5ISCO3HxQNE5ACqoKioqqGjv8x6P+udfQ27hV+SKDkrT61hVC308y5L1qKpaeBOwQQUK1qGi5NVDIX9XF7ZINVDI8NZ51Zf0chO18DoMFH1cCv2zX0VXyMgEeRf+pekdbo56JBbL1mNLsRRej04HqUdiy9WkXRxJwMIiCjzOpNPh8di7pR7S0nAjgeS3u5omLJ0O3wl/lfj+a5F1vLuxVPdwK7qeO7WIGG4kcOOtLij5MpmKDr9ppY+lsHr83yt5PcnHjpIz50GTJFyWq4eKrudOx9eWPpMtxVKaeuzl+N6pHu/Glr0PLCNhCYtx6fAIvu9uxGvst/i+u7FM40kbE7n25+k/ibw0SUarQ/mnDqX0dZgrFnPVo/MLxnPIVJPP5DmkbLGUtx7fBg25Vv9pjLeoDQa41uDpUl852FI9Eotl67GlWMxZT2nJPWAzkXvAlo3XcCOhwHPJpZV19TzbV/5M5AOP4FLeXtDljKUk9ZTk+FZULCVx7XAsO39dRvuHHi53L93UI7F4N25S7p6xd6qnJMe3omIpCTm+ZY+lpMxxjOUesKh0CnsuudR1+AaT4l8HnW856zFDLOaqx5Zi8WlQn5wWLfFpUL9c9fg2aGiWKw9z1GNLscjxtXw95jrGJSVN0EIIIYQVSAIWQgghrEASsBBCCGEFlSoBv//++yiKwtixY7VlmZmZjBo1imrVquHp6cmgQYO4cuWKyXbnzp2jb9++uLu7ExgYyPjx48nJyang6IUQQlQllSYB7969m4ULF9K8eXOT5S+//DL/+9//+Pnnn9m0aROXLl3ioYce0tbn5ubSt29fsrOz2bZtG19//TWLFy9mwoQJFf0RhBBCVCGVIgGnpaUxZMgQvvjiC/z8/p3JJSUlhf/+97/Mnj2b+++/nzZt2rBo0SK2bdvGjh07AFizZg1Hjhzhu+++o2XLlvTu3Zt3332X+fPnk52dba2PJIQQopKrFI8hjRo1ir59+xIVFcXUqVO15TExMej1eqKiorRlDRs2pFatWmzfvp177rmH7du306xZM4KCgrQyPXv25IUXXiA2NpZWrVoVus+srCyysrK096mpqUDes296vb5Mn8O4XVm3r2gSr2VJvJYl8VqWvcUL5om5NNvafQL+4Ycf2Lt3L7t37y6wLiEhAWdnZ3x9fU2WBwUFkZCQoJXJn3yN643rijJ9+nQmT55cYPmKFStwdy/9TBz5/fbbb+XavqJJvJYl8VqWxGtZ9hYvlC/mjIwMgALTihbGrhPw+fPnGTNmDNHR0bi6ulbovt98803GjRunvb948SKNGzfmmWeeqdA4hBBC2J6bN2/i4+NzxzJ2nYBjYmJITEykdevW2rLc3Fw2b97MJ598wurVq8nOziY5OdnkKvjKlSsEB+eN+hMcHMyuXbtM6jX2kjaWKYyLiwsuLi7ae09PT86fP4+Xl1eJJzC/XWpqKmFhYZw/f77Mw1lWJInXsiRey5J4Lcve4gXzxKyqKjdv3iQ0NLTYsnadgLt168ahQ4dMlj311FM0bNiQ119/nbCwMJycnFi3bh2DBg0C4NixY5w7d47IyEgAIiMjmTZtGomJiQQGBgIQHR2Nt7c3jRs3LnEsOp2OmjVrmuVzeXt7280JCxKvpUm8liXxWpa9xQvlj7m4K18ju07AXl5eNG3a1GSZh4cH1apV05YPHz6ccePG4e/vj7e3Ny+++CKRkZHcc889APTo0YPGjRvzxBNPMHPmTBISEnj77bcZNWqUyRWuEEIIYU52nYBL4qOPPkKn0zFo0CCysrLo2bMnn376qbbewcGBlStX8sILLxAZGYmHhwdDhw5lypQpVoxaCCFEZVfpEvDGjRtN3ru6ujJ//nzmz59f5Da1a9fmzz//tHBkxXNxcWHixIl2c+Ut8VqWxGtZEq9l2Vu8UPExy3zAQgghhBVUipGwhBBCCHsjCVgIIYSwAknAQgghhBVIAhZCCCGsQBJwBZs/fz7h4eG4urrSvn37AqNw3e7nn3+mYcOGuLq60qxZswrrrT19+nTatWuHl5cXgYGBDBgwgGPHjt1xm8WLF6MoislPRQ0ROmnSpAL7btiw4R23sdaxNQoPDy8Qs6IojBo1qtDyFX18N2/eTL9+/QgNDUVRFFasWGGyXlVVJkyYQEhICG5ubkRFRXHixIli6y3t74A54tXr9bz++us0a9YMDw8PQkNDefLJJ7l06dId6yzLeWWOeAGGDRtWYN+9evUqtl5rHF+g0HNZURRmzZpVZJ2WOr4l+f4qyVzxtyvrOV8UScAV6Mcff2TcuHFMnDiRvXv30qJFC3r27EliYmKh5bdt28Zjjz3G8OHD2bdvHwMGDGDAgAEcPnzY4rFu2rSJUaNGsWPHDqKjo9Hr9fTo0YP09PQ7buft7c3ly5e1n7Nnz1o8VqMmTZqY7HvLli1FlrXmsTXavXu3SbzR0dEAPPLII0VuU5HHNz09nRYtWhT5CN/MmTOZO3cun332GTt37sTDw4OePXuSmZlZZJ2l/R0wV7wZGRns3buXd955h7179/Lrr79y7NgxHnzwwWLrLc15Za54jXr16mWy7++///6OdVrr+AImcV6+fJmvvvoKRVG0UQiLYonjW5Lvr+Lmii9MWc75O1JFhbn77rvVUaNGae9zc3PV0NBQdfr06YWWf/TRR9W+ffuaLGvfvr363HPPWTTOwiQmJqqAumnTpiLLLFq0SPXx8am4oPKZOHGi2qJFixKXt6VjazRmzBi1Tp06qsFgKHS9NY8voC5fvlx7bzAY1ODgYHXWrFnasuTkZNXFxUX9/vvvi6yntL8D5oq3MLt27VIB9ezZs0WWKe15VVaFxTt06FC1f//+parHlo5v//791fvvv/+OZSrq+N7+/ZWcnKw6OTmpP//8s1YmLi5OBdTt27cXWkdZz/k7kSvgCpKdnU1MTIzJ3MQ6nY6oqCi2b99e6Dbbt283KQ95cxUXVd6SUlJSAPD3979jubS0NGrXrk1YWBj9+/cnNja2IsID4MSJE4SGhnLXXXcxZMgQzp07V2RZWzq2kHd+fPfddzz99NN3nMzDmsc3v/j4eBISEkyOoY+PD+3bty/yGJbld8CSUlJSUBSlwHSltyvNeWVuGzduJDAwkAYNGvDCCy9w/fr1Isva0vG9cuUKf/zxB8OHDy+2bEUc39u/v4qbK74wZTnniyMJuIJcu3aN3NzcQuceLmre4aLmKr7TPMWWYDAYGDt2LB06dCgw9nZ+DRo04KuvvuK3337ju+++w2AwcO+993LhwgWLx9i+fXsWL17MqlWrWLBgAfHx8XTq1ImbN28WWt5Wjq3RihUrSE5OZtiwYUWWsebxvZ3xOJXmGJbld8BSMjMzef3113nsscfuOOh+ac8rc+rVqxfffPMN69atY8aMGWzatInevXuTm5tbaHlbOr5ff/01Xl5exTbpVsTxLez7qyRzxd+uLOd8cSrdUJTC/EaNGsXhw4eLvTcTGRmpzTIFcO+999KoUSMWLlzIu+++a9EYe/furb1u3rw57du3p3bt2vz0008l+ivc2v773//Su3fvO05hZs3jW5no9XoeffRRVFVlwYIFdyxrzfNq8ODB2utmzZrRvHlz6tSpw8aNG+nWrZtF911eX331FUOGDCm2k2BFHN+Sfn9Zg1wBV5Dq1avj4OBQoJdd/rmJbxccHFyq8pYwevRoVq5cyYYNG0o93aKTkxOtWrXi5MmTFoquaL6+vtSvX7/IfdvCsTU6e/Ysa9eu5ZlnninVdtY8vsbjVJpjWJbfAXMzJt+zZ89q046WRnHnlSXdddddVK9evch928LxBfj77785duxYqc9nMP/xLer7Kzg4WJsrPr/ivo+NZUq6TXEkAVcQZ2dn2rRpw7p167RlBoOBdevWmVzV5BcZGWlSHvLmKi6qvDmpqsro0aNZvnw569evJyIiotR15ObmcujQIUJCQiwQ4Z2lpaVx6tSpIvdtzWN7u0WLFhEYGEjfvn1LtZ01j29ERATBwcEmxzA1NZWdO3cWeQzL8jtgTsbke+LECdauXUu1atVKXUdx55UlXbhwgevXrxe5b2sfX6P//ve/tGnThhYtWpR6W3Md3+K+v9q0aaPNFW90+1zxtyvLOV+SQEUF+eGHH1QXFxd18eLF6pEjR9QRI0aovr6+akJCgqqqqvrEE0+ob7zxhlZ+69atqqOjo/rBBx+ocXFx6sSJE1UnJyf10KFDFo/1hRdeUH18fNSNGzeqly9f1n4yMjK0MrfHO3nyZHX16tXqqVOn1JiYGHXw4MGqq6urGhsba/F4X3nlFXXjxo1qfHy8unXrVjUqKkqtXr26mpiYWGis1jy2+eXm5qq1atVSX3/99QLrrH18b968qe7bt0/dt2+fCqizZ89W9+3bp/Uafv/991VfX1/1t99+Uw8ePKj2799fjYiIUG/duqXVcf/996vz5s3T3hf3O2CpeLOzs9UHH3xQrVmzprp//36TczorK6vIeIs7rywV782bN9VXX31V3b59uxofH6+uXbtWbd26tVqvXj01MzOzyHitdXyNUlJSVHd3d3XBggWF1lFRx7ck31/PP/+8WqtWLXX9+vXqnj171MjISDUyMtKkngYNGqi//vqr9r4k53xpSAKuYPPmzVNr1aqlOjs7q3fffbe6Y8cObV2XLl3UoUOHmpT/6aef1Pr166vOzs5qkyZN1D/++KNC4gQK/Vm0aFGR8Y4dO1b7bEFBQWqfPn3UvXv3Vki8//nPf9SQkBDV2dlZrVGjhvqf//xHPXnyZJGxqqr1jm1+q1evVgH12LFjBdZZ+/hu2LCh0HPAGJPBYFDfeecdNSgoSHVxcVG7detW4HPUrl1bnThxosmyO/0OWCre+Pj4Is/pDRs2FBlvceeVpeLNyMhQe/TooQYEBKhOTk5q7dq11WeffbZAIrWV42u0cOFC1c3NTU1OTi60joo6viX5/rp165Y6cuRI1c/PT3V3d1cHDhyoXr58uUA9+bcpyTlfGjIdoRBCCGEFcg9YCCGEsAJJwEIIIYQVSAIWQgghrEASsBBCCGEFkoCFEEIIK5AELIQQQliBJGAhhBDCCiQBCyEsLjw8nDlz5lg7DCFsiiRgISqZYcOGMWDAAAC6du3K2LFjK2zfixcvLnR+3d27dzNixIgKi0MIeyDTEQohipWdnY2zs3OZtw8ICDBjNEJUDnIFLEQlNWzYMDZt2sTHH3+MoigoisKZM2cAOHz4ML1798bT05OgoCCeeOIJrl27pm3btWtXRo8ezdixY6levTo9e/YEYPbs2TRr1gwPDw/CwsIYOXIkaWlpAGzcuJGnnnqKlJQUbX+TJk0CCjZBnzt3jv79++Pp6Ym3tzePPvqoyTRvkyZNomXLlnz77beEh4fj4+PD4MGDTSZqX7ZsGc2aNcPNzY1q1aoRFRVFenq6hY6mEOYnCViISurjjz8mMjKSZ599lsuXL3P58mXCwsJITk7m/vvvp1WrVuzZs4dVq1Zx5coVHn30UZPtv/76a5ydndm6dSufffYZADqdjrlz5xIbG8vXX3/N+vXree211wC49957mTNnDt7e3tr+Xn311QJxGQwG+vfvT1JSEps2bSI6OprTp0/zn//8x6TcqVOnWLFiBStXrmTlypVs2rSJ999/H4DLly/z2GOP8fTTTxMXF8fGjRt56KGHkKHthT2RJmghKikfHx+cnZ1xd3c3mTD8k08+oVWrVrz33nvasq+++oqwsDCOHz9O/fr1AahXrx4zZ840qTP//eTw8HCmTp3K888/z6effoqzszM+Pj4oinLHCcrXrVvHoUOHiI+PJywsDIBvvvmGJk2asHv3btq1awfkJerFixfj5eUFwBNPPMG6deuYNm0aly9fJicnh4ceeojatWsD0KxZs3IcLSEqnlwBC1HFHDhwgA0bNuDp6an9NGzYEMi76jRq06ZNgW3Xrl1Lt27dqFGjBl5eXjzxxBNcv36djIyMEu8/Li6OsLAwLfkCNG7cGF9fX+Li4rRl4eHhWvIFCAkJITExEYAWLVrQrVs3mjVrxiOPPMIXX3zBjRs3Sn4QhLABkoCFqGLS0tLo168f+/fvN/k5ceIEnTt31sp5eHiYbHfmzBkeeOABmjdvzi+//EJMTAzz588H8jppmZuTk5PJe0VRMBgMADg4OBAdHc1ff/1F48aNmTdvHg0aNCA+Pt7scQhhKZKAhajEnJ2dyc3NNVnWunVrYmNjCQ8Pp27duiY/tyfd/GJiYjAYDHz44Yfcc8891K9fn0uXLhW7v9s1atSI8+fPc/78eW3ZkSNHSE5OpnHjxiX+bIqi0KFDByZPnsy+fftwdnZm+fLlJd5eCGuTBCxEJRYeHs7OnTs5c+YM165dw2AwMGrUKJKSknjsscfYvXs3p06dYvXq1Tz11FN3TJ5169ZFr9czb948Tp8+zbfffqt1zsq/v7S0NNatW8e1a9cKbZqOioqiWbNmDBkyhL1797Jr1y6efPJJunTpQtu2bUv0uXbu3Ml7773Hnj17OHfuHL/++itXr16lUaNGpTtAQliRJGAhKrFXX30VBwcHGjduTEBAAOfOnSM0NJStW7eSm5tLjx49aNasGWPHjsXX1xedruivhBYtWjB79mxmzJhB06ZNWbJkCdOnTzcpc++99/L888/zn//8h4CAgAKduCDvyvW3337Dz8+Pzp07ExUVxV133cWPP/5Y4s/l7e3N5s2b6dOnD/Xr1+ftt9/mww8/pHfv3iU/OEJYmaJKv30hhBCiwskVsBBCCGEFkoCFEEIIK5AELIQQQliBJGAhhBDCCiQBCyGEEFYgCVgIIYSwAknAQgghhBVIAhZCCCGsQBKwEEIIYQWSgIUQQggrkAQshBBCWIEkYCGEEMIK/j+CEDC1u43oMAAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_histories(histories, labels)" - ] - }, - { - "cell_type": "markdown", - "id": "32341937-4178-41d2-a10e-5e4d2634098e", - "metadata": {}, - "source": [ - "The hyperoptimization can lead to a faster convergence of the algorithm." - ] - }, - { - "cell_type": "code", - "execution_count": 88, - "id": "82b89092-07e5-4788-9ae0-8907df2428eb", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "visualize_matrix(dbf_1.h.matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": 89, - "id": "ac8ed320-04a8-42af-a980-48ab4f1fff7c", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "visualize_matrix(.h.matrix)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.0" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/src/qibo/models/double_bracket.py b/src/qibo/models/double_bracket.py deleted file mode 100644 index f29a1f427f..0000000000 --- a/src/qibo/models/double_bracket.py +++ /dev/null @@ -1,193 +0,0 @@ -from copy import deepcopy -from enum import Enum, auto -from functools import partial - -import numpy as np - -from qibo.backends.numpy import NumpyBackend - -from ..config import raise_error -from ..hamiltonians import Hamiltonian - - -class FlowGeneratorType(Enum): - """Define DBF evolution.""" - - canonical = auto() - """Use canonical commutator.""" - single_commutator = auto() - """Use single commutator.""" - group_commutator = auto() - """Use group commutator approximation""" - # TODO: add double commutator (does it converge?) - - -class DoubleBracketFlow: - """ - Class implementing the Double Bracket flow algorithm. - For more details, see https://arxiv.org/pdf/2206.11772.pdf - - Args: - hamiltonian (Hamiltonian): Starting Hamiltonian; - mode (FlowGeneratorType): type of generator of the evolution. - - Example: - .. code-block:: python - - import numpy as np - from qibo.models.double_bracket import DoubleBracketFlow, FlowGeneratorType - from qibo.quantum_info import random_hermitian - - nqubits = 4 - h0 = random_hermitian(2**nqubits) - dbf = DoubleBracketFlow(Hamiltonian(nqubits=nqubits, matrix=h0)) - - # diagonalized matrix - dbf.h - """ - - def __init__( - self, - hamiltonian: Hamiltonian, - mode: FlowGeneratorType = FlowGeneratorType.canonical, - ): - self.h = hamiltonian - self.h0 = deepcopy(self.h) - self.mode = mode - - def __call__(self, step: float, mode: FlowGeneratorType = None, d: np.array = None): - if mode is None: - mode = self.mode - - if mode is FlowGeneratorType.canonical: - operator = self.backend.calculate_matrix_exp( - 1.0j * step, - self.commutator(self.diagonal_h_matrix, self.h.matrix), - ) - elif mode is FlowGeneratorType.single_commutator: - if d is None: - raise_error(ValueError, f"Cannot use group_commutator with matrix {d}") - operator = self.backend.calculate_matrix_exp( - 1.0j * step, - self.commutator(d, self.h.matrix), - ) - elif mode is FlowGeneratorType.group_commutator: - if d is None: - raise_error(ValueError, f"Cannot use group_commutator with matrix {d}") - operator = ( - self.h.exp(-step) - @ self.backend.calculate_matrix_exp(-step, d) - @ self.h.exp(step) - @ self.backend.calculate_matrix_exp(step, d) - ) - operator_dagger = self.backend.cast( - np.matrix(self.backend.to_numpy(operator)).getH() - ) - self.h.matrix = operator @ self.h.matrix @ operator_dagger - - @staticmethod - def commutator(a, b): - """Compute commutator between two arrays.""" - return a @ b - b @ a - - @property - def diagonal_h_matrix(self): - """Diagonal H matrix.""" - return self.backend.cast(np.diag(np.diag(self.backend.to_numpy(self.h.matrix)))) - - @property - def off_diag_h(self): - return self.h.matrix - self.diagonal_h_matrix - - @property - def off_diagonal_norm(self): - """Norm of off-diagonal part of H matrix.""" - off_diag_h_dag = self.backend.cast( - np.matrix(self.backend.to_numpy(self.off_diag_h)).getH() - ) - return np.real( - np.trace(self.backend.to_numpy(off_diag_h_dag @ self.off_diag_h)) - ) - - @property - def backend(self): - """Get Hamiltonian's backend.""" - return self.h0.backend - - def hyperopt_step( - self, - step_min: float = 1e-5, - step_max: float = 1, - max_evals: int = 1000, - space: callable = None, - optimizer: callable = None, - look_ahead: int = 1, - verbose: bool = False, - ): - """ - Optimize flow step. - - Args: - step_min: lower bound of the search grid; - step_max: upper bound of the search grid; - max_evals: maximum number of iterations done by the hyperoptimizer; - space: see hyperopt.hp possibilities; - optimizer: see hyperopt algorithms; - look_ahead: number of flow steps to compute the loss function; - verbose: level of verbosity. - - Returns: - (float): optimized best flow step. - """ - try: - import hyperopt - except: - raise_error( - ImportError, "hyperopt_step function requires hyperopt to be installed." - ) - - if space is None: - space = hyperopt.hp.uniform - if optimizer is None: - optimizer = hyperopt.tpe - - space = space("step", step_min, step_max) - best = hyperopt.fmin( - fn=partial(self.loss, look_ahead=look_ahead), - space=space, - algo=optimizer.suggest, - max_evals=max_evals, - verbose=verbose, - ) - - return best["step"] - - def loss(self, step: float, look_ahead: int = 1): - """ - Compute loss function distance between `look_ahead` steps. - - Args: - step: flow step. - look_ahead: number of flow steps to compute the loss function; - """ - # copy initial hamiltonian - h_copy = deepcopy(self.h) - - for _ in range(look_ahead): - self.__call__(mode=self.mode, step=step) - - # off_diagonal_norm's value after the steps - loss = self.off_diagonal_norm - - # set back the initial configuration - self.h = h_copy - - return loss - - def energy_fluctuation(self, state): - """Evaluate energy fluctuations""" - energy = self.h.expectation(state) - h = self.h.matrix - h2 = Hamiltonian(nqubits=self.h.nqubits, matrix=h @ h, backend=self.backend) - average_h2 = self.backend.calculate_expectation_state(h2, state, normalize=True) - return np.sqrt(average_h2 - energy**2) diff --git a/tests/test_models_dbf.py b/tests/test_models_dbf.py deleted file mode 100644 index 31bd77c62f..0000000000 --- a/tests/test_models_dbf.py +++ /dev/null @@ -1,106 +0,0 @@ -"""Testing DoubleBracketFlow model""" -import hyperopt -import numpy as np -import pytest - -from qibo.backends import GlobalBackend -from qibo.hamiltonians import Hamiltonian -from qibo.models.double_bracket import DoubleBracketFlow, FlowGeneratorType -from qibo.quantum_info import random_hermitian - -NSTEPS = 50 -"""Number of steps for evolution.""" - - -@pytest.mark.parametrize("nqubits", [3, 4, 5]) -def test_double_bracket_flow_canonical(backend, nqubits): - h0 = random_hermitian(2**nqubits, backend=backend) - dbf = DoubleBracketFlow( - Hamiltonian(nqubits, h0, backend=backend), mode=FlowGeneratorType.canonical - ) - initial_off_diagonal_norm = dbf.off_diagonal_norm - for _ in range(NSTEPS): - dbf(step=np.sqrt(0.001)) - - assert initial_off_diagonal_norm > dbf.off_diagonal_norm - - -@pytest.mark.parametrize("nqubits", [3, 4, 5]) -def test_double_bracket_flow_group_commutator(backend, nqubits): - h0 = random_hermitian(2**nqubits, backend=backend) - d = backend.cast(np.diag(np.diag(backend.to_numpy(h0)))) - dbf = DoubleBracketFlow( - Hamiltonian(nqubits, h0, backend=backend), - mode=FlowGeneratorType.group_commutator, - ) - initial_off_diagonal_norm = dbf.off_diagonal_norm - - with pytest.raises(ValueError): - dbf(mode=FlowGeneratorType.group_commutator, step=0.01) - - for _ in range(NSTEPS): - dbf(step=0.01, d=d) - - assert initial_off_diagonal_norm > dbf.off_diagonal_norm - - -@pytest.mark.parametrize("nqubits", [3, 4, 5]) -def test_double_bracket_flow_single_commutator(backend, nqubits): - h0 = random_hermitian(2**nqubits, backend=backend) - d = backend.cast(np.diag(np.diag(backend.to_numpy(h0)))) - dbf = DoubleBracketFlow( - Hamiltonian(nqubits, h0, backend=backend), - mode=FlowGeneratorType.single_commutator, - ) - initial_off_diagonal_norm = dbf.off_diagonal_norm - - with pytest.raises(ValueError): - dbf(mode=FlowGeneratorType.single_commutator, step=0.01) - - for _ in range(NSTEPS): - dbf(step=0.01, d=d) - - assert initial_off_diagonal_norm > dbf.off_diagonal_norm - - -@pytest.mark.parametrize("nqubits", [3, 4, 5]) -def test_hyperopt_step(backend, nqubits): - h0 = random_hermitian(2**nqubits, backend=backend) - d = backend.cast(np.diag(np.diag(backend.to_numpy(h0)))) - dbf = DoubleBracketFlow(Hamiltonian(nqubits, h0, backend=backend)) - - # find initial best step with look_ahead = 1 - initial_step = 0.01 - delta = 0.02 - - step = dbf.hyperopt_step( - step_min=initial_step - delta, step_max=initial_step + delta, max_evals=100 - ) - - assert step != initial_step - - # evolve following the optimized first step - for generator in FlowGeneratorType: - dbf(mode=generator, step=step, d=d) - - # find the following step size with look_ahead - look_ahead = 3 - - step = dbf.hyperopt_step( - step_min=initial_step - delta, - step_max=initial_step + delta, - max_evals=100, - look_ahead=look_ahead, - ) - - # evolve following the optimized first step - for gentype in range(look_ahead): - dbf(mode=FlowGeneratorType(gentype + 1), step=step, d=d) - - -def test_energy_fluctuations(backend): - h0 = np.array([[1, 0], [0, -1]]) - state = np.array([1, 0]) - dbf = DoubleBracketFlow(Hamiltonian(1, matrix=h0, backend=backend)) - energy_fluctuation = dbf.energy_fluctuation(state=state) - assert energy_fluctuation == 0 From 5f0db911dff5c5299db1c42203088c8d17d2fb8c Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Tue, 21 Nov 2023 13:01:53 +0100 Subject: [PATCH 045/143] new dbi files --- .../code-examples/tutorials/dbi/dbi.ipynb | 1 + examples/dbi/Untitled.ipynb | 92 +++ examples/dbi/dbi.ipynb | 779 ++++++++++++++++++ src/qibo/models/dbi/double_bracket.py | 193 +++++ tests/test_models_dbi.py | 106 +++ 5 files changed, 1171 insertions(+) create mode 120000 doc/source/code-examples/tutorials/dbi/dbi.ipynb create mode 100644 examples/dbi/Untitled.ipynb create mode 100644 examples/dbi/dbi.ipynb create mode 100644 src/qibo/models/dbi/double_bracket.py create mode 100644 tests/test_models_dbi.py diff --git a/doc/source/code-examples/tutorials/dbi/dbi.ipynb b/doc/source/code-examples/tutorials/dbi/dbi.ipynb new file mode 120000 index 0000000000..7deb426d68 --- /dev/null +++ b/doc/source/code-examples/tutorials/dbi/dbi.ipynb @@ -0,0 +1 @@ +../../../../../examples/dbi/dbi.ipynb \ No newline at end of file diff --git a/examples/dbi/Untitled.ipynb b/examples/dbi/Untitled.ipynb new file mode 100644 index 0000000000..3bb5f28454 --- /dev/null +++ b/examples/dbi/Untitled.ipynb @@ -0,0 +1,92 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "0e206e0b-2e57-4b67-8c52-994f48989ccf", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Qibo 0.2.2|INFO|2023-11-17 17:07:57]: Using numpy backend on /CPU:0\n" + ] + } + ], + "source": [ + "import qibo\n", + "from qibo.models.qcnn import QuantumCNN\n", + "import math\n", + "import qibo\n", + "import numpy as np\n", + "import random\n", + "\n", + "qibo.set_backend(\"numpy\")\n", + "data = np.random.rand(16)\n", + "data = data / np.linalg.norm(data)\n", + "data = [data]\n", + "labels = [[1]]\n", + "testbias = np.zeros(1)\n", + "testangles = [random.uniform(0, 2 * np.pi) for i in range(21 * 2)]\n", + "init_theta = np.concatenate((testbias, testangles))\n", + "test_qcnn = QuantumCNN(nqubits=4, nlayers=1, nclasses=2, params=init_theta)\n", + "testcircuit = test_qcnn._circuit\n", + "result = test_qcnn.minimize(\n", + " init_theta, data=data, labels=labels, nshots=10000, method=\"Powell\"\n", + ")\n", + "predict0 = test_qcnn.predict(data, nshots=10000)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "58b7823b-3d33-415f-8bca-6ad0262ce6c4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1.02722098])" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "predict0" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "df635863-ceb4-45bb-9e3d-caa3df9b2773", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/dbi/dbi.ipynb b/examples/dbi/dbi.ipynb new file mode 100644 index 0000000000..716e211941 --- /dev/null +++ b/examples/dbi/dbi.ipynb @@ -0,0 +1,779 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cb748c1a-2ecd-44a2-91d8-c1255a00615b", + "metadata": {}, + "source": [ + "## Double-Bracket Flow diagonalization algorithm\n", + "\n", + "In this example we present the `Qibo`'s implementation of the Double-Bracket Flow (DBF) algorithm, which can be used to prepare the eigenstates of a quantum system. \n", + "\n", + "#### The initial setup\n", + "\n", + "At first we import some useful packages." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5bf7f589-dee5-4ce5-96c2-ee81ea6222e5", + "metadata": {}, + "outputs": [], + "source": [ + "# install extra dependences\n", + "# seaborn is a plotting library\n", + "!pip install seaborn \n", + "# hyperopt is required to optimize the DBF step\n", + "!pip install hyperopt" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "id": "f270b1ea-ee6a-4eac-a0ff-3d7dae296cf0", + "metadata": {}, + "outputs": [], + "source": [ + "from copy import deepcopy\n", + "\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "\n", + "from hyperopt import hp, tpe\n", + "\n", + "from qibo import hamiltonians, set_backend\n", + "from qibo.models.dbi.double_bracket import FlowGeneratorType, DoubleBracketFlow" + ] + }, + { + "cell_type": "markdown", + "id": "ba6e5402-ea34-4979-bb79-fd395567f77d", + "metadata": {}, + "source": [ + "Here we define a simple plotting function useful to keep track of the diagonalization process." + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "4aec7b46-19b9-4004-93c0-a90255e58fd9", + "metadata": {}, + "outputs": [], + "source": [ + "def visualize_matrix(matrix, title=\"\"):\n", + " \"\"\"Visualize hamiltonian in a heatmap form.\"\"\"\n", + " fig, ax = plt.subplots(figsize=(5,5))\n", + " ax.set_title(title)\n", + " try:\n", + " im = ax.imshow(np.absolute(matrix), cmap=\"inferno\")\n", + " except TypeError:\n", + " im = ax.imshow(np.absolute(matrix.get()), cmap=\"inferno\")\n", + " fig.colorbar(im, ax=ax)\n", + "\n", + "def visualize_drift(h0, h):\n", + " \"\"\"Visualize drift of the evolved hamiltonian w.r.t. h0.\"\"\"\n", + " fig, ax = plt.subplots(figsize=(5,5))\n", + " ax.set_title(r\"Drift: $|\\hat{H}_0 - \\hat{H}_{\\ell}|$\")\n", + " try:\n", + " im = ax.imshow(np.absolute(h0 - h), cmap=\"inferno\")\n", + " except TypeError:\n", + " im = ax.imshow(np.absolute((h0 - h).get()), cmap=\"inferno\")\n", + "\n", + " fig.colorbar(im, ax=ax)\n", + "\n", + "def plot_histories(histories, labels):\n", + " \"\"\"Plot off-diagonal norm histories over a sequential evolution.\"\"\"\n", + " colors = sns.color_palette(\"inferno\", n_colors=len(histories)).as_hex()\n", + " plt.figure(figsize=(5,5*6/8))\n", + " for i, (h, l) in enumerate(zip(histories, labels)):\n", + " plt.plot(h, lw=2, color=colors[i], label=l, marker='.')\n", + " plt.legend()\n", + " plt.xlabel(\"Iterations\")\n", + " plt.ylabel(r\"$\\| \\sigma(\\hat{H}) \\|^2$\")\n", + " plt.title(\"Loss function histories\")\n", + " plt.grid(True)\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "9f4cd7cc-9952-4da4-baef-e916300a9365", + "metadata": {}, + "source": [ + "We need to define a target hamiltonian which we aim to diagonalize. As an example, we consider the Transverse Field Ising Model (TFIM):\n", + "$$ H_{\\rm TFIM} = - \\sum_{q=0}^{N}\\bigl( Z_i Z_{i+1} + h X_i \\bigr),$$\n", + "which is already implemented in `Qibo`. For this tutorial we set $N=6$ and $h=3$." + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "id": "2c4ed408-68ed-4054-825c-2a7df0979a4f", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Qibo 0.2.2|INFO|2023-11-17 16:55:09]: Using qibojit (numba) backend on /CPU:0\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# set the qibo backend (we suggest qibojit if N >= 20)\n", + "set_backend(\"qibojit\", \"numba\")\n", + "\n", + "# hamiltonian parameters\n", + "nqubits = 5\n", + "h = 3\n", + "\n", + "# define the hamiltonian\n", + "h = hamiltonians.TFIM(nqubits=nqubits, h=h)\n", + "\n", + "# vosualize the matrix\n", + "visualize_matrix(h.matrix, title=\"Target hamiltonian\")" + ] + }, + { + "cell_type": "markdown", + "id": "4794e779-bf2d-4ab5-97ce-f876d9522a35", + "metadata": {}, + "source": [ + "#### The generator of the evolution\n", + "\n", + "The model is implemented following the procedure presented in [1], and the first practical step is to define the generator of the flow $\\hat{\\mathcal{U}}_{\\ell}$, which executes one diagonalization step $$\\hat{H}_{\\ell} = \\hat{\\mathcal{U}}_{\\ell}^{\\dagger} \\hat{H} \\hat{\\mathcal{U}}_{\\ell}.$$\n", + "In `Qibo`, we define the flow type through a `FlowGeneratorType` object, which can be chosen between one of the following:\n", + "- `canonical`: the generator of the flow at step $k+1$ is defined using the commutator between the off diagonal part $\\sigma(\\hat{H_k})$ and the diagonal part $\\Delta(\\hat{H}_k)$ of the target evolved hamiltonian:\n", + " $$\\hat{\\mathcal{U}}_{k+1}=\\exp\\bigl\\{s[\\Delta(\\hat{H}_k), \\sigma(\\hat{H}_k)]\\bigr\\}.$$ \n", + "- `single_commutator`: the evolution follows a similar procedure of the previous point in this list, but any additional matrix $D_k$ can be used to control the evolution at each step:\n", + " $$ \\hat{\\mathcal{U}}_{k+1}=\\exp\\bigl\\{s[D_k, \\hat{H}_k]\\bigr\\}. $$\n", + "- `group_commutator`: the following group commutator is used to compute the evolution:\n", + " $$ \\hat{\\mathcal{U}}_{k+1}= e^{is\\hat{H_k}} e^{isD_k} e^{-is\\hat{H_k}} e^{-isD_k}, $$\n", + "which approximates the canonical commutator for small $s$.\n", + "\n", + "In order to set one of this evolution generators one can do as follow:" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "id": "26a487e9-366b-4203-b660-e3d4af2bcb68", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "FlowGeneratorType.canonical\n", + "FlowGeneratorType.single_commutator\n", + "FlowGeneratorType.group_commutator\n" + ] + } + ], + "source": [ + "# we have a look inside the FlowGeneratorType class\n", + "for generator in FlowGeneratorType:\n", + " print(generator)" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "da8dce89-27f6-403d-982a-58d531fade48", + "metadata": {}, + "outputs": [], + "source": [ + "# here we set the canonical generator\n", + "flowtype = FlowGeneratorType.canonical" + ] + }, + { + "cell_type": "markdown", + "id": "fc4f9f75-0548-4533-a13c-3aba3191e608", + "metadata": {}, + "source": [ + "#### The `DoubleBracketFlow` class\n", + "\n", + "A `DoubleBracketFlow` object can be initialize by calling the `qibo.models.double_braket.DoubleBracketFlow` model and passing the target hamiltonian and the generator type we want to use to perform the evolutionary steps." + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "055870ec-55f2-4b99-a622-e3aa4c7dd0e9", + "metadata": {}, + "outputs": [], + "source": [ + "dbf = DoubleBracketFlow(hamiltonian=deepcopy(h), mode=flowtype)" + ] + }, + { + "cell_type": "markdown", + "id": "b38cf803-60b4-467a-be8e-cbad5d81f14a", + "metadata": {}, + "source": [ + "#### `DoubleBracketFlow` features" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "9e278c3d-9f34-4a40-b453-4e030c751ef5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Backend: qibojit (numba)\n" + ] + } + ], + "source": [ + "# on which qibo backend am I running the algorithm?\n", + "print(f\"Backend: {dbf.backend}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "id": "5b8e142b-a0a2-41bd-a16a-265a420b7360", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initial form of the target hamiltonian:\n", + "[[-5.-0.j -3.-0.j -3.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", + " [-3.-0.j -1.-0.j -0.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", + " [-3.-0.j -0.-0.j -1.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", + " ...\n", + " [-0.-0.j -0.-0.j -0.-0.j ... -1.-0.j -0.-0.j -3.-0.j]\n", + " [-0.-0.j -0.-0.j -0.-0.j ... -0.-0.j -1.-0.j -3.-0.j]\n", + " [-0.-0.j -0.-0.j -0.-0.j ... -3.-0.j -3.-0.j -5.-0.j]]\n" + ] + } + ], + "source": [ + "# the initial target hamiltonian is a qibo hamiltonian\n", + "# thus the matrix can be accessed typing h.matrix\n", + "print(f\"Initial form of the target hamiltonian:\\n{dbf.h0.matrix}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "4f9d1d41-3df7-49cf-96ca-fa1019c00c33", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# let's visualize it in a more graphical way\n", + "visualize_matrix(dbf.h0.matrix, r\"$H_0$\")" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "7b864712-219c-44b6-8337-19ef0100e318", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcgAAAGiCAYAAABjzlbWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABFYklEQVR4nO3df1hUVf4H8PeAMKgwg6gwoKiYLlIKJgSN/VIhwfqWrGyp0aosi2sLVtD2A9fEcjfsh4oWydNqmiVp7LNpmVEEod9yxBwj04g1v7aQOGCygGDAwNzvH8bUyB2YYWYcLr5f+5xn5c65534u8zx8Oueec65MEAQBREREZMLF2QEQERH1R0yQREREIpggiYiIRDBBEhERiWCCJCIiEsEESUREJIIJkoiISAQTJBERkQgmSCIiIhFMkERERCKYIImIyGq5ubkYN24cPDw8EBUVhSNHjpite/LkSSQkJGDcuHGQyWTIycnpU5utra1ITU3F8OHD4enpiYSEBNTW1trztkwwQRIRkVV2796NjIwMZGVl4dixYwgLC0NsbCzq6upE61+6dAnjx4/H2rVroVKp+txmeno63n//fRQUFODAgQOoqanBvHnzHHKPAACBiIjICpGRkUJqaqrx587OTiEgIEDIzs7u9dyxY8cKGzZssLrNhoYGwc3NTSgoKDDWqaioEAAIGo3Ghrsxb5DjUi8RETlKa2sr2tvb7dKWIAiQyWQmx+RyOeRyebe67e3t0Gq1yMzMNB5zcXFBTEwMNBpNn65vSZtarRZ6vR4xMTHGOpMmTcKYMWOg0Whw88039+naPWGCJCKSmNbWVgQFqaDTNdqlPU9PTzQ3N5scy8rKwurVq7vV/fHHH9HZ2Qk/Pz+T435+fvj222/7dH1L2tTpdHB3d4e3t3e3Ojqdrk/X7Q0TJBGRxLS3t0Ona8T//WcDFIrBNrXV1PQTxo9NR3V1NRQKhfG4WO/xWsMESUQkUQrFYJsT5C9tKUwSpDkjRoyAq6trt9mjtbW1Zifg2KNNlUqF9vZ2NDQ0mPQibblubziLlYhIogShwy7FGu7u7ggPD0dxcbHxmMFgQHFxMdRqdZ/uw5I2w8PD4ebmZlKnsrISVVVVfb5ub9iDJCKSKEHohCB02tyGtTIyMrB48WJEREQgMjISOTk5aGlpQVJSEgBg0aJFGDVqFLKzswFcHhL+5ptvjP8+e/YsysvL4enpiQkTJljUplKpRHJyMjIyMuDj4wOFQoHly5dDrVY7ZIIOwARJRERWmj9/Ps6fP49Vq1ZBp9Nh6tSpKCwsNE6yqaqqgovLLwOUNTU1uPHGG40/v/TSS3jppZdwxx13oLS01KI2AWDDhg1wcXFBQkIC2traEBsbi1dffdVh9ykTBEFwWOtERGR3TU1NUCqV0P24zi6TdFQjHkNjY6NFzyCvJexBEhFJVF+eIYq1QeI4SYeIiEgEEyQRgHXr1mH//v3ODqNHUoiRrq7Lk3RsncVq2ySfgYxDrHTNKygowOrVq+Hm5oZTp05h+PDhzg6pGynESFefYOiAYLBxiNXG8wcy9iDpmtbW1oYnn3wSW7duxZ133omsrCxnh9SNFGIkGoiYIOmalpOTg8mTJ+P+++/Hpk2b8M477xjXa/UXUoiRnETosE8hUVzmQUQkMV3LPH6oWQGFwsPGtloxOuA5LvMQwR4kERGRCCZIumq2b98OmUyG77//3uT4F198genTp2Po0KGQyWQoLy+32zXHjRsn+sqeawl/BwOYoQMw6G0sHGI1hwmSetSV1LqKh4cHAgICEBsbi02bNuHixYs2ta/X63Hfffehvr4eGzZswJtvvomxY8fi0KFDWL16NRoaGuxzI1f46KOPIJPJkJ+fL/r5vffei6FDh8JgMDjk+paQQozkXM7YrPxawmUeZJFnn30WQUFB0Ov10Ol0KC0txaOPPor169fjvffeQ2hoaK9t/P73v8eCBQtM3jN3+vRp/Oc//8E//vEP/PGPfzQeP3ToEJ555hksWbKk2wtS7eGrr74CAERERIh+rtVqMXnyZJP9JK82KcRINJAxQZJF5syZY/KHOjMzEyUlJfif//kf3HvvvaioqMDgweJ7Qra0tGDo0KFwdXWFq6uryWd1dXUA4JAk2JPjx49DoVBg4sSJ3T7T6XSoqanB3XfffVVjupIUYiQnM3QABtfe6/XWBonif3pSn82aNQtPP/00/vOf/+Ctt94CAKxevRoymQzffPMNHnjgAQwbNgy33norgO7PIJcsWYI77rgDAHDfffdBJpNhxowZWL16NR5//HEAQFBQkHF4t+u8b7/9FlVVVTbF/tVXX+HGG2+ETCbr9plWqwUAhIWF2XQNW0khRnIyQ4d9ColiD5Js8vvf/x4rVqzAxx9/jJSUFOPx++67DxMnTsRzzz0HcyuJ/vSnP2HUqFF47rnn8PDDD+Omm26Cn58f/Pz88O9//xtvv/02NmzYgBEjRgAARo4cCQAICQkxeU2Otdrb21FZWYmFCxfiu+++6/Z5SUkJAFg0bOwoUoiRaKBjgiSbjB49GkqlEqdPnzY5HhYWZnZySRe1Wo22tjY899xzuO222/C73/3O+Nm0adPw9ttvIz4+HuPGjbNrzN988w30ej127NiBHTt2mK3nzOQjhRipP+i0w0J/7sVqDhMk2czT07PbbNZly5Y57Hq27m1x/PhxAJd3qBk1alS3z5ctWwYvLy8olUqr2zYYDGhvb7eorlwuFx0+dXSMNHDIDB2QGWx7UibjEKtZTJBks+bmZvj6+pocCwoKclI0vfvqq6/g6uqKZcuWmcyoBYCffvoJ//3vf43PTQHg/PnzWLJkCUpLSzF69Gi8+uqriI6OFm374MGDmDlzpkVxVFRUYNKkSXaJEQCSkpJw4sQJlJWVcWYrkR0wQZJNfvjhBzQ2NmLChAkmx83NaO0Pjh8/juuuu65b4gEuJy2DwWAydJmamgqVSoXz58/jk08+wf33349Tp07Bx8en2/mTJk3Ctm3bLIrD39/fbjEeOnQIDQ0NkMlk0Ov1oufRAGToAGzsQXKSjnlMkGSTN998EwAQGxtr13bNDT3aw/Hjx3HLLbeIfnby5EkAv8wObW5uxp49e/B///d/GDJkCO69915MmTIFe/fuRVJSUrfzVSoVlixZclVjBIC9e/di7ty5eOWVV5gcryVMkA7FcRjqs5KSEqxZswZBQUFITEy0a9tDhw4FANGddGxZ5qHT6VBXV4cbbrhB9PMrk8+pU6fg6emJ0aNHG+tMmTLFWM8RrI0RAEpLS9HZ2Yk777zTYXERXWvYgySLfPjhh/j222/R0dGB2tpalJSUoKioCGPHjsV7770HDw/b3ihwpfDwcADAX//6VyxYsABubm645557MHToUJuWeXTtTtNT8vH09MR1110H4HIP8so3HCgUCly4cMHqazsqxs7OTtTU1ODTTz/lnqvXGJnQAZlg4yQdbjVnFhMkWWTVqlUAAHd3d/j4+GDKlCnIyclBUlISvLy87H69m266CWvWrEFeXh4KCwthMBhw5swZY8+yr7pmh/aUfCZPnmwc4vX09ERTU5NJnaamJnh6etoUhz1jrK2thYuLC9zc3Lo9C6YBzmAADDYu0+BevmbxfZA0oI0bNw5Llizpc8+qubkZPj4+OHPmjHG5xcyZM7Fo0SLRZ5DO8O9//xtTp07Ft99+izFjxnT73NbfAfU/Xe+DPPvNfVB4udnW1kU9Rl1fwPdBiuAzSKIeeHp6Yu7cucjKysJPP/2Effv24fjx45g7d66zQzM6duwYfvOb3yAwMBDFxcXODoeuosvrIG0vJI4JkqgXr776KmpqajB8+HBkZGRg9+7doks8nKG9vR379+/H7NmzMWPGjG7DwTTAGTrtU0gUn0ES9WLkyJHYv3+/s8MQ5e7u3uNWdETUd0yQNKB1vQHkWsbfwQBm6AAMNq4Z5hCrWUyQREQSJTN02mEvVg6xmsNnkERERCL6XQ/SYDCgpqYGXl5eDt1ujIjoahEEARcvXkRAQIB9N5IXOm3fak5gD9Kcfpcga2pqEBgY6OwwiIjsrrq62mTbQlvJDAabh0hl3CjALIclyNzcXLz44ovQ6XQICwvDyy+/jMjIyF7P69qVJX/qXRjiatsCWCKi/uBSpx4PlO93yK5T5DgOSZC7d+9GRkYG8vLyEBUVhZycHMTGxqKysrLbewOv1DWsOsTVDUMHMUES0cBh98dGhk47zGLlEKs5Dpmks379eqSkpCApKQnXX3898vLyMGTIELz++uuOuBwR0TXp8ixW2wuJs3uCbG9vh1arRUxMzC8XcXFBTEwMNBpNt/ptbW1oamoyKURERM5m9wT5448/orOzE35+fibH/fz8oNPputXPzs6GUqk0Fk7QISKyELeacyinr4PMzMxEY2OjsVRXVzs7JCIiSeAQq2PZPUGOGDECrq6uqK2tNTleW1sLlUrVrb5cLodCoTApRETUv+Xm5mLcuHHw8PBAVFQUjhw50mP9goICTJo0CR4eHpgyZUq3/Y1lMploefHFF411xo0b1+3ztWvXOuT+AAckSHd3d4SHh5u8dsdgMKC4uBhqtdrelyMiunY5aYi1a6VCVlYWjh07hrCwMMTGxqKurk60/qFDh7Bw4UIkJyfjyy+/RHx8POLj43HixAljnXPnzpmU119/HTKZDAkJCSZtPfvssyb1li9fbnX8lnLIEGtGRgb+8Y9/4I033kBFRQUeeughtLS09JsXzBIRDQQyg/DzZgG2FMHq61q7UmHjxo2Ii4vD448/jpCQEKxZswbTpk3DK6+8YqyjUqlMyt69ezFz5kyMHz/epC0vLy+TekOHDrU6fks5JEHOnz8fL730ElatWoWpU6eivLwchYWF3SbuEBFR/3DlaoK2tjbRetauVAAAjUZjUh8AYmNjzdavra3FBx98gOTk5G6frV27FsOHD8eNN96IF198ER0djnsbicN20klLS0NaWpqjmiciIkMnYOtOcT8PsV65giArKwurV6/uVr2nlQrffvut6CV0Op3FKxsA4I033oCXlxfmzZtncvzhhx/GtGnT4OPjg0OHDiEzMxPnzp3D+vXre7zFvup3e7ESEZGFBDskyJ83K6+urjaZJCmXy21suO9ef/11JCYmwsPDw+R4RkaG8d+hoaFwd3fHn/70J2RnZzskXiZIIiKyeBWBtSsVgMvPFy2t/7//+7+orKzE7t27e40lKioKHR0d+P777xEcHNxrfWs5fR0kERH1jUww2KVYoy8rFdRqtUl9ACgqKhKtv3XrVoSHhyMsLKzXWMrLy+Hi4tLrHt99xR4kEZFU2fEZpDUyMjKwePFiREREIDIyEjk5OSYrFRYtWoRRo0YhOzsbAPDII4/gjjvuwLp163D33Xdj165dOHr0KF577TWTdpuamlBQUIB169Z1u6ZGo0FZWRlmzpwJLy8vaDQapKen48EHH8SwYcP6cOO9Y4IkIiKrzJ8/H+fPn8eqVaug0+kwdepUk5UKVVVVJi+Gnj59OvLz87Fy5UqsWLECEydOxJ49ezB58mSTdnft2gVBELBw4cJu15TL5di1axdWr16NtrY2BAUFIT093eS5pL3JBEGwfhGMAzU1NUGpVGJP+Fy+7oqIBoSWDj3itXvR2Nhol93Cuv5O/vjhRCiGutrWVksnRsw5ZbfYBhL2IImIpMpgsMP7IG0dox24OEmHiIhIBHuQREQSdXmrONvbIHFMkEREUmUw2GEWKxOkORxiJSIiEsEeJBGRVLEH6VBMkEREUsUE6VAcYiUiIhLBHiQRkVQJnUAfXnhs2gZ7kOYwQRIRSRSXeTgWh1iJiIhEsAdJRCRVnKTjUEyQRERSxQTpUBxiJSIiEsEeJBGRVBkE23uAts6CHcCYIImIpMog2GGIlQnSHA6xEhERiWAPkohIquzywmT2IM1hgiQikiomSIfiECsREZEI9iCJiKSKk3QcigmSiEiqBAMg2DjEKjBBmsMhViIiIhHsQRIRSZVghyFW9iDNYoIkIpIqPoN0KA6xEhERiWAPkohIqtiDdCgmSCIiiRIMl4utbZA4DrESERGJYA+SiEiqOMTqUEyQRERSZYAdEqQ9AhmYOMRKREQkwu4JcvXq1ZDJZCZl0qRJ9r4MEREZ7FRIlEOGWG+44QZ88sknv1xkEEdyiYjsTvi52NoGiXJI5ho0aBBUKpVFddva2tDW1mb8uampyREhERERWcUhzyBPnTqFgIAAjB8/HomJiaiqqjJbNzs7G0ql0lgCAwMdERIR0YAjGGR2KSTO7gkyKioK27dvR2FhITZv3owzZ87gtttuw8WLF0XrZ2ZmorGx0Viqq6vtHRIR0cDEZ5AOZfcEOWfOHNx3330IDQ1FbGws9u/fj4aGBrzzzjui9eVyORQKhUkhIqL+LTc3F+PGjYOHhweioqJw5MiRHusXFBRg0qRJ8PDwwJQpU7B//36Tz5csWdJtgmdcXJxJnfr6eiQmJkKhUMDb2xvJyclobm62+711cfgyD29vb/zmN7/Bd9995+hLERFdWwQZYLCx9OGFy7t370ZGRgaysrJw7NgxhIWFITY2FnV1daL1Dx06hIULFyI5ORlffvkl4uPjER8fjxMnTpjUi4uLw7lz54zl7bffNvk8MTERJ0+eRFFREfbt24eDBw9i6dKlVsdvKYcnyObmZpw+fRr+/v6OvhQR0TXFWc8g169fj5SUFCQlJeH6669HXl4ehgwZgtdff120/saNGxEXF4fHH38cISEhWLNmDaZNm4ZXXnnFpJ5cLodKpTKWYcOGGT+rqKhAYWEhtmzZgqioKNx66614+eWXsWvXLtTU1Fh9D5awe4L8y1/+ggMHDuD777/HoUOH8Nvf/haurq5YuHChvS9FRER20tTUZFJ+vbrg19rb26HVahETE2M85uLigpiYGGg0GtFzNBqNSX0AiI2N7Va/tLQUvr6+CA4OxkMPPYQLFy6YtOHt7Y2IiAjjsZiYGLi4uKCsrMzq+7WE3RPkDz/8gIULFyI4OBj3338/hg8fjsOHD2PkyJH2vhQR0bXN1uHVrgIgMDDQZEVBdna26CV//PFHdHZ2ws/Pz+S4n58fdDqd6Dk6na7X+nFxcdixYweKi4vx/PPP48CBA5gzZw46OzuNbfj6+pq0MWjQIPj4+Ji9rq3svg5y165d9m6SiIjECH17hmjaxuX/q66uNpkkKZfLbWvXSgsWLDD+e8qUKQgNDcV1112H0tJSREdHX9VYunAvViIi6raawFyCHDFiBFxdXVFbW2tyvLa21uwGMSqVyqr6ADB+/HiMGDHCOMFTpVJ1mwTU0dGB+vp6izemsRYTJBGRRDljko67uzvCw8NRXFxsPGYwGFBcXAy1Wi16jlqtNqkPAEVFRWbrA5cf1124cME4wVOtVqOhoQFardZYp6SkBAaDAVFRUVbdg6W4SSoRkVQZXIzPEPvehvWbsWZkZGDx4sWIiIhAZGQkcnJy0NLSgqSkJADAokWLMGrUKONzzEceeQR33HEH1q1bh7vvvhu7du3C0aNH8dprrwG4vNrhmWeeQUJCAlQqFU6fPo0nnngCEyZMQGxsLAAgJCQEcXFxSElJQV5eHvR6PdLS0rBgwQIEBATY9jswgwmSiIisMn/+fJw/fx6rVq2CTqfD1KlTUVhYaJyIU1VVBReXXwYop0+fjvz8fKxcuRIrVqzAxIkTsWfPHkyePBkA4OrqiuPHj+ONN95AQ0MDAgICMHv2bKxZs8ZkqHfnzp1IS0tDdHQ0XFxckJCQgE2bNjnsPmWCIPSrvdybmpqgVCqxJ3wuhg5yc3Y4REQ2a+nQI167F42NjXbZLazr72Td0wooPGzrQTa1CvBd02S32AYS9iCJiCRKEGQQbJzF2r+6SP0LJ+kQERGJYA+SiEiqnDRJ51rBBElEJFGCATa/z1FggjSLQ6xEREQi2IMkIpIqQWb7EKutW9UNYEyQREQSZZ9ZrEyQ5nCIlYiISAR7kEREUmVwuVxsasM+oQxETJBERBLVl83GxdogcRxiJSIiEsEeJBGRRHGSjmMxQRIRSRWfQToUh1iJiIhEsAdJRCRRnKTjWEyQREQSxWeQjsUhViIiIhHsQRIRSRUn6TgUEyQRkUTxGaRjcYiViIhIBHuQREQSxUk6jsUESUQkVYIdnkEK9gllIOIQKxERkQj2IImIJIqTdByLCZKISKIEwfZniAKHWM3iECsREZEI9iCJiKTKDkOs4BCrWUyQREQSJQguEATbBgIFjrGaxSFWIiIiEexBEhFJlUFm+xAph1jNYoIkIpIo7qTjWBxiJSIiEmF1gjx48CDuueceBAQEQCaTYc+ePSafC4KAVatWwd/fH4MHD0ZMTAxOnTplr3iJiOhnXRsF2FpInNUJsqWlBWFhYcjNzRX9/IUXXsCmTZuQl5eHsrIyDB06FLGxsWhtbbU5WCIi+kXXLFZbC4mz+hnknDlzMGfOHNHPBEFATk4OVq5ciblz5wIAduzYAT8/P+zZswcLFiywLVoiIqKrxK7/6XDmzBnodDrExMQYjymVSkRFRUGj0Yie09bWhqamJpNCRES94xCrY9k1Qep0OgCAn5+fyXE/Pz/jZ1fKzs6GUqk0lsDAQHuGREQ0YHXNYrW1kDinDz5nZmaisbHRWKqrq50dEhER9SI3Nxfjxo2Dh4cHoqKicOTIkR7rFxQUYNKkSfDw8MCUKVOwf/9+42d6vR5PPvkkpkyZgqFDhyIgIACLFi1CTU2NSRvjxo2DTCYzKWvXrnXI/QF2TpAqlQoAUFtba3K8trbW+NmV5HI5FAqFSSEiot45qwe5e/duZGRkICsrC8eOHUNYWBhiY2NRV1cnWv/QoUNYuHAhkpOT8eWXXyI+Ph7x8fE4ceIEAODSpUs4duwYnn76aRw7dgz/+te/UFlZiXvvvbdbW88++yzOnTtnLMuXL7c6fkvZNUEGBQVBpVKhuLjYeKypqQllZWVQq9X2vBQR0TVPEOzwDLIPCXL9+vVISUlBUlISrr/+euTl5WHIkCF4/fXXRetv3LgRcXFxePzxxxESEoI1a9Zg2rRpeOWVVwBcnqtSVFSE+++/H8HBwbj55pvxyiuvQKvVoqqqyqQtLy8vqFQqYxk6dKj1vzgLWZ0gm5ubUV5ejvLycgCXJ+aUl5ejqqoKMpkMjz76KP72t7/hvffew9dff41FixYhICAA8fHxdg6diIjs5crJkm1tbaL12tvbodVqTSZjuri4ICYmxuxkTI1GY1IfAGJjY83WB4DGxkbIZDJ4e3ubHF+7di2GDx+OG2+8ES+++CI6OjosvEPrWb3M4+jRo5g5c6bx54yMDADA4sWLsX37djzxxBNoaWnB0qVL0dDQgFtvvRWFhYXw8PCwX9RERGTXt3lcOUEyKysLq1ev7lb/xx9/RGdnp+hkzG+//Vb0GjqdzqrJm62trXjyySexcOFCk8duDz/8MKZNmwYfHx8cOnQImZmZOHfuHNavX9/rffaF1QlyxowZPb4eRSaT4dlnn8Wzzz5rU2BERNQzeyzT6Dq/urraJBnJ5XKb2u0rvV6P+++/H4IgYPPmzSafdXXIACA0NBTu7u7405/+hOzsbIfE6/RZrERE5HxXTpY0l3BGjBgBV1dXqyZjqlQqi+p3Jcf//Oc/KCoq6nXSZlRUFDo6OvD999/3cnd9wwRJRCRRzpjF6u7ujvDwcJPJmAaDAcXFxWYnY6rVapP6AFBUVGRSvys5njp1Cp988gmGDx/eayzl5eVwcXGBr6+vVfdgKb7uiohIopz1uquMjAwsXrwYERERiIyMRE5ODlpaWpCUlAQAWLRoEUaNGoXs7GwAwCOPPII77rgD69atw913341du3bh6NGjeO211wBcTo6/+93vcOzYMezbtw+dnZ3G55M+Pj5wd3eHRqNBWVkZZs6cCS8vL2g0GqSnp+PBBx/EsGHDbPodmMMESUREVpk/fz7Onz+PVatWQafTYerUqSgsLDROxKmqqoKLyy8DlNOnT0d+fj5WrlyJFStWYOLEidizZw8mT54MADh79izee+89AMDUqVNNrvXpp59ixowZkMvl2LVrF1avXo22tjYEBQUhPT3d5LmkvcmEnmbcOEFTUxOUSiX2hM/F0EFuzg6HiMhmLR16xGv3orGx0S6boXT9nTx+bzi83Gzr51zUdyD0Pa3dYhtI2IMkIpIoZw2xXis4SYeIiEgEe5BERBJln40C2E8yhwmSiEiiDIIMBhuHSG09fyDjfzoQERGJYA+SiEiq7LDVHGw9fwBjgiQikijOYnUsDrESERGJYA+SiEii2IN0LCZIIiKJYoJ0LA6xEhERiWAPkohIogyCCww2LvS39fyBjAmSiEiiBMH2ZR4cYjWP/+lAREQkgj1IIiKJ4iQdx2KCJCKSKCZIx+IQKxERkQj2IImIJIpv83AsJkgiIoniEKtjcYiViIhIBHuQREQSxR6kYzFBEhFJFJ9BOhaHWImIiESwB0lEJFGCYPsQqSDYKZgBiAmSiEii+AzSsTjESkREJII9SCIiiRLsMEmHPUjzmCCJiCSKQ6yOxSFWIiIiEexBEhFJFHuQjsUESUQkUdwowLE4xEpERCSCPUgiIoniEKtjWd2DPHjwIO655x4EBARAJpNhz549Jp8vWbIEMpnMpMTFxdkrXiIi+lnXEKuthcRZnSBbWloQFhaG3Nxcs3Xi4uJw7tw5Y3n77bdtCpKIiOhqs3qIdc6cOZgzZ06PdeRyOVQqlUXttbW1oa2tzfhzU1OTtSEREV2TBMggwMYhVhvPH8gcMkmntLQUvr6+CA4OxkMPPYQLFy6YrZudnQ2lUmksgYGBjgiJiGjA6XoGaWshcXZPkHFxcdixYweKi4vx/PPP48CBA5gzZw46OztF62dmZqKxsdFYqqur7R0SERHZWW5uLsaNGwcPDw9ERUXhyJEjPdYvKCjApEmT4OHhgSlTpmD//v0mnwuCgFWrVsHf3x+DBw9GTEwMTp06ZVKnvr4eiYmJUCgU8Pb2RnJyMpqbm+1+b13sniAXLFiAe++9F1OmTEF8fDz27duHL774AqWlpaL15XI5FAqFSSEiot45a5LO7t27kZGRgaysLBw7dgxhYWGIjY1FXV2daP1Dhw5h4cKFSE5Oxpdffon4+HjEx8fjxIkTxjovvPACNm3ahLy8PJSVlWHo0KGIjY1Fa2ursU5iYiJOnjyJoqIi7Nu3DwcPHsTSpUut/8VZyOHrIMePH48RI0bgu+++c/SliIiuKc4aYl2/fj1SUlKQlJSE66+/Hnl5eRgyZAhef/110fobN25EXFwcHn/8cYSEhGDNmjWYNm0aXnnllZ/vQ0BOTg5WrlyJuXPnIjQ0FDt27EBNTY1xpURFRQUKCwuxZcsWREVF4dZbb8XLL7+MXbt2oaamps+/w544PEH+8MMPuHDhAvz9/R19KSIi6qOmpiaT8uvJk7/W3t4OrVaLmJgY4zEXFxfExMRAo9GInqPRaEzqA0BsbKyx/pkzZ6DT6UzqKJVKREVFGetoNBp4e3sjIiLCWCcmJgYuLi4oKyvr2033wuoE2dzcjPLycpSXlwO4fGPl5eWoqqpCc3MzHn/8cRw+fBjff/89iouLMXfuXEyYMAGxsbH2jp2I6JpmgB2GWH+exRoYGGgyYTI7O1v0mj/++CM6Ozvh5+dnctzPzw86nU70HJ1O12P9rv/vrY6vr6/J54MGDYKPj4/Z69rK6mUeR48excyZM40/Z2RkAAAWL16MzZs34/jx43jjjTfQ0NCAgIAAzJ49G2vWrIFcLrdf1EREZFfV1dUmc0D4N7sPCXLGjBkQBMHs5x999JFNARERkWXsudWcpZMkR4wYAVdXV9TW1pocr62tNbv+XaVS9Vi/6/9ra2tNHsfV1tZi6tSpxjpXTgLq6OhAfX29xevurcXNyomIJMoAmV2KNdzd3REeHo7i4uJf4jAYUFxcDLVaLXqOWq02qQ8ARUVFxvpBQUFQqVQmdZqamlBWVmaso1ar0dDQAK1Wa6xTUlICg8GAqKgoq+7BUtysnIiIrJKRkYHFixcjIiICkZGRyMnJQUtLC5KSkgAAixYtwqhRo4zPMR955BHccccdWLduHe6++27s2rULR48exWuvvQYAkMlkePTRR/G3v/0NEydORFBQEJ5++mkEBAQgPj4eABASEoK4uDikpKQgLy8Per0eaWlpWLBgAQICAhxyn0yQRERSZY+dcPpw/vz583H+/HmsWrUKOp0OU6dORWFhoXGSTVVVFVxcfhmgnD59OvLz87Fy5UqsWLECEydOxJ49ezB58mRjnSeeeAItLS1YunQpGhoacOutt6KwsBAeHh7GOjt37kRaWhqio6Ph4uKChIQEbNq0yYab75lM6OmBohM0NTVBqVRiT/hcDB3k5uxwiIhs1tKhR7x2LxobG+2yGUrX38l3pv4OQ1xt+zt5qVOP+8v/abfYBhI+gyQiIhLBIVYiIoniC5MdiwmSiEiiDD8XW9sgcRxiJSIiEsEeJBGRRHGI1bGYIImIJMogoE+vq7qyDRLHIVYiIiIR7EESEUmUABkEK7eKE2uDxDFBEhFJVNcrq2xtg8RxiJWIiEgEe5BERBJ1eZKO7W2QOCZIIiKJ4jNIx+IQKxERkQj2IImIJIqTdByLCZKISKIE4XKxtQ0SxyFWIiIiEexBEhFJlAAZDJyk4zBMkEREEsXNyh2LQ6xEREQi2IMkIpIozmJ1LCZIIiKJEn4utrZB4jjESkREJII9SCIiieIQq2MxQRIRSZTh52JrGySOQ6xEREQi2IMkIpIoroN0LCZIIiKJ4jNIx+IQKxERkQj2IImIJIrrIB2LCZKISKI4xOpYHGIlIiISwR4kEZFEcR2kYzFBEhFJFJd5OJZVQ6zZ2dm46aab4OXlBV9fX8THx6OystKkTmtrK1JTUzF8+HB4enoiISEBtbW1dg2aiIjI0axKkAcOHEBqaioOHz6MoqIi6PV6zJ49Gy0tLcY66enpeP/991FQUIADBw6gpqYG8+bNs3vgRETXOgG/DLP2tXAWq3lWDbEWFhaa/Lx9+3b4+vpCq9Xi9ttvR2NjI7Zu3Yr8/HzMmjULALBt2zaEhITg8OHDuPnmm+0XORHRNU6AHYZYwSFWc2yaxdrY2AgA8PHxAQBotVro9XrExMQY60yaNAljxoyBRqMRbaOtrQ1NTU0mhYiIyNn6nCANBgMeffRR3HLLLZg8eTIAQKfTwd3dHd7e3iZ1/fz8oNPpRNvJzs6GUqk0lsDAwL6GRER0TTEI9ikkrs8JMjU1FSdOnMCuXbtsCiAzMxONjY3GUl1dbVN7RETXCsFOxVHq6+uRmJgIhUIBb29vJCcno7m5ucdzepvo+dVXX2HhwoUIDAzE4MGDERISgo0bN5q0UVpaCplM1q2Y66iZ06dlHmlpadi3bx8OHjyI0aNHG4+rVCq0t7ejoaHBpBdZW1sLlUol2pZcLodcLu9LGERE1I8lJibi3LlzxkmdSUlJWLp0KfLz882ek56ejg8++AAFBQVQKpVIS0vDvHnz8PnnnwO4/CjP19cXb731FgIDA3Ho0CEsXboUrq6uSEtLM2mrsrISCoXC+LOvr69V8VuVIAVBwPLly/Huu++itLQUQUFBJp+Hh4fDzc0NxcXFSEhIMAZYVVUFtVptVWBERNQze241d+X8D1s7LxUVFSgsLMQXX3yBiIgIAMDLL7+Mu+66Cy+99BICAgK6nWPJRM8//OEPJueMHz8eGo0G//rXv7olSF9f326P/Kxh1RBramoq3nrrLeTn58PLyws6nQ46nQ4//fQTAECpVCI5ORkZGRn49NNPodVqkZSUBLVazRmsRER2ZusSj1/vxBMYGGgyHyQ7O9um2DQaDby9vY3JEQBiYmLg4uKCsrIy0XP6MtETuJxYuyaL/trUqVPh7++PO++809gDtYZVPcjNmzcDAGbMmGFyfNu2bViyZAkAYMOGDXBxcUFCQgLa2toQGxuLV1991erAiIjo6qmurjYZjrT10ZdOp+s2pDlo0CD4+PiYfRbYl4mehw4dwu7du/HBBx8Yj/n7+yMvLw8RERFoa2vDli1bMGPGDJSVlWHatGkW34PVQ6y98fDwQG5uLnJzc61pmoiIrGTPreYUCoVJgjTnqaeewvPPP99jnYqKCptistSJEycwd+5cZGVlYfbs2cbjwcHBCA4ONv48ffp0nD59Ghs2bMCbb75pcfvci5WISKKcsVn5Y489ZhwxNGf8+PFQqVSoq6szOd7R0YH6+nqzkzatmej5zTffIDo6GkuXLsXKlSt7jTsyMhKfffZZr/V+jQmSiIgsNnLkSIwcObLXemq1Gg0NDdBqtQgPDwcAlJSUwGAwICoqSvQcSyd6njx5ErNmzcLixYvx97//3aK4y8vL4e/vb1HdLkyQREQSJQiXi61tOEJISAji4uKQkpKCvLw86PV6pKWlYcGCBcYZrGfPnkV0dDR27NiByMhIk4mePj4+UCgUWL58uclEzxMnTmDWrFmIjY1FRkaG8dmkq6urMXHn5OQgKCgIN9xwA1pbW7FlyxaUlJTg448/tuoemCCJiCTKABkMNu6lauv5Pdm5cyfS0tIQHR1tnLy5adMm4+d6vR6VlZW4dOmS8VhvEz3/+c9/4vz583jrrbfw1ltvGY+PHTsW33//PQCgvb0djz32GM6ePYshQ4YgNDQUn3zyCWbOnGlV/DLBkpk3V1FTUxOUSiX2hM/F0EFuzg6HiMhmLR16xGv3orGx0aKJML3p+ju5YsxSeLi429RWq6Edz1W9ZrfYBhL2IImIJMoee6lyL1bzmCCJiKTKDs8g+UJI82x63RUREdFAxR4kEZFE9fdJOlLHBElEJFH9eZnHQMAhViIiIhHsQRIRSZQztpq7ljBBEhFJFJd5OBaHWImIiESwB0lEJFECbF/GyA6keUyQREQSdXmI1cZlHsyQZnGIlYiISAR7kEREEsV1kI7FBElEJFFc5uFYHGIlIiISwR4kEZFEcYjVsZggiYgkikOsjsUhViIiIhHsQRIRSZRgh63mOMRqHhMkEZFEcScdx+IQKxERkQj2IImIJIpv83AsJkgiIoniMg/H4hArERGRCPYgiYgkiusgHYsJkohIovgM0rE4xEpERCSCPUgiIoniOkjHYoIkIpIoDrE6FodYiYiIRLAHSUQkUVwH6VhMkEREEsVlHo7FIVYiIiIRViXI7Oxs3HTTTfDy8oKvry/i4+NRWVlpUmfGjBmQyWQmZdmyZXYNmoiIfu5BCjYWZ99EP2ZVgjxw4ABSU1Nx+PBhFBUVQa/XY/bs2WhpaTGpl5KSgnPnzhnLCy+8YNegiYjol2UethYSZ9UzyMLCQpOft2/fDl9fX2i1Wtx+++3G40OGDIFKpbKozba2NrS1tRl/bmpqsiYkIiIih7DpGWRjYyMAwMfHx+T4zp07MWLECEyePBmZmZm4dOmS2Tays7OhVCqNJTAw0JaQiIiuGYKtw6t2mAU7kPU5QRoMBjz66KO45ZZbMHnyZOPxBx54AG+99RY+/fRTZGZm4s0338SDDz5otp3MzEw0NjYaS3V1dV9DIiK6pnQt87C1OEp9fT0SExOhUCjg7e2N5ORkNDc393hOa2srUlNTMXz4cHh6eiIhIQG1tbUmda6c5yKTybBr1y6TOqWlpZg2bRrkcjkmTJiA7du3Wx1/n5d5pKam4sSJE/jss89Mji9dutT47ylTpsDf3x/R0dE4ffo0rrvuum7tyOVyyOXyvoZBRET9VGJiIs6dO2ecs5KUlISlS5ciPz/f7Dnp6en44IMPUFBQAKVSibS0NMybNw+ff/65Sb1t27YhLi7O+LO3t7fx32fOnMHdd9+NZcuWYefOnSguLsYf//hH+Pv7IzY21uL4+5Qg09LSsG/fPhw8eBCjR4/usW5UVBQA4LvvvhNNkERE1Df2XAd55fwPWzsvFRUVKCwsxBdffIGIiAgAwMsvv4y77roLL730EgICArqd09jYiK1btyI/Px+zZs0CcDkRhoSE4PDhw7j55puNdb29vc3OdcnLy0NQUBDWrVsHAAgJCcFnn32GDRs2WJUgrRpiFQQBaWlpePfdd1FSUoKgoKBezykvLwcA+Pv7W3MpIiLqxeXniIKN5XJbgYGBJvNBsrOzbYpNo9HA29vbmBwBICYmBi4uLigrKxM9R6vVQq/XIyYmxnhs0qRJGDNmDDQajUnd1NRUjBgxApGRkXj99dch/GqsWKPRmLQBALGxsd3a6I1VPcjU1FTk5+dj79698PLygk6nAwAolUoMHjwYp0+fRn5+Pu666y4MHz4cx48fR3p6Om6//XaEhoZaFRgREV091dXVUCgUxp9tffSl0+ng6+trcmzQoEHw8fEx5g6xc9zd3U2GSwHAz8/P5Jxnn30Ws2bNwpAhQ/Dxxx/jz3/+M5qbm/Hwww8b2/Hz8+vWRlNTE3766ScMHjzYonuwKkFu3rwZwOXNAH5t27ZtWLJkCdzd3fHJJ58gJycHLS0tCAwMREJCAlauXGnNZYiIyAL2fN2VQqEwSZDmPPXUU3j++ed7rFNRUWFjVD17+umnjf++8cYb0dLSghdffNGYIO3FqgQp9DLdKTAwEAcOHLApICIisow9dsKx9nVXjz32GJYsWdJjnfHjx0OlUqGurs7keEdHB+rr680+O1SpVGhvb0dDQ4NJL7K2trbHtfVRUVFYs2YN2traIJfLoVKpus18ra2thUKhsLj3CHCzciIissLIkSMxcuTIXuup1Wo0NDRAq9UiPDwcAFBSUgKDwWCcvHml8PBwuLm5obi4GAkJCQCAyspKVFVVQa1Wm71WeXk5hg0bZhwWVqvV2L9/v0mdoqKiHtsQwwRJRCRRws//s7UNRwgJCUFcXBxSUlKQl5cHvV6PtLQ0LFiwwDiD9ezZs4iOjsaOHTsQGRkJpVKJ5ORkZGRkwMfHBwqFAsuXL4darTbOYH3//fdRW1uLm2++GR4eHigqKsJzzz2Hv/zlL8ZrL1u2DK+88gqeeOIJ/OEPf0BJSQneeecdfPDBB1bdAxMkEZFEOWOI1Ro7d+5EWloaoqOj4eLigoSEBGzatMn4uV6vR2Vlpcluaxs2bDDWbWtrQ2xsLF599VXj525ubsjNzUV6ejoEQcCECROwfv16pKSkGOsEBQXhgw8+QHp6OjZu3IjRo0djy5YtVi3xAACZ0NuDxausqakJSqUSe8LnYuggN2eHQ0Rks5YOPeK1e9HY2GjRRJjedP2dvMtzKdxk7ja1pRfasb/5NbvFNpCwB0lEJFF8YbJjMUESEUmUINjhGWT/GkTsV2x6mwcREdFAxR4kEZFEcYjVsZggiYgkikOsjsUhViIiIhHsQRIRSZQA24dI2X80jwmSiEiiDIIAg40pzsAhVrM4xEpERCSCPUgiIonqz3uxDgRMkEREEsVlHo7FIVYiIiIR7EESEUmUAXaYpMMhVrOYIImIJIqzWB2LQ6xEREQi2IMkIpIozmJ1LCZIIiKJ4jNIx+IQKxERkQj2IImIJIo9SMdigiQikig+g3QsDrESERGJYA+SiEiiBDsMsbIHaR4TJBGRRBlkBshktu2mauBurGZxiJWIiEgEe5BERBJlgAAZZ7E6DBMkEZFECT8v9LC1DRLHIVYiIiIR7EESEUmUAbDDECuZwwRJRCRRnMXqWBxiJSIiEsEeJBGRRBlggMzGHiB7kOYxQRIRSRQTpGNxiJWIiEiEVQly8+bNCA0NhUKhgEKhgFqtxocffmj8vLW1FampqRg+fDg8PT2RkJCA2tpauwdNRES/rIO0tZA4qxLk6NGjsXbtWmi1Whw9ehSzZs3C3LlzcfLkSQBAeno63n//fRQUFODAgQOoqanBvHnzHBI4EdG1ziAz2KWQOKueQd5zzz0mP//973/H5s2bcfjwYYwePRpbt25Ffn4+Zs2aBQDYtm0bQkJCcPjwYdx8882ibba1taGtrc34c1NTk7X3QEREZHd9fgbZ2dmJXbt2oaWlBWq1GlqtFnq9HjExMcY6kyZNwpgxY6DRaMy2k52dDaVSaSyBgYF9DYmI6JoiwGDz/zjEap7VCfLrr7+Gp6cn5HI5li1bhnfffRfXX389dDod3N3d4e3tbVLfz88POp3ObHuZmZlobGw0lurqaqtvgojoWiSg0y7FUerr65GYmAiFQgFvb28kJyejubm5x3N6m8uyfft2yGQy0VJXVwcAKC0tFf28p1wkxuplHsHBwSgvL0djYyP++c9/YvHixThw4IC1zRjJ5XLI5fI+n09ERP1TYmIizp07h6KiIuj1eiQlJWHp0qXIz883e056ejo++OADFBQUQKlUIi0tDfPmzcPnn38OAJg/fz7i4uJMzlmyZAlaW1vh6+trcryyshIKhcL485Wf98bqBOnu7o4JEyYAAMLDw/HFF19g48aNmD9/Ptrb29HQ0GDSi6ytrYVKpbL2MkRE1IvLaxjtsw7yyvkftnZeKioqUFhYiC+++AIREREAgJdffhl33XUXXnrpJQQEBHQ7p7Gxsde5LIMHD8bgwYON55w/fx4lJSXYunVrt/Z8fX27jWpaw+Z1kAaDAW1tbQgPD4ebmxuKi4uNn1VWVqKqqgpqtdrWyxAR0RUMdnoKCQCBgYEm80Gys7Ntik2j0cDb29uYHAEgJiYGLi4uKCsrEz2nL3NZduzYgSFDhuB3v/tdt8+mTp0Kf39/3HnnncYeqDWs6kFmZmZizpw5GDNmDC5evIj8/HyUlpbio48+glKpRHJyMjIyMuDj4wOFQoHly5dDrVabncFKRET9Q3V1tclwpK2PvnQ6XbchzUGDBsHHx8fss8C+zGXZunUrHnjgAZNepb+/P/Ly8hAREYG2tjZs2bIFM2bMQFlZGaZNm2bxPViVIOvq6rBo0SKcO3cOSqUSoaGh+Oijj3DnnXcCADZs2AAXFxckJCSgra0NsbGxePXVV625BBERWejyJBuZzW0AMG4A05unnnoKzz//fI91KioqbIrJUhqNBhUVFXjzzTdNjgcHByM4ONj48/Tp03H69Gls2LChW92eWJUgxcZ4f83DwwO5ubnIzc21plkiIuoDez6DtNRjjz2GJUuW9Fhn/PjxUKlUxlmlXTo6OlBfX292XopKpbJqLsuWLVswdepUhIeH9xp3ZGQkPvvss17r/Ro3KyciIouNHDkSI0eO7LWeWq1GQ0MDtFqtMYGVlJTAYDAgKipK9Jxfz2VJSEgAYH4uS3NzM9555x2Ln5WWl5fD39/forpdmCCJiCTKHnupOmqjgJCQEMTFxSElJQV5eXnQ6/VIS0vDggULjDNYz549i+joaOzYsQORkZFWzWXZvXs3Ojo68OCDD3a7dk5ODoKCgnDDDTegtbUVW7ZsQUlJCT7++GOr7oEJkohIogzoBGx8Bmlw4EYBO3fuRFpaGqKjo43zUzZt2mT8XK/Xo7KyEpcuXTIes3Quy9atWzFv3jzRZRzt7e147LHHcPbsWQwZMgShoaH45JNPMHPmTKvilwmCIFh1hoM1NTVBqVRiT/hcDB3k5uxwiIhs1tKhR7x2LxobGy2aCNObrr+TfkOnw0VmWz/HIHSgtuWQ3WIbSNiDJCKSqP48xDoQMEESEUmUQbDDEKvguCFWqet3CbJrxPdSp97JkRAR2UfX37N+9kSLetHvEuTFixcBAA+U73dyJERE9nXx4kUolUq7tcchVsfqdwkyICAA1dXV8PLygkx2eeigqakJgYGB3bZCkhKp34PU4wekfw+M3/n6eg+CIODixYuiG3Tb4nKCtG2IlAnSvH6XIF1cXDB69GjRzyzdCqk/k/o9SD1+QPr3wPidry/3YM+eI10d/S5BEhGRZQTBAIOte7EK7EGawwRJRCRRl4dHbd2snAnSHJvfB3k1yOVyZGVl2fz6FWeS+j1IPX5A+vfA+J1vINwDWa7f7aRDREQ969pJR+lxPWQyV5vaEoRONLZ+w510RHCIlYhIoi4/geQQq6NIYoiViIjoamMPkohIoi7PQOUsVkdhgiQikihbNwmwVxsDFYdYiYiIREgiQebm5mLcuHHw8PBAVFQUjhw54uyQLLJ69WrIZDKTMmnSJGeH1aODBw/innvuQUBAAGQyGfbs2WPyuSAIWLVqFfz9/TF48GDExMTg1KlTzglWRG/xL1mypNt3EhcX55xgRWRnZ+Omm26Cl5cXfH19ER8fj8rKSpM6ra2tSE1NxfDhw+Hp6YmEhATU1tY6KeLuLLmHGTNmdPseli1b5qSITW3evBmhoaHG3XLUajU+/PBD4+f96fcvCAIEwWBj4UIGc/p9gty9ezcyMjKQlZWFY8eOISwsDLGxsairq3N2aBa54YYbcO7cOWP57LPPnB1Sj1paWhAWFobc3FzRz1944QVs2rQJeXl5KCsrw9ChQxEbG4vW1tarHKm43uIHgLi4OJPv5O23376KEfbswIEDSE1NxeHDh1FUVAS9Xo/Zs2ejpaXFWCc9PR3vv/8+CgoKcODAAdTU1GDevHlOjNqUJfcAACkpKSbfwwsvvOCkiE2NHj0aa9euhVarxdGjRzFr1izMnTsXJ0+eBNC/fv9dm5XbWsgMoZ+LjIwUUlNTjT93dnYKAQEBQnZ2thOjskxWVpYQFhbm7DD6DIDw7rvvGn82GAyCSqUSXnzxReOxhoYGQS6XC2+//bYTIuzZlfELgiAsXrxYmDt3rlPi6Yu6ujoBgHDgwAFBEC7/vt3c3ISCggJjnYqKCgGAoNFonBVmj668B0EQhDvuuEN45JFHnBeUlYYNGyZs2bKl3/z+GxsbBQDCYPdxwhD5eJvKYPdxAgChsbHxqsUvFf26B9ne3g6tVouYmBjjMRcXF8TExECj0TgxMsudOnUKAQEBGD9+PBITE1FVVeXskPrszJkz0Ol0Jt+HUqlEVFSUZL4PACgtLYWvry+Cg4Px0EMP4cKFC84OyazGxkYAgI+PDwBAq9VCr9ebfAeTJk3CmDFj+u13cOU9dNm5cydGjBiByZMnIzMzE5cuXXJGeD3q7OzErl270NLSArVa3e9+/4LQaZdC4vr1LNYff/wRnZ2d8PPzMznu5+eHb7/91klRWS4qKgrbt29HcHAwzp07h2eeeQa33XYbTpw4AS8vL2eHZzWdTgcAot9H12f9XVxcHObNm4egoCCcPn0aK1aswJw5c6DRaODqatuOJPZmMBjw6KOP4pZbbsHkyZMBXP4O3N3d4e3tbVK3v34HYvcAAA888ADGjh2LgIAAHD9+HE8++SQqKyvxr3/9y4nR/uLrr7+GWq1Ga2srPD098e677+L6669HeXl5v/r922OJBpd5mNevE6TUzZkzx/jv0NBQREVFYezYsXjnnXeQnJzsxMiuXQsWLDD+e8qUKQgNDcV1112H0tJSREdHOzGy7lJTU3HixIl+/9y6J+buYenSpcZ/T5kyBf7+/oiOjsbp06dx3XXXXe0wuwkODkZ5eTkaGxvxz3/+E4sXL8aBAwecHRZdZf16iHXEiBFwdXXtNkOstrYWKpXKSVH1nbe3N37zm9/gu+++c3YofdL1Ox8o3wcAjB8/HiNGjOh330laWhr27duHTz/91OT9qCqVCu3t7WhoaDCp3x+/A3P3ICYqKgoA+s334O7ujgkTJiA8PBzZ2dkICwvDxo0b+93vn5N0HKtfJ0h3d3eEh4ejuLjYeMxgMKC4uBhqtdqJkfVNc3MzTp8+DX9/f2eH0idBQUFQqVQm30dTUxPKysok+X0AwA8//IALFy70m+9EEASkpaXh3XffRUlJCYKCgkw+Dw8Ph5ubm8l3UFlZiaqqqn7zHfR2D2LKy8sBoN98D1cyGAxoa2vrd79/25d4GDjE2oN+P8SakZGBxYsXIyIiApGRkcjJyUFLSwuSkpKcHVqv/vKXv+Cee+7B2LFjUVNTg6ysLLi6umLhwoXODs2s5uZmk/+KP3PmDMrLy+Hj44MxY8bg0Ucfxd/+9jdMnDgRQUFBePrppxEQEID4+HjnBf0rPcXv4+ODZ555BgkJCVCpVDh9+jSeeOIJTJgwAbGxsU6M+hepqanIz8/H3r174eXlZXyupVQqMXjwYCiVSiQnJyMjIwM+Pj5QKBRYvnw51Go1br75ZidHf1lv93D69Gnk5+fjrrvuwvDhw3H8+HGkp6fj9ttvR2hoqJOjBzIzMzFnzhyMGTMGFy9eRH5+PkpLS/HRRx9J4vdPduTsabSWePnll4UxY8YI7u7uQmRkpHD48GFnh2SR+fPnC/7+/oK7u7swatQoYf78+cJ3333n7LB69OmnnwoAupXFixcLgnB5qcfTTz8t+Pn5CXK5XIiOjhYqKyudG/Sv9BT/pUuXhNmzZwsjR44U3NzchLFjxwopKSmCTqdzdthGYrEDELZt22as89NPPwl//vOfhWHDhglDhgwRfvvb3wrnzp1zXtBX6O0eqqqqhNtvv13w8fER5HK5MGHCBOHxxx/vN8sM/vCHPwhjx44V3N3dhZEjRwrR0dHCxx9/bPy8P/z+u5Z5DHIdKbgN8rOpDHIdyWUeZvB9kEREEtP1PkhXFx/IZLY9KRMEAzoN9XwfpIh+/QySiIjIWfr9M0giIjJHAGyehcpBRHOYIImIJMo+74NkgjSHQ6xEREQi2IMkIpKoy4v8bexBcojVLCZIIiLJsj1B8hmkeRxiJSIiEsEeJBGRVNlhkg44SccsJkgiIoniM0jH4hArERGRCPYgiYgki5N0HIk9SCIiyRIuP0O0pTgwQdbX1yMxMREKhQLe3t5ITk5Gc3Nzj+e89tprmDFjBhQKBWQyWbd3b1ra7vHjx3HbbbfBw8MDgYGBeOGFF6yOnwmSiIgcIjExESdPnkRRURH27duHgwcPYunSpT2ec+nSJcTFxWHFihV9brepqQmzZ8/G2LFjodVq8eKLL2L16tV47bXXrLsBJ79NhIiIrNT1uivAVQAG2VhcHfK6q2+++UYAIHzxxRfGYx9++KEgk8mEs2fP9np+16vr/vvf/1rd7quvvioMGzZMaGtrM9Z58sknheDgYKvugT1IIiJJM/sKTgvLZU1NTSalra3Npqg0Gg28vb0RERFhPBYTEwMXFxeUlZU5tF2NRoPbb78d7u7uxjqxsbGorKzEf//7X4uvxQRJRCQx7u7uUKlUADrtUjw9PREYGAilUmks2dnZNsWo0+ng6+trcmzQoEHw8fGBTqdzaLs6nQ5+fn4mdbp+tubanMVKRCQxHh4eOHPmDNrb2+3SniAIkMlMZ8PK5XLRuk899RSef/75HturqKiwS1zOxgRJRCRBHh4e8PDwuOrXfeyxx7BkyZIe64wfPx4qlQp1dXUmxzs6OlBfX/9z77dvLGlXpVKhtrbWpE7Xz9ZcmwmSiIgsNnLkSIwcObLXemq1Gg0NDdBqtQgPDwcAlJSUwGAwICoqqs/Xt6RdtVqNv/71r9Dr9XBzcwMAFBUVITg4GMOGDbP4WnwGSUREdhcSEoK4uDikpKTgyJEj+Pzzz5GWloYFCxYgICAAAHD27FlMmjQJR44cMZ6n0+lQXl6O7777DgDw9ddfo7y8HPX19Ra3+8ADD8Dd3R3Jyck4efIkdu/ejY0bNyIjI8O6m7BqzisREZGFLly4ICxcuFDw9PQUFAqFkJSUJFy8eNH4+ZkzZwQAwqeffmo8lpWVJTrddtu2bRa3KwiC8NVXXwm33nqrIJfLhVGjRglr1661On6ZIHArdyIioitxiJWIiEgEEyQREZEIJkgiIiIRTJBEREQimCCJiIhEMEESERGJYIIkIiISwQRJREQkggmSiIhIBBMkERGRCCZIIiIiEf8PsllLZ28TyJgAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# since we didn't perform yet any evolutionary step they are the same\n", + "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" + ] + }, + { + "cell_type": "markdown", + "id": "5e576bc4-4e79-4c71-9ea0-b3012e9f2ba1", + "metadata": {}, + "source": [ + "which shows $\\hat{H}$ is now identical to $\\hat{H}_0$ since no evolution step has been performed yet." + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "da3d3aaa-17e1-492e-bcd3-b510f44a5391", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# diagonal part of the H target\n", + "visualize_matrix(dbf.diagonal_h_matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "24d0dfa1-7039-4d7d-8aa3-5a937b9ab0b8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "HS norm of the off diagonal part of H: 1440.0\n" + ] + } + ], + "source": [ + "# Hilbert-Schmidt norm of the off-diagonal part\n", + "# which we want to bring to be close to zero\n", + "print(f\"HS norm of the off diagonal part of H: {dbf.off_diagonal_norm}\")" + ] + }, + { + "cell_type": "markdown", + "id": "d75e35ab-66f4-49f9-af19-679c20065a11", + "metadata": {}, + "source": [ + "Finally, the energy fluctuation of the system at step $k$ over a given state $\\mu$\n", + "\n", + "$$ \\Xi(\\mu) = \\sqrt{\\langle \\mu | \\hat{H}_k^2 | \\mu \\rangle - \\langle \\mu | \\hat{H}_k | \\mu \\rangle^2} $$\n", + "\n", + "can be computed:" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "95f8d86f-07d4-498c-acb1-f6f6a4614c24", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "6.708203932499369" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# define a quantum state\n", + "# for example the ground state of a multi-qubit Z hamiltonian\n", + "Z = hamiltonians.Z(nqubits=nqubits)\n", + "state = Z.ground_state()\n", + "\n", + "# compute energy fluctuations using current H and given state\n", + "dbf.energy_fluctuation(state)" + ] + }, + { + "cell_type": "markdown", + "id": "3d5b37f3-2477-49a0-9f80-7da5ddda1fff", + "metadata": {}, + "source": [ + "#### Call the `DoubleBracketFlow` to perform a DBF iteration\n", + "\n", + "If the DBF object is called, a Double Bracket Flow iteration is performed. This can be done customizing the flow by setting the flow step and the desired `FlowGeneratorType`. If no generator is provided, the one passed at the initialization time is used (default is `FlowGeneratorType.canonical`)." + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "9a886261-8aa6-4df0-a31b-9c39847db124", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initial value of the off-diagonal norm: 1440.0\n", + "One step later off-diagonal norm: 1168.2530943739996\n" + ] + } + ], + "source": [ + "# perform one evolution step\n", + "\n", + "# initial value of the off-diagonal norm\n", + "print(f\"Initial value of the off-diagonal norm: {dbf.off_diagonal_norm}\")\n", + "\n", + "dbf(step=0.01, mode=flowtype)\n", + "\n", + "# after one step\n", + "print(f\"One step later off-diagonal norm: {dbf.off_diagonal_norm}\")" + ] + }, + { + "cell_type": "markdown", + "id": "b78dd05d-ffe3-435a-b5ec-2a42f28066b2", + "metadata": {}, + "source": [ + "We can check now if something happened by plotting the drift:" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "cc74812d-7c2c-44e4-afc2-e235968801b4", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" + ] + }, + { + "cell_type": "markdown", + "id": "3465a422-eebf-4e80-ae96-bba894132330", + "metadata": {}, + "source": [ + "The set step can be good, but maybe not the best one. In order to do this choice in a wiser way, we can call the DBF hyperoptimization routine to search for a better initial step. The `dbf.hyperopt_step` method is built on top of the [`hyperopt`](https://hyperopt.github.io/hyperopt/) package. Any algorithm or sampling space provided by the official package can be used. We are going to use the default options (we sample new steps from a uniform space following a _Tree of Parzen estimators algorithm_)." + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "aad79966-7a11-4a45-aba5-4a4bb8315c50", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "100%|█████████████████████████████████████████████████████████████████████████| 1000/1000 [00:06<00:00, 144.50trial/s, best loss: 828.4068645826136]\n" + ] + } + ], + "source": [ + "# restart\n", + "dbf.h = dbf.h0\n", + "\n", + "# optimization of the step, we allow to search in [1e-5, 1]\n", + "step = dbf.hyperopt_step(\n", + " step_min = 1e-5,\n", + " step_max = 1,\n", + " space = hp.uniform,\n", + " optimizer = tpe,\n", + " max_evals = 1000,\n", + " verbose = True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "49483a47-d29d-440e-a4bc-143bfe6bb3cf", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "visualize_matrix(dbf.h.matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "id": "6bdaf7f9-7e49-4a16-8b29-ae1f9746cd9b", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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f8NGcMEfoa94hFuxYoWyWCxq6dKlav/+/eree+9V7dq1U5WVleGumq6ZM2eq4uJiVV5erv75z3+q7Oxs1bFjR3X8+PFwV+28Tp06pXbt2qV27dqlAKjnnntO7dq1S3399ddKKaXmzZun2rVrp9atW6f27Nmjxo0bp9LT01V1dXWYa97AX/1PnTqlfv3rX6utW7eq8vJytWHDBnXVVVepyy+/XNXU1IS76koppaZPn65sNpsqLi5Wx44d8x5nzpzxxkybNk117dpVbdq0Se3YsUNlZWWprKysMNbal957OHjwoHriiSfUjh07VHl5uVq3bp3q0aOHuv7668Nc8waPPPKIKikpUeXl5WrPnj3qkUceUZqmqffff18pFRmff+OstuioZBVzSWpQR3RUcshntUV8w6OUUn/84x9V165dVUxMjBo6dKjatm1buKskcvvtt6vU1FQVExOjLr30UnX77bergwcPhrtafm3evFmh4W6lz5Gbm6uUaphS/bvf/U4lJycri8WiRo4cqcrKysJb6X/jr/5nzpxRo0aNUp06dVLR0dGqW7du6p577omoP2KaqzsAtWTJEm9MdXW1uu+++1T79u1V27Zt1S233KKOHTsWvkqfQ+89HD58WF1//fUqKSlJWSwWddlll6nf/OY3If3F58/dd9+tunXrpmJiYlSnTp3UyJEjvY2OUpHx+Zu94eG2CEREJtO4LcIlUZ2gacHdMVHKg7Pub7gtAhER6TPrdOqInlxAREQXHvZ4iIhMSwFBz0oL/d0WNjxERCZlzH48oW94ONRGREQhxR4PEZFJNSz+DLLHw6E2IiKSC77hCcc9Hg61ERFRSLHHQ0RkVgZMLkAYJhew4SEiMimz3uPhUBsREYUUGx4iItPyGHQEbuHChejevTtiY2ORmZmJjz76SPxaNjxERKalGu7RBHO0YKjttddeQ35+PmbPno2dO3diwIABGD16NI4fPy56PbNTExGZTGN2auASaIbc4zkbUHbqzMxMDBkyBC+++CKAho3y7HY77r//fjzyyCO6r2ePh4jItFTQ/wXa46mrq0NpaSmys7O9j7Vp0wbZ2dnYunWrqAzOaiMiMjVjBq2cTqfPvy0WCywWS5O4b7/9Fm63G8nJyT6PJycn4/PPPxediz0eIiKTiYmJQUpKCgC3IUdCQgLsdjtsNpv3KCwsbLX6s8dDRGQysbGxKC8vR11dnSHlKaWgab73iprr7QBAx44dERUVhaqqKp/Hq6qqfmgM9bHhISIyodjYWMTGxob8vDExMRg8eDA2btyI8ePHA2iYXLBx40bMmDFDVAYbHiIiCkh+fj5yc3Nx9dVXY+jQoViwYAFcLhemTJkiej0bHiIiCsjtt9+Ob775BrNmzUJlZSUGDhyI9evXN5lwcD5cx0NERCHFWW1ERBRSbHiIiCik2PAQEVFIseEhIqKQYsNDREQhxYaHiIhCig0PERGFFBseIiIKKTY8REQUUmx4iIgopNjwEBFRSLHhISKikPp/EgSP89Np9xYAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" + ] + }, + { + "cell_type": "markdown", + "id": "b5f1d00e-e763-40d9-822f-e0e8d4c57d9a", + "metadata": {}, + "source": [ + "#### Let's evolve the model for `NSTEPS`\n", + "\n", + "We know recover the initial hamiltonian, and we perform a sequence of DBF iteration steps, in order to show how this mechanism can lead to a proper diagonalization of the target hamiltonian.\n", + "\n", + "#### Method 1: fixed step" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "id": "59a6a485-a714-4e14-b27a-1df2930068ee", + "metadata": {}, + "outputs": [], + "source": [ + "# restart\n", + "dbf_1 = DoubleBracketFlow(hamiltonian=deepcopy(h), mode=flowtype)\n", + "off_diagonal_norm_history = [dbf_1.off_diagonal_norm]\n", + "histories, labels = [], [\"Fixed step\"]\n", + "\n", + "# set the number of evolution steps\n", + "NSTEPS = 20\n", + "step = 0.005\n", + "\n", + "for s in range(NSTEPS):\n", + " dbf_1(step=step)\n", + " off_diagonal_norm_history.append(dbf_1.off_diagonal_norm)\n", + "\n", + "histories.append(off_diagonal_norm_history)" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "7e0b2f18-ca53-4f34-9fcf-0052dcc31dc5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeAAAAF2CAYAAAC260vLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABbfUlEQVR4nO3deVhU5f//8ecM+44gq6LgkvuKSq5ZIG6VmmUW39IyzdTMbP9VblmmlR/TzKw+aotW2mJ9rFTc0xARdyRXVFIWFRGQbWDO7w9icgRkm+Ew8H5cF5fMmfvc53VuD7w5Z86iURRFQQghhBA1Sqt2ACGEEKI+kgIshBBCqEAKsBBCCKECKcBCCCGECqQACyGEECqQAiyEEEKoQAqwEEIIoQIpwEIIIYQKpAALIYQQKpACLEQtsXHjRjp37oy9vT0ajYb09HS1I5VKo9Ewa9asGl/u2LFjcXZ2rlBbtTKW5dy5c2g0GlatWqV2FFGLSAEWddqqVavQaDTs379f7Si3dfXqVUaNGoWDgwNLly7lq6++wsnJSbU8v/32W60qYDVhzZo1LFq0SO0Yoh6xVjuAEAJiYmLIzMzkrbfeIiwsTO04/PbbbyxdurTUIpyTk4O1de3+1VGVjGvWrOHYsWNMmzbN5HmaNm1KTk4ONjY2Ju9bWK7a/VMkRD2RmpoKgLu7u7pBKsDe3l7tCOWqLRkLCgrQ6/XY2trWmkyi9pBD0EIABw8eZPDgwbi6uuLs7ExoaCh79+41aqPT6Zg9ezYtW7bE3t4eT09P+vTpQ2RkpKFNcnIyTzzxBI0bN8bOzg4/Pz+GDRvGuXPnylx2//79GTNmDADdu3dHo9EwduxYAAIDAw3f3zpP//79Da937NiBRqNh7dq1vP322zRu3Bh7e3tCQ0M5ffp0ifmjo6MZMmQIDRo0wMnJiY4dO/Lhhx8CRZ+1Ll26FCj6LLX4q1hpn69WZPyKPw7Ys2cP06dPx8vLCycnJ0aMGMHly5fLHJ9bXbx4keHDh+Ps7IyXlxcvvvgihYWFRm1uzZiZmcm0adMIDAzEzs4Ob29vBgwYwIEDBwzj+euvv3L+/HnD+gYGBhrmT01NZdy4cfj4+GBvb0+nTp344osvjJZZ/Dnv+++/z6JFi2jevDl2dnYcP368zM+A//rrLx588EE8PDywt7enW7du/PLLL0ZtKrLdCcske8Ci3ouLi6Nv3764urry8ssvY2Njw/Lly+nfvz87d+4kJCQEgFmzZjFv3jyeeuopevToQUZGBvv37+fAgQMMGDAAgJEjRxIXF8ezzz5LYGAgqampREZGcuHCBaNf6Dd7/fXXadWqFZ9++ilz5swhKCiI5s2bV2ld3n33XbRaLS+++CLXr19nwYIFREREEB0dbWgTGRnJvffei5+fH8899xy+vr7Ex8ezYcMGnnvuOZ5++mkuXbpEZGQkX331lcnGr9izzz5LgwYNmDlzJufOnWPRokVMmTKF7777rtxlFRYWMnDgQEJCQnj//ffZsmULH3zwAc2bN+eZZ54pc76JEyfy/fffM2XKFNq2bcvVq1fZvXs38fHxdO3alddff53r16/z999/85///AfAcMJXTk4O/fv35/Tp00yZMoWgoCDWrVvH2LFjSU9P57nnnjNa1sqVK8nNzWXChAnY2dnh4eGBXq8vddx69+5No0aNePXVV3FycmLt2rUMHz6cH374gREjRgAV2+6EhVKEqMNWrlypAEpMTEyZbYYPH67Y2toqZ86cMUy7dOmS4uLiovTr188wrVOnTsrQoUPL7OfatWsKoLz33nsmy9m0aVNlzJgxJdrfddddyl133WV4vX37dgVQ2rRpo+Tl5Rmmf/jhhwqgHD16VFEURSkoKFCCgoKUpk2bKteuXTPqU6/XG76fPHmyUtavB0CZOXOm4XVFx694HcPCwoyW9fzzzytWVlZKenp6qcsrNmbMGAVQ5syZYzS9S5cuSnBw8G0zurm5KZMnT75t/0OHDlWaNm1aYvqiRYsUQPn6668N0/Lz85WePXsqzs7OSkZGhqIoipKQkKAAiqurq5KammrUR/F7K1euNEwLDQ1VOnTooOTm5hqm6fV6pVevXkrLli0N08rb7oTlkkPQol4rLCxk8+bNDB8+nGbNmhmm+/n58eijj7J7924yMjKAos9n4+LiOHXqVKl9OTg4YGtry44dO7h27VqN5L/VE088ga2treF13759ATh79ixQdKg4ISGBadOmlfi8+ebDzBVVmfErNmHCBKNl9e3bl8LCQs6fP1+hZU6cONHodd++fQ3rVxZ3d3eio6O5dOlShZZxs99++w1fX18eeeQRwzQbGxumTp1KVlYWO3fuNGo/cuRIvLy8bttnWloa27ZtY9SoUWRmZnLlyhWuXLnC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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_histories(histories, labels)" + ] + }, + { + "cell_type": "markdown", + "id": "eb797d6c-0eba-4da4-b492-8b5d70f9123f", + "metadata": {}, + "source": [ + "#### Method 2: optimizing the step" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "id": "a6fd1e33-3620-4f3b-b705-a120f6da0027", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "100%|███████████████████████████████████████████████████████████████████████████| 500/500 [00:02<00:00, 193.41trial/s, best loss: 828.5188174589957]\n", + "New optimized step at iteration 1/20: 0.00988216174433494\n", + "New optimized step at iteration 2/20: 0.007178128589748405\n", + "New optimized step at iteration 3/20: 0.006586283123947156\n", + "New optimized step at iteration 4/20: 0.008496240698896648\n", + "New optimized step at iteration 5/20: 0.010639601305560622\n", + "New optimized step at iteration 6/20: 0.009688893201482675\n", + "New optimized step at iteration 7/20: 0.006959809497968054\n", + "New optimized step at iteration 8/20: 0.007079825908277573\n", + "New optimized step at iteration 9/20: 0.0025106878857708115\n", + "New optimized step at iteration 10/20: 0.007351003028447434\n", + "New optimized step at iteration 11/20: 0.005865305934025375\n", + "New optimized step at iteration 12/20: 0.007990929593067532\n", + "New optimized step at iteration 13/20: 0.011404539807978897\n", + "New optimized step at iteration 14/20: 0.0008194053292830093\n", + "New optimized step at iteration 15/20: 0.000292389939095989\n", + "New optimized step at iteration 16/20: 0.0067294371737333086\n", + "New optimized step at iteration 17/20: 0.0038227993688979764\n", + "New optimized step at iteration 18/20: 0.0019157593296632823\n", + "New optimized step at iteration 19/20: 0.003853751908247154\n" + ] + } + ], + "source": [ + "# restart\n", + "dbf_2 = DoubleBracketFlow(hamiltonian=deepcopy(h), mode=flowtype)\n", + "off_diagonal_norm_history = [dbf_2.off_diagonal_norm]\n", + "\n", + "# set the number of evolution steps\n", + "NSTEPS = 20\n", + "\n", + "# optimize first step\n", + "step = dbf_2.hyperopt_step(\n", + " step_min = 1e-5,\n", + " step_max = 1,\n", + " space = hp.uniform,\n", + " optimizer = tpe,\n", + " max_evals = 500,\n", + " verbose = True\n", + ")\n", + "\n", + "for s in range(NSTEPS):\n", + " if s != 0:\n", + " step = dbf_2.hyperopt_step(\n", + " step_min = 1e-5,\n", + " step_max = 1,\n", + " space = hp.uniform,\n", + " optimizer = tpe,\n", + " max_evals = 100,\n", + " )\n", + " print(f\"New optimized step at iteration {s}/{NSTEPS}: {step}\")\n", + " dbf_2(step=step)\n", + " off_diagonal_norm_history.append(dbf_2.off_diagonal_norm)\n", + "\n", + "histories.append(off_diagonal_norm_history)\n", + "labels.append(\"Optimizing step\")" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "0f0212bf-b642-4fea-9203-037876e0b266", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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nq+7u7uVIxFVkfG8K0vfg/wkAduIY7OnoswfSGTCUpg/kKMfvW/tkISwefZyb1FULuY67yQB24DkY0epduIbjP+nOgWqH/uK5GNHrRuYEEIIi5EEbANSYg+ju+0PKp0OUo/EWicgIYRVdO3albFjx1p0H5MmTaJly5YW3YcoGUnANsCnSVMMqukygwG8GzexTkBCCIsZNmwYiqIU+Dl58iS//vor7777rrVDLNKZM2dQFIX9+/dbO5RKQRKwDfBt0JBr9Z9G/ScJqypExzZD51u+Lu5CCNvUq1cvLl++bPITERGBv79/iWbREZWDJGAb0fDlNyCkAQCKArHnQtgwb42VoxKiaki5fINT246TcvlGhezPxcWF4OBgkx8HBweTJuijR4/i7u7O0qVLte2WL1+Oh4cHR44cASA5OZlnnnmGgIAAvL29uf/++zlw4IDJvt5//32CgoLw8vJi+PDhZGZm3jG2GzduMGTIEAICAnBzc6NevXosWrQIgIiICABatWqFoih07dpV2+7LL7+kUaNGuLq60rBhQxYsWKCtM145//DDD9x77724urrStGlTNm3aVOZjWBlIArYhTsG1tdeeLpnsXrqNGxeSrBiREJXfnh92MOOeSXz5n0+Ycc8kdv+w3dohAdCwYUM++OADRo4cyblz57hw4QLjxo3j/fffp3HjxgA88sgjJCYm8tdffxETE0Pr1q3p1q0bSUl53xs//fQTkyZN4r333mPPnj2EhITw6aef3nG/77zzDkeOHOGvv/4iLi6OBQsWUL16dQB27doFwNq1a7l8+TK//vorAEuWLGHChAlMmzaNuLg43nvvPSZMmMD3339vUvf48eN55ZVX2LdvH5GRkfTr14/r16+b9bjZExmIw4YoPkHaa0+3TFKS3Fk/ZxWDPnjcilEJYT8+6TOLm1dTS1w+R59LxvU07b1qUPl1/PesmbkSnUPJr0+8ArwZ/ef4EpdfuXIlnp6e2vvevXvz888/Fyg3cuRI/vzzT/7v//4PZ2dnWrduzejRowHYsmULu3btIjExERcXFwA++OADVqxYwbJlyxgxYgRz5sxh+PDhDB8+HICpU6eydu3aO14Fnzt3jlatWtG2bVsAwsPDtXUBAQEAVKtWjeDgYG35xIkT+fDDD3nooYeAvCvl2NhYFi1axHPPPaeVGz16NIMGDQJgwYIFrFq1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bIPyzwt8e0csoxrNa9GkV3MAbiamsvObLRUSmxCVkeFGAvpjO4r8fTOnUaNG4ezszJo1a+jSpQu1atWid+/erF27losXL/LWW29pZcPDw3n33Xd57LHH8PLyonHjxnz66acm6wEGDhyoTUgDBZughw0bxoABA3jvvfcICgrC19eXKVOmkJOTw/jx4/H396dmzZosWrRI2+b2Juhhw4ahKEqBn40bN2qx5L/6dHBw4JtvvuGhhx7C3d2devXq8fvvv5sci99//5169erh6urKfffdx9dff42iKCQnJxd67FRVZdKkSdSqVQsXFxdCQ0N56aWXgLzHVs+ePcvLL7+sxWa0ZcsWOnXqhJubG2FhYbz00kukp6cXOM6PP/44NWrUICwsjPnz59/x/9EcJAHbIJ3Pv2NQF3UFDND91b7aSbbp02iy0jItHpsQlU3WtmUkv92Vmx8/SfLbXcna+rPF9pWUlMTq1asZOXIkbm5uJuuCg4MZMmQIP/74o8n4B7NmzaJFixbExMRos71FR0cDec2+AIsWLeLy5cva+8KsX7+eS5cusXnzZmbPns3EiRN54IEH8PPzY+fOnTz//PM899xzXLhwodDtP/74Yy5fvqz9jBkzhsDAQBo2bFjkPmfMmMEjjzzCwYMH6dOnD0OGDNGu8OPj43n44YcZMGAABw4c4LnnnjP546Mwv/zyCx999BELFy7kxIkTrFixQptd6ddff6VmzZpMmTJFixHg1KlT9OrVi0GDBnHw4EF+/PFHtmzZwujRo03qNh7nTZs28frrrzNmzBjtOFuKTQ/EUVWZXAEX0hPaKKhBCC0GtGH/8j2kJ6Wz5cuNdBvbqyJCFMImpbz/EIbUqyUur+bkcCst331X1UD6krdI/99HKDqHoje8jc47AJ83fi223IkTJ1BVtchpThs1asSNGze4evUqgYF5nTE7dOjAG2+8gcFgYMSIEcTExPDRRx/RvXt3AgICAPD19b3j5DGQNyjR3Llz0el0NGjQgJkzZ5KRkcH/+3//D8ib4e39999ny5YtDB48uMD2Pj4++PjkPSb566+/snDhQtauXXvH/T7++OM89thj6HQ63nvvPebOncuuXbvo1asXCxcupEGDBsyaNQuABg0acPjwYaZNm1ZkfefOnSM4OJioqCicnJyoVasWd999t/b5HBwc8PLyMolp+vTpDBkyRJumtl69esydO5cuXbqwYMECbTajDh068Prrr5Oamkrr1q3Ztm2bdpwtRa6AbVBJmqCNur3cG51D3n/j35+vJ+NG+h3LC1GZGVKvoiZfKfEPaUV0ekq9Vqp6SpP0gVKN8BcZGVngfVxcXKn2B9CkSROTkfOCgoJM5uZ1cHCgWrVqBWaQu92+fft44okn+OSTT+jQoUOx+zQyTkVorP/YsWO0a9fOpLwxmRblkUce4datW9x11108++yzLF++vMB8vLc7cOAAixcvxtPTU/vp2bMnBoOB+Ph4rZy5jnNpyBWwDdL55m+CLvoKGKB6RABtHm3P7u+3k3Uzk78XrqfnG/0sHaIQNknnHYCh+GIaNSen8CTsXb3UV8AlUbduXRRFIS4ujoEDBxZYHxcXh5+fn3Zla063T5NnnE7v9mUGQ9FHMCEhgQcffJBnnnmG4cOHl2mfd6q/OGFhYRw7doy1a9cSHR3NyJEjmTVrFps2bSpyGsC0tDSee+457V5xfvmns7UGScA2SHH1QHH1RM1Mu+M9YKP7x/Rk7y+7yM3OZetXm+jwTFc8q3tVQKRC2JaSNAMbGQwGUlNTcTm8hls/TACDAXQ6PB57F5cOj1gkvmrVqtG9e3c+/fRTXn75ZZP7wAkJCSxZsoQnn3zSpAPRjh2mjxnu2LHDpAnbycmJ3FzLj4iXmZlJ//79adiwIbNnzy53fQ0aNODPP/80WXane9hGbm5u9OvXj379+jFq1CgaNmzIoUOHaN26Nc7OzgWORevWrTly5Ah169a9Y73FHWdLkCZoG2VshjbcSCi2ucq3hj93D8lrCtLfymbjJ5btOCBEZeJy78P4vrsRr7Hf4vvuRoslX6NPPvmErKwsevbsyebNmzl//jyrVq2ie/fu1KhRo8A90K1btzJz5kyOHz/OF198wbJlyxgzZoy2Pjw8nHXr1pGQkMCNGzcsFvdzzz3H+fPnmTt3LlevXiUhIYGEhASys8v2CORzzz3H0aNHef311zl+/Dg//fQTixcvBjD5AyS/xYsX89///pfDhw9z+vRpvvvuO9zc3KhdO2+M/PDwcDZv3szFixe5du0aAK+//jrbtm1j9OjR7N+/nxMnTvDbb78V6IS1detWZs2axcmTJ/n000/5+eefTY6zJUgCtlFaM7Q+EzUjpdjy943ugZNrXhPMjm//5uD/9pJy2XK/jEJUJjq/YJzqt0fnd+eOTOZQr1499uzZw1133cWjjz5KnTp1GDFiBPfddx/bt2/H39/fpPwrr7zCnj17aNOmDR9++CEffvghPXv21NZ/+OGHREdHExYWpk3dagmbNm3i8uXLNG7cmJCQEO1n27ZtZaovIiKCZcuW8euvv9K8eXMWLFig9YJ2cXEpdBtfX1+++OILOnToQPPmzVm7di3/+9//tGeep0yZwpkzZ6hTp47WjN+8eXM2bdrE8ePH6dSpkzalrXFOeCPjce7SpQvTpk1j9uzZJsfZEqQJ2kbl/yIw3EhA98/40EXxCvQm8qnObF6wjtzsXL4fuRhFpzBwxmDaDY6847ZCiIpVu3Zt7WqvON7e3vz0009ak7m3t7fJemNzbH6TJk1i0qRJ2vvC9mV8fje//FO6hoeHm7S+FTbda1HbAuTm5pKammqy7Pbnex988EEefPBB7f20adOoWbOm1jP5dgMGDGDAgAFFxnDPPfdw4MCBAsvbtWvHmjVr7hi/t7c3P/74o3aMK2KqV7kCtlGmHbFKNjhAy4GmPQpVg8ryN36QK2EhhE369NNP2b17N6dPn+bbb79l1qxZDB061NphVRi5ArZROr+SPQucX8aNtALL1FyV62eu4RPiZ7bYhBDCHE6cOMHUqVNJSkqiVq1avPLKK7z55pvWDqvCSAK2UWW5Aq4eEYCiU1AN/zYbKQ4K1cKrmz0+IYTlFdfsa+8++ugjPvroI2uHoR3n8jwiVRbSBG2jTBLwjZJdAfuE+DFwhukINp2f7yZXv0IIYYMkAdsok05YJbwCBmg3OJK+E/99wP9Wyi2zxiWELSnNiFJCmIu5zjtJwDZKcfcBp7yu+GopEjBAu8fuxdndGYCD/9uLPlNv9viEsCbjqEcZGRlWjkRURcbzrqjRt0pK7gHbKEVR0PkGY7h6ttRTpLl4uNCkT0v2LdtFZsotjq49TLMHLPd8oBAVzcHBAV9fX21cYXd39yIHbyiKwWAgOzubzMzMCnnkpLwkXssrLmZVVcnIyCAxMRFfX18cHEo+XGlhJAHbMGMCVjPTUG+lobh5lnjb1oPasW/ZLgD2/rJLErCodIwz3hQ3eUBRVFXl1q1buLm5lTp5W4PEa3kljbkks0+VhCRgG2b6KFICDm53Hss0v7vurYdPqB8pl25wfEMcadduyvjQolJRFIWQkBACAwPR60t/m0Wv17N582Y6d+5c7qbEiiDxWl5JYnZycir3la+RJGAbdvusSA4hJU/AOp2OVgPbsnF+NIZcA/tX7KHjM/dZIkwhrMrBwaFMX4gODg7k5OTg6upqFwlC4rW8io7ZPhrmqyjTntAlexQpv1YP/zu35r5fip9lRAghRMWRBGzDyjIYR36BdYOo2TJvlpBLhy+QEHfJbLEJIYQoH0nANuz2CRnKovWgf8eH3vvLrnLHJIQQwjwkAduw8l4BAzTv3wYHp7z7Y/uX7yE3x/ITdwshhCieJGAbpnj6g0NeR4CyJmAPPw8admsCwM3EVE5tOW62+IQQQpSdJGAbpuh06HwCgbI3QQO0GvRvZ6y9y6QZWgghbIEkYBtnfBZYTU9Gzc4sUx0N7m+Mu58HALGrDpJ5U8aHFkIIa5MEbONufxa4LBydHWnRvw0AOVl6Dv2x3xyhCSGEKAdJwDbOHAkYoFW+3tD7pBlaCCGsThKwjSvrtIS3q9miFgF185qz43eeIunc9XLHJoQQouwkAds4czyKBHnj5rbOPzLWr3IVLIQQ1iQJ2MaZYzAOo5YD22ozfOxdtlsmMxdCCCuSBGzjFB/TGZHKwzfUj7s61AMg6ew1zsXEl6s+IYQQZScJ2MbpfKqDkvffVN4rYMCkGVqeCRZCCOuRBGzjFAcnFO/qQPl6QRs16dUCZ3dnAA7+bx/6zNLPoyqEEKL8JAHbAeN9YPXmNdSc7HLV5eLhQtM+LQHITL3F0bWHyxueEEKIMrDpBLx582b69etHaGgoiqKwYsUKbZ1er+f111+nWbNmeHh4EBoaypNPPsmlS6ZT7iUlJTFkyBC8vb3x9fVl+PDhpKWlmZQ5ePAgnTp1wtXVlbCwMGbOnFkRH6/EtJ7Qqooh5Wq568vfDB0jzdBCCGEVNp2A09PTadGiBfPnzy+wLiMjg7179/LOO++wd+9efv31V44dO8aDDz5oUm7IkCHExsYSHR3NypUr2bx5MyNGjNDWp6am0qNHD2rXrk1MTAyzZs1i0qRJfP755xb/fCVlrsE4jCIi6+IT6gfAiY1x3LyaWu46hRBClI6jtQO4k969e9O7d+9C1/n4+BAdHW2y7JNPPuHuu+/m3Llz1KpVi7i4OFatWsXu3btp27YtAPPmzaNPnz588MEHhIaGsmTJErKzs/nqq69wdnamSZMm7N+/n9mzZ5skamsy12AcWn06Ha0easfGT9ZgyDVw4LcYOj5zX7nrFUIIUXI2fQVcWikpKSiKgq+vLwDbt2/H19dXS74AUVFR6HQ6du7cqZXp3Lkzzs7OWpmePXty7Ngxbty4UaHxF8Vcg3Hkl39oSukNLYQQFc+mr4BLIzMzk9dff53HHnsMb29vABISEggMDDQp5+joiL+/PwkJCVqZiIgIkzJBQUHaOj8/v0L3l5WVRVZWlvY+NTWvGVev16PXl61nsXG727c3eFXXXudcv1Tm+vPzq+1PjRa1uHjgHJdjL3L+4FmCG4WaJV5bJfFalsRrWRKv5Zkj5tJsWykSsF6v59FHH0VVVRYsWFAh+5w+fTqTJ08usHzNmjW4u7uXq+7bm9ZdM65jvF69FLefoy5/lqt+I6cGbnAg7/Xy2T9Te2C9MtVze7y2TuK1LInXsiReyytPzBkZGSUua/cJ2Jh8z549y/r167WrX4Dg4GASExNNyufk5JCUlERwcLBW5soV045NxvfGMoV58803GTdunPY+NTWVsLAwevToYRJDaT9LdHQ03bt3x8nJSVuu6rNI+/t9AILcdNzVp0+Z6r9dRmQ6s5ZPJlefy82DN+i5oCcOjg7ljtdWSbyWJfFalsRreeaI2dgaWhJ2nYCNyffEiRNs2LCBatWqmayPjIwkOTmZmJgY2rTJmw93/fr1GAwG2rdvr5V566230Ov12gGPjo6mQYMGRTY/A7i4uODi4lJguZOTU7lPtgJ1ODmhePqjpiVByhWzncw+gb407NaE2FUHSbt6k7M7TtPgvsblj9fGSbyWJfFalsRreeWJuTTb2XQnrLS0NPbv38/+/fsBiI+PZ//+/Zw7dw69Xs/DDz/Mnj17WLJkCbm5uSQkJJCQkEB2dt5gFY0aNaJXr148++yz7Nq1i61btzJ69GgGDx5MaGje/c7HH38cZ2dnhg8fTmxsLD/++CMff/yxydWtLTD2hDakJKIacs1WrwxNKYQQ1mHTCXjPnj20atWKVq1aATBu3DhatWrFhAkTuHjxIr///jsXLlygZcuWhISEaD/btm3T6liyZAkNGzakW7du9OnTh44dO5o84+vj48OaNWuIj4+nTZs2vPLKK0yYMMFmHkEy0npCG3JRb5pvLt/69zXG3c8DgCOrD5GZestsdQshhCiaTTdBd+3a9Y5T5pVkOj1/f3+WLl16xzLNmzfn77//LnV8FcnkUaQbCeh8Au9QuuQcnR1p0b8N2xdvJidLz6E/99NucKRZ6hZCCFE0m74CFv/S+ZlvWsLbmTRD/yzN0EIIUREkAduJ26+AzalG8zAC6+Ul+DO7TpF09ppZ6xdCCFGQJGA7ofPNfwVc/vGg81MUhVaD/r0K3rd8t1nrF0IIUZAkYDth7vGgb9fqobYoigLA3mW7S3R/XQghRNlJArYTOp98V8BmboIG8Anxo07H+gAknb3G2T3xZt+HEEKIf0kCthOKqweKW94IW5a4AgbTzlj7fpHOWEIIYUmSgO2INhhH8hWLNBE36dUcZ/e8WaEO/m8f+lvZZt+HEEKIPJKA7YjWESsnGzXd/FMlOru70LRPSwAyU28Rt/aw2fchhBAijyRgO2LSEcsC94EBWj+S75ngX6Q3tBBCWIokYDti8iywmR9FMoq4py4+oXmTUBzfcISLh89bZD9CCFHVSQK2I5YcjEPbh05HcMMQAFSDyid9ZrH7h+0W2ZcQQlRlkoDtiOJrueEojVIu3+D4xrh/F6iw/I0fSLls/nvOQghRlUkCtiOWHowD4Fr8VVSDaQ9rNVfl+hkZnlIIIcxJErAdqYgm6OoRASg6xXSholAtvLpF9ieEEFWVJGA7orh5gYs7YLkrYJ8QPwbOGGyShP1r+eMT4meR/QkhRFUlCdiOKIqiPQtsqcE4ANoNjuT1HZPwC6sGQNLZ66RcTrbIvoQQoqqSBGxntGborAzUzDSL7ccnxI/WD7fT3h9ZfdBi+xJCiKpIErCdqYjBOIya9G6hvT781wGL7ksIIaoaScB2xnQwDssm4OCGoVQLDwAgfsdJ0pMsd8UthBBVjSRgO6PL9yywauErYEVRaNK7ed6+DCpxaw5ZdH9CCFGVSAK2MxV5BQzQtHdL7bU0QwshhPlIArYzFTEYR341WoThE+ILwMktx8hMvWXxfQohRFUgCdjOVMRgHCb70+m0zli52bkcXRdr8X0KIURVIAnYziiefuDoBFhuRqTbNenVXHsdu0qaoYUQwhwkAduZvME48q6CKyoBh99dB49qngAc2xBH9q3sCtmvEEJUZpKA7ZAxAasZKahZGZbfn4OOxj3zroL1t7I5kX+2JCGEEGUiCdgOmXbEqvhm6MPSDC2EEOUmCdgOVfSjSAB1OtTH1dsNgKNrY8nJzqmQ/QohRGUlCdgO5R+MoyJ6QgM4OjvSMKoJAJmptzi19XiF7FcIISorScB2yCQBV9AVMJgOyhErg3IIIUS5SAK2Q6YTMlTMPWCAel0a4uTmDOTNjmTINVTYvoUQorKRBGyHrHEPGMDZzZkG9zcGID0pnbO7T1fYvoUQorKRBGyHFO/qoHMAKq4XtFGTXv9OUXhktUzOIIQQZSUJ2A4pOgd0PoFAxV4BAzTs1hgH57zkH7f6EKpBrdD9CyFEZSEJ2E5pg3HcvI6qr7iRqVy93KjbqSEAqQkppJ1LrbB9CyFEZSIJ2E6ZdMRKqdhm6Ka9/22GTtp/tUL3LYQQlYUkYDulWOlRJIBG3Zuic8g7dZL2J6Kq0gwthBClVeoEfOvWLS5evFhgeWysTFNXkUwH46jYK2APf08i7qkLQNa1W1w5erlC9y+EEJVBqRLwsmXLqFevHn379qV58+bs3LlTW/fEE0+YPThRNGs9imTUJF8z9JFVByt8/0IIYe9KlYCnTp1KTEwM+/fvZ9GiRQwfPpylS5cCSDNkBTMdjMMKCbjnv5MzyONIQghReo6lKazX6wkKymv6bNOmDZs3b2bgwIGcPHkSRVEsEqAonLWvgL2DfQhrE875mDMkHk/g6ulEAu4KrPA4hBDCXpXqCjgwMJCDB/9tbvT39yc6Opq4uDiT5cLydD4B8M8fPRU9GIdR457NtNcyNrQQQpROqRLwt99+S2Cg6VWOs7Mz33//PZs2bTJrYACbN2+mX79+hIaGoigKK1asMFmvqioTJkwgJCQENzc3oqKiOHHihEmZpKQkhgwZgre3N76+vgwfPpy0tDSTMgcPHqRTp064uroSFhbGzJkzzf5ZzE1xdEbxqg5Y5woYTBPw4T8lAQshRGmUKgHXrFmT4ODgQtd16NDBLAHll56eTosWLZg/f36h62fOnMncuXP57LPP2LlzJx4eHvTs2ZPMzEytzJAhQ4iNjSU6OpqVK1eyefNmRowYoa1PTU2lR48e1K5dm5iYGGbNmsWkSZP4/PPPzf55zM3YE1pNuYqaW/Hz8/qFVcO9phcAFw+eI/liUoXHIIQQ9qpU94ArWu/evendu3eh61RVZc6cObz99tv0798fgG+++YagoCBWrFjB4MGDiYuLY9WqVezevZu2bdsCMG/ePPr06cMHH3xAaGgoS5YsITs7m6+++gpnZ2eaNGnC/v37mT17tkmitkU6v2Byzx0G1YCaeg3Fr/A/jiypWssAMi7cBCB21UE6DO9a4TEIIYQ9KnMCPnfuXJm28/X1xdvbu6y71cTHx5OQkEBUVJS2zMfHh/bt27N9+3YGDx7M9u3b8fX11ZIvQFRUFDqdjp07dzJw4EC2b99O586dcXZ21sr07NmTGTNmcOPGDfz8/Ardf1ZWFllZWdr71NS8IRn1ej16vb5Mn8m4XYm39w7QXmZfu4CDZ7Uy7bes9Ho9/i0DOb8yb1akQ3/s5+4nzd8SYi6lPr5WJvFalsRrWfYWL5gn5tJsW+YEHB4eXuptFEVh4sSJTJgwoay71SQk5N33NPbKNgoKCtLWJSQkFLhn7ejoiL+/v0mZiIiIAnUY1xWVgKdPn87kyZMLLF+zZg3u7u5l+ET/io6OLlG5mgnJGCOPWf8X14ILDpBiaW7BHrgGuZN5JYOze06z4oflOHu7VHgcpVHS42srJF7Lkngty97ihfLFnJGRUeKyZU7ABkPVnoz9zTffZNy4cdr71NRUwsLC6NGjR5mv8PV6PdHR0XTv3h0nJ6fiy+/OJfPEXwC0vCsU5659yrTfsjLG23Zge7Z8tgFUqGEIpl2fyAqNo6RKe3ytTeK1LInXsuwtXjBPzMbW0JIocwKOiIgo07O/Y8eO5aWXXirrbjXGzmBXrlwhJCREW37lyhVatmyplUlMTDTZLicnh6SkJG374OBgrlwxfYzH+L6oDmcALi4uuLgUvNJzcnIq98lW4jqq18DY3UxJvWq1k7xpn5Z5CRg4uuYw9w7tbJU4Ssoc/0cVSeK1LInXsuwtXihfzKXZrswJePHixWXarixN14WJiIggODiYdevWaQk3NTWVnTt38sILLwAQGRlJcnIyMTExtGnTBoD169djMBho3769Vuatt95Cr9drBy46OpoGDRoU2fxsK0wG46jgGZHyC2lSA78wf26cT+LUtuPcSs7Azbd8zfBCCFHZlTkBd+nSxZxxFCotLY2TJ09q7+Pj49m/fz/+/v7UqlWLsWPHMnXqVOrVq0dERATvvPMOoaGhDBgwAIBGjRrRq1cvnn32WT777DP0ej2jR49m8ODBhIaGAvD4448zefJkhg8fzuuvv87hw4f5+OOP+eijjyz++crLdEIG6zwLDHn39pv0asGWLzZgyDEQt/YwrR++22rxCCGEPTDbdIR6vZ7z589z7NgxkpLM8zzonj17aNWqFa1atQJg3LhxtGrVSuvE9dprr/Hiiy8yYsQI2rVrR1paGqtWrcLV1VWrY8mSJTRs2JBu3brRp08fOnbsaPKMr4+PD2vWrCE+Pp42bdrwyiuvMGHCBJt/BAlAcXZF8fAFrDcallHTPv9OziCjYgkhRPHK9RzwzZs3+e677/jhhx/YtWsX2dnZqKqKoijUrFmTHj16aMmxLLp27XrHSR4URWHKlClMmTKlyDL+/v7ahBFFad68OX///XeZYrQ2nV8wuenJGJKvoBoMKDrrTPEc1jocr0BvbiamcnzTUbLSs3DxsO3e0EIIYU1l/raePXs24eHhLFq0iKioKFasWMH+/fs5fvw427dvZ+LEieTk5NCjRw969epVYIhIYR46n3+aoXP1qGnWG4lKp9PRpFfeDEk5WXqObzhitViEEMIelPkKePfu3WzevJkmTZoUuv7uu+/m6aef5rPPPmPRokX8/fff1KtXr8yBisKZTEuYnIDOu7rVYmnSuwU7vtkC5I0N3eyBVlaLRQghbF2ZE/D3339fonIuLi48//zzZd2NKIZJT+gbCVCrqdViibinLm6+7txKzuDo+lj0mXqcXO3r8QMhhKgo5bph6OXlRefOnXn55Zf59ttviY2NveM9W2F+t18BW5ODowONe+TNkJSdnsXJv49aNR4hhLBlpUrAt1/1zpgxg3r16rF+/XqefvppmjdvjpeXF/feey8vvvgiixYt4sAB6RFrSQWugK2sSe/8vaFljmghhChKiZqgExISGDlyJL6+vjz22GPa8pEjR2qvb926hYeHBy+++CJJSUns2LGDL7/8kuzsbHJzc80fuQBuexbYyo8iAdTt2AAXTxey0rI4suYQufpcHJwcrB2WEELYnBIl4M8//xy9Xs9XX31VZBk3NzcAHnvsMZo3/6c3bE4OR45Ib1hLMm2Ctn4CdnJ1osH9TTj4+15upWQQv+MkdTs1sHZYQghhc0rUBP3SSy/h7+/PoEGDSlW5o6OjloyFZSiuniiunoD17wEb5R+U47AMyiGEEIUqUQL29fXl66+/Zvjw4ZaOR5SB8k8ztOFGgk10gqvftTGOLnm9n4+sPljlZ84SQojClKoTVp8+ptPdPfPMMyxYsIDdu3drk9OXZYYkUT5aRyx9JmpGinWDAVw8XKjftREANxNTORdzxroBCSGEDSrXY0gnTpzgjTfeoH379nh5eQEwefJkPvnkE7Zt21aqiYlF2ZncB7aBntAATXr/e+vh8J/7rReIEELYqHKNBb1p0yYgLxHHxMSwd+9e9u7dy4QJE0hOTsbBwYH69esTGxtrlmBF4UweRUpOgJoNrRhNnkZRTdE56jDkGNi/IoaOz96Hb6htT+8ohBAVqVwJ2KhevXrUq1ePwYMHa8vi4+PZs2cP+/btM8cuxB3o/PI/imQbV8BuPu5UvyuQxOMJpF+7ycx7JjFw5mDaDY60dmhCCGETzJKACxMREUFERASPPPKIpXYh/mF6BWz9R5EAUi7fIPHEv38MqKrK8jd+oH6XhviEyJWwEEKU+R7wuXPnSlX+4sWLZd2VKIbpaFi2kYCvxV+F2zpkq7kq189cs05AQghhY8qcgNu1a8dzzz3H7t27iyyTkpLCF198QdOmTfnll1/KuitRDFsaD9qoekQAis60R7yiU6gWbr3ZmoQQwpaUuQn6yJEjTJs2je7du+Pq6kqbNm0IDQ3F1dWVGzducOTIEWJjY2ndujUzZ84s8AiTMB/F3QecXPMeQ7KRBOwT4sfAGYNZ/toP2rPJdTrUl+ZnIYT4R5mvgKtVq8bs2bO5fPkyn3zyCfXq1ePatWucOHECgCFDhhATE8P27dsl+VqYoijamNC28hgSQLvBkYyJfgOdQ95plng8QQblEEKIf5S7E5abmxu9evXi4YcfNkc8oox0vsEYrp5FzUxDvZWG4uZp7ZAACGoQQoP7GxMXfZjUKymc3XWaiHvqWjssIYSwunINxGHk4+Mj93itzBYfRTJq/mAb7fWB3/daMRIhhLAdZknAqqqycOFCOnToQMeOHRk7duwdO2cJ87PFR5GMGnVvipNr3tjQh//YR26OTE8phBBmScAA+/bto3Xr1nTs2JHY2Fg6derEq6++aq7qRTFssSe0kYuHCw2jmgKQnpTOqa3HrRyREEJYn9kG4li6dCndu3fX3h88eJD+/ftTo0YNXn75ZXPtRhTBlq+AAVo82JpDK/NGRTv4+17qd2lk5YiEEMK6zHIF7O/vT1hYmMmy5s2b88knn7BgwQJz7EIUwxYnZMiv/n2NcfF0ASB21UFysvRWjkgIIazLLAm4ZcuWLFq0qMDyunXrlnrELFE2BSZksDFOrk407pk3Q1Jm6i1ObD5q5YiEEMK6zJKAp06dyty5c3niiSfYvn076enpJCYm8t577xEREWGOXYhiKJ7+4JDX0ckWEzBA8wdba6+lN7QQoqozyz3ge+65hx07djBmzBg6deqkjXzk6urKzz//bI5diGIoOh06n0AMSRdtsgkaoG7HBrj5unMrOYO4NYfIvpWNs5uztcMSQgirMFsv6BYtWrBx40YuXbrEypUr+f333zl79qyMglWBjM8Cq+nJqNmZVo6mIEdnR5r2aQlAdkY2x9bJPNFCiKqrzFfAd7q326RJEwAyMjIKlPP19cXb27usuxV3cHtPaIfA2laMpnAtHmzN7qXbgLxm6GYPtLJyREIIYR1lTsDh4eGl3kZRFCZOnMiECRPKultxB7d3xLLFBBxxT108A7xIu3qTY+tjybx5C1cvN2uHJYQQFa7MCVgG1bc9poNx2N6zwAA6Bx3NHmjF9kWbycnK4ciaQ7QedLe1wxJCiApX5gQcERGBoijFF7zN2LFjeemll8q6W3EHtv4oklGLB1uzfdFmIG9QDknAQoiqqMwJePHixWXarixN16JkbH0wDqOw1uH4hPqRcukGJzYfJf1GOh5+HtYOSwghKlSZE3CXLl3MGYcwA3u5AtbpdDTv14q/F67HkGPgyKoDtHvsXmuHJYQQFcpsjyEJ61O8q4OS919qy1fAkNcMbSSDcgghqiJJwJWI4uCYl4Sx3U5YRqHNwqgWHgDA6W0nuJmYauWIhBCiYkkCrmSM94HV1KvkXrXdcbgVRdGGplQNKof+3G/dgIQQooJJAq5scnO0lymTepC11XaHAs3fDH1QmqGFEFWMJOBKxHAjgdzzcf8uUA2kf/+Ozd4PDmoQQlCDEADO7j5N8sUkK0ckhBAVRxJwJZKbeAZQTRcaDORePWuNcErE5Cr4f/usGIkQQlQsScCViENgONw+OIpOh0OA7Q1JadSsnzRDCyGqJknAlYjOLxj3R94xWebx2LsmA3TYmuoRAdRoFgbAxUPnuRZ/1coRCSFExbD7BJybm8s777xDREQEbm5u1KlTh3fffVebkxhAVVUmTJhASEgIbm5uREVFceLECZN6kpKSGDJkCN7e3vj6+jJ8+HDS0tIq+uOUm2vX/0OpVjPvjaMzzvcMtG5AJdA8XzP0of/JVbAQomqw+wQ8Y8YMFixYwCeffEJcXBwzZsxg5syZzJs3Tyszc+ZM5s6dy2effcbOnTvx8PCgZ8+eZGb+O2fukCFDiI2NJTo6mpUrV7J582ZGjBhhjY9Ubk61m+W9yMnGkHjGqrGURPN+/05JKINyCCGqCrtPwNu2baN///707duX8PBwHn74YXr06MGuXbuAvKvfOXPm8Pbbb9O/f3+aN2/ON998w6VLl1ixYgUAcXFxrFq1ii+//JL27dvTsWNH5s2bxw8//MClS5es+OnKxqFmQ+11zoW4O5S0Db41/Knd7i4Arhy7TMJR+zvmQghRWmUeC9pW3HvvvXz++eccP36c+vXrc+DAAbZs2cLs2bMBiI+PJyEhgaioKG0bHx8f2rdvz/bt2xk8eDDbt2/H19eXtm3bamWioqLQ6XTs3LmTgQMLNuNmZWWRlZWlvU9NzRvJSa/Xo9fry/RZjNuVdXtNcH3tZfbZw+ha9ipffUUwW7xA074tOLv7NAD7f9tDtzq9y13n7cwZb0WQeC1L4rUse4sXzBNzaba1+wT8xhtvkJqaSsOGDXFwcCA3N5dp06YxZMgQABIS8p6BDQoKMtkuKChIW5eQkEBgYKDJekdHR/z9/bUyt5s+fTqTJ08usHzNmjW4u7uX6zNFR0eXa3unrFTu+ed14oEtHHZqXK76ilPeeAGynbNAAVTY+eNWMhsYyjTdZUmYI96KJPFalsRrWfYWL5Qv5oyMjBKXtfsE/NNPP7FkyRKWLl1KkyZN2L9/P2PHjiU0NJShQ4dabL9vvvkm48aN096npqYSFhZGjx498Pb2LlOder2e6OhounfvjpOTU5ljU1WV9D2foqZdxz/zGr1797ZIMjNXvEbJK69wetsJMq/eolWt5oT+0zvaXMwdr6VJvJYl8VqWvcUL5onZ2BpaEnafgMePH88bb7zB4MGDAWjWrBlnz55l+vTpDB06lODgvEdwrly5QkhIiLbdlStXaNmyJQDBwcEkJiaa1JuTk0NSUpK2/e1cXFxwcXEpsNzJyancJ5s56sgMa0RO3BbU9Bs4pidZ9FEkc8QL0HJAG05vy+udHvvnQWq3vqvcdRbGXPFWFInXsiRey7K3eKF8MZdmO7vvhJWRkYFOZ/oxHBwcMBgMAERERBAcHMy6deu09ampqezcuZPIyEgAIiMjSU5OJiYmRiuzfv16DAYD7du3r4BPYX6OYY201/bQEQugSa8W6Bzz/i8P/m+f9n8ohBCVkd0n4H79+jFt2jT++OMPzpw5w/Lly5k9e7bWcUpRFMaOHcvUqVP5/fffOXToEE8++SShoaEMGDAAgEaNGtGrVy+effZZdu3axdatWxk9ejSDBw8mNDTUip+u7Bxq/puAc+0kAbv7eVCvc14P7pRLNzi/94x1AxJCCAuy+yboefPm8c477zBy5EgSExMJDQ3lueeeY8KECVqZ1157jfT0dEaMGEFycjIdO3Zk1apVuLq6amWWLFnC6NGj6datGzqdjkGDBjF37lxrfCSzcMyXgHPOH7FiJKXT/MHWHFufF++B3/dSu61lmqGFEMLa7D4Be3l5MWfOHObMmVNkGUVRmDJlClOmTCmyjL+/P0uXLrVAhNahCwwHZzfIvmU3V8AAjXs0w9HFkZysHA6t3McDEx9C52D3DTVCCFGAfLNVUorOAYcaDQAwXDuP4dZNK0dUMq5ebjS4vwkAaVdvEr/jpJUjEkIIy5AEXIk5mtwHPmrFSEon/xSFMjSlEKKykgRciTmE2V9HLIAG3Zrg7O4MwOE/95OTnWPliIQQwvwkAVdiJh2x7CgBO7s506hH3oQSt5IzOLnlmJUjEkII85MEXIk5hNYHJe+/ONeOekIDNO/3bzP0QWmGFkJUQpKAKzHF2Q2H4LzHeHIvn0TNybZyRCVXv0tDXL3dADiy+iD6TPsZ0F0IIUpCEnAlpw3IkasnN+GUdYMpBUcXJ5r0ag5AVloWxzfY1xW8EEIURxJwJWcyItZ5+7kPDHmDchhJb2ghRGUjCbiSs8cxoY3qdKiPh78HAEfXHiYrPauYLYQQwn5IAq7kHGrY56NIAA6ODjTt2woAfaaejfOjSbl8w8pRCSGEeUgCruR0Xv4ovkFAXgJWVdXKEZVO/kE5Ns5bw4x7JrH7h+1WjEgIIcxDEnAV4FizMQDqrZsYrl+wcjSl4xvmb/JeNagsf+MHuRIWQtg9ScBVgL2OiAWQdPZagWVqrsr1MwWXCyGEPZEEXAWYTk1oXwm4ekQAik4xWaboFKqFV7dSREIIYR6SgKsAe74C9gnxY+CMwZAvB7ca1A6fED/rBSWEEGYgCbgK0PnXRHH1BOwvAQO0GxzJk/8dob2/eOC83XUmE0KI20kCrgIUnQ6Hmg0BMNy4jCHN/jowNerelNrt8obVvHL8Mic22c/0ikIIURhJwFWEwz89ocE+r4IBOj57n/Z6yxcbrBiJEEKUnyTgKsKeR8QyatyjGX61qgFwYvNREo5esnJEQghRdpKAqwh7HhPaSOego8Pwrtr7rV9utFosQghRXpKAqwiHkLrg4ATYbxM0QNtH22vTFO5bvpubV1OtHJEQQpSNJOAqQnF0xiGkDgC5V06jZmdaOaKycfF05e4h9wKQm53Ljm+2WDkiIYQoG0nAVYjWDG3IJffScesGUw73PtUZnWPeqbvzm7/R38q2ckRCCFF6koCrEJMRsey4GdonxI9mD+TNkpSelM6+X3dbOSIhhCg9ScBVSGV4FMmo4zP5Hkn6ciMGg8GK0QghROlJAq5CjINxgP32hDaq2aIWEe3z7mlfPXmF4xvt+/MIIaoeScBViM7dG121mgDkXDqGasi1ckTlIwNzCCHsmSTgKkbriJWVgeHqOesGU04NuzelWngAAKe2HOfykYtWjkgIIUpOEnAVUxlGxDLS6XR0eKar9v5vuQoWQtgRScBVjOmIWEesGIl5tHnkbtx83AE4+FsMqQkpVo5ICCFKRhJwFVOZekIDOLu70P7/OgCQq89l+9d/WzkiIYQoGUnAVYzOLxjFwxeAnAuVY0q/yGGdcXByAGDnd1vIzsiyckRCCFE8ScBVjKIo2uNIaupVDClXrRxR+XkH+9D8wdYA3ErOYO+yXVaOSAghiicJuApyzNcMbe8dsYxMHkmSgTmEEHZAEnAVZNIRq5Ik4NAmNanToT4A1+OvcnRtrJUjEkKIO5MEXAU5hFWuntBGMjCHEMKeSAKughyC7gJHZ6DydMQCqH9fIwLqBAIQv+MkFw/a90AjQojKTRJwFaQ4OOIQmtdca7h6BjUz3coRmUfewBym94KFEMJWSQKuorQRsVSVnIvHrBuMGbUe1A53Pw8ADv5vLymXb1g5IiGEKJwk4Cqqsg3IYeTk5sw9T3YEwJBjYNuizVaOSAghCicJuIqqjD2hje55shMOznkDc+xaso2sdBmYQwhheyQBV1GONRqAogCQU4l6QgN4BXrTckBbADJTbxHz0w4rRySEEAVVigR88eJF/u///o9q1arh5uZGs2bN2LNnj7ZeVVUmTJhASEgIbm5uREVFceLECZM6kpKSGDJkCN7e3vj6+jJ8+HDS0tIq+qNUGMXVA11AOAC5l46j5uZYNyAz65ivM9bWLzdiyJWBOYQQtsXuE/CNGzfo0KEDTk5O/PXXXxw5coQPP/wQPz8/rczMmTOZO3cun332GTt37sTDw4OePXuSmZmplRkyZAixsbFER0ezcuVKNm/ezIgRI6zxkSqM4z9DUpKTTe6VeOsGY2bBjUKp26kBAEnnrhO35pCVIxJCCFN2n4BnzJhBWFgYixYt4u677yYiIoIePXpQp04dIO/qd86cObz99tv079+f5s2b880333Dp0iVWrFgBQFxcHKtWreLLL7+kffv2dOzYkXnz5vHDDz9w6dIlK346y6psUxPertOI+7XXMjCHEMLWOFo7gPL6/fff6dmzJ4888gibNm2iRo0ajBw5kmeffRaA+Ph4EhISiIqK0rbx8fGhffv2bN++ncGDB7N9+3Z8fX1p27atViYqKgqdTsfOnTsZOHBggf1mZWWRlfVv557U1FQA9Ho9er2+TJ/FuF1Zty+1f54FBsg+F4uudZ9SbV7h8ZZS+L11CKgXxNUTVziz+zRnYk4Dthvv7Wz9+N5O4rUsidfyzBFzaba1+wR8+vRpFixYwLhx4/h//+//sXv3bl566SWcnZ0ZOnQoCQkJAAQFBZlsFxQUpK1LSEggMDDQZL2joyP+/v5amdtNnz6dyZMnF1i+Zs0a3N3dy/WZoqOjy7V9STllpXLPP68TD2zhsHOTMtVTUfGWhVc7f66euALAb9N/pt7TzWw63sJIvJYl8VqWvcUL5Ys5IyOjxGXtPgEbDAbatm3Le++9B0CrVq04fPgwn332GUOHDrXYft98803GjRunvU9NTSUsLIwePXrg7e1dpjr1ej3R0dF0794dJycnc4V6R2kxn6LevI5f5lV69+6N8k/P6JKwRrylpe+mZ/bqqaRfTyPpwDWykm7xwH8etNl487OH45ufxGtZEq/lmSNmY2toSdh9Ag4JCaFx48Ymyxo1asQvv/wCQHBwMABXrlwhJCREK3PlyhVatmyplUlMTDSpIycnh6SkJG3727m4uODi4lJguZOTU7lPNnPUUVKOYY3RH/kbMlJwSLuOg39I8RvdpiLjLS0nJyfuGdqJdbP/Qs01cHb5STK6pVO9VoC1QysxWz6+hZF4LUvitbzyxFya7ey+E1aHDh04dsx0KMXjx49Tu3ZtACIiIggODmbdunXa+tTUVHbu3ElkZCQAkZGRJCcnExMTo5VZv349BoOB9u3bV8CnsJ7KPCCH0T1PdETnmHeqJ+1LZHanqez+YbuVoxJCVHV2n4BffvllduzYwXvvvcfJkydZunQpn3/+OaNGjQJAURTGjh3L1KlT+f333zl06BBPPvkkoaGhDBgwAMi7Yu7VqxfPPvssu3btYuvWrYwePZrBgwcTGhpqxU9neaYJuPL1hAbI1edgyPn3OWDVoLL8jR9knGghhFXZfRN0u3btWL58OW+++SZTpkwhIiKCOXPmMGTIEK3Ma6+9Rnp6OiNGjCA5OZmOHTuyatUqXF1dtTJLlixh9OjRdOvWDZ1Ox6BBg5g7d641PlKFcgz7t/k+53zlvAK+Fn+1wDI1V+X6mWv4hPgVsoUQQlie3SdggAceeIAHHnigyPWKojBlyhSmTJlSZBl/f3+WLl1qifBsmi6gFri4Q1ZGpW2Crh4RgKJTUA2qyXI3Xw8rRSSEEJWgCVqUj6JzwDE0b8Qow/ULGDJK3oPPXviE+DFwxmAUnWkP77+mrZAhKoUQViMJWOAQlv8+8FErRmI57QZHMu7vt6n7dFPcfPOe0z6x6SjrPvrLypEJIaoqScCiSvSEBvAJ8aV66yD+M3+odjW8/uPVxK09bOXIhBBVkSRggWO+BJxTSXtC53dXZF16vfmg9v6nMd8W2lFLCCEsSRKwwCG0PujyJrCvzFfA+XV67n6a9mkB5M0ZvGTEf8m+lW3lqIQQVYkkYIHi7IpD0F0A5F4+hZpT+RORoig8/OEQAurmjRGecPQSy9/4AVVVi9lSCCHMQxKwAPLdB87Vk3v5pHWDqSAunq783+fDcfbIG1J0/6972PH131aOSghRVUgCFkDV6Yh1u8B6wTz8wePa+5WTf+XsntNWjEgIUVVIAhYAOOZ7FKmyjohVlGYPtKLTiPsBMOQYWPr8Im4mVr7noYUQtkUSsADAoWZD7XVlHRP6Tnq+2Y+Ie+oCkHolhe9HLiJXn2vlqIQQlZkkYAGAztMfnW/e1Is5F+JQDVVrhCgHRwce+3QY3kE+AMTvPMXq9/9n5aiEEJWZJGChcTBOzJCZjiHpgnWDsQKvAG8eX/g0Dk55j2T9/fl6Dq3cZ+WohBCVlSRgoTHpiFXF7gMb1W4TQd8JA7X3y15ZQuKJBCtGJISorCQBC41jvvvAOVWoJ/Tt7hnaiZYPtQUgOyOb7579ksybt6wclRCispEELDQO+eYGrqpXwJA3SMfA9wcT3CgUgKunEln2ylIZpEMIYVaSgIVGV60miqsnUDXGhL4TZzdnhiwcjqu3GwCxfx3g74XrrRyVEKIykQQsNIqiaPeB1eQrGG4mWTki66oeEcCjHz+hvV81/XdObT1uxYiEEJWJJGBhwqQZ+mLVbYY2ahTVlPvH9ARANah8P2oxKZdvWDkqIURlIAlYmDCZmrAK3wfOr9vLvanXJa+DWvr1NL5+6nOOb4yTRCyEKBdJwMKE6YhYkoABdA46/jNvKL41/QG4HHuRRU8sYMY9k9j9w3YrRyeEsFeSgIUJh5C64OAESALOz8PPgwHTHjFZphpUlr/+AzcuVu175UKIspEELEwojs55SRjITTiNmi3Pvxo5ujoVWKYaVL54ZC6H/9yPoYoN3ymEKB9JwKIAbUQs1UDuJen1a1Q9IgBFpxRYfuN8Ekue+4pPes/iyOqD8rywEKJEJAGLAhzz9YTOPr7DipHYFp8QPwbOGIzikJeEFZ2CXy1/bf3lIxf59pkv+aTvLOLWHpZELIS4I0drByBsT27yFe115ooPcfDwx6XDI3fYoupoNziS+l0acv3MNaqFV8c72JdjG46w9sO/uHjwHACXDl3gm6c+p2aLWkS90of6XRuhKAWvnIUQVZskYGHCcCOBrLX/NVmWvuRtFJ8AnJt2tU5QNsYnxA+fED/tfcP7m9DgvsYcXXuYtbP/4tLhvJmkLhw4x+InPyOsdTjdX+lD3U4NJBELITTSBC1M5CaeAfX2zkQqaZ+OIOW9/mRu+g5DRoo1QrNpiqLQqHszRv85nv/74hltHGmA83vP8NWQT1k46GNObT0uTdNCCECugMVtHALDQdEVkoTzHkvK+HEKGb/OwLlVTxzaPwSSTEwoikKTXs1p1KMpR1YdZO2Hf3Hl+GUAzu4+zZeDPyHinrpEjetNtfDqXIu/SvWIAJMraiFE1SAJWJjQ+QXj8fi7pH//DhgMoOhwvvtBcq+cJvfMwbxC+iyyd/0Ou36njXt1slwu43Dvw+h8AqwbvA3R6XQ07dOSxr2ac3jlftZ+9BdXT+bdW4/fcZIvHp2nlVUUhV7/70E6PXe/NFELUYVIAhYFuHR4BKfGnci9ehaHgNro/IIByLlwlKxty8je9RvqP83Q7hnXyP7fR2T/MRenZvfhcm/etoqDnFqQl4ibP9iapn1bcvD3vaybs4prpxNNyqiqyl/TfmPt7L8IrBdMQJ1AAuoE4R9ejYyLaeiz9Dg5FXwGWQhh3+RbUhRK5xesJV4jx5oNcXz0bdwHjid7fzSZW34k98TOvJWGXPQH1qI/sBbFNwiXyEG4RA5CcXAiN/EMDoHhBeqrSnQOOloObEuzfq2I/uAPNs1fW6CM/lY2Fw+e03pTGx16fxd+Yf5UrxNEQJ1AAusGEVAniOp1AsnV53L9TPmbsVMu35DmcCEqmCRgUWqKkwsu7R5A17In65d9QwfXG+h3rUBNybuyU5OvkPnXp2T+9Wm+jRRcOj6GU9MuKE7O4OiC4uQCjs7//Jv3XnF0BidncHAyaY413EgodyI3JCfgc/0khuQECAgr8+cvTywOjg5EDu3E5gXr8HC+hZ9HOjfSPUjLdMU31JeUyykFOmmpqkrSuesknbvO8Q2m8zR7umZqdbjXCiegThDO7s44uznj7O6Ck7szzm5OOLm7/LMsb7mzuzNO/7w/ujaWrR//hK9bOsm3PLj/rSdoOzgSnYMORaeUuFk85dhxHA/sI6VOXao3bVKq45Jf8rGjpMQexqdJU3wbNCx+AwvWY0uxyPG1fD3mOsYlpajSJdMsUlNT8fHxISUlBW9v7zLVodfr+fPPP+nTp49dNDnmj9dRp6A/8jdZW39Cf3gjGHLLV7mi5CVnRxdU1QCZaf+u8vRHcfcGFFD4519josh7ra3757UhPRn1xuV/6/APRefpT2kZ0pJQky6Vu57MKwk4Zl5DUfL6seW4Vsc1KBhVVcnJyiEnS48+U09GWgY6g0JOVk6BoS7dnLPxccvU6ki55cqtbOdSx1JcPQqK8UXeO+W214CLYybeLre0Om5muZNlcCNfJRSexk1XOCsZeDln/FtPtgd61bSeknDiFl7O6Vo9adkeZONWoFxubi4ODg6F1uHMLTwL1OFesgBM6skodz3mqKPi61HzHd+C/3G2/JkMKlyr/zQNX36j1PWUJhdIAjaTqp6A88drSEkk438fk73tZytGJ4QQZWcwgOPLv5f6iro0uUCaoIXZ6XwCce/7ItnbfzF9nElRcO32NDg6gz4LNScbcrJQ9Vmo+mzIyUbVZ+Uty8kGfRaG9BTU5ISCO3HxQNE5ACqoKioqqGjv8x6P+udfQ27hV+SKDkrT61hVC308y5L1qKpaeBOwQQUK1qGi5NVDIX9XF7ZINVDI8NZ51Zf0chO18DoMFH1cCv2zX0VXyMgEeRf+pekdbo56JBbL1mNLsRRej04HqUdiy9WkXRxJwMIiCjzOpNPh8di7pR7S0nAjgeS3u5omLJ0O3wl/lfj+a5F1vLuxVPdwK7qeO7WIGG4kcOOtLij5MpmKDr9ppY+lsHr83yt5PcnHjpIz50GTJFyWq4eKrudOx9eWPpMtxVKaeuzl+N6pHu/Glr0PLCNhCYtx6fAIvu9uxGvst/i+u7FM40kbE7n25+k/ibw0SUarQ/mnDqX0dZgrFnPVo/MLxnPIVJPP5DmkbLGUtx7fBg25Vv9pjLeoDQa41uDpUl852FI9Eotl67GlWMxZT2nJPWAzkXvAlo3XcCOhwHPJpZV19TzbV/5M5AOP4FLeXtDljKUk9ZTk+FZULCVx7XAsO39dRvuHHi53L93UI7F4N25S7p6xd6qnJMe3omIpCTm+ZY+lpMxxjOUesKh0CnsuudR1+AaT4l8HnW856zFDLOaqx5Zi8WlQn5wWLfFpUL9c9fg2aGiWKw9z1GNLscjxtXw95jrGJSVN0EIIIYQVSAIWQgghrEASsBBCCGEFlSoBv//++yiKwtixY7VlmZmZjBo1imrVquHp6cmgQYO4cuWKyXbnzp2jb9++uLu7ExgYyPjx48nJyang6IUQQlQllSYB7969m4ULF9K8eXOT5S+//DL/+9//+Pnnn9m0aROXLl3ioYce0tbn5ubSt29fsrOz2bZtG19//TWLFy9mwoQJFf0RhBBCVCGVIgGnpaUxZMgQvvjiC/z8/p3JJSUlhf/+97/Mnj2b+++/nzZt2rBo0SK2bdvGjh07AFizZg1Hjhzhu+++o2XLlvTu3Zt3332X+fPnk52dba2PJIQQopKrFI8hjRo1ir59+xIVFcXUqVO15TExMej1eqKiorRlDRs2pFatWmzfvp177rmH7du306xZM4KCgrQyPXv25IUXXiA2NpZWrVoVus+srCyysrK096mpqUDes296vb5Mn8O4XVm3r2gSr2VJvJYl8VqWvcUL5om5NNvafQL+4Ycf2Lt3L7t37y6wLiEhAWdnZ3x9fU2WBwUFkZCQoJXJn3yN643rijJ9+nQmT55cYPmKFStwdy/9TBz5/fbbb+XavqJJvJYl8VqWxGtZ9hYvlC/mjIwMgALTihbGrhPw+fPnGTNmDNHR0bi6ulbovt98803GjRunvb948SKNGzfmmWeeqdA4hBBC2J6bN2/i4+NzxzJ2nYBjYmJITEykdevW2rLc3Fw2b97MJ598wurVq8nOziY5OdnkKvjKlSsEB+eN+hMcHMyuXbtM6jX2kjaWKYyLiwsuLi7ae09PT86fP4+Xl1eJJzC/XWpqKmFhYZw/f77Mw1lWJInXsiRey5J4Lcve4gXzxKyqKjdv3iQ0NLTYsnadgLt168ahQ4dMlj311FM0bNiQ119/nbCwMJycnFi3bh2DBg0C4NixY5w7d47IyEgAIiMjmTZtGomJiQQGBgIQHR2Nt7c3jRs3LnEsOp2OmjVrmuVzeXt7280JCxKvpUm8liXxWpa9xQvlj7m4K18ju07AXl5eNG3a1GSZh4cH1apV05YPHz6ccePG4e/vj7e3Ny+++CKRkZHcc889APTo0YPGjRvzxBNPMHPmTBISEnj77bcZNWqUyRWuEEIIYU52nYBL4qOPPkKn0zFo0CCysrLo2bMnn376qbbewcGBlStX8sILLxAZGYmHhwdDhw5lypQpVoxaCCFEZVfpEvDGjRtN3ru6ujJ//nzmz59f5Da1a9fmzz//tHBkxXNxcWHixIl2c+Ut8VqWxGtZEq9l2Vu8UPExy3zAQgghhBVUipGwhBBCCHsjCVgIIYSwAknAQgghhBVIAhZCCCGsQBJwBZs/fz7h4eG4urrSvn37AqNw3e7nn3+mYcOGuLq60qxZswrrrT19+nTatWuHl5cXgYGBDBgwgGPHjt1xm8WLF6MoislPRQ0ROmnSpAL7btiw4R23sdaxNQoPDy8Qs6IojBo1qtDyFX18N2/eTL9+/QgNDUVRFFasWGGyXlVVJkyYQEhICG5ubkRFRXHixIli6y3t74A54tXr9bz++us0a9YMDw8PQkNDefLJJ7l06dId6yzLeWWOeAGGDRtWYN+9evUqtl5rHF+g0HNZURRmzZpVZJ2WOr4l+f4qyVzxtyvrOV8UScAV6Mcff2TcuHFMnDiRvXv30qJFC3r27EliYmKh5bdt28Zjjz3G8OHD2bdvHwMGDGDAgAEcPnzY4rFu2rSJUaNGsWPHDqKjo9Hr9fTo0YP09PQ7buft7c3ly5e1n7Nnz1o8VqMmTZqY7HvLli1FlrXmsTXavXu3SbzR0dEAPPLII0VuU5HHNz09nRYtWhT5CN/MmTOZO3cun332GTt37sTDw4OePXuSmZlZZJ2l/R0wV7wZGRns3buXd955h7179/Lrr79y7NgxHnzwwWLrLc15Za54jXr16mWy7++///6OdVrr+AImcV6+fJmvvvoKRVG0UQiLYonjW5Lvr+Lmii9MWc75O1JFhbn77rvVUaNGae9zc3PV0NBQdfr06YWWf/TRR9W+ffuaLGvfvr363HPPWTTOwiQmJqqAumnTpiLLLFq0SPXx8am4oPKZOHGi2qJFixKXt6VjazRmzBi1Tp06qsFgKHS9NY8voC5fvlx7bzAY1ODgYHXWrFnasuTkZNXFxUX9/vvvi6yntL8D5oq3MLt27VIB9ezZs0WWKe15VVaFxTt06FC1f//+parHlo5v//791fvvv/+OZSrq+N7+/ZWcnKw6OTmpP//8s1YmLi5OBdTt27cXWkdZz/k7kSvgCpKdnU1MTIzJ3MQ6nY6oqCi2b99e6Dbbt283KQ95cxUXVd6SUlJSAPD3979jubS0NGrXrk1YWBj9+/cnNja2IsID4MSJE4SGhnLXXXcxZMgQzp07V2RZWzq2kHd+fPfddzz99NN3nMzDmsc3v/j4eBISEkyOoY+PD+3bty/yGJbld8CSUlJSUBSlwHSltyvNeWVuGzduJDAwkAYNGvDCCy9w/fr1Isva0vG9cuUKf/zxB8OHDy+2bEUc39u/v4qbK74wZTnniyMJuIJcu3aN3NzcQuceLmre4aLmKr7TPMWWYDAYGDt2LB06dCgw9nZ+DRo04KuvvuK3337ju+++w2AwcO+993LhwgWLx9i+fXsWL17MqlWrWLBgAfHx8XTq1ImbN28WWt5Wjq3RihUrSE5OZtiwYUWWsebxvZ3xOJXmGJbld8BSMjMzef3113nsscfuOOh+ac8rc+rVqxfffPMN69atY8aMGWzatInevXuTm5tbaHlbOr5ff/01Xl5exTbpVsTxLez7qyRzxd+uLOd8cSrdUJTC/EaNGsXhw4eLvTcTGRmpzTIFcO+999KoUSMWLlzIu+++a9EYe/furb1u3rw57du3p3bt2vz0008l+ivc2v773//Su3fvO05hZs3jW5no9XoeffRRVFVlwYIFdyxrzfNq8ODB2utmzZrRvHlz6tSpw8aNG+nWrZtF911eX331FUOGDCm2k2BFHN+Sfn9Zg1wBV5Dq1avj4OBQoJdd/rmJbxccHFyq8pYwevRoVq5cyYYNG0o93aKTkxOtWrXi5MmTFoquaL6+vtSvX7/IfdvCsTU6e/Ysa9eu5ZlnninVdtY8vsbjVJpjWJbfAXMzJt+zZ89q046WRnHnlSXdddddVK9evch928LxBfj77785duxYqc9nMP/xLer7Kzg4WJsrPr/ivo+NZUq6TXEkAVcQZ2dn2rRpw7p167RlBoOBdevWmVzV5BcZGWlSHvLmKi6qvDmpqsro0aNZvnw569evJyIiotR15ObmcujQIUJCQiwQ4Z2lpaVx6tSpIvdtzWN7u0WLFhEYGEjfvn1LtZ01j29ERATBwcEmxzA1NZWdO3cWeQzL8jtgTsbke+LECdauXUu1atVKXUdx55UlXbhwgevXrxe5b2sfX6P//ve/tGnThhYtWpR6W3Md3+K+v9q0aaPNFW90+1zxtyvLOV+SQEUF+eGHH1QXFxd18eLF6pEjR9QRI0aovr6+akJCgqqqqvrEE0+ob7zxhlZ+69atqqOjo/rBBx+ocXFx6sSJE1UnJyf10KFDFo/1hRdeUH18fNSNGzeqly9f1n4yMjK0MrfHO3nyZHX16tXqqVOn1JiYGHXw4MGqq6urGhsba/F4X3nlFXXjxo1qfHy8unXrVjUqKkqtXr26mpiYWGis1jy2+eXm5qq1atVSX3/99QLrrH18b968qe7bt0/dt2+fCqizZ89W9+3bp/Uafv/991VfX1/1t99+Uw8ePKj2799fjYiIUG/duqXVcf/996vz5s3T3hf3O2CpeLOzs9UHH3xQrVmzprp//36TczorK6vIeIs7rywV782bN9VXX31V3b59uxofH6+uXbtWbd26tVqvXj01MzOzyHitdXyNUlJSVHd3d3XBggWF1lFRx7ck31/PP/+8WqtWLXX9+vXqnj171MjISDUyMtKkngYNGqi//vqr9r4k53xpSAKuYPPmzVNr1aqlOjs7q3fffbe6Y8cObV2XLl3UoUOHmpT/6aef1Pr166vOzs5qkyZN1D/++KNC4gQK/Vm0aFGR8Y4dO1b7bEFBQWqfPn3UvXv3Vki8//nPf9SQkBDV2dlZrVGjhvqf//xHPXnyZJGxqqr1jm1+q1evVgH12LFjBdZZ+/hu2LCh0HPAGJPBYFDfeecdNSgoSHVxcVG7detW4HPUrl1bnThxosmyO/0OWCre+Pj4Is/pDRs2FBlvceeVpeLNyMhQe/TooQYEBKhOTk5q7dq11WeffbZAIrWV42u0cOFC1c3NTU1OTi60joo6viX5/rp165Y6cuRI1c/PT3V3d1cHDhyoXr58uUA9+bcpyTlfGjIdoRBCCGEFcg9YCCGEsAJJwEIIIYQVSAIWQgghrEASsBBCCGEFkoCFEEIIK5AELIQQQliBJGAhhBDCCiQBCyEsLjw8nDlz5lg7DCFsiiRgISqZYcOGMWDAAAC6du3K2LFjK2zfixcvLnR+3d27dzNixIgKi0MIeyDTEQohipWdnY2zs3OZtw8ICDBjNEJUDnIFLEQlNWzYMDZt2sTHH3+MoigoisKZM2cAOHz4ML1798bT05OgoCCeeOIJrl27pm3btWtXRo8ezdixY6levTo9e/YEYPbs2TRr1gwPDw/CwsIYOXIkaWlpAGzcuJGnnnqKlJQUbX+TJk0CCjZBnzt3jv79++Pp6Ym3tzePPvqoyTRvkyZNomXLlnz77beEh4fj4+PD4MGDTSZqX7ZsGc2aNcPNzY1q1aoRFRVFenq6hY6mEOYnCViISurjjz8mMjKSZ599lsuXL3P58mXCwsJITk7m/vvvp1WrVuzZs4dVq1Zx5coVHn30UZPtv/76a5ydndm6dSufffYZADqdjrlz5xIbG8vXX3/N+vXree211wC49957mTNnDt7e3tr+Xn311QJxGQwG+vfvT1JSEps2bSI6OprTp0/zn//8x6TcqVOnWLFiBStXrmTlypVs2rSJ999/H4DLly/z2GOP8fTTTxMXF8fGjRt56KGHkKHthT2RJmghKikfHx+cnZ1xd3c3mTD8k08+oVWrVrz33nvasq+++oqwsDCOHz9O/fr1AahXrx4zZ840qTP//eTw8HCmTp3K888/z6effoqzszM+Pj4oinLHCcrXrVvHoUOHiI+PJywsDIBvvvmGJk2asHv3btq1awfkJerFixfj5eUFwBNPPMG6deuYNm0aly9fJicnh4ceeojatWsD0KxZs3IcLSEqnlwBC1HFHDhwgA0bNuDp6an9NGzYEMi76jRq06ZNgW3Xrl1Lt27dqFGjBl5eXjzxxBNcv36djIyMEu8/Li6OsLAwLfkCNG7cGF9fX+Li4rRl4eHhWvIFCAkJITExEYAWLVrQrVs3mjVrxiOPPMIXX3zBjRs3Sn4QhLABkoCFqGLS0tLo168f+/fvN/k5ceIEnTt31sp5eHiYbHfmzBkeeOABmjdvzi+//EJMTAzz588H8jppmZuTk5PJe0VRMBgMADg4OBAdHc1ff/1F48aNmTdvHg0aNCA+Pt7scQhhKZKAhajEnJ2dyc3NNVnWunVrYmNjCQ8Pp27duiY/tyfd/GJiYjAYDHz44Yfcc8891K9fn0uXLhW7v9s1atSI8+fPc/78eW3ZkSNHSE5OpnHjxiX+bIqi0KFDByZPnsy+fftwdnZm+fLlJd5eCGuTBCxEJRYeHs7OnTs5c+YM165dw2AwMGrUKJKSknjsscfYvXs3p06dYvXq1Tz11FN3TJ5169ZFr9czb948Tp8+zbfffqt1zsq/v7S0NNatW8e1a9cKbZqOioqiWbNmDBkyhL1797Jr1y6efPJJunTpQtu2bUv0uXbu3Ml7773Hnj17OHfuHL/++itXr16lUaNGpTtAQliRJGAhKrFXX30VBwcHGjduTEBAAOfOnSM0NJStW7eSm5tLjx49aNasGWPHjsXX1xedruivhBYtWjB79mxmzJhB06ZNWbJkCdOnTzcpc++99/L888/zn//8h4CAgAKduCDvyvW3337Dz8+Pzp07ExUVxV133cWPP/5Y4s/l7e3N5s2b6dOnD/Xr1+ftt9/mww8/pHfv3iU/OEJYmaJKv30hhBCiwskVsBBCCGEFkoCFEEIIK5AELIQQQliBJGAhhBDCCiQBCyGEEFYgCVgIIYSwAknAQgghhBVIAhZCCCGsQBKwEEIIYQWSgIUQQggrkAQshBBCWIEkYCGEEMIK/j+CEDC1u43oMAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_histories(histories, labels)" + ] + }, + { + "cell_type": "markdown", + "id": "32341937-4178-41d2-a10e-5e4d2634098e", + "metadata": {}, + "source": [ + "The hyperoptimization can lead to a faster convergence of the algorithm." + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "id": "82b89092-07e5-4788-9ae0-8907df2428eb", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAacAAAGdCAYAAAC2DrxTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAzC0lEQVR4nO3dfXSUxb0H8O8mJJsgyUKAvKxsIIAFBRK8CDHFUpCUkFouEW4Llp4bQbFqoEJuq+YeAV+7iudUfKGhvXpBzzGi9BastEIxhXA8EizhRsDepgSDRCBBqWQhIZuXZ+4fMasLgZ3NM8nOs/l+PM857u5knnn2Sfw588z8xiaEECAiItJIRKgbQEREdCkGJyIi0g6DExERaYfBiYiItMPgRERE2mFwIiIi7TA4ERGRdhiciIhIO/1C3QAiIgpec3MzWlpalNQVHR2NmJgYJXWpwuBERGQxzc3NSEtLRl1dg5L6kpOTUVNTo1WAYnAiIrKYlpYW1NU14JNPn0N8fKypujyeixg5fCVaWloYnIiIyLz4+FjTwUlXDE5ERBYlRBuEaDNdh44YnIiILEqIdgjRbroOHXEqORERaYc9JyIiizJEGwyTw3Jmf76nMDgREVlUOD9z4rAeERFphz0nIiKL6pgQYbbnpOeECAYnIiKLEkYbhGEyOJn8+Z7CYT0iItIOe05ERFYl2joOs3VoiMGJiMiiOFuPiIioF7HnRERkVUYbYLSar0NDDE5ERBbVMawXaboOHXFYj4iItMOeExGRVRltgGGu58RhPSIiUiuMgxOH9YiISDvsORERWVa7gkW0zK1HREQK2Yw22AxzA2A2DusRERHJYc+JiMiqjDbAZM9J1wkRDE5ERFYVxsGJw3pERKQd9pyIiCzKJtpgEyYnRGiavojBiYjIqgwDMExOBTcMNW1RjMN6RESkHfaciIgsqmOdk810HTpicCIisiqjXcFsPT0zRHBYj4iItMOeExGRVRltgMlhPV3XOTE4ERFZlM1oV5Bbj8N6REREUrTrORmGgVOnTiEuLg42m8nuKhGRBoQQOH/+PJxOJyIiFPYJhIIJESK4ntPevXvx7LPPoqKiAqdPn8bWrVuRl5cHAGhtbcUjjzyCP/3pT/jkk0/gcDiQnZ2Np59+Gk6nM6jzaBecTp06BZfLFepmEBEpV1tbi2HDhimrz2YYpoflbEEuwm1sbERGRgaWLFmCefPm+X3W1NSEgwcPYtWqVcjIyMCXX36JBx54AP/6r/+KAwcOBHWeHgtO69evx7PPPou6ujpkZGTgxRdfxJQpUwL+XFxcHADg+InnER8fe9WyCQPvVdJWIiIzxsbOvern7aIVR5u3+/77ZmW5ubnIzc3t8jOHw4Fdu3b5vffSSy9hypQpOHHiBFJTU6XP0yPB6c0330RhYSE2bNiAzMxMrFu3Djk5OaiqqkJiYuJVf7ZzKC8+Phbx8f0DnInDfkQUepG2KKlyyh9VGO0KZut19Lw8Ho/f23a7HXa73VzdABoaGmCz2TBw4MCgfq5HJkT86le/wtKlS7F48WLccMMN2LBhA/r374///u//7onTERH1SR2z9cwfAOByueBwOHyH2+023b7m5mY89NBDuOOOOxAfHx/UzyrvObW0tKCiogJFRUW+9yIiIpCdnY19+/ZdVt7r9cLr9fpeXxq9iYio59XW1voFELO9ptbWVvzoRz+CEALFxcVB/7zyntMXX3yB9vZ2JCUl+b2flJSEurq6y8q73W6/aM3JEEREkox2NQeA+Ph4v8NMcOoMTJ9++il27doVdK8J0GCdU1FRERoaGnxHbW1tqJtERGQJKof1VOkMTEePHsV7772HwYMHd6se5cN6Q4YMQWRkJOrr6/3er6+vR3Jy8mXlVT10IyKinnfhwgVUV1f7XtfU1KCyshIJCQlISUnBv/3bv+HgwYPYvn072tvbfSNmCQkJiI6Olj6P8p5TdHQ0Jk2ahNLSUt97hmGgtLQUWVlZqk9HRNR3KRzWk3XgwAHceOONuPHGGwEAhYWFuPHGG7F69WqcPHkSf/jDH/DZZ59h4sSJSElJ8R0ffPBBUOfpkankhYWFyM/Px0033YQpU6Zg3bp1aGxsxOLFi3vidEREfZLNEEEvou2qjmBMnz4dQlz5Z672WTB6JDgtWLAAn3/+OVavXo26ujpMnDgRO3bsuGySxNV0LLC9+vz9GbF3B6xnv/Ge1Pmc/cZJlatu/KNUORmx0XIL0mw2uQ5uk/e4idZYh+z3JkP2uw3F74fOdP7dVfn7AQDeti8Dlvm46X8ClFDzH+y+pMcyRCxbtgzLli3rqeqJiMhoB8x1nLTdbFC73HpERCRJKAhOQSZ+7S0hn0pORER0KfaciIgsyiYM2IS53Ho2Ybbr1TMYnIiIrCqMnzlxWI+IiLTDnhMRkVUZhoItMzisR0REKjE46UlmgW1mRLZUXbU4LVWuv32EVDmZRYXXRk2QqiscFnbKLIy82HJCqq5QLOw8qfihsczvkc6LqmXvlcoFsaFYXAsA9n6DApa52HLebHPoEpYOTkREfZnNMGAz+f9NZtMf9RQGJyIiqzIMBbP19AxOnK1HRETaYc+JiMiqwrjnxOBERGRVYRycOKxHRETaYc+JiMiqRDsQ5GaBl9ehZ8+JwYmIyKLCeSo5h/WIiEg7lu45yWydLZv5wWWkSJU7KQ5LlZMhm/lh9DW3Ka3P6mQzJ8hkYRCSQxqyGRFkyfzuVmucIUI2W4PK7002M0hz61mpcjKZH7QXxhMiLB2ciIj6tDAOThzWIyIi7bDnRERkVYYw3/MxO9uvhzA4ERFZlSEUDOvpGZw4rEdERNphz4mIyKqUbDaoZ8+JwYmIyKrCODhxWI+IiLTDnhMRkVWF8YQISwcnmYwIMlkCAPnMDzdHzpIqtxsvBywjm/nhVNvHUuVkrlU2u4Jq10ZNCFimWnEWhlBdq4yTreoyjagmm/1BZV0ymSRkMz/ERA2WKheq7CBKCQMQJof1hJ7BicN6RESkHUv3nIiI+jShYFhP054TgxMRkVWF8TMnDusREZF22HMiIrKqMO45MTgREVmUMMzvsq7pLu0c1iMiIv2w50REZFUc1rMu1QsxZRbXAkB13pSAZUZv6/1t1WUXJcsuUJQls2A6HLajV7noVPZeyWz5Dsgv/A3FotOE/hkBy/yz6SOpupq85802xzoMKAhOKhqinvJhvUcffRQ2m83vGDt2rOrTEBFRGOuRntO4cePw3nvvfX2SfmHfQSMi6n1h3HPqkajRr18/JCcn90TVRETUSXx1mK1DQz0yW+/o0aNwOp0YOXIkFi1ahBMnrjyG7fV64fF4/A4iIurblAenzMxMbNq0CTt27EBxcTFqamrwne98B+fPd/2Q0u12w+Fw+A6Xy6W6SUREYUkYNiWHjpQHp9zcXPzwhz9Eeno6cnJy8Kc//Qnnzp3DW2+91WX5oqIiNDQ0+I7a2lrVTSIiCk+GokNDPT5TYeDAgfjWt76F6urqLj+32+2w2+093QwiIrKQHs8QceHCBRw7dgwpKSk9fSoior5F2ADD5GF2s8Ieojw4/fznP0dZWRmOHz+ODz74ALfffjsiIyNxxx13qD4VEVGfFopnTnv37sWcOXPgdDphs9mwbds2/zYJgdWrVyMlJQWxsbHIzs7G0aNHg7425cN6n332Ge644w6cPXsWQ4cOxS233ILy8nIMHTpU9amkVuPLbA8OyGcdkM1iIJP9YUbs3VJ11UaclionkwFA563LVd8DlZkkVGZ+kCV7r6oV31OZzBSyGUS8bV9KlZPJ/qD6HsjWZ7MF/n94nf+uVGtsbERGRgaWLFmCefPmXfb52rVr8cILL+DVV19FWloaVq1ahZycHPztb39DTEyM9HmUB6fNmzerrpKIiLrSOTRnqo7giufm5iI3N7fLz4QQWLduHR555BHMnTsXAPDaa68hKSkJ27Ztw8KFC6XPw6zkRERWJWxqDuCy9aZerzfo5tTU1KCurg7Z2dm+9xwOBzIzM7Fv376g6mJwIiIiuFwuvzWnbrc76Drq6uoAAElJSX7vJyUl+T6TxaR3REQWpWIRbefjw9raWsTHx/veD/USHwYnIiKrMiIUPHPqSK4XHx/vF5y6ozOnan19vd/yofr6ekycODGoujisR0RESqSlpSE5ORmlpaW+9zweD/bv34+srKyg6mLPiYjIqkIwW+/ChQt+GX9qampQWVmJhIQEpKamYsWKFXjyySdx3XXX+aaSO51O5OXlBXUeBiciIosSwgZhMsODCHLLjAMHDmDGjBm+14WFhQCA/Px8bNq0CQ8++CAaGxtxzz334Ny5c7jllluwY8eOoNY4AQxOREQUhOnTp0NcJaLZbDY8/vjjePzxx02dx9LBSWbltuqsA6faPpYqJ0M284PLkMtLeBKBM0SEA5X3VCarBqA284PunP3GBSzzycW9UnXZ+w2SKnexpestdbojVJkkQkLhhAjdWDo4ERH1ZcKAgqnkegYnztYjIiLtsOdERGRVQsFsPU23zGBwIiKyKDWz9fQMThzWIyIi7bDnRERkVUZEx2GqDjVNUY3BiYjIotQkfuWwHhERkRRL95xUbo0su7BTZgtrWbILQGUX194cOStgmd14Waou1WQWxKq+BzLfr8xCbiA0CztDtfBXZoHtyNhpUnWpXLQuS/X3pvMC7HCeEGHp4ERE1KeF8TMnDusREZF22HMiIrKocJ4QweBERGRR4fzMicN6RESkHfaciIisKownRDA4ERFZVDg/c+KwHhERaYc9JyIiiwrnCREMTkGSzUohk8VAZYYLQC77Q3XeFKm60t89I1VOZktvQC77g0wWCdm6QkVlJgnV24PHSm6Z/s+mjwKWUX0PdM6YoTWh4JmTnhvhcliPiIj0w54TEZFFhfOECAYnIiKLEsL8MyPBYT0iIiI57DkREVmVgmE9cFiPiIhUEiICQpgbABOajutxWI+IiLTDnhMRkVUZNvPDchzWIyIilZghgoImhJ6pfmUzPxzKTZQqN3uXmdb4O9l6WF1lIWKz9f5IuWzmh4ttX/ZwS7rv2qgJActUM0NEnxL0X9LevXsxZ84cOJ1O2Gw2bNu2ze9zIQRWr16NlJQUxMbGIjs7G0ePHlXVXiIi+krnIlyzh46CDk6NjY3IyMjA+vXru/x87dq1eOGFF7Bhwwbs378f11xzDXJyctDc3Gy6sURE9LXO2XpmDx0FPayXm5uL3NzcLj8TQmDdunV45JFHMHfuXADAa6+9hqSkJGzbtg0LFy4011oiIuoTlIbMmpoa1NXVITs72/eew+FAZmYm9u3b1+XPeL1eeDwev4OIiALjsJ6kuro6AEBSUpLf+0lJSb7PLuV2u+FwOHyHy+VS2SQiorDVOVvP7KGjkA82FhUVoaGhwXfU1taGuklERBRiSqeSJycnAwDq6+uRkpLie7++vh4TJ07s8mfsdjvsdrvKZhAR9QnhvM5Jac8pLS0NycnJKC0t9b3n8Xiwf/9+ZGVlqTwVEVGfJ4SCZ06aBqege04XLlxAdXW173VNTQ0qKyuRkJCA1NRUrFixAk8++SSuu+46pKWlYdWqVXA6ncjLy1PZbiIiCmNBB6cDBw5gxowZvteFhYUAgPz8fGzatAkPPvggGhsbcc899+DcuXO45ZZbsGPHDsTExKhrNXWbs984qXKymR92fO9zqXKjtwUuE4rsCqqpzAwSDpkfZJ1q+zjUTbCkcM5KHnRwmj59+lUvxmaz4fHHH8fjjz9uqmFERHR14bxNu/X/V5WIiMIOE78SEVlUOM/WY3AiIrKocA5OHNYjIiLtsOdERGRRwjA/oUHTrefYcyIisqpQ5NZrb2/HqlWrkJaWhtjYWIwaNQpPPPGE8inp7DkREZG0Z555BsXFxXj11Vcxbtw4HDhwAIsXL4bD4cDPfvYzZecJ++AUG52qtD6Z7aQBoLrxj0rPK2P0NbcFLKO6XTKLawFgRuzdAcvsvviy3DklrhOQW9ipctEsAFyU3Eo8IiIuYJl/Nn1ktjndIvM3I3udspq8xwOWkf1blv0blV34K9O2UFGzCDe4n//ggw8wd+5c3HZbx9/hiBEj8MYbb+DDDz801Y5LcViPiMiiDGFTcgC4bF89r9fb5Tm//e1vo7S0FP/4xz8AAB999BHef//9K25C211h33MiIqLALt1Lb82aNXj00UcvK/fwww/D4/Fg7NixiIyMRHt7O5566iksWrRIaXsYnIiIrErFTrZf/XxtbS3i4+N9b19pK6O33noLr7/+OkpKSjBu3DhUVlZixYoVcDqdyM/PN9eWb2BwIiKyKJWLcOPj4/2C05X84he/wMMPP4yFCxcCACZMmIBPP/0UbrdbaXDiMyciIpLW1NSEiAj/0BEZGQnDUDu5iD0nIiKLCkX6ojlz5uCpp55Camoqxo0bh//93//Fr371KyxZssRUOy7F4EREZFGhCE4vvvgiVq1ahfvvvx9nzpyB0+nET3/6U6xevdpUOy7F4ERERNLi4uKwbt06rFu3rkfPw+BERGRRhoiAYXIRrtmf7ylhH5xUr2SvlqwvFNkaZOqTza5wsvWwVDnZrdVlsj9U502Rqmv0tt7PviEroX+GVDmZ7A+yGRFk74FsNgzVfzMyVGalkP0bDQdCKNgJl1tmEBERyQn7nhMRUbgK580GGZyIiCwqnIMTh/WIiEg77DkREVnUN7OKm6lDRwxOREQWxWE9IiKiXsSeExGRRYVzz4nBiYjIovjMSVMyq8plV883eY+bbI0/ldkaZDNJ9LePUFaXajLXKpv5YUbs3VLlaiNOBywjmwnD2/alVDmZzA+A2owIqqlsm2yWC12zUgDAtVETApYJ1d9VOLN0cCIi6suEMD8sJ4SixijG4EREZFHh/MyJs/WIiEg77DkREVmUUDAhQteeE4MTEZFFcViPiIioF7HnRERkUeHcc2JwIiKyKC7CtTDZxbUyC1iDqU+G7MI91Vurh8Kpto+V1SWzuBYAXEZKwDKftO2Vqsveb5BUuYst56XK6Uxm4Xo4LK6VbdspyYX8pFbQ3/revXsxZ84cOJ1O2Gw2bNu2ze/zO++8Ezabze+YPXu2qvYSEdFXOof1zB46Crrn1NjYiIyMDCxZsgTz5s3rsszs2bOxceNG32u73d79FhIRUZc4rPcNubm5yM3NvWoZu92O5OTkbjeKiIj6th4ZTN2zZw8SExMxZswY3HfffTh79uwVy3q9Xng8Hr+DiIgCE7ApOXSkPDjNnj0br732GkpLS/HMM8+grKwMubm5aG9v77K82+2Gw+HwHS6XS3WTiIjCEp85BWHhwoW+f58wYQLS09MxatQo7NmzBzNnzrysfFFREQoLC32vPR4PAxQRUR/X41PJR44ciSFDhqC6urrL4GS32zlhgoioGzghwoTPPvsMZ8+eRUpK4DUnREQkjxkivuHChQuorq72va6pqUFlZSUSEhKQkJCAxx57DPPnz0dycjKOHTuGBx98EKNHj0ZOTo7ShhMRUfgKOjgdOHAAM2bM8L3ufF6Un5+P4uJiHDp0CK+++irOnTsHp9OJWbNm4YknnuiRoTvZLdhlCGEoq0s12cwPKr8P1VR+v7Lfh0z2h+/aF0jVJZuVoloy64DV75XM1uWA/PehkurvVuf/NhhQMKyn6Wy9oIPT9OnTIa6yr+/OnTtNNYiIiCjsc+sREYUrPnMiIiLtGLCZHpbTdVhP34FvIiLqs9hzIiKyKhUZHjisR0REKoXzIlwO6xERkXbYcyIisijO1iMiIu0YXx1m69CRpYOTs9+4gGVOSq7uvhiCleyx0alS5WTbJluf1XnbvpQqZ+83KGAZ2cwPLkMuN2R14CIA5H53q73HJWtTSybDQnXjH6XqGn3NbVLlZOuT0ST5vfW3j5Aqp3OGiHBm6eBERNSXcViPiIi0Ywjzs+2MK2ejCynO1iMiIu2w50REZFECNgiT6YfM/nxPYXAiIrIoLsIlIiL6ysmTJ/GTn/wEgwcPRmxsLCZMmIADBw4oPQd7TkREFtUxIcJ8HcH48ssvMXXqVMyYMQPvvvsuhg4diqNHj2LQoMBLN4LB4EREZFGheOb0zDPPwOVyYePGjb730tLSTLWhK5YOTioX7qkmsyBW9cJfmfpkF+rKbnUtu0BRpm0J/TOk6vpn00eS5zwfsIzsNuKyi2ur86ZIlRu9LfDvrupFotJbqyv8u1K5WFf137vsYt2+wuPx+L222+2w2+2XlfvDH/6AnJwc/PCHP0RZWRmuvfZa3H///Vi6dKnS9vCZExGRRXVOiDB7AIDL5YLD4fAdbre7y3N+8sknKC4uxnXXXYedO3fivvvuw89+9jO8+uqrSq/N0j0nIqK+TIiOw2wdAFBbW4v4+Hjf+131mgDAMAzcdNNN+OUvfwkAuPHGG3HkyBFs2LAB+fn55hrzDew5ERER4uPj/Y4rBaeUlBTccMMNfu9df/31OHFC7WMK9pyIiCxKwAajlydETJ06FVVVVX7v/eMf/8Dw4cNNteNSDE5ERBYVisSvK1euxLe//W388pe/xI9+9CN8+OGH+O1vf4vf/va3ptpxKQ7rERGRtMmTJ2Pr1q144403MH78eDzxxBNYt24dFi1apPQ87DkREVlUqNIX/eAHP8APfvADU+cNhMGJiMiixFeH2Tp0xGE9IiLSTtj3nGRX2ctsmw0AJ1sPS5XTddv3ULQLACIi4gKWkc38oHI7etlMGLK/HzKZHwBgRuzdAcvsvviyVF2yZLNhhCJbg0x9slu+y/6NygrV34yMcM5KHvbBiYgoXBlfHWbr0BGH9YiISDvsORERWVQo1jn1FgYnIiKLCudnThzWIyIi7bDnRERkUeG8zonBiYjIojisR0RE1IvYcyIisqhwXucU9sGpyXtcqly1ZDlZMpkpZNsmS2Ylu8rsCgAQ22+QVDmZ7A+ybQvFin3Z3w/ZjCQy2R+q86ZI1TV711CpcrJUZ3+QIXPvQ9Eu3YXzVPKghvXcbjcmT56MuLg4JCYmIi8v77JNp5qbm1FQUIDBgwdjwIABmD9/Purr65U2moiIwltQwamsrAwFBQUoLy/Hrl270NrailmzZqGxsdFXZuXKlXjnnXewZcsWlJWV4dSpU5g3b57yhhMR9XUCXw/tdfcIi9l6O3bs8Hu9adMmJCYmoqKiAtOmTUNDQwNeeeUVlJSU4NZbbwUAbNy4Eddffz3Ky8tx8803q2s5EVEfJ6BgWM/kNu89xdRsvYaGBgBAQkICAKCiogKtra3Izs72lRk7dixSU1Oxb9++Luvwer3weDx+BxER9W3dDk6GYWDFihWYOnUqxo8fDwCoq6tDdHQ0Bg4c6Fc2KSkJdXV1XdbjdrvhcDh8h8vl6m6TiIj6FEOoOXTU7eBUUFCAI0eOYPPmzaYaUFRUhIaGBt9RW1trqj4ior5CKDp01K2p5MuWLcP27duxd+9eDBs2zPd+cnIyWlpacO7cOb/eU319PZKTk7usy263w263d6cZREQUpoLqOQkhsGzZMmzduhV/+ctfkJaW5vf5pEmTEBUVhdLSUt97VVVVOHHiBLKystS0mIiIAHydvsjsoaOgek4FBQUoKSnB22+/jbi4ON9zJIfDgdjYWDgcDtx1110oLCxEQkIC4uPjsXz5cmRlZfW5mXoy23qrXvirkuzi2ottXyo7p+yW6ToTQt16e9nFtTu+97lUufR3z5hpDmmIGSK+UlxcDACYPn263/sbN27EnXfeCQB47rnnEBERgfnz58Pr9SInJwe//vWvlTSWiIj6hqCCkxCBH53FxMRg/fr1WL9+fbcbRUREgYVz+qKwz61HRBSuwnlYz/qD/EREFHbYcyIisighOg6zdeiIwYmIyKIM2GCYzI1n9ud7Cof1iIhIO+w5ERFZlIrceLrm1mNwIiKyKgXPnHRNrsfg1ENOth4OdRO6FIrMD7JUZlcIlWujJkiVq1a41bxs5odDuYlS5UZvO26iNd0TDtlBSC0GJyIiiwrnCREMTkREFhXOU8nZlyYiIu2w50REZFHhnL6IwYmIyKLCeSo5h/WIiEg77DkREVmUgPllSpp2nBiciIisqmNYz+RUck2jE4f1iIhIO+w5BSk2OlWq3EWJDAD97SOk6nL2GydV7pOLewOW+WfTR1J1qSbzvcl8Z7J1AXJZB2SzUshmMKhu/KNUudHX3KasLlmymR9mxN4dsEx5+59NtsZfk/d4wDKyfy8ydYWLcF7nxOBERGRR4TyVnMN6RESkHfaciIgsisN6RESkHQ7rERER9SIGJyIiixLi6xRG3T3MDOs9/fTTsNlsWLFihbJr6sRhPSIiiwplhoi//vWv+M1vfoP09HSTLegae05ERBSUCxcuYNGiRfiv//ovDBokt7t2sCzdcwrFwk6VZBeAyiyuBYCRsdMCllG9sFOW7H1QWZfMPZXeVl3x9xaq+yBDZoHtzZGzpOqqjTgtVU7ltvUyC5wB+Xsgs/g3VAt/VWYl93g8fu/b7XbY7fYuf6agoAC33XYbsrOz8eSTT5prwBWw50REZFGdU8nNHgDgcrngcDh8h9vt7vKcmzdvxsGDB6/4uSqW7jkREZEatbW1iI+P973uqtdUW1uLBx54ALt27UJMTEyPtofBiYjIolSuc4qPj/cLTl2pqKjAmTNn8C//8i++99rb27F371689NJL8Hq9iIyMNNmiDgxOREQW1ds74c6cOROHDx/2e2/x4sUYO3YsHnroIWWBCWBwIiIiSXFxcRg/frzfe9dccw0GDx582ftmMTgREVkUd8IlIiLt9PawXlf27NljroIr4FRyIiLSDntOREQWxS0zNCWzdbbKbdWDqU+Gt+1LqXL2fnLpQU61fWymOZah8p7KZiZQnXXA6mQzP7iMFKly1RJlnP3GydUleQ9k7+nJ1sOBC4UIt8z4itvtxuTJkxEXF4fExETk5eWhqqrKr8z06dNhs9n8jnvvvVdpo4mIKLwFFZzKyspQUFCA8vJy7Nq1C62trZg1axYaGxv9yi1duhSnT5/2HWvXrlXaaCIi+qrnZHbbjFBfxBUENay3Y8cOv9ebNm1CYmIiKioqMG3a10lH+/fvj+TkZDUtJCKiLoXzVHJTs/UaGhoAAAkJCX7vv/766xgyZAjGjx+PoqIiNDU1XbEOr9cLj8fjdxARUd/W7QkRhmFgxYoVmDp1qt/K4B//+McYPnw4nE4nDh06hIceeghVVVX4/e9/32U9brcbjz32WHebQUTUZwkFw3JhN1uvoKAAR44cwfvvv+/3/j333OP79wkTJiAlJQUzZ87EsWPHMGrUqMvqKSoqQmFhoe+1x+OBy+XqbrOIiPoMIRQM64VTcFq2bBm2b9+OvXv3YtiwYVctm5mZCQCorq7uMjhdbUMrIiLqm4IKTkIILF++HFu3bsWePXuQlpYW8GcqKysBACkpcusdiIhITjivcwoqOBUUFKCkpARvv/024uLiUFdXBwBwOByIjY3FsWPHUFJSgu9///sYPHgwDh06hJUrV2LatGlIT0/vkQsgIuqrOqaCmxuXM5tbr6fYhJAfcbTZbF2+v3HjRtx5552ora3FT37yExw5cgSNjY1wuVy4/fbb8cgjjwTcxKqTx+OBw+FAx0TCrs9nBQn9MwKW+WfTR73QEn+y2RWujZogVU42K0WT93jAMqqzeYSCykwSKrORAHIZVQC5e6Vadd6UgGVGb/uwF1rSUwQAAw0NDdL/Lbyazv9O5sX/FFG2aFN1tYoWbPP8RlnbVAl6WO9qXC4XysrKTDWIiIjkhPM6J0vn1iMi6stUZHjQdViPW2YQEZF22HMiIrIo8dU/ZuvQEYMTEZFFcViPiIioF7HnRERkUVyES0RE2hFCwTMnTZPrcViPiIi0E/Y9J9lV9rKr55tbz0qVk8n+oDoDgAzZ7ArVirMwyFyrzpkfZMlkfgDkMknI1qVaf/sIZXU5+42TKjd6W+BrnRF7t1Rd5e1/liqnc8YMWRzWIyIi7XBYj4iIqBex50REZFEd6WTN16EjBiciIosyhFCwZYae4YnDekREpB32nIiILIq59YiISDvhPJWcw3pERKQdS/ecVC5ilV1cGxM1WKpck/d8wDKyi07DYftymW3fQ7HwN1QLMU+2HlZan0oy16pyO3pZsotrb46cJVWuNuK03IklFhKHasG0AQUTIjisR0REKnG2HhERUS9iz4mIyKI4W4+IiLQTzs+cOKxHRETaYc+JiMiiwrnnxOBERGRR4fzMicN6RESkHfaciIgsSigY1tO15xT2wcnb9qVUOXu/QVLlhFCXiSocMj/IOtX2sbK6QvG9yW5drvOW3iqp3I5etj7ZbB6ymR9cRopUuf3Ge1LlQsGwGbDZzP03ydA0ux6H9YiISDth33MiIgpXBgRsnK1HREQ6EV9NJjdbh444rEdERNphcCIisqiOzQaFySM4brcbkydPRlxcHBITE5GXl4eqqirl18bgRERkUYbNUHIEo6ysDAUFBSgvL8euXbvQ2tqKWbNmobGxUem18ZkTERFJ27Fjh9/rTZs2ITExERUVFZg2bZqy8zA4ERFZlAEDNpMTGjrXOXk8Hr/37XY77HZ7wJ9vaGgAACQkJJhqx6U4rEdEZFGGon8AwOVyweFw+A632x34/IaBFStWYOrUqRg/frzSawuq51RcXIzi4mIcP34cADBu3DisXr0aubm5AIDm5mb8x3/8BzZv3gyv14ucnBz8+te/RlJSktJGd5LJ/iCb+UGWyqwDsivewyGThMrMCddGTZAqd0ri+5XN+KEyMwig972SIZsx42TrYWXnlP4d6jdOqphs5ofMiOyAZXbjZam6dFZbW4v4+Hjfa5leU0FBAY4cOYL3339feXuC6jkNGzYMTz/9NCoqKnDgwAHceuutmDt3Lj7+uCM1zcqVK/HOO+9gy5YtKCsrw6lTpzBv3jzljSYiIpiep/fN+Xrx8fF+R6DgtGzZMmzfvh27d+/GsGHDlF9bUD2nOXPm+L1+6qmnUFxcjPLycgwbNgyvvPIKSkpKcOuttwIANm7ciOuvvx7l5eW4+eab1bWaiIhCkltPCIHly5dj69at2LNnD9LS0kyd/0q6PSGivb0dW7ZsQWNjI7KyslBRUYHW1lZkZ3/dBR47dixSU1Oxb9++KwYnr9cLr9fre33pQzkiItJHQUEBSkpK8PbbbyMuLg51dXUAAIfDgdjYWGXnCXpCxOHDhzFgwADY7Xbce++92Lp1K2644QbU1dUhOjoaAwcO9CuflJTka3xX3G6330M4l8sV9EUQEfVFQsFkiGCX4RYXF6OhoQHTp09HSkqK73jzzTeVXlvQPacxY8agsrISDQ0N+N3vfof8/HyUlZV1uwFFRUUoLCz0vfZ4PAxQREQSBNohTE66FmgPrrzonUSxQQen6OhojB49GgAwadIk/PWvf8Xzzz+PBQsWoKWlBefOnfPrPdXX1yM5OfmK9cnOpScior7D9DonwzDg9XoxadIkREVFobS01PdZVVUVTpw4gaysLLOnISKiS6hc56SboHpORUVFyM3NRWpqKs6fP4+SkhLs2bMHO3fuhMPhwF133YXCwkIkJCQgPj4ey5cvR1ZWFmfqERH1gI69mMzO1guD/ZzOnDmDf//3f8fp06fhcDiQnp6OnTt34nvf+x4A4LnnnkNERATmz5/vtwi3O8bGzkWkLeqqZT5u+p+A9VxsOd+t8/eGvrKlt2qyW4RTz9H5d1f174fMAts249Wrfu7xNCFh4D2qmtQnBBWcXnnllat+HhMTg/Xr12P9+vWmGkVERIF1TIiwma5DR0z8SkRkUR3Pi3p3EW5vYeJXIiLSDntOREQW1b29bC+vQ0cMTkREFmWgHTD5zMnQ9JkTh/WIiEg77DkREVkUh/WIiEg7hlAwrCf0HNbTLjh1JhVsF60ypXu2MUREEjyepgCfXwTQe0lTw4F2wen8+Y6MDkebt4e4JUREcmSzP5w/fx4Oh0PZeTms14ucTidqa2sRFxcHm62ju9q5jcale9xbidWvwertB6x/DWx/6HX3GoQQOH/+PJxOp9L2dAQnc8NyDE6SIiIirrgffefe9lZm9WuwevsB618D2x963bkGlT2mvkC74ERERHKEMGCYza0n2HMiIiKFOobkzCZ+1TM4WWIRrt1ux5o1ayy9Y67Vr8Hq7Qesfw1sf+iFwzVYhU1wbiMRkaV4PB44HA44Ym6AzRZpqi4h2tHQ/Dc0NDRo9SyQw3pERBbV8cSJw3pERES9gj0nIiKL6phpx9l6RESkERVbrOu6TbslhvXWr1+PESNGICYmBpmZmfjwww9D3SQpjz76KGw2m98xduzYUDfrqvbu3Ys5c+bA6XTCZrNh27Ztfp8LIbB69WqkpKQgNjYW2dnZOHr0aGga24VA7b/zzjsvuyezZ88OTWO74Ha7MXnyZMTFxSExMRF5eXmoqqryK9Pc3IyCggIMHjwYAwYMwPz581FfXx+iFl9O5hqmT59+2X249957Q9Rif8XFxUhPT/cttM3KysK7777r+1z37z9caB+c3nzzTRQWFmLNmjU4ePAgMjIykJOTgzNnzoS6aVLGjRuH06dP+473338/1E26qsbGRmRkZGD9+vVdfr527Vq88MIL2LBhA/bv349rrrkGOTk5aG5u7uWWdi1Q+wFg9uzZfvfkjTfe6MUWXl1ZWRkKCgpQXl6OXbt2obW1FbNmzUJjY6OvzMqVK/HOO+9gy5YtKCsrw6lTpzBv3rwQttqfzDUAwNKlS/3uw9q1a0PUYn/Dhg3D008/jYqKChw4cAC33nor5s6di48//hiAXt+/EAJCGCYPTSdsC81NmTJFFBQU+F63t7cLp9Mp3G53CFslZ82aNSIjIyPUzeg2AGLr1q2+14ZhiOTkZPHss8/63jt37pyw2+3ijTfeCEELr+7S9gshRH5+vpg7d25I2tMdZ86cEQBEWVmZEKLj+46KihJbtmzxlfm///s/AUDs27cvVM28qkuvQQghvvvd74oHHnggdI0K0qBBg8TLL7+szfff0NAgAIjY6BGiv32kqSM2eoQAIBoaGnqt/TK07jm1tLSgoqIC2dnZvvciIiKQnZ2Nffv2hbBl8o4ePQqn04mRI0di0aJFOHHiRKib1G01NTWoq6vzux8OhwOZmZmWuR8AsGfPHiQmJmLMmDG47777cPbs2VA36YoaGhoAAAkJCQCAiooKtLa2+t2DsWPHIjU1Vdt7cOk1dHr99dcxZMgQjB8/HkVFRWhquvq2E6HQ3t6OzZs3o7GxEVlZWZb8/q1K6wkRX3zxBdrb25GUlOT3flJSEv7+97+HqFXyMjMzsWnTJowZMwanT5/GY489hu985zs4cuQI4uLiQt28oNXV1QFAl/ej8zPdzZ49G/PmzUNaWhqOHTuG//zP/0Rubi727duHyEhzixlVMwwDK1aswNSpUzF+/HgAHfcgOjoaAwcO9Cur6z3o6hoA4Mc//jGGDx8Op9OJQ4cO4aGHHkJVVRV+//vfh7C1Xzt8+DCysrLQ3NyMAQMGYOvWrbjhhhtQWVmp1fcvRDvM7mvH2Xp9UG5uru/f09PTkZmZieHDh+Ott97CXXfdFcKW9V0LFy70/fuECROQnp6OUaNGYc+ePZg5c2YIW3a5goICHDlyRPvnlFdzpWu4556v9z+aMGECUlJSMHPmTBw7dgyjRo3q7WZeZsyYMaisrERDQwN+97vfIT8/H2VlZaFu1mVUBBZdg5PWw3pDhgxBZGTkZTNh6uvrkZycHKJWdd/AgQPxrW99C9XV1aFuSrd0fufhcj8AYOTIkRgyZIh292TZsmXYvn07du/e7beFTHJyMlpaWnDu3Dm/8jregytdQ1cyMzMBQJv7EB0djdGjR2PSpElwu93IyMjA888/b6nv3+q0Dk7R0dGYNGkSSktLfe8ZhoHS0lJkZWWFsGXdc+HCBRw7dgwpKSmhbkq3pKWlITk52e9+eDwe7N+/35L3AwA+++wznD17Vpt7IoTAsmXLsHXrVvzlL39BWlqa3+eTJk1CVFSU3z2oqqrCiRMntLkHga6hK5WVlQCgzX24lGEY8Hq92n3/nTvhmj10pP2wXmFhIfLz83HTTTdhypQpWLduHRobG7F48eJQNy2gn//855gzZw6GDx+OU6dOYc2aNYiMjMQdd9wR6qZd0YULF/z+77WmpgaVlZVISEhAamoqVqxYgSeffBLXXXcd0tLSsGrVKjidTuTl5YWu0d9wtfYnJCTgsccew/z585GcnIxjx47hwQcfxOjRo5GTkxPCVn+toKAAJSUlePvttxEXF+d7juFwOBAbGwuHw4G77roLhYWFSEhIQHx8PJYvX46srCzcfPPNIW59h0DXcOzYMZSUlOD73/8+Bg8ejEOHDmHlypWYNm0a0tPTQ9x6oKioCLm5uUhNTcX58+dRUlKCPXv2YOfOndp9/+E8rKf9VHIhhHjxxRdFamqqiI6OFlOmTBHl5eWhbpKUBQsWiJSUFBEdHS2uvfZasWDBAlFdXR3qZl3V7t27BTqesPod+fn5QoiO6eSrVq0SSUlJwm63i5kzZ4qqqqrQNvobrtb+pqYmMWvWLDF06FARFRUlhg8fLpYuXSrq6upC3WyfrtoOQGzcuNFX5uLFi+L+++8XgwYNEv379xe33367OH36dOgafYlA13DixAkxbdo0kZCQIOx2uxg9erT4xS9+oc1U5iVLlojhw4eL6OhoMXToUDFz5kzx5z//2fe5Dt9/51TyqMgkEd0vxdQRFZmk5VRybplBRGQxnVtm9IscCpvN3NMZIQy0tX/OLTOIiEiNcJ5KrvWECCIi6pvYcyIisiwBmJ5tp+eTHQYnIiKLUrOfk57BicN6RESkHfaciIgsqmMBrcmeE4f1iIhILfPBSddnThzWIyIi7bDnRERkVQomREDTCREMTkREFhXOz5w4rEdERNphcCIisixD0RG89evXY8SIEYiJiUFmZiY+/PBDc5dyCQYnIiLLEh3PjMwc3RjWe/PNN1FYWIg1a9bg4MGDyMjIQE5ODs6cOaPsypiVnIjIYjqzkgP9YFPyzKktqKzkmZmZmDx5Ml566SUAHZsxulwuLF++HA8//LCp9nRiz4mIyLKE6X+C7Tm1tLSgoqIC2dnZvvciIiKQnZ2Nffv2KbsyztYjIrI0NYNfHo/H77Xdbofdbr+s3BdffIH29nYkJSX5vZ+UlIS///3vStoCsOdERGQ50dHRSE5OBtCu5BgwYABcLhccDofvcLvdvX1ZfthzIiKymJiYGNTU1KClpUVJfUII2Gz+z6666jUBwJAhQxAZGYn6+nq/9+vr678KmGowOBERWVBMTAxiYmJ6/bzR0dGYNGkSSktLkZeXB6BjQkRpaSmWLVum7DwMTkREFJTCwkLk5+fjpptuwpQpU7Bu3To0NjZi8eLFys7B4EREREFZsGABPv/8c6xevRp1dXWYOHEiduzYcdkkCTO4zomIiLTD2XpERKQdBiciItIOgxMREWmHwYmIiLTD4ERERNphcCIiIu0wOBERkXYYnIiISDsMTkREpB0GJyIi0g6DExERaYfBiYiItPP/iN3BNtmcJVIAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "visualize_matrix(dbf_1.h.matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "id": "ac8ed320-04a8-42af-a980-48ab4f1fff7c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "visualize_matrix(.h.matrix)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/qibo/models/dbi/double_bracket.py b/src/qibo/models/dbi/double_bracket.py new file mode 100644 index 0000000000..f29a1f427f --- /dev/null +++ b/src/qibo/models/dbi/double_bracket.py @@ -0,0 +1,193 @@ +from copy import deepcopy +from enum import Enum, auto +from functools import partial + +import numpy as np + +from qibo.backends.numpy import NumpyBackend + +from ..config import raise_error +from ..hamiltonians import Hamiltonian + + +class FlowGeneratorType(Enum): + """Define DBF evolution.""" + + canonical = auto() + """Use canonical commutator.""" + single_commutator = auto() + """Use single commutator.""" + group_commutator = auto() + """Use group commutator approximation""" + # TODO: add double commutator (does it converge?) + + +class DoubleBracketFlow: + """ + Class implementing the Double Bracket flow algorithm. + For more details, see https://arxiv.org/pdf/2206.11772.pdf + + Args: + hamiltonian (Hamiltonian): Starting Hamiltonian; + mode (FlowGeneratorType): type of generator of the evolution. + + Example: + .. code-block:: python + + import numpy as np + from qibo.models.double_bracket import DoubleBracketFlow, FlowGeneratorType + from qibo.quantum_info import random_hermitian + + nqubits = 4 + h0 = random_hermitian(2**nqubits) + dbf = DoubleBracketFlow(Hamiltonian(nqubits=nqubits, matrix=h0)) + + # diagonalized matrix + dbf.h + """ + + def __init__( + self, + hamiltonian: Hamiltonian, + mode: FlowGeneratorType = FlowGeneratorType.canonical, + ): + self.h = hamiltonian + self.h0 = deepcopy(self.h) + self.mode = mode + + def __call__(self, step: float, mode: FlowGeneratorType = None, d: np.array = None): + if mode is None: + mode = self.mode + + if mode is FlowGeneratorType.canonical: + operator = self.backend.calculate_matrix_exp( + 1.0j * step, + self.commutator(self.diagonal_h_matrix, self.h.matrix), + ) + elif mode is FlowGeneratorType.single_commutator: + if d is None: + raise_error(ValueError, f"Cannot use group_commutator with matrix {d}") + operator = self.backend.calculate_matrix_exp( + 1.0j * step, + self.commutator(d, self.h.matrix), + ) + elif mode is FlowGeneratorType.group_commutator: + if d is None: + raise_error(ValueError, f"Cannot use group_commutator with matrix {d}") + operator = ( + self.h.exp(-step) + @ self.backend.calculate_matrix_exp(-step, d) + @ self.h.exp(step) + @ self.backend.calculate_matrix_exp(step, d) + ) + operator_dagger = self.backend.cast( + np.matrix(self.backend.to_numpy(operator)).getH() + ) + self.h.matrix = operator @ self.h.matrix @ operator_dagger + + @staticmethod + def commutator(a, b): + """Compute commutator between two arrays.""" + return a @ b - b @ a + + @property + def diagonal_h_matrix(self): + """Diagonal H matrix.""" + return self.backend.cast(np.diag(np.diag(self.backend.to_numpy(self.h.matrix)))) + + @property + def off_diag_h(self): + return self.h.matrix - self.diagonal_h_matrix + + @property + def off_diagonal_norm(self): + """Norm of off-diagonal part of H matrix.""" + off_diag_h_dag = self.backend.cast( + np.matrix(self.backend.to_numpy(self.off_diag_h)).getH() + ) + return np.real( + np.trace(self.backend.to_numpy(off_diag_h_dag @ self.off_diag_h)) + ) + + @property + def backend(self): + """Get Hamiltonian's backend.""" + return self.h0.backend + + def hyperopt_step( + self, + step_min: float = 1e-5, + step_max: float = 1, + max_evals: int = 1000, + space: callable = None, + optimizer: callable = None, + look_ahead: int = 1, + verbose: bool = False, + ): + """ + Optimize flow step. + + Args: + step_min: lower bound of the search grid; + step_max: upper bound of the search grid; + max_evals: maximum number of iterations done by the hyperoptimizer; + space: see hyperopt.hp possibilities; + optimizer: see hyperopt algorithms; + look_ahead: number of flow steps to compute the loss function; + verbose: level of verbosity. + + Returns: + (float): optimized best flow step. + """ + try: + import hyperopt + except: + raise_error( + ImportError, "hyperopt_step function requires hyperopt to be installed." + ) + + if space is None: + space = hyperopt.hp.uniform + if optimizer is None: + optimizer = hyperopt.tpe + + space = space("step", step_min, step_max) + best = hyperopt.fmin( + fn=partial(self.loss, look_ahead=look_ahead), + space=space, + algo=optimizer.suggest, + max_evals=max_evals, + verbose=verbose, + ) + + return best["step"] + + def loss(self, step: float, look_ahead: int = 1): + """ + Compute loss function distance between `look_ahead` steps. + + Args: + step: flow step. + look_ahead: number of flow steps to compute the loss function; + """ + # copy initial hamiltonian + h_copy = deepcopy(self.h) + + for _ in range(look_ahead): + self.__call__(mode=self.mode, step=step) + + # off_diagonal_norm's value after the steps + loss = self.off_diagonal_norm + + # set back the initial configuration + self.h = h_copy + + return loss + + def energy_fluctuation(self, state): + """Evaluate energy fluctuations""" + energy = self.h.expectation(state) + h = self.h.matrix + h2 = Hamiltonian(nqubits=self.h.nqubits, matrix=h @ h, backend=self.backend) + average_h2 = self.backend.calculate_expectation_state(h2, state, normalize=True) + return np.sqrt(average_h2 - energy**2) diff --git a/tests/test_models_dbi.py b/tests/test_models_dbi.py new file mode 100644 index 0000000000..4f25162871 --- /dev/null +++ b/tests/test_models_dbi.py @@ -0,0 +1,106 @@ +"""Testing DoubleBracketFlow model""" +import hyperopt +import numpy as np +import pytest + +from qibo.backends import GlobalBackend +from qibo.hamiltonians import Hamiltonian +from qibo.models.dbi.double_bracket import DoubleBracketFlow, FlowGeneratorType +from qibo.quantum_info import random_hermitian + +NSTEPS = 50 +"""Number of steps for evolution.""" + + +@pytest.mark.parametrize("nqubits", [3, 4, 5]) +def test_double_bracket_flow_canonical(backend, nqubits): + h0 = random_hermitian(2**nqubits, backend=backend) + dbf = DoubleBracketFlow( + Hamiltonian(nqubits, h0, backend=backend), mode=FlowGeneratorType.canonical + ) + initial_off_diagonal_norm = dbf.off_diagonal_norm + for _ in range(NSTEPS): + dbf(step=np.sqrt(0.001)) + + assert initial_off_diagonal_norm > dbf.off_diagonal_norm + + +@pytest.mark.parametrize("nqubits", [3, 4, 5]) +def test_double_bracket_flow_group_commutator(backend, nqubits): + h0 = random_hermitian(2**nqubits, backend=backend) + d = backend.cast(np.diag(np.diag(backend.to_numpy(h0)))) + dbf = DoubleBracketFlow( + Hamiltonian(nqubits, h0, backend=backend), + mode=FlowGeneratorType.group_commutator, + ) + initial_off_diagonal_norm = dbf.off_diagonal_norm + + with pytest.raises(ValueError): + dbf(mode=FlowGeneratorType.group_commutator, step=0.01) + + for _ in range(NSTEPS): + dbf(step=0.01, d=d) + + assert initial_off_diagonal_norm > dbf.off_diagonal_norm + + +@pytest.mark.parametrize("nqubits", [3, 4, 5]) +def test_double_bracket_flow_single_commutator(backend, nqubits): + h0 = random_hermitian(2**nqubits, backend=backend) + d = backend.cast(np.diag(np.diag(backend.to_numpy(h0)))) + dbf = DoubleBracketFlow( + Hamiltonian(nqubits, h0, backend=backend), + mode=FlowGeneratorType.single_commutator, + ) + initial_off_diagonal_norm = dbf.off_diagonal_norm + + with pytest.raises(ValueError): + dbf(mode=FlowGeneratorType.single_commutator, step=0.01) + + for _ in range(NSTEPS): + dbf(step=0.01, d=d) + + assert initial_off_diagonal_norm > dbf.off_diagonal_norm + + +@pytest.mark.parametrize("nqubits", [3, 4, 5]) +def test_hyperopt_step(backend, nqubits): + h0 = random_hermitian(2**nqubits, backend=backend) + d = backend.cast(np.diag(np.diag(backend.to_numpy(h0)))) + dbf = DoubleBracketFlow(Hamiltonian(nqubits, h0, backend=backend)) + + # find initial best step with look_ahead = 1 + initial_step = 0.01 + delta = 0.02 + + step = dbf.hyperopt_step( + step_min=initial_step - delta, step_max=initial_step + delta, max_evals=100 + ) + + assert step != initial_step + + # evolve following the optimized first step + for generator in FlowGeneratorType: + dbf(mode=generator, step=step, d=d) + + # find the following step size with look_ahead + look_ahead = 3 + + step = dbf.hyperopt_step( + step_min=initial_step - delta, + step_max=initial_step + delta, + max_evals=100, + look_ahead=look_ahead, + ) + + # evolve following the optimized first step + for gentype in range(look_ahead): + dbf(mode=FlowGeneratorType(gentype + 1), step=step, d=d) + + +def test_energy_fluctuations(backend): + h0 = np.array([[1, 0], [0, -1]]) + state = np.array([1, 0]) + dbf = DoubleBracketFlow(Hamiltonian(1, matrix=h0, backend=backend)) + energy_fluctuation = dbf.energy_fluctuation(state=state) + assert energy_fluctuation == 0 From a3da390f24dc2309d04aee48b045105c64906f10 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Tue, 21 Nov 2023 13:03:35 +0100 Subject: [PATCH 046/143] rm unused notebook --- examples/dbi/Untitled.ipynb | 92 ------------------------------------- 1 file changed, 92 deletions(-) delete mode 100644 examples/dbi/Untitled.ipynb diff --git a/examples/dbi/Untitled.ipynb b/examples/dbi/Untitled.ipynb deleted file mode 100644 index 3bb5f28454..0000000000 --- a/examples/dbi/Untitled.ipynb +++ /dev/null @@ -1,92 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "0e206e0b-2e57-4b67-8c52-994f48989ccf", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Qibo 0.2.2|INFO|2023-11-17 17:07:57]: Using numpy backend on /CPU:0\n" - ] - } - ], - "source": [ - "import qibo\n", - "from qibo.models.qcnn import QuantumCNN\n", - "import math\n", - "import qibo\n", - "import numpy as np\n", - "import random\n", - "\n", - "qibo.set_backend(\"numpy\")\n", - "data = np.random.rand(16)\n", - "data = data / np.linalg.norm(data)\n", - "data = [data]\n", - "labels = [[1]]\n", - "testbias = np.zeros(1)\n", - "testangles = [random.uniform(0, 2 * np.pi) for i in range(21 * 2)]\n", - "init_theta = np.concatenate((testbias, testangles))\n", - "test_qcnn = QuantumCNN(nqubits=4, nlayers=1, nclasses=2, params=init_theta)\n", - "testcircuit = test_qcnn._circuit\n", - "result = test_qcnn.minimize(\n", - " init_theta, data=data, labels=labels, nshots=10000, method=\"Powell\"\n", - ")\n", - "predict0 = test_qcnn.predict(data, nshots=10000)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "58b7823b-3d33-415f-8bca-6ad0262ce6c4", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([1.02722098])" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "predict0" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "df635863-ceb4-45bb-9e3d-caa3df9b2773", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.0" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From 559ed4bb589faaf679c57b75718d311cde2d45e1 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Tue, 21 Nov 2023 13:17:25 +0100 Subject: [PATCH 047/143] fix imports --- src/qibo/models/dbi/double_bracket.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/qibo/models/dbi/double_bracket.py b/src/qibo/models/dbi/double_bracket.py index f29a1f427f..48f1f88925 100644 --- a/src/qibo/models/dbi/double_bracket.py +++ b/src/qibo/models/dbi/double_bracket.py @@ -4,10 +4,8 @@ import numpy as np -from qibo.backends.numpy import NumpyBackend - -from ..config import raise_error -from ..hamiltonians import Hamiltonian +from qibo.config import raise_error +from qibo.hamiltonians import Hamiltonian class FlowGeneratorType(Enum): From 564b97829a226079e6e075c266ef3246459cca3f Mon Sep 17 00:00:00 2001 From: simone bordoni Date: Tue, 21 Nov 2023 17:27:20 +0400 Subject: [PATCH 048/143] native gates rewritten --- src/qibo/transpiler/abstract.py | 32 ++- src/qibo/transpiler/decompositions.py | 14 +- src/qibo/transpiler/pipeline.py | 22 +-- src/qibo/transpiler/unroller.py | 40 ++-- tests/test_transpiler_decompositions.py | 236 +++++++++++++++++++++++ tests/test_transpiler_pipeline.py | 31 +-- tests/test_transpiler_unroller.py | 16 +- tests/test_transpilers_decompositions.py | 198 ------------------- 8 files changed, 326 insertions(+), 263 deletions(-) create mode 100644 tests/test_transpiler_decompositions.py delete mode 100644 tests/test_transpilers_decompositions.py diff --git a/src/qibo/transpiler/abstract.py b/src/qibo/transpiler/abstract.py index 4d5423c313..7e0fa5c106 100644 --- a/src/qibo/transpiler/abstract.py +++ b/src/qibo/transpiler/abstract.py @@ -13,27 +13,53 @@ class NativeGates(Flag): """Define native gates supported by the unroller. A native gate set should contain at least one two-qubit gate (CZ or iSWAP) and at least one single qubit gate (GPI2 or U3). + Gates I, Z, RZ and M are always included in the single qubit native gates set. Should have the same names with qibo gates. """ + I = auto() + Z = auto() + RZ = auto() + M = auto() GPI2 = auto() U3 = auto() CZ = auto() iSWAP = auto() + # TODO: use GPI2 as default single qubit native gate + @classmethod + def default(cls): + """Return default native gates set.""" + return cls.CZ | cls.U3 | cls.I | cls.Z | cls.RZ | cls.M + + @classmethod + def from_gatelist(cls, gatelist: list): + """Create a NativeGates object containing all gates from a gatelist.""" + natives = cls(0) + for gate in gatelist: + natives |= cls.from_gate(gate) + return natives + @classmethod def from_gate(cls, gate: gates.Gate): + """Create a NativeGates object from a gate. + The gate can be either a class:`qibo.gates.Gate` or an instance of this class. + """ + if isinstance(gate, gates.Gate): + return cls.from_gate(gate.__class__) try: - return getattr(cls, gate.__class__.__name__) + return getattr(cls, gate.__name__) except AttributeError: raise ValueError(f"Gate {gate} cannot be used as native.") def single_qubit_natives(self): - return (self.GPI2, self.U3) + """Return single qubit native gates in the native gates set.""" + return self & (self.GPI2 | self.U3) | (self.I | self.Z | self.RZ | self.M) def two_qubit_natives(self): - return (self.CZ, self.iSWAP) + """Return two qubit native gates in the native gates set.""" + return self & (self.CZ | self.iSWAP) class Placer(ABC): diff --git a/src/qibo/transpiler/decompositions.py b/src/qibo/transpiler/decompositions.py index c4fea72b8c..34e1380e43 100644 --- a/src/qibo/transpiler/decompositions.py +++ b/src/qibo/transpiler/decompositions.py @@ -47,11 +47,11 @@ def __call__(self, gate): ] +# Decompose single qubit gates using GPI2 (more efficient on hardware) gpi2_dec = GateDecompositions() -gpi2_dec.add(gates.H, [gates.U3(0, 7 * np.pi / 2, np.pi, 0)]) +gpi2_dec.add(gates.H, [gates.Z(0), gates.GPI2(0, np.pi / 2)]) gpi2_dec.add(gates.X, [gates.U3(0, np.pi, 0, np.pi)]) gpi2_dec.add(gates.Y, [gates.U3(0, np.pi, 0, 0)]) -# apply virtually by changing ``phase`` instead of using pulses gpi2_dec.add(gates.Z, [gates.Z(0)]) gpi2_dec.add(gates.S, [gates.RZ(0, np.pi / 2)]) gpi2_dec.add(gates.SDG, [gates.RZ(0, -np.pi / 2)]) @@ -61,11 +61,8 @@ def __call__(self, gate): gates.RX, lambda gate: [gates.U3(0, gate.parameters[0], -np.pi / 2, np.pi / 2)] ) gpi2_dec.add(gates.RY, lambda gate: [gates.U3(0, gate.parameters[0], 0, 0)]) -# apply virtually by changing ``phase`` instead of using pulses gpi2_dec.add(gates.RZ, lambda gate: [gates.RZ(0, gate.parameters[0])]) -# apply virtually by changing ``phase`` instead of using pulses gpi2_dec.add(gates.GPI2, lambda gate: [gates.GPI2(0, gate.parameters[0])]) -# implemented as single RX90 pulse gpi2_dec.add(gates.U1, lambda gate: [gates.RZ(0, gate.parameters[0])]) gpi2_dec.add( gates.U2, @@ -86,12 +83,11 @@ def __call__(self, gate): lambda gate: [gates.U3(0, *u3_decomposition(gate.matrix(backend)))], ) - +# 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.X, [gates.U3(0, np.pi, 0, np.pi)]) u3_dec.add(gates.Y, [gates.U3(0, np.pi, 0, 0)]) -# apply virtually by changing ``phase`` instead of using pulses u3_dec.add(gates.Z, [gates.Z(0)]) u3_dec.add(gates.S, [gates.RZ(0, np.pi / 2)]) u3_dec.add(gates.SDG, [gates.RZ(0, -np.pi / 2)]) @@ -101,11 +97,9 @@ def __call__(self, gate): gates.RX, lambda gate: [gates.U3(0, gate.parameters[0], -np.pi / 2, np.pi / 2)] ) u3_dec.add(gates.RY, lambda gate: [gates.U3(0, gate.parameters[0], 0, 0)]) -# apply virtually by changing ``phase`` instead of using pulses u3_dec.add(gates.RZ, lambda gate: [gates.RZ(0, gate.parameters[0])]) -# apply virtually by changing ``phase`` instead of using pulses +# TODO: decompose using U3 u3_dec.add(gates.GPI2, lambda gate: [gates.GPI2(0, gate.parameters[0])]) -# implemented as single RX90 pulse u3_dec.add(gates.U1, lambda gate: [gates.RZ(0, gate.parameters[0])]) u3_dec.add( gates.U2, diff --git a/src/qibo/transpiler/pipeline.py b/src/qibo/transpiler/pipeline.py index a473aa061a..b01fc9a142 100644 --- a/src/qibo/transpiler/pipeline.py +++ b/src/qibo/transpiler/pipeline.py @@ -3,12 +3,11 @@ import networkx as nx import numpy as np -from qibo import gates from qibo.backends import NumpyBackend from qibo.config import raise_error from qibo.models import Circuit from qibo.quantum_info.random_ensembles import random_statevector -from qibo.transpiler.abstract import NativeType, Optimizer, Placer, Router, Unroller +from qibo.transpiler.abstract import NativeGates, Optimizer, Placer, Router, Unroller from qibo.transpiler.exceptions import TranspilerPipelineError from qibo.transpiler.optimizer import Preprocessing from qibo.transpiler.placer import Trivial, assert_placement @@ -16,7 +15,7 @@ from qibo.transpiler.star_connectivity import StarConnectivity from qibo.transpiler.unroller import ( DecompositionError, - NativeGates, + DefaultUnroller, assert_decomposition, ) @@ -98,8 +97,7 @@ def assert_transpiling( connectivity: nx.Graph, initial_layout: dict, final_layout: dict, - two_qubit_natives: NativeType = NativeType.CZ, - single_qubit_natives: tuple = (gates.I, gates.Z, gates.RZ, gates.U3), + native_gates: NativeGates = NativeGates.default(), check_circuit_equivalence=True, ): """Check that all transpiler passes have been executed correctly. @@ -110,15 +108,13 @@ def assert_transpiling( connectivity (networkx.Graph): chip qubits connectivity. initial_layout (dict): initial physical-logical qubit mapping. final_layout (dict): final physical-logical qubit mapping. - two_qubit_natives (NativeType): two qubit native gates supported by the hardware. - single_qubit_natives (tuple): single qubit native gates supported by the hardware. + native_gates (NativeGates): native gates supported by the hardware. check_circuit_equivalence (Bool): use simulations to check if the transpiled circuit is the same as the original. """ assert_connectivity(circuit=transpiled_circuit, connectivity=connectivity) assert_decomposition( circuit=transpiled_circuit, - two_qubit_natives=two_qubit_natives, - single_qubit_natives=single_qubit_natives, + native_gates=native_gates, ) if original_circuit.nqubits != transpiled_circuit.nqubits: qubit_matcher = Preprocessing(connectivity=connectivity) @@ -147,7 +143,7 @@ def __init__( self, passes: list = None, connectivity: nx.Graph = None, - native_gates: NativeType = NativeType.CZ, + native_gates: NativeGates = NativeGates.default(), ): self.native_gates = native_gates if passes is None: @@ -171,7 +167,7 @@ def default(self, connectivity: nx.Graph): # default router pass default_passes.append(StarConnectivity()) # default unroller pass - default_passes.append(NativeGates(two_qubit_natives=self.native_gates)) + default_passes.append(DefaultUnroller(native_gates=self.native_gates)) return default_passes def __call__(self, circuit): @@ -211,11 +207,11 @@ def is_satisfied(self, circuit): Args: circuit (qibo.models.Circuit): circuit to be checked. - native_gates (NativeType): two qubit native gates. + native_gates (NativeGates): two qubit native gates. """ try: assert_connectivity(circuit=circuit, connectivity=self.connectivity) - assert_decomposition(circuit=circuit, two_qubit_natives=self.native_gates) + assert_decomposition(circuit=circuit, native_gates=self.native_gates) return True except ConnectivityError: return False diff --git a/src/qibo/transpiler/unroller.py b/src/qibo/transpiler/unroller.py index 83d6982cb1..4f0638d9e4 100644 --- a/src/qibo/transpiler/unroller.py +++ b/src/qibo/transpiler/unroller.py @@ -13,8 +13,7 @@ class DefaultUnroller(Unroller): Args: circuit (:class:`qibo.models.circuit.Circuit`): circuit model to translate into native gates. - single_qubit_natives (tuple): single qubit native gates. - native_gates (:class:`qibo.transpiler.abstract.NativeGates`): native gates + native_gates (:class:`qibo.transpiler.abstract.NativeGates`): native gates supported by the quantum hardware. Returns: (:class:`qibo.models.circuit.Circuit`): equivalent circuit with native gates. @@ -59,9 +58,7 @@ def __call__(self, circuit: Circuit): def is_satisfied(self, circuit: Circuit): """Return True if a circuit is correctly decomposed into native gates, otherwise False.""" try: - assert_decomposition( - circuit, self.native_gates, native_gates=self.native_gates - ) + assert_decomposition(circuit=circuit, native_gates=self.native_gates) except DecompositionError: return False return True @@ -83,7 +80,14 @@ def assert_decomposition( if isinstance(gate, gates.M): continue if len(gate.qubits) == 1: - if not isinstance(gate, native_gates): + try: + native_type_gate = NativeGates.from_gate(gate) + if not (native_type_gate & native_gates.single_qubit_natives()): + raise_error( + DecompositionError, + f"{gate.name} is not a single qubit native gate.", + ) + except ValueError: raise_error( DecompositionError, f"{gate.name} is not a single qubit native gate.", @@ -91,7 +95,7 @@ def assert_decomposition( elif len(gate.qubits) == 2: try: native_type_gate = NativeGates.from_gate(gate) - if not (native_type_gate in native_gates): + if not (native_type_gate & native_gates.two_qubit_natives()): raise_error( DecompositionError, f"{gate.name} is not a two qubits native gate.", @@ -114,9 +118,7 @@ def translate_gate( Args: gate (:class:`qibo.gates.abstract.Gate`): gate to be decomposed. - two_qubit_natives (:class:`qibo.transpiler.abstract.NativeGates`): - two-qubit native gates supported by the quantum hardware. - single_qubit_natives (tuple): single qubit native gates. + native_gates (:class:`qibo.transpiler.abstract.NativeGates`): native gates supported by the quantum hardware. Returns: (list): List of native gates that decompose the input gate. @@ -126,42 +128,42 @@ def translate_gate( elif len(gate.qubits) == 1: return _translate_single_qubit_gates(gate, native_gates.single_qubit_natives()) else: - return _translate_two_qubit_gates(gate, native_gates.two_qubit_natives()) + return _translate_two_qubit_gates(gate, native_gates) -def _translate_single_qubit_gates(gate: gates.Gate, single_qubit_natives): +def _translate_single_qubit_gates(gate: gates.Gate, single_qubit_natives: NativeGates): """Helper method for :meth:`translate_gate`. Maps single qubit gates to a hardware-native implementation. Args: gate (:class:`qibo.gates.abstract.Gate`): gate to be decomposed. - single_qubit_natives (tuple): single qubit native gates. + single_qubit_natives (:class:`qibo.transpiler.abstract.NativeGates`): single qubit native gates. Returns: (list): List of native gates that decompose the input gate. """ - if gates.U3 in single_qubit_natives: + if NativeGates.U3 & single_qubit_natives: return u3_dec(gate) - elif gates.GPI2 in single_qubit_natives: + elif NativeGates.GPI2 & single_qubit_natives: return gpi2_dec(gate) else: raise DecompositionError("Use U3 or GPI2 as single qubit native gates") -def _translate_two_qubit_gates(gate: gates.Gate, two_qubit_natives): +def _translate_two_qubit_gates(gate: gates.Gate, native_gates: NativeGates): """Helper method for :meth:`translate_gate`. Maps two qubit gates to a hardware-native implementation. Args: gate (:class:`qibo.gates.abstract.Gate`): gate to be decomposed. - native_gates (:class:`qibo.transpiler.abstract.NativeGates`): - two-qubit native gates supported by the quantum hardware. + native_gates (:class:`qibo.transpiler.abstract.NativeGates`): native gates supported by the quantum hardware. Returns: (list): List of native gates that decompose the input gate. """ + two_qubit_natives = native_gates.two_qubit_natives() if two_qubit_natives is NativeGates.CZ | NativeGates.iSWAP: # Check for a special optimized decomposition. if gate.__class__ in opt_dec.decompositions: @@ -193,7 +195,7 @@ def _translate_two_qubit_gates(gate: gates.Gate, two_qubit_natives): iswap_decomposed = [] for g in cz_decomposed: # Need recursive function as gates.Unitary is not in iswap_dec - for g_translated in translate_gate(g, NativeGates.iSWAP): + for g_translated in translate_gate(g, native_gates=native_gates): iswap_decomposed.append(g_translated) return iswap_decomposed else: # pragma: no cover diff --git a/tests/test_transpiler_decompositions.py b/tests/test_transpiler_decompositions.py new file mode 100644 index 0000000000..f122fd048d --- /dev/null +++ b/tests/test_transpiler_decompositions.py @@ -0,0 +1,236 @@ +import numpy as np +import pytest + +from qibo import gates +from qibo.backends import NumpyBackend +from qibo.models import Circuit +from qibo.quantum_info.random_ensembles import random_unitary +from qibo.transpiler.abstract import NativeGates +from qibo.transpiler.unroller import translate_gate + + +def assert_matrices_allclose(gate, natives, backend): + target_matrix = gate.matrix(backend) + target_matrix = backend.cast(target_matrix, dtype=target_matrix.dtype) + # Remove global phase from target matrix + normalisation = np.power( + np.linalg.det(target_matrix), 1 / float(target_matrix.shape[0]), dtype=complex + ) + normalisation = backend.cast(normalisation, dtype=normalisation.dtype) + target_unitary = target_matrix / normalisation + + circuit = Circuit(len(gate.qubits)) + circuit.add(translate_gate(gate, natives)) + native_matrix = circuit.unitary(backend) + # Remove global phase from native matrix + normalisation = np.power( + np.linalg.det(native_matrix), 1 / float(native_matrix.shape[0]), dtype=complex + ) + normalisation = backend.cast(normalisation, dtype=normalisation.dtype) + native_unitary = native_matrix / normalisation + + # There can still be phase differences of -1, -1j, 1j + c = 0 + for phase in [1, -1, 1j, -1j]: + if np.allclose(phase * native_unitary, target_unitary, atol=1e-12): + c = 1 + backend.assert_allclose(c, 1) + + +@pytest.mark.parametrize("natives", [NativeGates.U3, NativeGates.GPI2]) +@pytest.mark.parametrize("gatename", ["H", "X", "Y", "I"]) +def test_pauli_to_native(backend, gatename, natives): + gate = getattr(gates, gatename)(0) + assert_matrices_allclose(gate, natives=natives, backend=backend) + + +@pytest.mark.parametrize("natives", [NativeGates.U3, NativeGates.GPI2]) +@pytest.mark.parametrize("gatename", ["RX", "RY", "RZ"]) +def test_rotations_to_native(backend, gatename, natives): + gate = getattr(gates, gatename)(0, theta=0.1) + assert_matrices_allclose(gate, natives=natives, backend=backend) + + +@pytest.mark.parametrize("natives", [NativeGates.U3, NativeGates.GPI2]) +@pytest.mark.parametrize("gatename", ["S", "SDG", "T", "TDG"]) +def test_special_single_qubit_to_native(backend, gatename, natives): + gate = getattr(gates, gatename)(0) + assert_matrices_allclose(gate, natives=natives, backend=backend) + + +@pytest.mark.parametrize("natives", [NativeGates.U3, NativeGates.GPI2]) +def test_u1_to_native(backend, natives): + gate = gates.U1(0, theta=0.5) + assert_matrices_allclose(gate, natives=natives, backend=backend) + + +@pytest.mark.parametrize("natives", [NativeGates.U3, NativeGates.GPI2]) +def test_u2_to_native(backend, natives): + gate = gates.U2(0, phi=0.1, lam=0.3) + assert_matrices_allclose(gate, natives=natives, backend=backend) + + +@pytest.mark.parametrize("natives", [NativeGates.U3, NativeGates.GPI2]) +def test_u3_to_native(backend, natives): + gate = gates.U3(0, theta=0.2, phi=0.1, lam=0.3) + assert_matrices_allclose(gate, natives=natives, backend=backend) + + +@pytest.mark.parametrize("natives", [NativeGates.U3, NativeGates.GPI2]) +def test_gpi2_to_native(backend, natives): + gate = gates.GPI2(0, phi=0.123) + assert_matrices_allclose(gate, natives=natives, backend=backend) + + +@pytest.mark.parametrize("gatename", ["CNOT", "CZ", "SWAP", "iSWAP", "FSWAP"]) +@pytest.mark.parametrize( + "natives_2q", + [NativeGates.CZ, NativeGates.iSWAP, NativeGates.CZ | NativeGates.iSWAP], +) +@pytest.mark.parametrize( + "natives_1q", + [NativeGates.U3, NativeGates.GPI2, NativeGates.U3 | NativeGates.GPI2], +) +def test_two_qubit_to_native(backend, gatename, natives_1q, natives_2q): + gate = getattr(gates, gatename)(0, 1) + assert_matrices_allclose(gate, natives_1q | natives_2q, backend) + + +@pytest.mark.parametrize( + "natives_2q", + [NativeGates.CZ, NativeGates.iSWAP, NativeGates.CZ | NativeGates.iSWAP], +) +@pytest.mark.parametrize( + "natives_1q", + [NativeGates.U3, NativeGates.GPI2, NativeGates.U3 | NativeGates.GPI2], +) +@pytest.mark.parametrize("gatename", ["CRX", "CRY", "CRZ"]) +def test_controlled_rotations_to_native(backend, gatename, natives_1q, natives_2q): + gate = getattr(gates, gatename)(0, 1, 0.3) + assert_matrices_allclose(gate, natives_1q | natives_2q, backend) + + +@pytest.mark.parametrize( + "natives_2q", + [NativeGates.CZ, NativeGates.iSWAP, NativeGates.CZ | NativeGates.iSWAP], +) +@pytest.mark.parametrize( + "natives_1q", + [NativeGates.U3, NativeGates.GPI2, NativeGates.U3 | NativeGates.GPI2], +) +def test_cu1_to_native(backend, natives_1q, natives_2q): + gate = gates.CU1(0, 1, theta=0.4) + assert_matrices_allclose(gate, natives_1q | natives_2q, backend) + + +@pytest.mark.parametrize( + "natives_2q", + [NativeGates.CZ, NativeGates.iSWAP, NativeGates.CZ | NativeGates.iSWAP], +) +@pytest.mark.parametrize( + "natives_1q", + [NativeGates.U3, NativeGates.GPI2, NativeGates.U3 | NativeGates.GPI2], +) +def test_cu2_to_native(backend, natives_1q, natives_2q): + gate = gates.CU2(0, 1, phi=0.2, lam=0.3) + assert_matrices_allclose(gate, natives_1q | natives_2q, backend) + + +@pytest.mark.parametrize( + "natives_2q", + [NativeGates.CZ, NativeGates.iSWAP, NativeGates.CZ | NativeGates.iSWAP], +) +@pytest.mark.parametrize( + "natives_1q", + [NativeGates.U3, NativeGates.GPI2, NativeGates.U3 | NativeGates.GPI2], +) +def test_cu3_to_native(backend, natives_1q, natives_2q): + gate = gates.CU3(0, 1, theta=0.2, phi=0.3, lam=0.4) + assert_matrices_allclose(gate, natives_1q | natives_2q, backend) + + +@pytest.mark.parametrize( + "natives_2q", + [NativeGates.CZ, NativeGates.iSWAP, NativeGates.CZ | NativeGates.iSWAP], +) +@pytest.mark.parametrize( + "natives_1q", + [NativeGates.U3, NativeGates.GPI2, NativeGates.U3 | NativeGates.GPI2], +) +def test_fSim_to_native(backend, natives_1q, natives_2q): + gate = gates.fSim(0, 1, theta=0.3, phi=0.1) + assert_matrices_allclose(gate, natives_1q | natives_2q, backend) + + +@pytest.mark.parametrize("seed", [None, 10, np.random.default_rng(10)]) +@pytest.mark.parametrize( + "natives_2q", + [NativeGates.CZ, NativeGates.iSWAP, NativeGates.CZ | NativeGates.iSWAP], +) +@pytest.mark.parametrize( + "natives_1q", + [NativeGates.U3, NativeGates.GPI2, NativeGates.U3 | NativeGates.GPI2], +) +def test_GeneralizedfSim_to_native(backend, natives_1q, natives_2q, seed): + unitary = random_unitary(2, seed=seed, backend=backend) + gate = gates.GeneralizedfSim(0, 1, unitary, phi=0.1) + assert_matrices_allclose(gate, natives_1q | natives_2q, backend) + + +@pytest.mark.parametrize( + "natives_2q", + [NativeGates.CZ, NativeGates.iSWAP, NativeGates.CZ | NativeGates.iSWAP], +) +@pytest.mark.parametrize( + "natives_1q", + [NativeGates.U3, NativeGates.GPI2, NativeGates.U3 | NativeGates.GPI2], +) +@pytest.mark.parametrize("gatename", ["RXX", "RZZ", "RYY"]) +def test_rnn_to_native(backend, gatename, natives_1q, natives_2q): + gate = getattr(gates, gatename)(0, 1, theta=0.1) + assert_matrices_allclose(gate, natives_1q | natives_2q, backend) + + +@pytest.mark.parametrize( + "natives_2q", + [NativeGates.CZ, NativeGates.iSWAP, NativeGates.CZ | NativeGates.iSWAP], +) +@pytest.mark.parametrize( + "natives_1q", + [NativeGates.U3, NativeGates.GPI2, NativeGates.U3 | NativeGates.GPI2], +) +def test_TOFFOLI_to_native(backend, natives_1q, natives_2q): + gate = gates.TOFFOLI(0, 1, 2) + assert_matrices_allclose(gate, natives_1q | natives_2q, backend) + + +@pytest.mark.parametrize("seed", [None, 10, np.random.default_rng(10)]) +@pytest.mark.parametrize( + "natives_2q", + [NativeGates.CZ, NativeGates.iSWAP, NativeGates.CZ | NativeGates.iSWAP], +) +@pytest.mark.parametrize( + "natives_1q", + [NativeGates.U3, NativeGates.GPI2, NativeGates.U3 | NativeGates.GPI2], +) +@pytest.mark.parametrize("nqubits", [1, 2]) +def test_unitary_to_native(backend, nqubits, natives_1q, natives_2q, seed): + u = random_unitary(2**nqubits, seed=seed, backend=NumpyBackend()) + # transform to SU(2^nqubits) form + u = u / np.sqrt(np.linalg.det(u)) + gate = gates.Unitary(u, *range(nqubits)) + assert_matrices_allclose(gate, natives_1q | natives_2q, backend) + + +def test_count_1q(): + from qibo.transpiler.unroller import cz_dec + + np.testing.assert_allclose(cz_dec.count_1q(gates.CNOT(0, 1)), 2) + np.testing.assert_allclose(cz_dec.count_1q(gates.CRX(0, 1, 0.1)), 2) + + +def test_count_2q(): + from qibo.transpiler.unroller import cz_dec + + np.testing.assert_allclose(cz_dec.count_2q(gates.CNOT(0, 1)), 1) + np.testing.assert_allclose(cz_dec.count_2q(gates.CRX(0, 1, 0.1)), 2) diff --git a/tests/test_transpiler_pipeline.py b/tests/test_transpiler_pipeline.py index 685959eec4..04786c2430 100644 --- a/tests/test_transpiler_pipeline.py +++ b/tests/test_transpiler_pipeline.py @@ -6,7 +6,7 @@ from qibo import gates from qibo.models import Circuit -from qibo.transpiler.abstract import NativeType +from qibo.transpiler.abstract import NativeGates from qibo.transpiler.optimizer import Preprocessing from qibo.transpiler.pipeline import ( Passes, @@ -16,12 +16,11 @@ ) from qibo.transpiler.placer import Random, ReverseTraversal, Trivial from qibo.transpiler.router import ShortestPaths -from qibo.transpiler.unroller import NativeGates +from qibo.transpiler.unroller import DefaultUnroller def generate_random_circuit(nqubits, ngates, seed=None): """Generate random circuits one-qubit rotations and CZ gates.""" - pairs = list(itertools.combinations(range(nqubits), 2)) if seed is not None: # pragma: no cover np.random.seed(seed) @@ -84,7 +83,7 @@ def test_pipeline_default(ngates): connectivity=star_connectivity(), initial_layout=initial_layout, final_layout=final_layout, - two_qubit_natives=NativeType.CZ, + native_gates=NativeGates.default(), check_circuit_equivalence=False, ) @@ -166,9 +165,11 @@ def test_custom_passes(circ): custom_passes.append(Preprocessing(connectivity=star_connectivity())) custom_passes.append(Random(connectivity=star_connectivity())) custom_passes.append(ShortestPaths(connectivity=star_connectivity())) - custom_passes.append(NativeGates(two_qubit_natives=NativeType.iSWAP)) + custom_passes.append(DefaultUnroller(native_gates=NativeGates.default())) custom_pipeline = Passes( - custom_passes, connectivity=star_connectivity(), native_gates=NativeType.iSWAP + custom_passes, + connectivity=star_connectivity(), + native_gates=NativeGates.default(), ) transpiled_circ, final_layout = custom_pipeline(circ) initial_layout = custom_pipeline.get_initial_layout() @@ -178,7 +179,7 @@ def test_custom_passes(circ): connectivity=star_connectivity(), initial_layout=initial_layout, final_layout=final_layout, - two_qubit_natives=NativeType.iSWAP, + native_gates=NativeGates.default(), ) @@ -196,9 +197,11 @@ def test_custom_passes_reverse(circ): ) ) custom_passes.append(ShortestPaths(connectivity=star_connectivity())) - custom_passes.append(NativeGates(two_qubit_natives=NativeType.iSWAP)) + custom_passes.append(DefaultUnroller(native_gates=NativeGates.default())) custom_pipeline = Passes( - custom_passes, connectivity=star_connectivity(), native_gates=NativeType.iSWAP + custom_passes, + connectivity=star_connectivity(), + native_gates=NativeGates.default(), ) transpiled_circ, final_layout = custom_pipeline(circ) initial_layout = custom_pipeline.get_initial_layout() @@ -208,7 +211,7 @@ def test_custom_passes_reverse(circ): connectivity=star_connectivity(), initial_layout=initial_layout, final_layout=final_layout, - two_qubit_natives=NativeType.iSWAP, + native_gates=NativeGates.default(), ) @@ -217,7 +220,9 @@ def test_custom_passes_multiple_placer(): custom_passes.append(Random(connectivity=star_connectivity())) custom_passes.append(Trivial(connectivity=star_connectivity())) custom_pipeline = Passes( - custom_passes, connectivity=star_connectivity(), native_gates=NativeType.CZ + custom_passes, + connectivity=star_connectivity(), + native_gates=NativeGates.default(), ) circ = generate_random_circuit(nqubits=5, ngates=20) with pytest.raises(TranspilerPipelineError): @@ -228,7 +233,9 @@ def test_custom_passes_no_placer(): custom_passes = [] custom_passes.append(ShortestPaths(connectivity=star_connectivity())) custom_pipeline = Passes( - custom_passes, connectivity=star_connectivity(), native_gates=NativeType.CZ + custom_passes, + connectivity=star_connectivity(), + native_gates=NativeGates.default(), ) circ = generate_random_circuit(nqubits=5, ngates=20) with pytest.raises(TranspilerPipelineError): diff --git a/tests/test_transpiler_unroller.py b/tests/test_transpiler_unroller.py index 4b2a3c16a5..dafa888dba 100644 --- a/tests/test_transpiler_unroller.py +++ b/tests/test_transpiler_unroller.py @@ -2,10 +2,10 @@ from qibo import gates from qibo.models import Circuit -from qibo.transpiler.abstract import NativeType +from qibo.transpiler.abstract import NativeGates from qibo.transpiler.unroller import ( DecompositionError, - NativeGates, + DefaultUnroller, assert_decomposition, ) @@ -15,14 +15,14 @@ def test_assert_decomposition(): circuit.add(gates.CZ(0, 1)) circuit.add(gates.Z(0)) circuit.add(gates.M(1)) - assert_decomposition(circuit, two_qubit_natives=NativeType.CZ) + assert_decomposition(circuit, native_gates=NativeGates.default()) def test_assert_decomposition_fail_1q(): circuit = Circuit(1) circuit.add(gates.X(0)) with pytest.raises(DecompositionError): - assert_decomposition(circuit, two_qubit_natives=NativeType.CZ) + assert_decomposition(circuit, native_gates=NativeGates.default()) @pytest.mark.parametrize("gate", [gates.CNOT(0, 1), gates.iSWAP(0, 1)]) @@ -30,19 +30,19 @@ def test_assert_decomposition_fail_2q(gate): circuit = Circuit(2) circuit.add(gate) with pytest.raises(DecompositionError): - assert_decomposition(circuit, two_qubit_natives=NativeType.CZ) + assert_decomposition(circuit, native_gates=NativeGates.default()) def test_assert_decomposition_fail_3q(): circuit = Circuit(3) circuit.add(gates.TOFFOLI(0, 1, 2)) with pytest.raises(DecompositionError): - assert_decomposition(circuit, two_qubit_natives=NativeType.CZ) + assert_decomposition(circuit, native_gates=NativeGates.default()) def test_no_translate_single_qubit(): - unroller = NativeGates( - two_qubit_natives=NativeType.CZ, translate_single_qubit=False + unroller = DefaultUnroller( + native_gates=NativeGates.default(), translate_single_qubit=False ) circuit = Circuit(2) circuit.add(gates.X(0)) diff --git a/tests/test_transpilers_decompositions.py b/tests/test_transpilers_decompositions.py deleted file mode 100644 index 682d317eb9..0000000000 --- a/tests/test_transpilers_decompositions.py +++ /dev/null @@ -1,198 +0,0 @@ -import numpy as np -import pytest - -from qibo import gates -from qibo.backends import NumpyBackend -from qibo.models import Circuit -from qibo.quantum_info.random_ensembles import random_unitary -from qibo.transpiler.abstract import NativeType -from qibo.transpiler.unroller import translate_gate - - -def assert_matrices_allclose( - gate, - two_qubit_natives, - backend, - single_qubit_natives=(gates.I, gates.Z, gates.RZ, gates.U3), -): - target_matrix = gate.matrix(backend) - target_matrix = backend.cast(target_matrix, dtype=target_matrix.dtype) - # Remove global phase from target matrix - normalisation = np.power( - np.linalg.det(target_matrix), 1 / float(target_matrix.shape[0]), dtype=complex - ) - normalisation = backend.cast(normalisation, dtype=normalisation.dtype) - target_unitary = target_matrix / normalisation - - circuit = Circuit(len(gate.qubits)) - circuit.add( - translate_gate( - gate, two_qubit_natives, single_qubit_natives=single_qubit_natives - ) - ) - native_matrix = circuit.unitary(backend) - # Remove global phase from native matrix - normalisation = np.power( - np.linalg.det(native_matrix), 1 / float(native_matrix.shape[0]), dtype=complex - ) - normalisation = backend.cast(normalisation, dtype=normalisation.dtype) - native_unitary = native_matrix / normalisation - - # There can still be phase differences of -1, -1j, 1j - c = 0 - for phase in [1, -1, 1j, -1j]: - if np.allclose(phase * native_unitary, target_unitary, atol=1e-12): - c = 1 - backend.assert_allclose(c, 1) - - -@pytest.mark.parametrize("gatename", ["H", "X", "Y", "I"]) -def test_pauli_to_native(backend, gatename): - gate = getattr(gates, gatename)(0) - assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) - - -@pytest.mark.parametrize("gatename", ["RX", "RY", "RZ"]) -def test_rotations_to_native(backend, gatename): - gate = getattr(gates, gatename)(0, theta=0.1) - assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) - - -@pytest.mark.parametrize("gatename", ["S", "SDG", "T", "TDG"]) -def test_special_single_qubit_to_native(backend, gatename): - gate = getattr(gates, gatename)(0) - assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) - - -def test_u1_to_native(backend): - gate = gates.U1(0, theta=0.5) - assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) - - -def test_u2_to_native(backend): - gate = gates.U2(0, phi=0.1, lam=0.3) - assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) - - -def test_u3_to_native(backend): - gate = gates.U3(0, theta=0.2, phi=0.1, lam=0.3) - assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) - - -def test_gpi2_to_native(backend): - gate = gates.GPI2(0, phi=0.123) - assert_matrices_allclose(gate, two_qubit_natives=NativeType.CZ, backend=backend) - - -@pytest.mark.parametrize("gatename", ["CNOT", "CZ", "SWAP", "iSWAP", "FSWAP"]) -@pytest.mark.parametrize( - "natives", - [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], -) -def test_two_qubit_to_native(backend, gatename, natives): - gate = getattr(gates, gatename)(0, 1) - assert_matrices_allclose(gate, natives, backend) - - -@pytest.mark.parametrize( - "natives", - [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], -) -@pytest.mark.parametrize("gatename", ["CRX", "CRY", "CRZ"]) -def test_controlled_rotations_to_native(backend, gatename, natives): - gate = getattr(gates, gatename)(0, 1, 0.3) - assert_matrices_allclose(gate, natives, backend) - - -@pytest.mark.parametrize( - "natives", - [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], -) -def test_cu1_to_native(backend, natives): - gate = gates.CU1(0, 1, theta=0.4) - assert_matrices_allclose(gate, natives, backend) - - -@pytest.mark.parametrize( - "natives", - [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], -) -def test_cu2_to_native(backend, natives): - gate = gates.CU2(0, 1, phi=0.2, lam=0.3) - assert_matrices_allclose(gate, natives, backend) - - -@pytest.mark.parametrize( - "natives", - [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], -) -def test_cu3_to_native(backend, natives): - gate = gates.CU3(0, 1, theta=0.2, phi=0.3, lam=0.4) - assert_matrices_allclose(gate, natives, backend) - - -@pytest.mark.parametrize( - "natives", - [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], -) -def test_fSim_to_native(backend, natives): - gate = gates.fSim(0, 1, theta=0.3, phi=0.1) - assert_matrices_allclose(gate, natives, backend) - - -@pytest.mark.parametrize("seed", [None, 10, np.random.default_rng(10)]) -@pytest.mark.parametrize( - "natives", - [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], -) -def test_GeneralizedfSim_to_native(backend, natives, seed): - unitary = random_unitary(2, seed=seed, backend=backend) - gate = gates.GeneralizedfSim(0, 1, unitary, phi=0.1) - assert_matrices_allclose(gate, natives, backend) - - -@pytest.mark.parametrize( - "natives", - [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], -) -@pytest.mark.parametrize("gatename", ["RXX", "RZZ", "RYY"]) -def test_rnn_to_native(backend, gatename, natives): - gate = getattr(gates, gatename)(0, 1, theta=0.1) - assert_matrices_allclose(gate, natives, backend) - - -@pytest.mark.parametrize( - "natives", - [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], -) -def test_TOFFOLI_to_native(backend, natives): - gate = gates.TOFFOLI(0, 1, 2) - assert_matrices_allclose(gate, natives, backend) - - -@pytest.mark.parametrize("seed", [None, 10, np.random.default_rng(10)]) -@pytest.mark.parametrize( - "natives", - [NativeType.CZ, NativeType.iSWAP, NativeType.CZ | NativeType.iSWAP], -) -@pytest.mark.parametrize("nqubits", [1, 2]) -def test_unitary_to_native(backend, nqubits, natives, seed): - u = random_unitary(2**nqubits, seed=seed, backend=NumpyBackend()) - # transform to SU(2^nqubits) form - u = u / np.sqrt(np.linalg.det(u)) - gate = gates.Unitary(u, *range(nqubits)) - assert_matrices_allclose(gate, natives, backend) - - -def test_count_1q(): - from qibo.transpiler.unroller import cz_dec - - np.testing.assert_allclose(cz_dec.count_1q(gates.CNOT(0, 1)), 2) - np.testing.assert_allclose(cz_dec.count_1q(gates.CRX(0, 1, 0.1)), 2) - - -def test_count_2q(): - from qibo.transpiler.unroller import cz_dec - - np.testing.assert_allclose(cz_dec.count_2q(gates.CNOT(0, 1)), 1) - np.testing.assert_allclose(cz_dec.count_2q(gates.CRX(0, 1, 0.1)), 2) From 18e1a3593da1f3e5a2f8c3a48b4b913e5842423c Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Tue, 21 Nov 2023 16:19:52 +0100 Subject: [PATCH 049/143] uncover exception --- src/qibo/models/dbi/double_bracket.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibo/models/dbi/double_bracket.py b/src/qibo/models/dbi/double_bracket.py index 48f1f88925..08fd6cadb3 100644 --- a/src/qibo/models/dbi/double_bracket.py +++ b/src/qibo/models/dbi/double_bracket.py @@ -139,7 +139,7 @@ def hyperopt_step( """ try: import hyperopt - except: + except: # pragma: no cover raise_error( ImportError, "hyperopt_step function requires hyperopt to be installed." ) From 74fe724570cc836d783af528da814ffa4ca64819 Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Wed, 22 Nov 2023 09:55:18 +0400 Subject: [PATCH 050/143] matrix --- src/qibo/backends/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/qibo/backends/__init__.py b/src/qibo/backends/__init__.py index 14bfaa169d..4b25c71bbb 100644 --- a/src/qibo/backends/__init__.py +++ b/src/qibo/backends/__init__.py @@ -100,6 +100,7 @@ def create(self, dtype): self.S = self.matrices.S self.SDG = self.matrices.SDG self.CNOT = self.matrices.CNOT + self.CY = self.matrices.CY self.CZ = self.matrices.CZ self.CSX = self.matrices.CSX self.CSXDG = self.matrices.CSXDG From 18c1e1dad9499717f70964cf14636e9d86ed8b1d Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Wed, 22 Nov 2023 09:55:32 +0400 Subject: [PATCH 051/143] numpy matrix --- src/qibo/backends/npmatrices.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/qibo/backends/npmatrices.py b/src/qibo/backends/npmatrices.py index 490489833c..68f67a5401 100644 --- a/src/qibo/backends/npmatrices.py +++ b/src/qibo/backends/npmatrices.py @@ -121,6 +121,12 @@ def CNOT(self): [[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]], dtype=self.dtype + ) + @cached_property def CZ(self): return self.np.array( From f37c74daf5bbf62b7cccf5c9450824d8c5f9b0e2 Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Wed, 22 Nov 2023 09:55:37 +0400 Subject: [PATCH 052/143] gate --- src/qibo/gates/gates.py | 52 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/qibo/gates/gates.py b/src/qibo/gates/gates.py index f289b33c66..0e94225fca 100644 --- a/src/qibo/gates/gates.py +++ b/src/qibo/gates/gates.py @@ -178,6 +178,15 @@ def __init__(self, q): def qasm_label(self): return "y" + @Gate.check_controls + def controlled_by(self, *q): + """Fall back to CY if there is only one control.""" + if len(q) == 1: + gate = CY(q[0], self.target_qubits[0]) + else: + gate = super().controlled_by(*q) + return gate + def basis_rotation(self): from qibo import matrices # pylint: disable=C0415 @@ -972,6 +981,49 @@ def decompose(self, *free, use_toffolis: bool = True) -> List[Gate]: return [self.__class__(q0, q1)] +class CY(Gate): + """The Controlled-:math:`Y` gate. + + Corresponds to the following unitary matrix + + .. math:: + \\begin{pmatrix} + 1 & 0 & 0 & 0 \\\\ + 0 & 1 & 0 & 0 \\\\ + 0 & 0 & 0 & -i \\\\ + 0 & 0 & i & 0 \\\\ + \\end{pmatrix} + + Args: + q0 (int): the control qubit id number. + q1 (int): the target qubit id number. + """ + + def __init__(self, q0, q1): + super().__init__() + self.name = "cy" + self.draw_label = "Y" + self.control_qubits = (q0,) + self.target_qubits = (q1,) + self.init_args = [q0, q1] + self.clifford = True + self.unitary = True + + @property + def qasm_label(self): + return "cy" + + def decompose(self) -> List[Gate]: + """Decomposition of :math:`\\text{CY}` gate. + + Decompose :math:`\\text{CY}` gate into :class:`qibo.gates.SDG` in + 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)] + + class CZ(Gate): """The Controlled-Phase gate. From 05f3aa4486a24ddaa32edb2865859f4179696642 Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Wed, 22 Nov 2023 09:55:47 +0400 Subject: [PATCH 053/143] test abstract --- tests/test_gates_abstract.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/test_gates_abstract.py b/tests/test_gates_abstract.py index efeb527d3f..708a9046da 100644 --- a/tests/test_gates_abstract.py +++ b/tests/test_gates_abstract.py @@ -228,10 +228,13 @@ def test_one_qubit_rotations_controlled_by(gatename, params): assert gate.parameters == params -def test_cnot_and_cz_init(): +def test_cnot_and_cy_and_cz_init(): gate = gates.CNOT(0, 1) assert gate.target_qubits == (1,) assert gate.control_qubits == (0,) + gate = gates.CZ(4, 7) + assert gate.target_qubits == (7,) + assert gate.control_qubits == (4,) gate = gates.CZ(3, 2) assert gate.target_qubits == (2,) assert gate.control_qubits == (3,) From 0f1255d814da1ee5ab4b3139d479dfdf7d858ca3 Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Wed, 22 Nov 2023 09:55:57 +0400 Subject: [PATCH 054/143] test gate --- tests/test_gates_gates.py | 50 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/tests/test_gates_gates.py b/tests/test_gates_gates.py index 957d1e9c20..8bb0e190ea 100644 --- a/tests/test_gates_gates.py +++ b/tests/test_gates_gates.py @@ -478,6 +478,56 @@ def test_cnot(backend, applyx): assert gates.CNOT(0, 1).unitary +@pytest.mark.parametrize("seed_observable", list(range(1, 10 + 1))) +@pytest.mark.parametrize("seed_state", list(range(1, 10 + 1))) +@pytest.mark.parametrize("controlled_by", [False, True]) +def test_cy(backend, controlled_by, seed_state, seed_observable): + nqubits = 2 + initial_state = random_statevector(2**nqubits, seed=seed_state, backend=backend) + matrix = np.array( + [ + [1, 0, 0, 0], + [0, 1, 0, 0], + [0, 0, 0, -1j], + [0, 0, 1j, 0], + ] + ) + matrix = backend.cast(matrix, dtype=matrix.dtype) + + target_state = np.dot(matrix, initial_state) + # test decomposition + final_state_decompose = apply_gates( + backend, + gates.CY(0, 1).decompose(), + nqubits=nqubits, + initial_state=initial_state, + ) + + if controlled_by: + gate = gates.Y(1).controlled_by(0) + else: + gate = gates.CY(0, 1) + + final_state = apply_gates(backend, [gate], initial_state=initial_state) + + assert gate.name == "cy" + + backend.assert_allclose(final_state, target_state) + + # testing random expectation value due to global phase difference + observable = random_hermitian(2**nqubits, seed=seed_observable, backend=backend) + backend.assert_allclose( + np.transpose(np.conj(final_state_decompose)) + @ observable + @ final_state_decompose, + np.transpose(np.conj(target_state)) @ observable @ target_state, + ) + + assert gates.CY(0, 1).qasm_label == "cy" + assert gates.CY(0, 1).clifford + assert gates.CY(0, 1).unitary + + @pytest.mark.parametrize("seed_observable", list(range(1, 10 + 1))) @pytest.mark.parametrize("seed_state", list(range(1, 10 + 1))) @pytest.mark.parametrize("controlled_by", [False, True]) From 9a88f9251640da4648e7cd062687b9b53f075467 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 06:01:01 +0000 Subject: [PATCH 055/143] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/qibo/backends/npmatrices.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/qibo/backends/npmatrices.py b/src/qibo/backends/npmatrices.py index 68f67a5401..366c466cd7 100644 --- a/src/qibo/backends/npmatrices.py +++ b/src/qibo/backends/npmatrices.py @@ -124,7 +124,8 @@ def CNOT(self): @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]], dtype=self.dtype + [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, -1j], [0, 0, 1j, 0]], + dtype=self.dtype, ) @cached_property From 46e006dbda3710e54aef5bcd0530362c0deeaba8 Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Wed, 22 Nov 2023 10:04:03 +0400 Subject: [PATCH 056/143] api ref --- doc/source/api-reference/qibo.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/source/api-reference/qibo.rst b/doc/source/api-reference/qibo.rst index 8a47c74ae7..514dffa734 100644 --- a/doc/source/api-reference/qibo.rst +++ b/doc/source/api-reference/qibo.rst @@ -548,6 +548,13 @@ Controlled-NOT (CNOT) :members: :member-order: bysource +Controlled-Y (CY) +""""""""""""""""""""" + +.. autoclass:: qibo.gates.CY + :members: + :member-order: bysource + Controlled-phase (CZ) """"""""""""""""""""" From 51385efd78e6dceae7dd4e4f7c42c14b543278d2 Mon Sep 17 00:00:00 2001 From: simone bordoni Date: Wed, 22 Nov 2023 15:18:35 +0400 Subject: [PATCH 057/143] completed decompositions and added SX --- src/qibo/transpiler/decompositions.py | 64 ++++++++++++++++++------- tests/test_transpiler_decompositions.py | 2 +- 2 files changed, 48 insertions(+), 18 deletions(-) diff --git a/src/qibo/transpiler/decompositions.py b/src/qibo/transpiler/decompositions.py index 34e1380e43..229f59605c 100644 --- a/src/qibo/transpiler/decompositions.py +++ b/src/qibo/transpiler/decompositions.py @@ -47,40 +47,68 @@ def __call__(self, gate): ] +def _u3_to_gpi2(t, p, l): + """Decompose a U3 gate into GPI2 gates. + + Args: + t (float): theta parameter of U3 gate. + p (float): phi parameter of U3 gate. + l (float): lambda parameter of U3 gate. + + Returns: + list of native gates that decompose the U3 gate. + """ + return [ + gates.RZ(0, l), + gates.GPI2(0, 0), + gates.RZ(0, t + np.pi), + gates.GPI2(0, 0), + gates.RZ(0, p + np.pi), + ] + + # Decompose single qubit gates using GPI2 (more efficient on hardware) gpi2_dec = GateDecompositions() gpi2_dec.add(gates.H, [gates.Z(0), gates.GPI2(0, np.pi / 2)]) -gpi2_dec.add(gates.X, [gates.U3(0, np.pi, 0, np.pi)]) -gpi2_dec.add(gates.Y, [gates.U3(0, np.pi, 0, 0)]) +gpi2_dec.add(gates.X, [gates.GPI2(0, np.pi / 2), gates.GPI2(0, np.pi / 2), gates.Z(0)]) +gpi2_dec.add(gates.Y, [gates.Z(0), gates.GPI2(0, 0), gates.GPI2(0, 0)]) gpi2_dec.add(gates.Z, [gates.Z(0)]) gpi2_dec.add(gates.S, [gates.RZ(0, np.pi / 2)]) gpi2_dec.add(gates.SDG, [gates.RZ(0, -np.pi / 2)]) gpi2_dec.add(gates.T, [gates.RZ(0, np.pi / 4)]) gpi2_dec.add(gates.TDG, [gates.RZ(0, -np.pi / 4)]) +gpi2_dec.add(gates.SX, [gates.GPI2(0, 0)]) gpi2_dec.add( - gates.RX, lambda gate: [gates.U3(0, gate.parameters[0], -np.pi / 2, np.pi / 2)] + gates.RX, + lambda gate: [ + gates.Z(0), + gates.GPI2(0, np.pi / 2), + gates.RZ(0, gate.parameters[0] + np.pi), + gates.GPI2(0, np.pi / 2), + ], +) +gpi2_dec.add( + gates.RY, + lambda gate: [ + gates.GPI2(0, 0), + gates.RZ(0, gate.parameters[0] + np.pi), + gates.GPI2(0, 0), + gates.Z(0), + ], ) -gpi2_dec.add(gates.RY, lambda gate: [gates.U3(0, gate.parameters[0], 0, 0)]) gpi2_dec.add(gates.RZ, lambda gate: [gates.RZ(0, gate.parameters[0])]) gpi2_dec.add(gates.GPI2, lambda gate: [gates.GPI2(0, gate.parameters[0])]) gpi2_dec.add(gates.U1, lambda gate: [gates.RZ(0, gate.parameters[0])]) gpi2_dec.add( gates.U2, - lambda gate: [gates.U3(0, np.pi / 2, gate.parameters[0], gate.parameters[1])], + lambda gate: _u3_to_gpi2(np.pi / 2, gate.parameters[0], gate.parameters[1]), ) +gpi2_dec.add(gates.U3, lambda gate: _u3_to_gpi2(*gate.parameters)) gpi2_dec.add( - gates.U3, - lambda gate: [ - gates.U3(0, gate.parameters[0], gate.parameters[1], gate.parameters[2]) - ], -) -gpi2_dec.add( - gates.Unitary, - lambda gate: [gates.U3(0, *u3_decomposition(gate.parameters[0]))], + gates.Unitary, lambda gate: _u3_to_gpi2(*u3_decomposition(gate.parameters[0])) ) gpi2_dec.add( - gates.FusedGate, - lambda gate: [gates.U3(0, *u3_decomposition(gate.matrix(backend)))], + gates.FusedGate, lambda gate: _u3_to_gpi2(*u3_decomposition(gate.matrix(backend))) ) # Decompose single qubit gates using U3 @@ -93,13 +121,15 @@ def __call__(self, gate): u3_dec.add(gates.SDG, [gates.RZ(0, -np.pi / 2)]) u3_dec.add(gates.T, [gates.RZ(0, np.pi / 4)]) u3_dec.add(gates.TDG, [gates.RZ(0, -np.pi / 4)]) +u3_dec.add(gates.SX, [gates.U3(0, np.pi / 2, -np.pi / 2, np.pi / 2)]) u3_dec.add( gates.RX, lambda gate: [gates.U3(0, gate.parameters[0], -np.pi / 2, np.pi / 2)] ) u3_dec.add(gates.RY, lambda gate: [gates.U3(0, gate.parameters[0], 0, 0)]) u3_dec.add(gates.RZ, lambda gate: [gates.RZ(0, gate.parameters[0])]) -# TODO: decompose using U3 -u3_dec.add(gates.GPI2, lambda gate: [gates.GPI2(0, gate.parameters[0])]) +u3_dec.add( + gates.GPI2, lambda gate: [gates.U3(0, *u3_decomposition(gate.matrix(backend)))] +) u3_dec.add(gates.U1, lambda gate: [gates.RZ(0, gate.parameters[0])]) u3_dec.add( gates.U2, diff --git a/tests/test_transpiler_decompositions.py b/tests/test_transpiler_decompositions.py index f122fd048d..5bf7c32266 100644 --- a/tests/test_transpiler_decompositions.py +++ b/tests/test_transpiler_decompositions.py @@ -52,7 +52,7 @@ def test_rotations_to_native(backend, gatename, natives): @pytest.mark.parametrize("natives", [NativeGates.U3, NativeGates.GPI2]) -@pytest.mark.parametrize("gatename", ["S", "SDG", "T", "TDG"]) +@pytest.mark.parametrize("gatename", ["S", "SDG", "T", "TDG", "SX"]) def test_special_single_qubit_to_native(backend, gatename, natives): gate = getattr(gates, gatename)(0) assert_matrices_allclose(gate, natives=natives, backend=backend) From f3ce2f32ecbcbdb571cb28077400c205f9c50860 Mon Sep 17 00:00:00 2001 From: simone bordoni Date: Wed, 22 Nov 2023 16:18:58 +0400 Subject: [PATCH 058/143] fixed tests --- src/qibo/transpiler/abstract.py | 3 +- src/qibo/transpiler/decompositions.py | 22 ++++++----- src/qibo/transpiler/unroller.py | 43 ++++++++------------- tests/test_transpiler_decompositions.py | 3 +- tests/test_transpiler_unroller.py | 51 +++++++++++++++++++++---- 5 files changed, 75 insertions(+), 47 deletions(-) diff --git a/src/qibo/transpiler/abstract.py b/src/qibo/transpiler/abstract.py index 7e0fa5c106..2ae59c24cc 100644 --- a/src/qibo/transpiler/abstract.py +++ b/src/qibo/transpiler/abstract.py @@ -27,11 +27,10 @@ class NativeGates(Flag): CZ = auto() iSWAP = auto() - # TODO: use GPI2 as default single qubit native gate @classmethod def default(cls): """Return default native gates set.""" - return cls.CZ | cls.U3 | cls.I | cls.Z | cls.RZ | cls.M + return cls.CZ | cls.GPI2 | cls.I | cls.Z | cls.RZ | cls.M @classmethod def from_gatelist(cls, gatelist: list): diff --git a/src/qibo/transpiler/decompositions.py b/src/qibo/transpiler/decompositions.py index 229f59605c..6b874310fc 100644 --- a/src/qibo/transpiler/decompositions.py +++ b/src/qibo/transpiler/decompositions.py @@ -47,24 +47,28 @@ def __call__(self, gate): ] -def _u3_to_gpi2(t, p, l): +def _u3_to_gpi2(t, p, l, optimize=True): """Decompose a U3 gate into GPI2 gates. Args: t (float): theta parameter of U3 gate. p (float): phi parameter of U3 gate. l (float): lambda parameter of U3 gate. + optimize (bool): if True, the decomposition is optimized to use the minimum number of gates. Returns: - list of native gates that decompose the U3 gate. + decomposition (list): list of native gates that decompose the U3 gate. """ - return [ - gates.RZ(0, l), - gates.GPI2(0, 0), - gates.RZ(0, t + np.pi), - gates.GPI2(0, 0), - gates.RZ(0, p + np.pi), - ] + decomposition = [] + if l != 0.0 or not optimize: + decomposition.append(gates.RZ(0, l)) + decomposition.append(gates.GPI2(0, 0)) + if t != -np.pi or not optimize: + decomposition.append(gates.RZ(0, t + np.pi)) + decomposition.append(gates.GPI2(0, 0)) + if p != -np.pi or not optimize: + decomposition.append(gates.RZ(0, p + np.pi)) + return decomposition # Decompose single qubit gates using GPI2 (more efficient on hardware) diff --git a/src/qibo/transpiler/unroller.py b/src/qibo/transpiler/unroller.py index 4f0638d9e4..1c1c342402 100644 --- a/src/qibo/transpiler/unroller.py +++ b/src/qibo/transpiler/unroller.py @@ -22,37 +22,18 @@ class DefaultUnroller(Unroller): def __init__( self, native_gates: NativeGates, - translate_single_qubit: bool = True, ): self.native_gates = native_gates - self.translate_single_qubit = translate_single_qubit def __call__(self, circuit: Circuit): - two_qubit_translated_circuit = circuit.__class__(circuit.nqubits) translated_circuit = circuit.__class__(circuit.nqubits) for gate in circuit.queue: - if len(gate.qubits) > 1 or self.translate_single_qubit: - two_qubit_translated_circuit.add( - translate_gate( - gate, - self.native_gates, - ) + translated_circuit.add( + translate_gate( + gate, + self.native_gates, ) - else: - two_qubit_translated_circuit.add(gate) - if self.translate_single_qubit: - for gate in two_qubit_translated_circuit.queue: - if len(gate.qubits) == 1: - translated_circuit.add( - translate_gate( - gate, - self.native_gates, - ) - ) - else: - translated_circuit.add(gate) - else: - translated_circuit = two_qubit_translated_circuit + ) return translated_circuit def is_satisfied(self, circuit: Circuit): @@ -73,8 +54,7 @@ def assert_decomposition( Args: circuit (:class:`qibo.models.circuit.Circuit`): circuit model to check. native_gates (:class:`qibo.transpiler.abstract.NativeGates`): - two-qubit native gates supported by the quantum hardware. - single_qubit_natives (tuple): single qubit native gates. + native gates supported by the quantum hardware. """ for gate in circuit.queue: if isinstance(gate, gates.M): @@ -128,7 +108,16 @@ def translate_gate( elif len(gate.qubits) == 1: return _translate_single_qubit_gates(gate, native_gates.single_qubit_natives()) else: - return _translate_two_qubit_gates(gate, native_gates) + decomposition_2q = _translate_two_qubit_gates(gate, native_gates) + final_decomposition = [] + for gate in decomposition_2q: + if len(gate.qubits) == 1: + final_decomposition += _translate_single_qubit_gates( + gate, native_gates.single_qubit_natives() + ) + else: + final_decomposition.append(gate) + return final_decomposition def _translate_single_qubit_gates(gate: gates.Gate, single_qubit_natives: NativeGates): diff --git a/tests/test_transpiler_decompositions.py b/tests/test_transpiler_decompositions.py index 5bf7c32266..194e6da420 100644 --- a/tests/test_transpiler_decompositions.py +++ b/tests/test_transpiler_decompositions.py @@ -6,7 +6,7 @@ from qibo.models import Circuit from qibo.quantum_info.random_ensembles import random_unitary from qibo.transpiler.abstract import NativeGates -from qibo.transpiler.unroller import translate_gate +from qibo.transpiler.unroller import assert_decomposition, translate_gate def assert_matrices_allclose(gate, natives, backend): @@ -35,6 +35,7 @@ def assert_matrices_allclose(gate, natives, backend): if np.allclose(phase * native_unitary, target_unitary, atol=1e-12): c = 1 backend.assert_allclose(c, 1) + assert_decomposition(circuit, natives) @pytest.mark.parametrize("natives", [NativeGates.U3, NativeGates.GPI2]) diff --git a/tests/test_transpiler_unroller.py b/tests/test_transpiler_unroller.py index dafa888dba..f5720d5e11 100644 --- a/tests/test_transpiler_unroller.py +++ b/tests/test_transpiler_unroller.py @@ -1,3 +1,4 @@ +import numpy as np import pytest from qibo import gates @@ -40,14 +41,48 @@ def test_assert_decomposition_fail_3q(): assert_decomposition(circuit, native_gates=NativeGates.default()) -def test_no_translate_single_qubit(): - unroller = DefaultUnroller( - native_gates=NativeGates.default(), translate_single_qubit=False - ) - circuit = Circuit(2) +@pytest.mark.parametrize( + "natives_2q", + [NativeGates.CZ, NativeGates.iSWAP, NativeGates.CZ | NativeGates.iSWAP], +) +@pytest.mark.parametrize( + "natives_1q", + [NativeGates.U3, NativeGates.GPI2, NativeGates.U3 | NativeGates.GPI2], +) +def test_unroller(natives_1q, natives_2q): + circuit = Circuit(3) + circuit.add(gates.H(0)) circuit.add(gates.X(0)) + circuit.add(gates.Y(0)) + circuit.add(gates.Z(0)) + circuit.add(gates.S(0)) + circuit.add(gates.T(0)) + circuit.add(gates.SDG(0)) + circuit.add(gates.TDG(0)) + circuit.add(gates.SX(0)) + circuit.add(gates.RX(0, 0.1)) + circuit.add(gates.RY(0, 0.2)) + circuit.add(gates.RZ(0, 0.3)) + circuit.add(gates.U1(0, 0.4)) + circuit.add(gates.U2(0, 0.5, 0.6)) + circuit.add(gates.U3(0, 0.7, 0.8, 0.9)) + circuit.add(gates.GPI2(0, 0.123)) + circuit.add(gates.CZ(0, 1)) circuit.add(gates.CNOT(0, 1)) + circuit.add(gates.SWAP(0, 1)) + circuit.add(gates.iSWAP(0, 1)) + circuit.add(gates.FSWAP(0, 1)) + circuit.add(gates.CRX(0, 1, 0.1)) + circuit.add(gates.CRY(0, 1, 0.2)) + circuit.add(gates.CRZ(0, 1, 0.3)) + circuit.add(gates.CU1(0, 1, 0.4)) + circuit.add(gates.CU2(0, 1, 0.5, 0.6)) + circuit.add(gates.CU3(0, 1, 0.7, 0.8, 0.9)) + circuit.add(gates.RXX(0, 1, 0.1)) + circuit.add(gates.RYY(0, 1, 0.2)) + circuit.add(gates.RZZ(0, 1, 0.3)) + circuit.add(gates.fSim(0, 1, 0.4, 0.5)) + circuit.add(gates.TOFFOLI(0, 1, 2)) + unroller = DefaultUnroller(native_gates=natives_1q | natives_2q) translated_circuit = unroller(circuit) - assert isinstance(translated_circuit.queue[0], gates.X) and isinstance( - translated_circuit.queue[2], gates.CZ - ) + assert_decomposition(translated_circuit, native_gates=natives_1q | natives_2q) From d71fac386019b60e3d2f7df6036830a468a26065 Mon Sep 17 00:00:00 2001 From: simone bordoni Date: Thu, 23 Nov 2023 14:00:49 +0400 Subject: [PATCH 059/143] fix advanced examples --- doc/source/code-examples/advancedexamples.rst | 10 +++++----- tests/test_transpiler_unroller.py | 1 - 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/doc/source/code-examples/advancedexamples.rst b/doc/source/code-examples/advancedexamples.rst index 2adbae6128..6b9b526cca 100644 --- a/doc/source/code-examples/advancedexamples.rst +++ b/doc/source/code-examples/advancedexamples.rst @@ -2011,10 +2011,10 @@ Multiple transpilation steps can be implemented using the :class:`qibo.transpile from qibo import gates from qibo.models import Circuit from qibo.transpiler.pipeline import Passes, assert_transpiling - from qibo.transpiler.abstract import NativeType + from qibo.transpiler.abstract import NativeGates from qibo.transpiler.optimizer import Preprocessing from qibo.transpiler.router import ShortestPaths - from qibo.transpiler.unroller import NativeGates + from qibo.transpiler.unroller import DefaultUnroller from qibo.transpiler.placer import Random # Define connectivity as nx.Graph @@ -2040,10 +2040,10 @@ Multiple transpilation steps can be implemented using the :class:`qibo.transpile # Routing step custom_passes.append(ShortestPaths(connectivity=star_connectivity())) # Gate decomposition step - custom_passes.append(NativeGates(two_qubit_natives=NativeType.iSWAP)) + custom_passes.append(DefaultUnroller(native_gates=NativeGates.default())) # Define the general pipeline - custom_pipeline = Passes(custom_passes, connectivity=star_connectivity(), native_gates=NativeType.iSWAP) + custom_pipeline = Passes(custom_passes, connectivity=star_connectivity(), native_gates=NativeGates.default()) # Call the transpiler pipeline on the circuit transpiled_circ, final_layout = custom_pipeline(circuit) @@ -2057,7 +2057,7 @@ Multiple transpilation steps can be implemented using the :class:`qibo.transpile connectivity=star_connectivity(), initial_layout=initial_layout, final_layout=final_layout, - native_gates=NativeType.iSWAP + native_gates=NativeGates.default() ) In this case circuits will first be transpiled to respect the 5-qubit star connectivity, with qubit 2 as the middle qubit. This will potentially add some SWAP gates. diff --git a/tests/test_transpiler_unroller.py b/tests/test_transpiler_unroller.py index f5720d5e11..99785e4b22 100644 --- a/tests/test_transpiler_unroller.py +++ b/tests/test_transpiler_unroller.py @@ -1,4 +1,3 @@ -import numpy as np import pytest from qibo import gates From 2075cadeba7b7593437a3c06335313e3a6026297 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Thu, 23 Nov 2023 15:28:45 +0100 Subject: [PATCH 060/143] dbf -> dbi in qibo src --- src/qibo/models/dbi/double_bracket.py | 32 ++++++++++++------------- tests/test_models_dbi.py | 34 +++++++++++++-------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/qibo/models/dbi/double_bracket.py b/src/qibo/models/dbi/double_bracket.py index 08fd6cadb3..55dd00465b 100644 --- a/src/qibo/models/dbi/double_bracket.py +++ b/src/qibo/models/dbi/double_bracket.py @@ -8,7 +8,7 @@ from qibo.hamiltonians import Hamiltonian -class FlowGeneratorType(Enum): +class IterationGeneratorType(Enum): """Define DBF evolution.""" canonical = auto() @@ -20,25 +20,25 @@ class FlowGeneratorType(Enum): # TODO: add double commutator (does it converge?) -class DoubleBracketFlow: +class DoubleBracketIteration: """ - Class implementing the Double Bracket flow algorithm. + Class implementing the Double Bracket iteration algorithm. For more details, see https://arxiv.org/pdf/2206.11772.pdf Args: hamiltonian (Hamiltonian): Starting Hamiltonian; - mode (FlowGeneratorType): type of generator of the evolution. + mode (IterationGeneratorType): type of generator of the evolution. Example: .. code-block:: python import numpy as np - from qibo.models.double_bracket import DoubleBracketFlow, FlowGeneratorType + from qibo.models.double_bracket import DoubleBracketIteration, IterationGeneratorType from qibo.quantum_info import random_hermitian nqubits = 4 h0 = random_hermitian(2**nqubits) - dbf = DoubleBracketFlow(Hamiltonian(nqubits=nqubits, matrix=h0)) + dbf = DoubleBracketIteration(Hamiltonian(nqubits=nqubits, matrix=h0)) # diagonalized matrix dbf.h @@ -47,29 +47,29 @@ class DoubleBracketFlow: def __init__( self, hamiltonian: Hamiltonian, - mode: FlowGeneratorType = FlowGeneratorType.canonical, + mode: IterationGeneratorType = IterationGeneratorType.canonical, ): self.h = hamiltonian self.h0 = deepcopy(self.h) self.mode = mode - def __call__(self, step: float, mode: FlowGeneratorType = None, d: np.array = None): + def __call__(self, step: float, mode: IterationGeneratorType = None, d: np.array = None): if mode is None: mode = self.mode - if mode is FlowGeneratorType.canonical: + if mode is IterationGeneratorType.canonical: operator = self.backend.calculate_matrix_exp( 1.0j * step, self.commutator(self.diagonal_h_matrix, self.h.matrix), ) - elif mode is FlowGeneratorType.single_commutator: + elif mode is IterationGeneratorType.single_commutator: if d is None: raise_error(ValueError, f"Cannot use group_commutator with matrix {d}") operator = self.backend.calculate_matrix_exp( 1.0j * step, self.commutator(d, self.h.matrix), ) - elif mode is FlowGeneratorType.group_commutator: + elif mode is IterationGeneratorType.group_commutator: if d is None: raise_error(ValueError, f"Cannot use group_commutator with matrix {d}") operator = ( @@ -123,7 +123,7 @@ def hyperopt_step( verbose: bool = False, ): """ - Optimize flow step. + Optimize iteration step. Args: step_min: lower bound of the search grid; @@ -131,11 +131,11 @@ def hyperopt_step( max_evals: maximum number of iterations done by the hyperoptimizer; space: see hyperopt.hp possibilities; optimizer: see hyperopt algorithms; - look_ahead: number of flow steps to compute the loss function; + look_ahead: number of iteration steps to compute the loss function; verbose: level of verbosity. Returns: - (float): optimized best flow step. + (float): optimized best iteration step. """ try: import hyperopt @@ -165,8 +165,8 @@ def loss(self, step: float, look_ahead: int = 1): Compute loss function distance between `look_ahead` steps. Args: - step: flow step. - look_ahead: number of flow steps to compute the loss function; + step: iteration step. + look_ahead: number of iteration steps to compute the loss function; """ # copy initial hamiltonian h_copy = deepcopy(self.h) diff --git a/tests/test_models_dbi.py b/tests/test_models_dbi.py index 4f25162871..766f39cf12 100644 --- a/tests/test_models_dbi.py +++ b/tests/test_models_dbi.py @@ -1,11 +1,11 @@ -"""Testing DoubleBracketFlow model""" +"""Testing DoubleBracketIteration model""" import hyperopt import numpy as np import pytest from qibo.backends import GlobalBackend from qibo.hamiltonians import Hamiltonian -from qibo.models.dbi.double_bracket import DoubleBracketFlow, FlowGeneratorType +from qibo.models.dbi.double_bracket import DoubleBracketIteration, IterationGeneratorType from qibo.quantum_info import random_hermitian NSTEPS = 50 @@ -13,10 +13,10 @@ @pytest.mark.parametrize("nqubits", [3, 4, 5]) -def test_double_bracket_flow_canonical(backend, nqubits): +def test_double_bracket_iteration_canonical(backend, nqubits): h0 = random_hermitian(2**nqubits, backend=backend) - dbf = DoubleBracketFlow( - Hamiltonian(nqubits, h0, backend=backend), mode=FlowGeneratorType.canonical + dbf = DoubleBracketIteration( + Hamiltonian(nqubits, h0, backend=backend), mode=IterationGeneratorType.canonical ) initial_off_diagonal_norm = dbf.off_diagonal_norm for _ in range(NSTEPS): @@ -26,17 +26,17 @@ def test_double_bracket_flow_canonical(backend, nqubits): @pytest.mark.parametrize("nqubits", [3, 4, 5]) -def test_double_bracket_flow_group_commutator(backend, nqubits): +def test_double_bracket_iteration_group_commutator(backend, nqubits): h0 = random_hermitian(2**nqubits, backend=backend) d = backend.cast(np.diag(np.diag(backend.to_numpy(h0)))) - dbf = DoubleBracketFlow( + dbf = DoubleBracketIteration( Hamiltonian(nqubits, h0, backend=backend), - mode=FlowGeneratorType.group_commutator, + mode=IterationGeneratorType.group_commutator, ) initial_off_diagonal_norm = dbf.off_diagonal_norm with pytest.raises(ValueError): - dbf(mode=FlowGeneratorType.group_commutator, step=0.01) + dbf(mode=IterationGeneratorType.group_commutator, step=0.01) for _ in range(NSTEPS): dbf(step=0.01, d=d) @@ -45,17 +45,17 @@ def test_double_bracket_flow_group_commutator(backend, nqubits): @pytest.mark.parametrize("nqubits", [3, 4, 5]) -def test_double_bracket_flow_single_commutator(backend, nqubits): +def test_double_bracket_iteration_single_commutator(backend, nqubits): h0 = random_hermitian(2**nqubits, backend=backend) d = backend.cast(np.diag(np.diag(backend.to_numpy(h0)))) - dbf = DoubleBracketFlow( + dbf = DoubleBracketIteration( Hamiltonian(nqubits, h0, backend=backend), - mode=FlowGeneratorType.single_commutator, + mode=IterationGeneratorType.single_commutator, ) initial_off_diagonal_norm = dbf.off_diagonal_norm with pytest.raises(ValueError): - dbf(mode=FlowGeneratorType.single_commutator, step=0.01) + dbf(mode=IterationGeneratorType.single_commutator, step=0.01) for _ in range(NSTEPS): dbf(step=0.01, d=d) @@ -67,7 +67,7 @@ def test_double_bracket_flow_single_commutator(backend, nqubits): def test_hyperopt_step(backend, nqubits): h0 = random_hermitian(2**nqubits, backend=backend) d = backend.cast(np.diag(np.diag(backend.to_numpy(h0)))) - dbf = DoubleBracketFlow(Hamiltonian(nqubits, h0, backend=backend)) + dbf = DoubleBracketIteration(Hamiltonian(nqubits, h0, backend=backend)) # find initial best step with look_ahead = 1 initial_step = 0.01 @@ -80,7 +80,7 @@ def test_hyperopt_step(backend, nqubits): assert step != initial_step # evolve following the optimized first step - for generator in FlowGeneratorType: + for generator in IterationGeneratorType: dbf(mode=generator, step=step, d=d) # find the following step size with look_ahead @@ -95,12 +95,12 @@ def test_hyperopt_step(backend, nqubits): # evolve following the optimized first step for gentype in range(look_ahead): - dbf(mode=FlowGeneratorType(gentype + 1), step=step, d=d) + dbf(mode=IterationGeneratorType(gentype + 1), step=step, d=d) def test_energy_fluctuations(backend): h0 = np.array([[1, 0], [0, -1]]) state = np.array([1, 0]) - dbf = DoubleBracketFlow(Hamiltonian(1, matrix=h0, backend=backend)) + dbf = DoubleBracketIteration(Hamiltonian(1, matrix=h0, backend=backend)) energy_fluctuation = dbf.energy_fluctuation(state=state) assert energy_fluctuation == 0 From 0cc75984e99783881a9167b60fdda880092c6df7 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Thu, 23 Nov 2023 15:38:54 +0100 Subject: [PATCH 061/143] dbf -> dbi in dbi tutorial --- examples/dbi/dbi.ipynb | 144 ++++++++++++++++++++--------------------- 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/examples/dbi/dbi.ipynb b/examples/dbi/dbi.ipynb index 716e211941..1a8a86b153 100644 --- a/examples/dbi/dbi.ipynb +++ b/examples/dbi/dbi.ipynb @@ -5,9 +5,9 @@ "id": "cb748c1a-2ecd-44a2-91d8-c1255a00615b", "metadata": {}, "source": [ - "## Double-Bracket Flow diagonalization algorithm\n", + "## Double-Bracket Iteration diagonalization algorithm\n", "\n", - "In this example we present the `Qibo`'s implementation of the Double-Bracket Flow (DBF) algorithm, which can be used to prepare the eigenstates of a quantum system. \n", + "In this example we present the `Qibo`'s implementation of the Double-Bracket Iteration (DBI) algorithm, which can be used to prepare the eigenstates of a quantum system. \n", "\n", "#### The initial setup\n", "\n", @@ -17,7 +17,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5bf7f589-dee5-4ce5-96c2-ee81ea6222e5", + "id": "91dc69bf-0404-4bd1-9990-0a8cf00951e6", "metadata": {}, "outputs": [], "source": [ @@ -30,7 +30,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 2, "id": "f270b1ea-ee6a-4eac-a0ff-3d7dae296cf0", "metadata": {}, "outputs": [], @@ -44,7 +44,7 @@ "from hyperopt import hp, tpe\n", "\n", "from qibo import hamiltonians, set_backend\n", - "from qibo.models.dbi.double_bracket import FlowGeneratorType, DoubleBracketFlow" + "from qibo.models.dbi.double_bracket import IterationGeneratorType, DoubleBracketIteration" ] }, { @@ -57,7 +57,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 3, "id": "4aec7b46-19b9-4004-93c0-a90255e58fd9", "metadata": {}, "outputs": [], @@ -109,7 +109,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 4, "id": "2c4ed408-68ed-4054-825c-2a7df0979a4f", "metadata": {}, "outputs": [ @@ -117,7 +117,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "[Qibo 0.2.2|INFO|2023-11-17 16:55:09]: Using qibojit (numba) backend on /CPU:0\n" + "[Qibo 0.2.3|INFO|2023-11-23 15:31:38]: Using qibojit (numba) backend on /CPU:0\n" ] }, { @@ -153,9 +153,9 @@ "source": [ "#### The generator of the evolution\n", "\n", - "The model is implemented following the procedure presented in [1], and the first practical step is to define the generator of the flow $\\hat{\\mathcal{U}}_{\\ell}$, which executes one diagonalization step $$\\hat{H}_{\\ell} = \\hat{\\mathcal{U}}_{\\ell}^{\\dagger} \\hat{H} \\hat{\\mathcal{U}}_{\\ell}.$$\n", - "In `Qibo`, we define the flow type through a `FlowGeneratorType` object, which can be chosen between one of the following:\n", - "- `canonical`: the generator of the flow at step $k+1$ is defined using the commutator between the off diagonal part $\\sigma(\\hat{H_k})$ and the diagonal part $\\Delta(\\hat{H}_k)$ of the target evolved hamiltonian:\n", + "The model is implemented following the procedure presented in [1], and the first practical step is to define the generator of the iteration $\\hat{\\mathcal{U}}_{\\ell}$, which executes one diagonalization step $$\\hat{H}_{\\ell} = \\hat{\\mathcal{U}}_{\\ell}^{\\dagger} \\hat{H} \\hat{\\mathcal{U}}_{\\ell}.$$\n", + "In `Qibo`, we define the iteration type through a `IterationGeneratorType` object, which can be chosen between one of the following:\n", + "- `canonical`: the generator of the iteration at step $k+1$ is defined using the commutator between the off diagonal part $\\sigma(\\hat{H_k})$ and the diagonal part $\\Delta(\\hat{H}_k)$ of the target evolved hamiltonian:\n", " $$\\hat{\\mathcal{U}}_{k+1}=\\exp\\bigl\\{s[\\Delta(\\hat{H}_k), \\sigma(\\hat{H}_k)]\\bigr\\}.$$ \n", "- `single_commutator`: the evolution follows a similar procedure of the previous point in this list, but any additional matrix $D_k$ can be used to control the evolution at each step:\n", " $$ \\hat{\\mathcal{U}}_{k+1}=\\exp\\bigl\\{s[D_k, \\hat{H}_k]\\bigr\\}. $$\n", @@ -168,7 +168,7 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 5, "id": "26a487e9-366b-4203-b660-e3d4af2bcb68", "metadata": {}, "outputs": [ @@ -176,27 +176,27 @@ "name": "stdout", "output_type": "stream", "text": [ - "FlowGeneratorType.canonical\n", - "FlowGeneratorType.single_commutator\n", - "FlowGeneratorType.group_commutator\n" + "IterationGeneratorType.canonical\n", + "IterationGeneratorType.single_commutator\n", + "IterationGeneratorType.group_commutator\n" ] } ], "source": [ - "# we have a look inside the FlowGeneratorType class\n", - "for generator in FlowGeneratorType:\n", + "# we have a look inside the IterationGeneratorType class\n", + "for generator in IterationGeneratorType:\n", " print(generator)" ] }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 7, "id": "da8dce89-27f6-403d-982a-58d531fade48", "metadata": {}, "outputs": [], "source": [ "# here we set the canonical generator\n", - "flowtype = FlowGeneratorType.canonical" + "iterationtype = IterationGeneratorType.canonical" ] }, { @@ -204,19 +204,19 @@ "id": "fc4f9f75-0548-4533-a13c-3aba3191e608", "metadata": {}, "source": [ - "#### The `DoubleBracketFlow` class\n", + "#### The `DoubleBracketIteration` class\n", "\n", - "A `DoubleBracketFlow` object can be initialize by calling the `qibo.models.double_braket.DoubleBracketFlow` model and passing the target hamiltonian and the generator type we want to use to perform the evolutionary steps." + "A `DoubleBracketIteration` object can be initialize by calling the `qibo.models.double_braket.DoubleBracketIteration` model and passing the target hamiltonian and the generator type we want to use to perform the evolutionary steps." ] }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 8, "id": "055870ec-55f2-4b99-a622-e3aa4c7dd0e9", "metadata": {}, "outputs": [], "source": [ - "dbf = DoubleBracketFlow(hamiltonian=deepcopy(h), mode=flowtype)" + "dbf = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=iterationtype)" ] }, { @@ -224,12 +224,12 @@ "id": "b38cf803-60b4-467a-be8e-cbad5d81f14a", "metadata": {}, "source": [ - "#### `DoubleBracketFlow` features" + "#### `DoubleBracketIteration` features" ] }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 9, "id": "9e278c3d-9f34-4a40-b453-4e030c751ef5", "metadata": {}, "outputs": [ @@ -248,7 +248,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 10, "id": "5b8e142b-a0a2-41bd-a16a-265a420b7360", "metadata": {}, "outputs": [ @@ -275,7 +275,7 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 11, "id": "4f9d1d41-3df7-49cf-96ca-fa1019c00c33", "metadata": {}, "outputs": [ @@ -297,7 +297,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 12, "id": "7b864712-219c-44b6-8337-19ef0100e318", "metadata": {}, "outputs": [ @@ -327,7 +327,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 13, "id": "da3d3aaa-17e1-492e-bcd3-b510f44a5391", "metadata": {}, "outputs": [ @@ -349,7 +349,7 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 14, "id": "24d0dfa1-7039-4d7d-8aa3-5a937b9ab0b8", "metadata": {}, "outputs": [ @@ -381,7 +381,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 15, "id": "95f8d86f-07d4-498c-acb1-f6f6a4614c24", "metadata": {}, "outputs": [ @@ -391,7 +391,7 @@ "6.708203932499369" ] }, - "execution_count": 78, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -411,14 +411,14 @@ "id": "3d5b37f3-2477-49a0-9f80-7da5ddda1fff", "metadata": {}, "source": [ - "#### Call the `DoubleBracketFlow` to perform a DBF iteration\n", + "#### Call the `DoubleBracketIteration` to perform a DBF iteration\n", "\n", - "If the DBF object is called, a Double Bracket Flow iteration is performed. This can be done customizing the flow by setting the flow step and the desired `FlowGeneratorType`. If no generator is provided, the one passed at the initialization time is used (default is `FlowGeneratorType.canonical`)." + "If the DBF object is called, a Double Bracket Iteration iteration is performed. This can be done customizing the iteration by setting the iteration step and the desired `IterationGeneratorType`. If no generator is provided, the one passed at the initialization time is used (default is `IterationGeneratorType.canonical`)." ] }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 16, "id": "9a886261-8aa6-4df0-a31b-9c39847db124", "metadata": {}, "outputs": [ @@ -437,7 +437,7 @@ "# initial value of the off-diagonal norm\n", "print(f\"Initial value of the off-diagonal norm: {dbf.off_diagonal_norm}\")\n", "\n", - "dbf(step=0.01, mode=flowtype)\n", + "dbf(step=0.01, mode=iterationtype)\n", "\n", "# after one step\n", "print(f\"One step later off-diagonal norm: {dbf.off_diagonal_norm}\")" @@ -453,7 +453,7 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": 17, "id": "cc74812d-7c2c-44e4-afc2-e235968801b4", "metadata": {}, "outputs": [ @@ -482,7 +482,7 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 18, "id": "aad79966-7a11-4a45-aba5-4a4bb8315c50", "metadata": {}, "outputs": [ @@ -490,7 +490,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "100%|█████████████████████████████████████████████████████████████████████████| 1000/1000 [00:06<00:00, 144.50trial/s, best loss: 828.4068645826136]\n" + "100%|█████████████████████████████████████████████████████████████████████████| 1000/1000 [00:06<00:00, 147.68trial/s, best loss: 828.3951090043593]\n" ] } ], @@ -511,7 +511,7 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 19, "id": "49483a47-d29d-440e-a4bc-143bfe6bb3cf", "metadata": {}, "outputs": [ @@ -532,13 +532,13 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 20, "id": "6bdaf7f9-7e49-4a16-8b29-ae1f9746cd9b", "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZ4AAAGdCAYAAAAi6BWhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA/tklEQVR4nO3de3RU1b0H8O8hJpOQZAbCIw8ZIKCCPAKIEFN8gEQgt1JQLr5oG5CrFwxaDW01Xgv4IlQXSq0YWi8FbQsIIqAuReWRcFsBJYCAaASMEgoJijIDQ17M7PtHzNghYc5vMiczc+D7cZ21ZOY3++yZM8nO3mfv39aUUgpEREQh0ibcFSAioosLGx4iIgopNjxERBRSbHiIiCik2PAQEVFIseEhIqKQYsNDREQhxYaHiIhC6pJwV4CIiAJXU1ODuro6Q8qKiYlBbGysIWVJsOEhIjKZmpoapKenoLLSYUh5KSkpKC8vD1njw4aHiMhk6urqUFnpwJdfPw+rNS6ospzOavTo9hDq6urY8BARkX9Wa1zQDU84sOEhIjIppc5CqbNBlxFqbHiIiExKKTeUcgddRqhxOjUREYUUezxERCblUWfhCXKoLNjXtwQbHiIikzLrPR4OtREBmD9/Pt55551wV8MvM9SRSII9HrrorVq1CnPmzEF0dDQOHDiADh06hLtKTZihjhR6DZMLgu3xcHIBUUjV1tbi4YcfxuLFi3HTTTdh9uzZ4a5SE2aoI4WH8pw15Ag1Njx0UVuwYAH69euH2267DS+88AJWrlyJ/fv3h7taPsxQR6JAaEopFe5KEBGRnNPphM1mw7+OzYLVGlyaG6ezBpemPgGHwwGr1WpQDf3jPR4iIpPirDYiHUuXLoWmafjqq698Hv/444/xk5/8BPHx8dA0Dbt37zbsnN27d8ecOXMMK8+M+BlQpGHDQ341NhaNR2xsLNLS0jB69Gi88MILOHXqVFDl19fXY+LEifjuu+/w/PPP469//Su6deuGDz/8EHPmzMHJkyeNeSPneO+996BpGpYtW9bs8z/72c8QHx8Pj8fTKueXMEMdKcw8ZwFPfZAHF5BShHriiSeQnp6O+vp6VFZWori4GA8++CCee+45vPnmm8jIyNAt4xe/+AXuuOMOWCwW72OHDh3C119/jZdffhn/9V//5X38ww8/xOOPP47JkyejXbt2hr+fTz75BABw9dVXN/t8aWkp+vXrhzZtwve3mRnqSOHVMNQWFXQZocaGh0RycnJ8fgEWFBRg06ZNuPnmm/Gzn/0Mn332GeLimk/P7nK5EB8fj6ioKERF+f6QHD9+HABapXHxZ8+ePbBarbj88subPFdZWYmjR4/ipz/9aUjrdC4z1JGoJfinErXYjTfeiN/97nf4+uuv8be//Q0AMGfOHGiahv379+Ouu+5C+/btce211wJoeo9n8uTJuOGGGwAAEydOhKZpGD58OObMmYPf/OY3AID09HTvMF/j6z7//HMcPnw4qLp/8sknGDRoEDRNa/JcaWkpAGDAgAFBnSNYZqgjhZnnrDFHALp37+4z/N545OXlictgj4eC8otf/AKPPvoo3n//fdxzzz3exydOnIjLL78cc+fOxflm7P/3f/83Lr30UsydOxcPPPAAhgwZguTkZCQnJ+OLL77A8uXL8fzzz6Njx44AgE6dOgEArrzyStxwww0oLi5uUZ3r6upQVlaGO++8EwcPHmzy/KZNmwBANHzYWsxQR4oAnrOAJ7ihtkAbno8//hhu94/ZDvbt24ebbroJEydOFJfBhoeC0qVLF9hsNhw6dMjn8QEDBpz3pnijrKws1NbWYu7cubjuuuvwn//5n97nrrrqKixfvhzjx49H9+7dDa3z/v37UV9fj1dffRWvvvrqeePC+UvdDHWki1PjH4CN5s2bh549e3pHLyTY8FDQEhISmsxumzZtWqudL9g1z3v27AHQkBHg0ksvbfL8tGnTkJiYCJvNFnDZHo8HdXV1oliLxdLsMFpr15EuJG4g6MkBDb0Xp9Pp86jFYvGZCNScuro6/O1vf0N+fv55v8vNYcNDQTt9+jQ6d+7s81h6enqYaqPvk08+QVRUFKZNm9bkB6u6uhrff/+9974UAHzzzTeYPHkyiouL0aVLF7z00ksYOXJks2Vv2bIFI0aMENXjs88+Q+/evQ2pIwBMmTIF+/btw/bt2znT7SKhec5C8wR3rbUfhtrsdrvP47Nnz9Zd/7V27VqcPHkSkydPDuicbHgoKEeOHIHD4cBll13m8/j5ZrhFgj179qBnz57N/jX32WefwePx+Axh5eXlISUlBd988w02bNiA2267DQcOHEBSUlKT1/fu3RtLliwR1SM1NdWwOn744Yc4efIkNE1DfX297l+qROeqqKjwSZkj+Q4tXrwYOTk5SEtLC+hcbHgoKH/9618BAKNHjza03EC67YHas2cPhg0b1uxzn376KYAfZ4udPn0aa9euxZdffom2bdviZz/7Gfr3749169ZhypQpTV6fkpIS8F9/wdYRANatW4dx48bhxRdfZKNzMfGcBYLs8TROLrBarQHlavv666+xYcMGvPHGGwGfkv1xarFNmzbhySefRHp6OiZNmmRo2fHx8QDQbOaCYKZTV1ZW4vjx4+jbt2+zz5/7S/3AgQNISEhAly5dvDH9+/f3xrWGQOsIAMXFxXC73bjppptarV4UgcIwnbrRkiVL0Llz5xatJWOPh0TeffddfP755zh79iyqqqqwadMmfPDBB+jWrRvefPNNxMYGlyH3XIMHDwYA/M///A/uuOMOREdHY+zYsYiPjw9qOnVjNgB/v9QTEhLQs2dPAA09nnP/CrRarThx4kTA526tOrrdbhw9ehSbN29mTjYKCY/HgyVLliA3NxeXXBJ4M8KGh0RmzZoFAIiJiUFSUhL69++PBQsWYMqUKUhMTDT8fEOGDMGTTz6JRYsWYf369fB4PCgvL/f2hFqqcbaYv1/q/fr18w71JSQkNJnt43Q6kZCQEFQ9jKxjVVUV2rRpg+jo6Cb32ujCpqmz0FSQkwtaMCtuw4YNOHz4MO6+++4WnpP78dAFrHv37pg8eXKLewKnT59GUlISysvLvdOaR4wYgV/+8pfN3uMJhy+++AIDBw7E559/jq5duzZ5PtjPgCKPdz+e/RNhTYwOrqxT9bi0z6qQ7sfDezxEfiQkJGDcuHGYPXs2qqur8fbbb2PPnj0YN25cuKvmtXPnTlxxxRWw2+3YuHFjuKtDpIsND5GOl156CUePHkWHDh2Qn5+P1157rdmp1OFQV1eHd955B6NGjcLw4cObDAvSha1hHU/wR6jxHg+Rjk6dOuGdd94JdzWaFRMT4zelDl3gPG4DplO79WMMxoaHLmjn7nZ6MeJnQJGGDQ8RkVl5zgKeIBdbc6iNiIikNI/bgFxtoR9q4+QCIiIKqYjr8Xg8Hhw9ehSJiYmtmq+LiChUlFI4deoU0tLSjM0crgyYXKA4uQBHjx5tkp6biOhCUFFR4ZP3L1iaxxP0UJnm8RhUG7lWa3gWLlyIZ599FpWVlRgwYAD++Mc/YujQobqva0y/8tXhP8Bq9Z9av/bpAkPqCgAjXxwuits4o1gUl/rs97oxfeJuEZV1RH0miiu7v0o3RlKv1iB5r/ur14jKssY2v4fNudLRXzdm/f0bRGVJvx9Gvgdnzeeisow2IFZ/C+N6TXZDWvrdlbxXSb0AoBx7RXGS74fU8p/6r//pejeGvrmvVdJLmVGrNDyvvfYa8vPzsWjRImRmZmLBggUYPXo0ysrKmmwYdq7G4TWrNQ5Wa1u/sbUW47qsUZos7YRVfE79YULpOTXI9lSX1S08w5ey9yqrm6bJPo8oxOjGSK+n9FoZ+x7Cda30PzePcBhc+t2V/bzo1yuQc0q+H1KJ0bJzGn77wOM2YFbbBTK54LnnnsM999yDKVOmoE+fPli0aBHatm2Lv/zlL61xOiKii1LDrLbgj1AzvOGpq6tDaWkpsrOzfzxJmzbIzs7G1q1bm8TX1tbC6XT6HEREdOEyvOH59ttv4Xa7kZyc7PN4cnIyKisrm8QXFhbCZrN5D04sICIS8riNOUIs7Ot4CgoK4HA4vEdFRUW4q0REZApmHWozfHJBx44dERUVhaoq3xlWVVVVSElJaRJvsVi4RzwR0UXE8B5PTEwMBg8e7LMviMfjwcaNG5GVlWX06YiILl4mHWprlenU+fn5yM3NxdVXX42hQ4diwYIFcLlcEbNjIxHRhUDzqKAXgGqe0G9C3SoNz+23345vvvkGs2bNQmVlJQYOHIj169c3mXDgT+3TBbrrdG6ef6tuOT3iZcN407vUiOLin/pOFOd6TH+jsAcW+V/T1GgoZHHxTy3UjZHUq6Es2fuU2ntmlW5M/7ayBYIVwkWJg+Lb68Y8sOhOUVnS70dBRR9RnKN6vyjOSFfF3SWK21m9TDdmasc8UVnS7+4uDNSNkdQLANrF9RPFSb4fALChpkw3Zty6vn6fd6s6AJ+IzncxaLXMBTNmzMCMGTNaq3giIvK4gWAz3lwoQ21ERBQCyoCGJwxJQsM+nZqIiC4u7PEQEZmUpjzQVHC52jR1AWWnJiKiVmbSezwcaiMiopBij4eIyKw8HgO2ReBQGxERSbHhCT3J4tAvXbWisgbL1lWKF86lzd+sG1Noly1KvO+LxaI4CSMXwAZSnuRz2+WS7Y46If4GUdzib/UX1MrJrvvRmU0zsDfngUX65Unrb+TCUClp3aSLOe3albox0p+91a4SUZxkYSgAZMf20o2RfnepgakbHiKii5nm8UALssMSbMqdlmDDQ0RkVh6PAbPaQt/wcFYbERGFFHs8RERmZdIeDxseIiKzMmnDw6E2IiIKKfZ4iIjMSrmBYDdyY642IiKSMut0ag61ERFRSEVsj2fki8MRpUX7jZFsRyzNSLCqQpZ2oke8rLyumv+tcAF5RoKXrpgqiovkDAeXztdfTa6Ed0l3fivbNlq60l1CulL/o+dk23dLvru7XKHPSCAlzUhwsnqfKE7F6V976TbatqgUUZzDLcsysdqlH6f33VVopQzQJp1cELENDxER6TBpw8OhNiIiCin2eIiIzMqjgu+xBDsrrgXY4yEiMiuPMuYI0L/+9S/8/Oc/R4cOHRAXF4f+/ftjx44d4tezx0NERGLff/89hg0bhhEjRuDdd99Fp06dcODAAbRv315cBhseIiKzMmQjuMB6PL///e9ht9uxZMkS72Pp6ekBlcGhNiIis/J4jDkAOJ1On6O2tvlNNN98801cffXVmDhxIjp37oxBgwbh5ZdfDqjabHiIiAh2ux02m817FBYWNhv35ZdfoqioCJdffjnee+89TJ8+HQ888ABeeeUV8bk41EZEZFYeZcA6noahtoqKClitVu/DFoul+XCPB1dffTXmzp0LABg0aBD27duHRYsWITc3V3TKiG14Ns4ohtXiv0MmWV0vXb0uzUjwpav57ue5ts3cqBvzykpZRoLS72JFcZL3Kl2Bb4vrI4q7bv5AUdxce5xujJGZFwD5ezXS3jOrRHGPVuiv/P/XzKOisq4RZkuQ1s3IjA+rhXE9kKEbs6GmTFRWdmwv4VllcZLv0VVx/rNMuFGHTyDLuBEQ5QFUkPd4VEPDY7VafRqe80lNTUWfPr6/H6688kqsXi292hxqIyKiAAwbNgxlZb5/BHzxxRfo1q2buIyI7fEQEZEOZcBQmwpsVttDDz2En/zkJ5g7dy5uu+02fPTRR/jzn/+MP//5z+Iy2OMhIjKrMCwgHTJkCNasWYPly5ejX79+ePLJJ7FgwQJMmjRJXAZ7PEREFJCbb74ZN998c4tfz4aHiMisDJzVFkpseIiITEp5gt+5Ogw7X/MeDxERhRZ7PEREZsWhNmOlPvs9AP8LoyTbLqfN3yw6n2SrakC2MBQAju27TDem6IhTds78NaI4IxfUrnbpb1UNAIPiZRlp7/tCfxFeOLb4NpqRW0I/sEh2rSTbaANA6Xey8oxYMNlIup35bSmJujErZTtV43WXsT/zkveqv/14K/1y98CAhseIigTG8KG2OXPmQNM0n6N3795Gn4aIiEyqVXo8ffv2xYYNG348ySUR27EiIjIvk/Z4WqVFuOSSS5CSktIaRRMRUSOF4EfxQn+Lp3VmtR04cABpaWno0aMHJk2ahMOHD583tra2tsk+EEREdOEyvOHJzMzE0qVLsX79ehQVFaG8vBzXXXcdTp061Wx8YWGhzx4Qdrvd6CoREV2QlEcz5Ag1wxuenJwcTJw4ERkZGRg9ejTeeecdnDx5EitXrmw2vqCgAA6Hw3tUVFQYXSUioguTx6AjxFr9rn+7du1wxRVX4ODBg80+b7FYzrvhEBERXXhaPXPB6dOncejQIaSmprb2qYiILi5KAzxBHsFuJNcChjc8v/71r1FSUoKvvvoKH374IW655RZERUXhzjvvNPpUREQXNbPe49GUCnAXIB133HEHtmzZghMnTqBTp0649tpr8fTTT6Nnz56i1zudTthsNvSJm4AoLdpv7NC2nXXLG5wkW9UtXQ0vXV0vyUrQUdlEZU20yy6RZIvsXa7vRWXVa/WiOOl2ykYKR4YDIzMSGE26TfnRmbKl/w8s0v8jUZrZwhYlW1Zx0q2/zbcm/DtZeg2k13RC/A26MXrZEpRyw1mzHw6HQ7S9tJ7G35PfzI2FNTa4hsNZo9Dp0RrD6iZh+D2eFStWGF0kERE1p3G4LKgyjKlKIJhSgIjIrJQB92gulAWkRERE58MeDxGRSRkxOSAcG8Gx4SEiMitPGwPu8YR+rI1DbUREFFLs8RARmRVntRERUSgppUEFOavN2JWcMhxqIyKikIrYHs8R9Rk0RPmNGQr9zAVGZySQZAcAgG35a3RjXll5i6isVRWyv2h2QX81uRL2qx1n9ovi+redKIozMsOBkdf00YrtorIiOSOBo1p2ra55TnatpnfRz/axoUaWkcDhlmVL6ImBujGD4tuLylotigrgmgoyF3TV+vp93o167IfsOgXEpJMLIrbhISIi/5QHBkyn5qw2IiK6wLHHQ0RkVsqAWW1h2BaBDQ8RkUkZM6vtAtiPh4iIyB/2eIiIzMrTpuEIqgxjqhIINjxERCZlTJJQDrUREdEFLmJ7PGX3V8Fq8d8uxj+10LDzSRclTu2YJ4qLf+o7QVmyxaiShaEAMAjX6Ma8PfMNUVlAkijqmudkpUkWcxp9DUr1L4FoW2MAokWEALD4W9l3UrLtsnSx71Vxd4nipBt+/f7o17oxD6d1E5VV+l0vUZzkcxsUL7vuRi/2ldRN7xq0aaW8NGadXBCxDQ8REekw6T0eDrUREVFIscdDRGRSZp1cwIaHiMikzHqPh0NtREQUUuzxEBGZlUknF7DhISIyKbPe4+FQGxERic2ZMweapvkcvXv3DqgM9niIiEwqXJML+vbtiw0bNnj/fcklgTUlEdvwpD77PQD/H4jrMf3V9ZIMAoGQrkyXrK7f5fpeVJZ0BbskK8GxfZeJyir8xxBRnGSbZECWlUC6/XhBxWZRnN52xABwWH1qWFmALCMBIFtdLy1LuiX05YlnRXErBbtVFx1xisqSbAEPAFik//Mi/dkzmiQzxM7qZToRrbTLpzLgHk8LqnbJJZcgJUW2/XlzONRGRERwOp0+R21t7XljDxw4gLS0NPTo0QOTJk3C4cOHAzoXGx4iIpNqnFwQ7AEAdrsdNpvNexQWFjZ7zszMTCxduhTr169HUVERysvLcd111+HUqVPiekfsUBsREfmnVPALQBvzl1ZUVMBqtXoft1gszcbn5OR4/z8jIwOZmZno1q0bVq5cialTZcPlbHiIiAhWq9Wn4ZFq164drrjiChw8eFD8Gg61ERGZlRHDbEGu4zl9+jQOHTqE1NRU8WvY8BARmZRSbQw5AvHrX/8aJSUl+Oqrr/Dhhx/illtuQVRUFO68805xGRxqIyIisSNHjuDOO+/EiRMn0KlTJ1x77bXYtm0bOnXqJC6DDQ8RkVkZMFQW6OtXrFgR3PnAhoeIyLTMui2CqRseSVYCSXYDaVkAYIvrI4pb7SrRjbFrV4rKcpzZL4oD9N+rNCNBwbUfi+Le399fFNe/7UTdmNLvYkVlHZ0pWFoPIP4p6eemLzpuoChuQvwNorjXDUwJLM1IcOCUcT/ue8+sEsWlzZf9vBTa9TNgfHRG/zsEyOsmyUgASLISUKACnlywZcsWjB07FmlpadA0DWvXrvV5XimFWbNmITU1FXFxccjOzsaBAweMqi8REf3AyAWkoRRww+NyuTBgwAAsXNh83qRnnnkGL7zwAhYtWoTt27cjPj4eo0ePRk2NLKcXERHJhGNWmxEC7nvn5OT4rFz9d0opLFiwAI899hjGjRsHAHj11VeRnJyMtWvX4o477giutkREZHqGNnXl5eWorKxEdna29zGbzYbMzExs3bq12dfU1tY2SU5HRET6LpqhNn8qKxtu+iYnJ/s8npyc7H3uXIWFhT6J6ex2u5FVIiK6YDXOagv2CLWwZy4oKCiAw+HwHhUVFeGuEhERtSJDp1M3bgxUVVXlk7enqqoKAwcObPY1FovlvFlQiYjo/My6jsfQHk96ejpSUlKwceNG72NOpxPbt29HVlaWkaciIrroKWXAPR4zLCA9ffq0T/rr8vJy7N69G0lJSejatSsefPBBPPXUU7j88suRnp6O3/3ud0hLS8P48eONrDcREZlUwA3Pjh07MGLECO+/8/PzAQC5ublYunQpfvvb38LlcuHee+/FyZMnce2112L9+vWIjZWtSjeaNCOBNMPBdfMHiuIGxbfXjZHuIS9Z9Q8A1zynHzO9i2w9lTQjwag+e0VxBRWndWOGorOoLCOv6XXzx4jKkq5eHxSfJ4rrqvXVjZmULPtOzqv8pyhOSgmyKkgzeDiqZdkjSr8boRuzLX+NqKzr5l88GQmMWIejGneCC6GAG57hw4f7raimaXjiiSfwxBNPBFUxIiLyz4jp0KafTk1ERKTH1ElCiYguZmad1caGh4jIpMza8HCojYiIQoo9HiIik1Ke4CcHKOO2hhJjw0NEZFIcaiMiIhLQVDhWD/nhdDphs9nQJ24CorRov7GSLW6ndpQt6JNsVQ0Ac+2Zorj7vlgsijPSS1dM1Y2R1ku6aPWw+lQUdxV+ohvz9sw3RGW9svIWUZx0K20J6fejBzJEcSeijuvGWD36i5AB+TWQLuZsF9dPN+Zk9T5RWUaS1AuQ/4xKvx+Shd56C2qVcsNZsx8OhwNWq1V0Xn8af0/uvnkoEqODG7g6VX8WA9/+yLC6SXCojYjIpDxKgyfIobJgX98SHGojIqKQYo+HiMisjNhBNAwpc9jwEBGZFGe1ERERCbDHQ0RkUmbt8bDhISIyKbM2PBxqIyKikGKPh4jIpDyqDTxB7kAa7OtbImIbnv3VawD47wJKVtfvcn0vOp9ku19AvvLfyCwCUpLyJPUC5Ku6pdtVvzBtuW7MsX2XicoqOuIUxUm2SpZufS39ftyWkiiKW1mpHyPZPh2QX4PVwgGOSM1KIK1X0ZErRXHSrbRfn6+/zbd+VojWSRCjlAE7kHKojYiILnQR2+MhIiL/zDq5gA0PEZFJmbXh4VAbERGFFHs8REQmZdbs1Gx4iIhMikNtREREAuzxEBGZlFl7PGx4iIhMyqz3eDSlVOssqW2hxr3ErbF9oGlRfmM1wUjhhPgbROeV7KtuNGkWAWmGg6kd83RjXndtFpV1dKZgaT2A+Ke+E8VJ3qs0I0FHZRPFTbTrf7UfrdguKssWlSKKO+k+KoqTfHelK/WvirtLFFev1YvihrbVz4Qg/XmRZCQAwpMtQfLzAgCDk2p0Y/S+u25Vj/3Vq+FwOGC1WkXn9afx92Tx9dlIuCS4/sPps2cxfMsGw+omwXs8REQmpdSPw20tP1p+/nnz5kHTNDz44IMBvY5DbUREJhXOezwff/wx/vSnPyEjIyPg17LHQ0REATl9+jQmTZqEl19+Ge3by5LZ/js2PEREJqV+mFwQzNHY43E6nT5HbW3tec+bl5eHn/70p8jOzm5RvdnwEBGZVPD3d35seOx2O2w2m/coLCxs9pwrVqzAzp07z/u8BO/xEBERKioqfGa1WSyWZmN+9atf4YMPPkBsrGzPruaw4SEiMikjJxdYrVbd6dSlpaU4fvw4rrrqKu9jbrcbW7ZswYsvvoja2lpERflfBgOw4SEiMq1QLyAdOXIk9u7d6/PYlClT0Lt3bzz88MOiRgeI4IYnHf0RhRi/MZKtgaUL3aSLyYxcaGrkNtoAUCpYy9lV6ysqK/4pva18G7geSxLFPbBIv1su3Yr4lZW3iOJWVej/QEkXhjrcsgW1PTFQFCf57u6CbJrqzuplojhbnP4WzoBsK+0LYWGo/GdZvzy9766z1oPUZ4Wni2CJiYno18/32sfHx6NDhw5NHvcn4MkFW7ZswdixY5GWlgZN07B27Vqf5ydPngxN03yOMWNk+9oTEZGckZMLQingHo/L5cKAAQNw991349Zbb202ZsyYMViyZIn3383dpCIiouBEQq624uLigF8TcMOTk5ODnJwcvzEWiwUpKbIhDCIiuri0yjqe4uJidO7cGb169cL06dNx4sSJ88bW1tY2WbhERET6FDRDjlAzvOEZM2YMXn31VWzcuBG///3vUVJSgpycHLjd7mbjCwsLfRYt2e12o6tERHRBumju8ei54447vP/fv39/ZGRkoGfPniguLsbIkSObxBcUFCA/P9/7b6fTycaHiOgC1urTqXv06IGOHTvi4MGDzTY8FouFkw+IiFogEiYXtESrNzxHjhzBiRMnkJqa2tqnIiK6qFw0W1+fPn0aBw8e9P67vLwcu3fvRlJSEpKSkvD4449jwoQJSElJwaFDh/Db3/4Wl112GUaPHm1oxYmIyJwCbnh27NiBESNGeP/deH8mNzcXRUVF2LNnD1555RWcPHkSaWlpGDVqFJ588smAh9PW378BVov/uQ8PLLoz0OqbknR7Zsk234fVp8FWx8d182WLgwfFG1fWlzBuu+oe7u6isibau4nicm+TZV+QfHf/b+Z6UVnxT4nCxFkrJObaM0Vx930R+swF4aD33XWrOgCvGX5eDwwYagvDrLaAG57hw4dD+dkr9b333guqQkREdGGL2FxtRETk30Vzj4eIiCKDB1rQQ2XhGGrjDqRERBRS7PEQEZmVEZkHONRGRERSZl1AyqE2IiIKKfZ4iIhMirPaiIgopDw/HMGWEWoR2/CMfHE4orRovzHTu9QISjJ6/3XjGL5vvSBzgXT1enTcQFHczuplorgvof9elfBHoF1UmijO4a7UjZFmJFhVIfursOi5polwmyP57sY/9Z2oLNdjSaK4tPmyrBVD0Vk35r4vFovKeumKqaI4aXkS0p/lqR1lvxtWu0p0Y/S+uwrNbwtzsYrYhoeIiPzjUBsREYWURwU/K81z/gxorYaz2oiIKKTY4yEiMikFDSrIlDfBvr4l2PAQEZkUF5ASEREJsMdDRGRSDZMLgi8j1NjwEBGZlFnv8WjK33aiYeB0OmGz2dAwCuj/A7HF9dEt7+hM/UWEAHCNcOHf3jOrRHGSxaHihaEGki5alWyjHYhdru91Y25LSRSVVVj5f6K4nhioGyPdXlr6/Vgz6mtRXGq/g7oxRm/tPjhJsuDa2MWcUpKFptJ6SX4vALLvBwDUa/W6Mfq/FxQADxwOB6xWq+i8/jT+nvxL3zvRNiomqLLOuOtw96fLDaubBHs8REQmZdbJBWx4iIhMSqmGI9gyQo2z2oiIKKTY4yEiMikFDR4TTi5gw0NEZFJmTRLKoTYiIgop9niIiEyKs9qIiCik1A9HsGWEGofaiIgopCK2x2ON7Q1Ni/Ib46jer1vOA4tk29vKttEGHq0weLtqAxmZLeF14TbU0q20nVH6mQtWypJMQBP+vTQovr1ujDQ7gPT7IclIAAA3z79VN2YnNovKkl6Dxd/Ksm4YmUVASlKedBvtRyu2i+Ik3w9AtpV2/7YT/T7vVvXYX71adL5AcKiNiIhCyvPDEWwZocahNiIiCin2eIiITIrreIiIKKQa7/EEewSiqKgIGRkZsFqtsFqtyMrKwrvvvhtQGWx4iIhIrEuXLpg3bx5KS0uxY8cO3HjjjRg3bhw+/fRTcRkcaiMiMqlwrOMZO3asz7+ffvppFBUVYdu2bejbVzbDkg0PEZFJGTmd2ul0+jxusVhgsVj8vtbtdmPVqlVwuVzIysoSn5NDbUREBLvdDpvN5j0KCwvPG7t3714kJCTAYrFg2rRpWLNmDfr0ke38CrDHQ0RkWkau46moqPDZ+tpfb6dXr17YvXs3HA4HXn/9deTm5qKkpETc+GhKhWP/ufNr3Eu8oTMWuml+V8XdJYr7v5nrRXGSFfGSFdGAfA95Cemqf6lHUoaJ4v5e9Z1uzNC2nUVlST83yTWVXs/4p/TrDwBTO8oyZbzu0s9KUDo6QVTW+/v7i+Kkio449YOE9p6RZUuQfG67XPrZLwDjr6kxFAAPHA6Hzy/3lmr8Pfn7HncjLiomqLKq3XV4+Mu/BFW37Oxs9OzZE3/6059E8QH9FiosLMSQIUOQmJiIzp07Y/z48SgrK/OJqampQV5eHjp06ICEhARMmDABVVVVgZyGiIhMxOPxoLa2VhwfUMNTUlKCvLw8bNu2DR988AHq6+sxatQouFwub8xDDz2Et956C6tWrUJJSQmOHj2KW2/Vz0tFRESBaehHBXcEOuRVUFCALVu24KuvvsLevXtRUFCA4uJiTJo0SVxGQPd41q/37cIuXboUnTt3RmlpKa6//no4HA4sXrwYy5Ytw4033ggAWLJkCa688kps27YN11xzTSCnIyIiPxQMyFwQ4C2N48eP45e//CWOHTsGm82GjIwMvPfee7jpppvEZQQ1ucDhcAAAkpKSAAClpaWor69Hdna2N6Z3797o2rUrtm7d2mzDU1tb69NFO3dKHxERRY7Fi4PPTN7iO80ejwcPPvgghg0bhn79GtLxV1ZWIiYmBu3atfOJTU5ORmVl8znvCwsLfabw2e32llaJiOii4lHGHKHW4oYnLy8P+/btw4oVK4KqQEFBARwOh/eoqKgIqjwioouFMugItRYNtc2YMQNvv/02tmzZgi5dungfT0lJQV1dHU6ePOnT66mqqkJKSkqzZUlWxxIR0YUjoB6PUgozZszAmjVrsGnTJqSnp/s8P3jwYERHR2Pjxo3ex8rKynD48OGA0ikQEZG+cGSnNkJAPZ68vDwsW7YM69atQ2Jiove+jc1mQ1xcHGw2G6ZOnYr8/HwkJSXBarXi/vvvR1ZWVthmtEkXhu6sXiaKu+Y5/1vcNpJslfy6S7YwVLLFNyB7r9Ltfi9PPCuKm1f5T1GcEqyvHgrZAlIjr2n8U6Ki4HosSRT3wCJZeZLtqt/fL1vMN6rPXlFc4T+GiOK25a/RjZEuvtTbErrRaleJbozkOwTI6ya9pqFdaBoYs+5AGlDDU1RUBAAYPny4z+NLlizB5MmTAQDPP/882rRpgwkTJqC2thajR4/GSy+9ZEhliYjI/AJqeCTZdWJjY7Fw4UIsXChLa0JERC1j1h1ImSSUiMikzDrUxm0RiIgopNjjISIyKaUajmDLCDU2PEREJuWBBk+Q28cE+/qW4FAbERGFFHs8REQmZUSutXDkamPDQ0RkVgbc4wlHsjZTNzySFezSjARS0q18S7/T38r36MzmM3afS5otQfIFkmYkOHDK2K+GJPvCauHIr127UhQn2TJckkEAANLmfyqKK7TrZ6wAgMXfSr5HU2XnFGYkKLj2Y1GchHQ79mgVLYqbEH+Dbox0y3MpIzMcRHJ2g0hk6oaHiOhiZtbJBWx4iIhMyqzTqTmrjYiIQoo9HiIikzJryhw2PEREJmXW6dQcaiMiopBij4eIyKQUgl+GE4YODxseIiKzahhqC3I6NYfaiIjoQhexPZ4BsRMRpcX4jTE6K4HE1I76GQkA4SrrRbKypneRrYb//dGvdWNWypIliCnhnJh2cf10Y05W7xOVNaGj/ip3ABiKzqI4I8u67wvZ6vqXrtDPSlB0xCkqa1v+GlGc1M3zb9WN0bBNVNag+PaiOMnPi6E/ewGQZCXQy27grPUg9dkTRlXJy6zreCK24SEiIv/MOp2aQ21ERBRS7PEQEZkUh9qIiCikONRGREQkwB4PEZFJKQNS5nCojYiIxMyauYBDbUREFFIR2+Op187Co/lPBSFZUCZdTCZZ4BgIybbcq10lorI21KSI4h5O66YbI12UKN3iW7oFsnRxqISR13SuPVNU1n1fLBbFSUnK699WtuW5dNtl6bWSLA4dhGtEZQ1Oki1+fmGa/vbSDywSFSVanAvIr6nk90za/M1+n1fKDcD4BaRmzU4dsQ0PERH5Z9bp1BxqIyKikGKPh4jIpMy6jocNDxGRSZn1Hg+H2oiIKKTY4yEiMimzruNhw0NEZFIcaiMiogteYWEhhgwZgsTERHTu3Bnjx49HWVlZQGWw4SEiMqnGdTzBHoEoKSlBXl4etm3bhg8++AD19fUYNWoUXC6XuIyIHWo7oj6Dhii/MZLtiKUZCaQr61eLomRbQreLShOV5XDL9qsu/a6Xbox0m+S0+bJV7o7q/aI4Ixl5Te/7QnbdjV4NLyHNHiHNcBCtokVxku2qpRkJVlX4zz7SqOi5kbox0i3gpddAek1LBYkhump9/T7vRj32w/iflXBMp16/fr3Pv5cuXYrOnTujtLQU119/vaiMgHo8ki7W8OHDoWmazzFt2rRATkNERCHmdDp9jtraWtHrHA4HACApST/tUaOAGh5pF+uee+7BsWPHvMczzzwTyGmIiEjAgx8nGLT4+KEsu90Om83mPQoLC/XP7/HgwQcfxLBhw9CvnzzfZUBDbdIuVtu2bZGSIktsSURELWPkdOqKigpYrVbv4xaLRfe1eXl52LdvH/7xj38EdM6gJhecr4v197//HR07dkS/fv1QUFCAM2fOnLeM2traJl08IiIKLavV6nPoNTwzZszA22+/jc2bN6NLly4BnavFkwvO18W666670K1bN6SlpWHPnj14+OGHUVZWhjfeeKPZcgoLC/H444+3tBpERBctpYKfXBDorDalFO6//36sWbMGxcXFSE9PD/icLW54ztfFuvfee73/379/f6SmpmLkyJE4dOgQevbs2aScgoIC5Ofne//tdDpht9tbWi0ioouGUgYMtQVYQF5eHpYtW4Z169YhMTERlZUNs25tNhvi4uJEZbSo4WnsYm3ZskW3i5WZ2bDR1sGDB5tteCwWi2gskYiIwq+oqAhAwwzmf7dkyRJMnjxZVEZADU9Luli7d+8GAKSmpgZyKiIi0hGOdTzKgJ3jAmp49LpYhw4dwrJly/Af//Ef6NChA/bs2YOHHnoI119/PTIyMoKuLBER/ahhOnRwDUE4crVpKoDmS9OaX4Xc2MWqqKjAz3/+c+zbtw8ulwt2ux233HILHnvsMZ9pev44nU7YbDY0TLjzv+r5qri7dMur1+pF5z2sPhXF9cRAUdxtKYm6MYWV/2foOXdWL9ONkewfD8hXppd+FyuKW/ztQt0Yo7NMhIORGQ6k12q1q0QUNyH+BlGc5Fq5HpMtFrxGkJEAANaM+lo3JrXfQUPPKf2ZPzpTP3NI/FN66Q0UAA8cDof4d6E/jb8nx1v/G9FaTFBl1as6rHX+ybC6SQQ81OaP3W5HSYnsh4CIiILDbRGIiCikPAZMp+a2CEREdMFjj4eIyKTUD/8FW0aoseEhIjIpDrUREREJsMdDRGRS4VhAagQ2PEREJqWUAfd4DMhEECgOtRERUUgFlLkgFBpX5A6IvR1ROityjVypL7Whpkw/CEAHd2fdmC+xR1SWdMW5hGRVOgD0bztRFLctf6Mo7tL5aboxkZyRwGiSDAf/W1EtKusQdoviHNX7RXFG/sxIM2Dk3rZGN+bm+beKyuoRb2zSYSMyOThrPUh99oThmQtuir/HkMwFH7hejtzMBUREFDk41EZERCTAHg8RkUk1pB4NvoxQY8NDRGRSHqUM2BaBQ21ERHSBY4+HiMikmKuNiIhCyqyZCzjURkREIRWxC0itsX2gaVF+YzUD201bVIooLju2lyjudddm3Rjpgr5I3hJasv04APyXPU43puiIU1TW3jOrRHFGLoSULry1xfURxUm+u/+aeVRUlv62y8YzcotvQLZgeWhb/UXZAPClq1YUN9Fu3K8+ve+uW9Vjf/VqwxeQXhs3BZcEuYD0rKrDP6qXcAEpERHp46w2IiIiAfZ4iIhMirPaiIgopDwwYKgtDA0Ph9qIiCik2OMhIjIps/Z42PAQEZmUWe/xcKiNiIhCij0eIiKTUgYMtXFW279JR39Ewf+K3EHx7XXLkW5V7XBXiuIAWeaCrlpf3ZiKOFmHM5IzEki2HweA0u/0swhsy9ff/hgAHlgky0ggzTYgIc2CsMv1vShO8t2Nf0pWf71tl38sz7gMB9KMBNIMBwUVW3VjhkKWuUCakWBVhSaKk2ylrffdbdj6WnS6gHg0DzQtuGxrnjBka+NQGxERhVTE9niIiMg/DxQ0zmojIqJQUT9MqA62jFDjUBsREYUUezxERCblAQwYags9NjxERCbFWW1EREQC7PEQEZmUBx5oQfZYwtHjYcNDRGRSF0XDU1RUhKKiInz11VcAgL59+2LWrFnIyckBANTU1GDmzJlYsWIFamtrMXr0aLz00ktITk42vOKALCtBdqws08BqlyxzgXQ1vGTl/4T4G0RlQRgnqZvRGQmkJHV7fX4fUVmF9hrhWWXZBiRWu0pEcXbtSlGckVkVpBkJjMxwIM3kUCpMlnB0pv7PnzSTw+AkWbYESUYCAPjSVSuKI7mA7vF06dIF8+bNQ2lpKXbs2IEbb7wR48aNw6effgoAeOihh/DWW29h1apVKCkpwdGjR3Hrrbe2SsWJiC52yrsxQnBHILZs2YKxY8ciLS0NmqZh7dq1Adc7oB7P2LFjff799NNPo6ioCNu2bUOXLl2wePFiLFu2DDfeeCMAYMmSJbjyyiuxbds2XHPNNQFXjoiIzi8cs9pcLhcGDBiAu+++u8Udixbf43G73Vi1ahVcLheysrJQWlqK+vp6ZGdne2N69+6Nrl27YuvWredteGpra1Fb+2NX1ul0trRKRETUynJycry3V1oq4IZn7969yMrKQk1NDRISErBmzRr06dMHu3fvRkxMDNq1a+cTn5ycjMrK84/fFhYW4vHHHw+44kREFzsFT9CTAxqH2s79o99iscBikd0HC1TA63h69eqF3bt3Y/v27Zg+fTpyc3Oxf//+FlegoKAADofDe1RUVLS4LCKii4mC25ADAOx2O2w2m/coLCxstXoH3OOJiYnBZZddBgAYPHgwPv74Y/zhD3/A7bffjrq6Opw8edKn11NVVYWUlJTzltearSoREclUVFTAarV6/92av5eDzlzg8XhQW1uLwYMHIzo6Ghs3bvQ+V1ZWhsOHDyMrKyvY0xAR0Tk8Bv0HAFar1edozYYnoB5PQUEBcnJy0LVrV5w6dQrLli1DcXEx3nvvPdhsNkydOhX5+flISkqC1WrF/fffj6ysLM5oIyJqBQ176QQ7qy3C9+M5fvw4fvnLX+LYsWOw2WzIyMjAe++9h5tuugkA8Pzzz6NNmzaYMGGCzwLSllj+08+RGB3lN2bcOv3tpaVbEUvnshu5APMQZAsmJdtoA7K6Gb0wVMoWp/9eHdWye4VFR2Sfh2Qr7evmjxGVJf1+7D2zShTXv+1Ew8qSMnKhadr8zaKypN9dSd2kC2CveU42M1a61bqE5Ynn/T/vPAM8e69h5wun06dP4+DBg95/l5eXY/fu3UhKSkLXrl1FZQTU8Cxe7H+f9djYWCxcuBALFxq3KpuIiJrXMDlAC7qMQOzYsQMjRozw/js/Px8AkJubi6VLl4rKYK42IiKTarg/E9oFpMOHD4dSwQ3PcVsEIiIKKfZ4iIhMqiW51porI9TY8BARmZQHbiDIezyeAO/xGIFDbUREFFLs8RARmRSH2oiIKKQ8yoChNhX6obaIa3gap+mdrtf/MNyqzrjzCsc53ZCeU3+6oRJecDfqRXFtRFMcQ79KGZC+V1nd3Er2eThr9f+Sk36H5GsdjHwP4blWks/N6O+u5L1K6gUY+/2QsjjP+D+XsxoAgp6GfKHQVIR9EkeOHIHdbg93NYiIDFdRUYEuXboEXY7T6YTNZkOHtoPRRguu/+BRZ3HiTCkcDodPktDWFHE9nrS0NFRUVCAxMRGa1tCFdDqdsNvtTbKnmonZ34PZ6w+Y/z2w/uHX0veglMKpU6eQlpZmaH0a7vEEN1TGezwA2rRpc96/CBqzppqZ2d+D2esPmP89sP7h15L3YLPZWqk25hNxDQ8REcko5YEn2Fxtij0eIiISahgmCzZJaOgbHlMsILVYLJg9e7apdyo1+3swe/0B878H1j/8LoT3EAkiblYbERH51zirzRbbB5rmf98yPUq54ajZf3HPaiMiIpmGOzwcaiMiIvKLPR4iIpNqmJHGWW1ERBQiwS4eNaqMQJliqG3hwoXo3r07YmNjkZmZiY8++ijcVRKZM2cONE3zOXr37h3uavm1ZcsWjB07FmlpadA0DWvXrvV5XimFWbNmITU1FXFxccjOzsaBAwfCU9lm6NV/8uTJTa7JmDFjwlPZZhQWFmLIkCFITExE586dMX78eJSVlfnE1NTUIC8vDx06dEBCQgImTJiAqqqqMNW4Kcl7GD58eJPrMG3atDDV2FdRUREyMjK8i0SzsrLw7rvvep+P9M/fDCK+4XnttdeQn5+P2bNnY+fOnRgwYABGjx6N48ePh7tqIn379sWxY8e8xz/+8Y9wV8kvl8uFAQMGYOHChc0+/8wzz+CFF17AokWLsH37dsTHx2P06NGoqakJcU2bp1d/ABgzZozPNVm+fHkIa+hfSUkJ8vLysG3bNnzwwQeor6/HqFGj4HK5vDEPPfQQ3nrrLaxatQolJSU4evQobr311jDW2pfkPQDAPffc43MdnnnmmTDV2FeXLl0wb948lJaWYseOHbjxxhsxbtw4fPrppwAi6/NXSkEpT5BHGCY2qwg3dOhQlZeX5/232+1WaWlpqrCwMIy1kpk9e7YaMGBAuKvRYgDUmjVrvP/2eDwqJSVFPfvss97HTp48qSwWi1q+fHkYaujfufVXSqnc3Fw1bty4sNSnJY4fP64AqJKSEqVUw+cdHR2tVq1a5Y357LPPFAC1devWcFXTr3Pfg1JK3XDDDepXv/pV+CoVoPbt26v//d//jZjP3+FwKAAqLqa7amvpEdQRF9NdAVAOhyNk9Y/oHk9dXR1KS0uRnZ3tfaxNmzbIzs7G1q1bw1gzuQMHDiAtLQ09evTApEmTcPjw4XBXqcXKy8tRWVnpcz1sNhsyMzNNcz0AoLi4GJ07d0avXr0wffp0nDhxItxVOi+HwwEASEpKAgCUlpaivr7e5xr07t0bXbt2jdhrcO57aPT3v/8dHTt2RL9+/VBQUIAzZ/xvLRAObrcbK1asgMvlQlZWlik//0gU0ZMLvv32W7jdbiQnJ/s8npycjM8//zxMtZLLzMzE0qVL0atXLxw7dgyPP/44rrvuOuzbtw+JiYnhrl7AKisrAaDZ69H4XKQbM2YMbr31VqSnp+PQoUN49NFHkZOTg61btyIqKriFeEbzeDx48MEHMWzYMPTr1w9AwzWIiYlBu3btfGIj9Ro09x4A4K677kK3bt2QlpaGPXv24OGHH0ZZWRneeOONMNb2R3v37kVWVhZqamqQkJCANWvWoE+fPti9e3dEff4N+yIFN1TGWW0XmJycHO//Z2RkIDMzE926dcPKlSsxderUMNbs4nXHHXd4/79///7IyMhAz549UVxcjJEjR4axZk3l5eVh3759EX9f0J/zvYd7773X+//9+/dHamoqRo4ciUOHDqFnz56hrmYTvXr1wu7du+FwOPD6668jNzcXJSUl4a5WE0Y0GuFoeCJ6qK1jx46IiopqMmOkqqoKKSkpYapVy7Vr1w5XXHEFDh48GO6qtEjjZ36hXA8A6NGjBzp27Bhx12TGjBl4++23sXnzZp9tQlJSUlBXV4eTJ0/6xEfiNTjfe2hOZmYmAETMdYiJicFll12GwYMHo7CwEAMGDMAf/vAHU33+kSyiG56YmBgMHjwYGzdu9D7m8XiwceNGZGVlhbFmLXP69GkcOnQIqamp4a5Ki6SnpyMlJcXnejidTmzfvt2U1wNo2PH2xIkTEXNNlFKYMWMG1qxZg02bNiE9Pd3n+cGDByM6OtrnGpSVleHw4cMRcw303kNzdu/eDQARcx3O5fF4UFtbG3Gff8NGcMEfoa94hFuxYoWyWCxq6dKlav/+/eree+9V7dq1U5WVleGumq6ZM2eq4uJiVV5erv75z3+q7Oxs1bFjR3X8+PFwV+28Tp06pXbt2qV27dqlAKjnnntO7dq1S3399ddKKaXmzZun2rVrp9atW6f27Nmjxo0bp9LT01V1dXWYa97AX/1PnTqlfv3rX6utW7eq8vJytWHDBnXVVVepyy+/XNXU1IS76koppaZPn65sNpsqLi5Wx44d8x5nzpzxxkybNk117dpVbdq0Se3YsUNlZWWprKysMNbal957OHjwoHriiSfUjh07VHl5uVq3bp3q0aOHuv7668Nc8waPPPKIKikpUeXl5WrPnj3qkUceUZqmqffff18pFRmff+OstuioZBVzSWpQR3RUcshntUV8w6OUUn/84x9V165dVUxMjBo6dKjatm1buKskcvvtt6vU1FQVExOjLr30UnX77bergwcPhrtafm3evFmh4W6lz5Gbm6uUaphS/bvf/U4lJycri8WiRo4cqcrKysJb6X/jr/5nzpxRo0aNUp06dVLR0dGqW7du6p577omoP2KaqzsAtWTJEm9MdXW1uu+++1T79u1V27Zt1S233KKOHTsWvkqfQ+89HD58WF1//fUqKSlJWSwWddlll6nf/OY3If3F58/dd9+tunXrpmJiYlSnTp3UyJEjvY2OUpHx+Zu94eG2CEREJtO4LcIlUZ2gacHdMVHKg7Pub7gtAhER6TPrdOqInlxAREQXHvZ4iIhMSwFBz0oL/d0WNjxERCZlzH48oW94ONRGREQhxR4PEZFJNSz+DLLHw6E2IiKSC77hCcc9Hg61ERFRSLHHQ0RkVgZMLkAYJhew4SEiMimz3uPhUBsREYUUGx4iItPyGHQEbuHChejevTtiY2ORmZmJjz76SPxaNjxERKalGu7RBHO0YKjttddeQ35+PmbPno2dO3diwIABGD16NI4fPy56PbNTExGZTGN2auASaIbc4zkbUHbqzMxMDBkyBC+++CKAho3y7HY77r//fjzyyCO6r2ePh4jItFTQ/wXa46mrq0NpaSmys7O9j7Vp0wbZ2dnYunWrqAzOaiMiMjVjBq2cTqfPvy0WCywWS5O4b7/9Fm63G8nJyT6PJycn4/PPPxediz0eIiKTiYmJQUpKCgC3IUdCQgLsdjtsNpv3KCwsbLX6s8dDRGQysbGxKC8vR11dnSHlKaWgab73iprr7QBAx44dERUVhaqqKp/Hq6qqfmgM9bHhISIyodjYWMTGxob8vDExMRg8eDA2btyI8ePHA2iYXLBx40bMmDFDVAYbHiIiCkh+fj5yc3Nx9dVXY+jQoViwYAFcLhemTJkiej0bHiIiCsjtt9+Ob775BrNmzUJlZSUGDhyI9evXN5lwcD5cx0NERCHFWW1ERBRSbHiIiCik2PAQEVFIseEhIqKQYsNDREQhxYaHiIhCig0PERGFFBseIiIKKTY8REQUUmx4iIgopNjwEBFRSLHhISKikPp/EgSP89Np9xYAAAAASUVORK5CYII=", + "image/png": "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", "text/plain": [ "
" ] @@ -565,13 +565,13 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 21, "id": "59a6a485-a714-4e14-b27a-1df2930068ee", "metadata": {}, "outputs": [], "source": [ "# restart\n", - "dbf_1 = DoubleBracketFlow(hamiltonian=deepcopy(h), mode=flowtype)\n", + "dbf_1 = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=iterationtype)\n", "off_diagonal_norm_history = [dbf_1.off_diagonal_norm]\n", "histories, labels = [], [\"Fixed step\"]\n", "\n", @@ -588,7 +588,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 22, "id": "7e0b2f18-ca53-4f34-9fcf-0052dcc31dc5", "metadata": {}, "outputs": [ @@ -617,7 +617,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 23, "id": "a6fd1e33-3620-4f3b-b705-a120f6da0027", "metadata": {}, "outputs": [ @@ -625,32 +625,32 @@ "name": "stdout", "output_type": "stream", "text": [ - "100%|███████████████████████████████████████████████████████████████████████████| 500/500 [00:02<00:00, 193.41trial/s, best loss: 828.5188174589957]\n", - "New optimized step at iteration 1/20: 0.00988216174433494\n", - "New optimized step at iteration 2/20: 0.007178128589748405\n", - "New optimized step at iteration 3/20: 0.006586283123947156\n", - "New optimized step at iteration 4/20: 0.008496240698896648\n", - "New optimized step at iteration 5/20: 0.010639601305560622\n", - "New optimized step at iteration 6/20: 0.009688893201482675\n", - "New optimized step at iteration 7/20: 0.006959809497968054\n", - "New optimized step at iteration 8/20: 0.007079825908277573\n", - "New optimized step at iteration 9/20: 0.0025106878857708115\n", - "New optimized step at iteration 10/20: 0.007351003028447434\n", - "New optimized step at iteration 11/20: 0.005865305934025375\n", - "New optimized step at iteration 12/20: 0.007990929593067532\n", - "New optimized step at iteration 13/20: 0.011404539807978897\n", - "New optimized step at iteration 14/20: 0.0008194053292830093\n", - "New optimized step at iteration 15/20: 0.000292389939095989\n", - "New optimized step at iteration 16/20: 0.0067294371737333086\n", - "New optimized step at iteration 17/20: 0.0038227993688979764\n", - "New optimized step at iteration 18/20: 0.0019157593296632823\n", - "New optimized step at iteration 19/20: 0.003853751908247154\n" + "100%|███████████████████████████████████████████████████████████████████████████| 500/500 [00:03<00:00, 139.57trial/s, best loss: 828.4416826609863]\n", + "New optimized step at iteration 1/20: 0.007905620677085556\n", + "New optimized step at iteration 2/20: 0.007805271769771582\n", + "New optimized step at iteration 3/20: 0.010246844819985524\n", + "New optimized step at iteration 4/20: 0.005907716931047463\n", + "New optimized step at iteration 5/20: 0.009034340720421006\n", + "New optimized step at iteration 6/20: 0.005354106626311928\n", + "New optimized step at iteration 7/20: 0.00641629177927186\n", + "New optimized step at iteration 8/20: 0.009953940710537906\n", + "New optimized step at iteration 9/20: 0.0058391008557497955\n", + "New optimized step at iteration 10/20: 0.008776919053600729\n", + "New optimized step at iteration 11/20: 0.004927886698230342\n", + "New optimized step at iteration 12/20: 0.0029794074593601505\n", + "New optimized step at iteration 13/20: 0.0009112070946712646\n", + "New optimized step at iteration 14/20: 0.018740586232013773\n", + "New optimized step at iteration 15/20: 0.00024087612658448834\n", + "New optimized step at iteration 16/20: 0.0018747278198779527\n", + "New optimized step at iteration 17/20: 0.0011877968058805026\n", + "New optimized step at iteration 18/20: 0.025601681401882653\n", + "New optimized step at iteration 19/20: 0.0021360282290642726\n" ] } ], "source": [ "# restart\n", - "dbf_2 = DoubleBracketFlow(hamiltonian=deepcopy(h), mode=flowtype)\n", + "dbf_2 = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=iterationtype)\n", "off_diagonal_norm_history = [dbf_2.off_diagonal_norm]\n", "\n", "# set the number of evolution steps\n", @@ -685,13 +685,13 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 24, "id": "0f0212bf-b642-4fea-9203-037876e0b266", "metadata": {}, "outputs": [ { "data": { - "image/png": "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nq+7u7uVIxFVkfG8K0vfg/wkAduIY7OnoswfSGTCUpg/kKMfvW/tkISwefZyb1FULuY67yQB24DkY0epduIbjP+nOgWqH/uK5GNHrRuYEEIIi5EEbANSYg+ju+0PKp0OUo/EWicgIYRVdO3albFjx1p0H5MmTaJly5YW3YcoGUnANsCnSVMMqukygwG8GzexTkBCCIsZNmwYiqIU+Dl58iS//vor7777rrVDLNKZM2dQFIX9+/dbO5RKQRKwDfBt0JBr9Z9G/ScJqypExzZD51u+Lu5CCNvUq1cvLl++bPITERGBv79/iWbREZWDJGAb0fDlNyCkAQCKArHnQtgwb42VoxKiaki5fINT246TcvlGhezPxcWF4OBgkx8HBweTJuijR4/i7u7O0qVLte2WL1+Oh4cHR44cASA5OZlnnnmGgIAAvL29uf/++zlw4IDJvt5//32CgoLw8vJi+PDhZGZm3jG2GzduMGTIEAICAnBzc6NevXosWrQIgIiICABatWqFoih07dpV2+7LL7+kUaNGuLq60rBhQxYsWKCtM145//DDD9x77724urrStGlTNm3aVOZjWBlIArYhTsG1tdeeLpnsXrqNGxeSrBiREJXfnh92MOOeSXz5n0+Ycc8kdv+w3dohAdCwYUM++OADRo4cyblz57hw4QLjxo3j/fffp3HjxgA88sgjJCYm8tdffxETE0Pr1q3p1q0bSUl53xs//fQTkyZN4r333mPPnj2EhITw6aef3nG/77zzDkeOHOGvv/4iLi6OBQsWUL16dQB27doFwNq1a7l8+TK//vorAEuWLGHChAlMmzaNuLg43nvvPSZMmMD3339vUvf48eN55ZVX2LdvH5GRkfTr14/r16+b9bjZExmIw4YoPkHaa0+3TFKS3Fk/ZxWDPnjcilEJYT8+6TOLm1dTS1w+R59LxvU07b1qUPl1/PesmbkSnUPJr0+8ArwZ/ef4EpdfuXIlnp6e2vvevXvz888/Fyg3cuRI/vzzT/7v//4PZ2dnWrduzejRowHYsmULu3btIjExERcXFwA++OADVqxYwbJlyxgxYgRz5sxh+PDhDB8+HICpU6eydu3aO14Fnzt3jlatWtG2bVsAwsPDtXUBAQEAVKtWjeDgYG35xIkT+fDDD3nooYeAvCvl2NhYFi1axHPPPaeVGz16NIMGDQJgwYIFrFq1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bIPyzwt8e0csoxrNa9GkV3MAbiamsvObLRUSmxCVkeFGAvpjO4r8fTOnUaNG4ezszJo1a+jSpQu1atWid+/erF27losXL/LWW29pZcPDw3n33Xd57LHH8PLyonHjxnz66acm6wEGDhyoTUgDBZughw0bxoABA3jvvfcICgrC19eXKVOmkJOTw/jx4/H396dmzZosWrRI2+b2Juhhw4ahKEqBn40bN2qx5L/6dHBw4JtvvuGhhx7C3d2devXq8fvvv5sci99//5169erh6urKfffdx9dff42iKCQnJxd67FRVZdKkSdSqVQsXFxdCQ0N56aWXgLzHVs+ePcvLL7+sxWa0ZcsWOnXqhJubG2FhYbz00kukp6cXOM6PP/44NWrUICwsjPnz59/x/9EcJAHbIJ3Pv2NQF3UFDND91b7aSbbp02iy0jItHpsQlU3WtmUkv92Vmx8/SfLbXcna+rPF9pWUlMTq1asZOXIkbm5uJuuCg4MZMmQIP/74o8n4B7NmzaJFixbExMRos71FR0cDec2+AIsWLeLy5cva+8KsX7+eS5cusXnzZmbPns3EiRN54IEH8PPzY+fOnTz//PM899xzXLhwodDtP/74Yy5fvqz9jBkzhsDAQBo2bFjkPmfMmMEjjzzCwYMH6dOnD0OGDNGu8OPj43n44YcZMGAABw4c4LnnnjP546Mwv/zyCx999BELFy7kxIkTrFixQptd6ddff6VmzZpMmTJFixHg1KlT9OrVi0GDBnHw4EF+/PFHtmzZwujRo03qNh7nTZs28frrrzNmzBjtOFuKTQ/EUVWZXAEX0hPaKKhBCC0GtGH/8j2kJ6Wz5cuNdBvbqyJCFMImpbz/EIbUqyUur+bkcCst331X1UD6krdI/99HKDqHoje8jc47AJ83fi223IkTJ1BVtchpThs1asSNGze4evUqgYF5nTE7dOjAG2+8gcFgYMSIEcTExPDRRx/RvXt3AgICAPD19b3j5DGQNyjR3Llz0el0NGjQgJkzZ5KRkcH/+3//D8ib4e39999ny5YtDB48uMD2Pj4++PjkPSb566+/snDhQtauXXvH/T7++OM89thj6HQ63nvvPebOncuuXbvo1asXCxcupEGDBsyaNQuABg0acPjwYaZNm1ZkfefOnSM4OJioqCicnJyoVasWd999t/b5HBwc8PLyMolp+vTpDBky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", + "image/png": "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/e9/ef3118t87KoTScBWRON964T29dFxKQn2L99D99GR+DXwt2BkQtiGm9fSSEtIrXQ96ddumiCakt17771GTbRubm4lll20aBFNmjRBo9GwY8cOwzOohw4dIj09vchIYFlZWZw5cwaAuLg4nn/+eaP1ERERbNq0qcT9vfDCCzz00EPs37+fPn36MGTIEO65554Sy2dkZHDmzBlGjhzJs88+a1iel5eHp6dnkX3r2dvb07FjR+Li4kqsu7qz6iborVu3MmjQIIKDg1EUhZUrV5ZY9vnnn0dRFObOnWu0PCkpiaioKDw9PfH29mbkyJGkp6cblTl8+DDdunXD2dmZkJAQZs2aZYZvUzrF+9YVcKsedQDQ5evYMOcvi8QjhK3x8PPEM9CrzC/XWu7F1uPu51Guejz8PIutpyRubm40atTI8LrTmMKHDh0iIyODjIwMrl69alienp5OUFAQBw8eNHqdOHGC114r+9X47fr378/58+d5+eWXuXz5Mr169eLVV18tsbz+9+lXX31lFMfhw4eJjo6ucBw1gVVfAWdkZNCmTRuefvppQ9NGcVasWMGuXbsIDg4usi4qKoorV64QHR2NVqvlqaeeYtSoUYaODWlpafTp04fIyEi++OILjhw5wtNPP423tzejRo0y23crTuEEXL+JG26+9mQkZXD4j/30HNObwGZFv58Q4pbyNAPrdDrS0tI4ufoYK//fT6j5KoqdwtAPhtFpWETpFVSBpKQkRowYwdtvv83ly5cZNWoU+/fvx83Njfbt25OQkIC9vb1RM3FhzZo1Y/fu3Tz55JOGZbt27Sp1v35+fgwfPpzhw4fTrVs3XnvtNT788EMcHR0BjKbqCwgIIDg4mLNnzxIVFWVYrj++he3atYvu3bsDBVfI+/btMzSp10RWnYD79+9P//7971jm0qVLvPjii6xdu5aBAwcarYuLi2PNmjXExMQY7mfMmzePAQMG8OGHHxIcHMzSpUvJzc1l0aJFODo60qJFCw4ePMicOXOqPAEXboJWMm/QY8xQVr+3ElVVif5oNU98/UyVxiNETdBx2N00vbcZN85dp1ZobbyCfCwdksHzzz9PSEgI77zzDllZWbRr147XXnuNzz//nMjISCIiIhgyZAizZs2iSZMmXL58mT///JOhQ4fSsWNHxo0bx4gRI+jYsSNdunRh6dKlxMbG0qBB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", "text/plain": [ "
" ] @@ -714,7 +714,7 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 25, "id": "82b89092-07e5-4788-9ae0-8907df2428eb", "metadata": {}, "outputs": [ @@ -735,7 +735,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 27, "id": "ac8ed320-04a8-42af-a980-48ab4f1fff7c", "metadata": {}, "outputs": [ @@ -751,7 +751,7 @@ } ], "source": [ - "visualize_matrix(.h.matrix)" + "visualize_matrix(dbf_2.h.matrix)" ] } ], From c3e4745be2a5968377d5668c25bc6260ef8f476e Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Thu, 23 Nov 2023 15:40:58 +0100 Subject: [PATCH 062/143] rm unused deps --- tests/test_models_dbi.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/test_models_dbi.py b/tests/test_models_dbi.py index 766f39cf12..9315ab273b 100644 --- a/tests/test_models_dbi.py +++ b/tests/test_models_dbi.py @@ -1,9 +1,7 @@ """Testing DoubleBracketIteration model""" -import hyperopt import numpy as np import pytest -from qibo.backends import GlobalBackend from qibo.hamiltonians import Hamiltonian from qibo.models.dbi.double_bracket import DoubleBracketIteration, IterationGeneratorType from qibo.quantum_info import random_hermitian From fcff6b9577e288503f2bac6ea62788809c8c2781 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Thu, 23 Nov 2023 15:58:30 +0100 Subject: [PATCH 063/143] add dbi to docs --- doc/source/api-reference/qibo.rst | 17 +++++++++++++++++ .../code-examples/applications-by-algorithm.rst | 9 +++++++++ .../code-examples/applications-by-topic.rst | 1 + 3 files changed, 27 insertions(+) diff --git a/doc/source/api-reference/qibo.rst b/doc/source/api-reference/qibo.rst index 8a47c74ae7..478f95bb6f 100644 --- a/doc/source/api-reference/qibo.rst +++ b/doc/source/api-reference/qibo.rst @@ -203,6 +203,23 @@ Iterative Quantum Amplitude Estimation (IQAE) :member-order: bysource +Double Bracket Iteration algorithm for Diagonalization +"""""""""""""""""""""""""""""""""""""""""""""""""""""" + +The Double Bracket Iteration (DBI) has been presented in `Gluza M. `_ +as a novel strategy for preparing eigenstates of a quantum system. We implement in +Qibo a discretized version of the algorithm, which executes sequential Double +Bracket Iterations. + +.. autoclass:: qibo.models.dbi.IterationGeneratorType + :members: + :member-order: bysource + +.. autoclass:: qibo.models.dbi.DoubleBracketIteration + :members: + :member-order: bysource + + .. _timeevolution: Time evolution diff --git a/doc/source/code-examples/applications-by-algorithm.rst b/doc/source/code-examples/applications-by-algorithm.rst index 5bdc2eaa1d..3819ba99b3 100644 --- a/doc/source/code-examples/applications-by-algorithm.rst +++ b/doc/source/code-examples/applications-by-algorithm.rst @@ -68,3 +68,12 @@ Clustering :maxdepth: 1 tutorials/qclustering/README.md + + +Diagonalization Algorithms +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. toctree:: + :maxdepth: 1 + + tutorials/dbi/dbi.ipynb diff --git a/doc/source/code-examples/applications-by-topic.rst b/doc/source/code-examples/applications-by-topic.rst index 500300e9b4..8d44557d48 100644 --- a/doc/source/code-examples/applications-by-topic.rst +++ b/doc/source/code-examples/applications-by-topic.rst @@ -61,6 +61,7 @@ Quantum Physics tutorials/bell-variational/README.md tutorials/falqon/README.md tutorials/grover/README.md + tutorials/dbi/dbi.ipynb Quantum Machine Learning ^^^^^^^^^^^^^^^^^^^^^^^^ From 4c4683cef6cf953dc852111e4bfd9d5f999b1882 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Thu, 23 Nov 2023 16:09:44 +0100 Subject: [PATCH 064/143] add more details in docs --- doc/source/api-reference/qibo.rst | 6 +++--- doc/source/code-examples/applications.rst | 4 ++-- src/qibo/models/dbi/double_bracket.py | 18 +++++++++--------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/doc/source/api-reference/qibo.rst b/doc/source/api-reference/qibo.rst index 478f95bb6f..ee65efd1e0 100644 --- a/doc/source/api-reference/qibo.rst +++ b/doc/source/api-reference/qibo.rst @@ -206,16 +206,16 @@ Iterative Quantum Amplitude Estimation (IQAE) Double Bracket Iteration algorithm for Diagonalization """""""""""""""""""""""""""""""""""""""""""""""""""""" -The Double Bracket Iteration (DBI) has been presented in `Gluza M. `_ +The Double Bracket Flow (DBF) has been presented `here `_ as a novel strategy for preparing eigenstates of a quantum system. We implement in Qibo a discretized version of the algorithm, which executes sequential Double Bracket Iterations. -.. autoclass:: qibo.models.dbi.IterationGeneratorType +.. autoclass:: qibo.models.dbi.double_bracket.IterationGeneratorType :members: :member-order: bysource -.. autoclass:: qibo.models.dbi.DoubleBracketIteration +.. autoclass:: qibo.models.dbi.double_bracket.DoubleBracketIteration :members: :member-order: bysource diff --git a/doc/source/code-examples/applications.rst b/doc/source/code-examples/applications.rst index 087548202e..8787659178 100644 --- a/doc/source/code-examples/applications.rst +++ b/doc/source/code-examples/applications.rst @@ -69,7 +69,7 @@ Quantum Physics tutorials/bell-variational/README.md tutorials/falqon/README.md tutorials/grover/README.md - tutorials/dbf/dbf.ipynb + tutorials/dbi/dbi.ipynb Quantum Machine Learning @@ -159,7 +159,7 @@ Diagonalization .. toctree:: :maxdepth: 1 - tutorials/dbf/dbf.ipynb + tutorials/dbi/dbi.ipynb FALQON ^^^^^^ diff --git a/src/qibo/models/dbi/double_bracket.py b/src/qibo/models/dbi/double_bracket.py index 55dd00465b..a9b5f53d15 100644 --- a/src/qibo/models/dbi/double_bracket.py +++ b/src/qibo/models/dbi/double_bracket.py @@ -30,18 +30,18 @@ class DoubleBracketIteration: mode (IterationGeneratorType): type of generator of the evolution. Example: - .. code-block:: python + .. testcode:: - import numpy as np - from qibo.models.double_bracket import DoubleBracketIteration, IterationGeneratorType - from qibo.quantum_info import random_hermitian + import numpy as np + from qibo.models.double_bracket import DoubleBracketIteration, IterationGeneratorType + from qibo.quantum_info import random_hermitian - nqubits = 4 - h0 = random_hermitian(2**nqubits) - dbf = DoubleBracketIteration(Hamiltonian(nqubits=nqubits, matrix=h0)) + nqubits = 4 + h0 = random_hermitian(2**nqubits) + dbf = DoubleBracketIteration(Hamiltonian(nqubits=nqubits, matrix=h0)) - # diagonalized matrix - dbf.h + # diagonalized matrix + dbf.h """ def __init__( From 1111ac7093ce6bb028808a04029ccd28d21881f0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 23 Nov 2023 15:10:09 +0000 Subject: [PATCH 065/143] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- doc/source/api-reference/qibo.rst | 6 +++--- src/qibo/models/dbi/double_bracket.py | 6 ++++-- tests/test_models_dbi.py | 5 ++++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/doc/source/api-reference/qibo.rst b/doc/source/api-reference/qibo.rst index ee65efd1e0..c27d2885df 100644 --- a/doc/source/api-reference/qibo.rst +++ b/doc/source/api-reference/qibo.rst @@ -207,9 +207,9 @@ Double Bracket Iteration algorithm for Diagonalization """""""""""""""""""""""""""""""""""""""""""""""""""""" The Double Bracket Flow (DBF) has been presented `here `_ -as a novel strategy for preparing eigenstates of a quantum system. We implement in -Qibo a discretized version of the algorithm, which executes sequential Double -Bracket Iterations. +as a novel strategy for preparing eigenstates of a quantum system. We implement in +Qibo a discretized version of the algorithm, which executes sequential Double +Bracket Iterations. .. autoclass:: qibo.models.dbi.double_bracket.IterationGeneratorType :members: diff --git a/src/qibo/models/dbi/double_bracket.py b/src/qibo/models/dbi/double_bracket.py index a9b5f53d15..486dad8be0 100644 --- a/src/qibo/models/dbi/double_bracket.py +++ b/src/qibo/models/dbi/double_bracket.py @@ -30,7 +30,7 @@ class DoubleBracketIteration: mode (IterationGeneratorType): type of generator of the evolution. Example: - .. testcode:: + .. testcode:: import numpy as np from qibo.models.double_bracket import DoubleBracketIteration, IterationGeneratorType @@ -53,7 +53,9 @@ def __init__( self.h0 = deepcopy(self.h) self.mode = mode - def __call__(self, step: float, mode: IterationGeneratorType = None, d: np.array = None): + def __call__( + self, step: float, mode: IterationGeneratorType = None, d: np.array = None + ): if mode is None: mode = self.mode diff --git a/tests/test_models_dbi.py b/tests/test_models_dbi.py index 9315ab273b..064f3375cc 100644 --- a/tests/test_models_dbi.py +++ b/tests/test_models_dbi.py @@ -3,7 +3,10 @@ import pytest from qibo.hamiltonians import Hamiltonian -from qibo.models.dbi.double_bracket import DoubleBracketIteration, IterationGeneratorType +from qibo.models.dbi.double_bracket import ( + DoubleBracketIteration, + IterationGeneratorType, +) from qibo.quantum_info import random_hermitian NSTEPS = 50 From 5e3044d17c02d8db7158b2dece95b974cd0de62b Mon Sep 17 00:00:00 2001 From: Andrea Date: Fri, 24 Nov 2023 10:44:06 +0100 Subject: [PATCH 066/143] IterationGeneratorType -> DoubleBracketGeneratorType --- doc/source/api-reference/qibo.rst | 2 +- examples/dbi/dbi.ipynb | 335 +++++--------------------- src/qibo/models/dbi/double_bracket.py | 16 +- tests/test_models_dbi.py | 17 +- 4 files changed, 77 insertions(+), 293 deletions(-) diff --git a/doc/source/api-reference/qibo.rst b/doc/source/api-reference/qibo.rst index c27d2885df..d76ac5507a 100644 --- a/doc/source/api-reference/qibo.rst +++ b/doc/source/api-reference/qibo.rst @@ -211,7 +211,7 @@ as a novel strategy for preparing eigenstates of a quantum system. We implement Qibo a discretized version of the algorithm, which executes sequential Double Bracket Iterations. -.. autoclass:: qibo.models.dbi.double_bracket.IterationGeneratorType +.. autoclass:: qibo.models.dbi.double_bracket.DoubleBracketGeneratorType :members: :member-order: bysource diff --git a/examples/dbi/dbi.ipynb b/examples/dbi/dbi.ipynb index 1a8a86b153..3c82cf2700 100644 --- a/examples/dbi/dbi.ipynb +++ b/examples/dbi/dbi.ipynb @@ -23,14 +23,14 @@ "source": [ "# install extra dependences\n", "# seaborn is a plotting library\n", - "!pip install seaborn \n", + "!pip install seaborn\n", "# hyperopt is required to optimize the DBF step\n", "!pip install hyperopt" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "f270b1ea-ee6a-4eac-a0ff-3d7dae296cf0", "metadata": {}, "outputs": [], @@ -44,7 +44,7 @@ "from hyperopt import hp, tpe\n", "\n", "from qibo import hamiltonians, set_backend\n", - "from qibo.models.dbi.double_bracket import IterationGeneratorType, DoubleBracketIteration" + "from qibo.models.dbi.double_bracket import DoubleBracketGeneratorType, DoubleBracketIteration" ] }, { @@ -57,7 +57,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "4aec7b46-19b9-4004-93c0-a90255e58fd9", "metadata": {}, "outputs": [], @@ -109,28 +109,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "2c4ed408-68ed-4054-825c-2a7df0979a4f", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Qibo 0.2.3|INFO|2023-11-23 15:31:38]: Using qibojit (numba) backend on /CPU:0\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# set the qibo backend (we suggest qibojit if N >= 20)\n", "set_backend(\"qibojit\", \"numba\")\n", @@ -154,7 +136,7 @@ "#### The generator of the evolution\n", "\n", "The model is implemented following the procedure presented in [1], and the first practical step is to define the generator of the iteration $\\hat{\\mathcal{U}}_{\\ell}$, which executes one diagonalization step $$\\hat{H}_{\\ell} = \\hat{\\mathcal{U}}_{\\ell}^{\\dagger} \\hat{H} \\hat{\\mathcal{U}}_{\\ell}.$$\n", - "In `Qibo`, we define the iteration type through a `IterationGeneratorType` object, which can be chosen between one of the following:\n", + "In `Qibo`, we define the iteration type through a `DoubleBracketGeneratorType` object, which can be chosen between one of the following:\n", "- `canonical`: the generator of the iteration at step $k+1$ is defined using the commutator between the off diagonal part $\\sigma(\\hat{H_k})$ and the diagonal part $\\Delta(\\hat{H}_k)$ of the target evolved hamiltonian:\n", " $$\\hat{\\mathcal{U}}_{k+1}=\\exp\\bigl\\{s[\\Delta(\\hat{H}_k), \\sigma(\\hat{H}_k)]\\bigr\\}.$$ \n", "- `single_commutator`: the evolution follows a similar procedure of the previous point in this list, but any additional matrix $D_k$ can be used to control the evolution at each step:\n", @@ -168,35 +150,25 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "26a487e9-366b-4203-b660-e3d4af2bcb68", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "IterationGeneratorType.canonical\n", - "IterationGeneratorType.single_commutator\n", - "IterationGeneratorType.group_commutator\n" - ] - } - ], - "source": [ - "# we have a look inside the IterationGeneratorType class\n", - "for generator in IterationGeneratorType:\n", + "outputs": [], + "source": [ + "# we have a look inside the DoubleBracketGeneratorType class\n", + "for generator in DoubleBracketGeneratorType:\n", " print(generator)" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "da8dce89-27f6-403d-982a-58d531fade48", "metadata": {}, "outputs": [], "source": [ "# here we set the canonical generator\n", - "iterationtype = IterationGeneratorType.canonical" + "iterationtype = DoubleBracketGeneratorType.canonical" ] }, { @@ -211,7 +183,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "055870ec-55f2-4b99-a622-e3aa4c7dd0e9", "metadata": {}, "outputs": [], @@ -229,18 +201,10 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "9e278c3d-9f34-4a40-b453-4e030c751ef5", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Backend: qibojit (numba)\n" - ] - } - ], + "outputs": [], "source": [ "# on which qibo backend am I running the algorithm?\n", "print(f\"Backend: {dbf.backend}\")" @@ -248,25 +212,10 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "5b8e142b-a0a2-41bd-a16a-265a420b7360", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Initial form of the target hamiltonian:\n", - "[[-5.-0.j -3.-0.j -3.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", - " [-3.-0.j -1.-0.j -0.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", - " [-3.-0.j -0.-0.j -1.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", - " ...\n", - " [-0.-0.j -0.-0.j -0.-0.j ... -1.-0.j -0.-0.j -3.-0.j]\n", - " [-0.-0.j -0.-0.j -0.-0.j ... -0.-0.j -1.-0.j -3.-0.j]\n", - " [-0.-0.j -0.-0.j -0.-0.j ... -3.-0.j -3.-0.j -5.-0.j]]\n" - ] - } - ], + "outputs": [], "source": [ "# the initial target hamiltonian is a qibo hamiltonian\n", "# thus the matrix can be accessed typing h.matrix\n", @@ -275,21 +224,10 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "4f9d1d41-3df7-49cf-96ca-fa1019c00c33", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZ4AAAGiCAYAAADXxKDZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAslElEQVR4nO3df3BV9Z3/8dclkhswuRfDj/woAfklVCFoo6YZrQuSAlmHYmVmkTrT6FIc3OBUs7aanVbQbSeunVFsG7FjXagzRShOgdGusIIkjLtgJYIR280AzZZYSFC+Sy6JEDDn8/0jcvVCSM7NOTn3npvnw/nMcM8993Pe9x707edzPj8CxhgjAAA8MiTRAQAABhcSDwDAUyQeAICnSDwAAE+ReAAAniLxAAA8ReIBAHiKxAMA8BSJBwDgKRIPAMBTJB4AgG2rVq1SIBCIKdOmTYurjisGKDYAQIq67rrrtGPHjujrK66IL5WQeAAAcbniiiuUm5vb/8+7GAsAwCNnz57VuXPnXKnLGKNAIBBzLBgMKhgM9nj+oUOHlJ+fr4yMDJWUlKi6ulrjxo2zfb0A2yIAgL+cPXtWEybkqqWlzZX6MjMz1d7eHnNs5cqVWrVq1SXnvvHGG2pvb9fUqVN1/PhxPfHEE/rb3/6mgwcPKisry9b1SDwA4DORSEThcFh/+euzCoWGOazrjCaOf1jNzc0KhULR4721eL7s1KlTGj9+vJ555hktXbrU1jXpagMAnwqFhjlOPF/UFYpJPHaNGDFC11xzjQ4fPmz7MwynBgCfMuYzV4oT7e3tOnLkiPLy8mx/hsQDAD5lTJcrJR6PPPKI6urq9L//+7/67//+b337299WWlqalixZYrsOutoAALZ99NFHWrJkiU6ePKnRo0fr1ltv1d69ezV69GjbdZB4AMCnLPOZLIddZfF+fsOGDY6uJ5F4AMC33HhG4/Tz/cEzHgCAp2jxAIBPdQ8OcNriiW9wgRtIPADgU8b6TMZymHgcfr4/6GoDAHiKFg8A+JX5rLs4rcNjJB4A8ClGtQEAYAMtHgDwK+szyTrvvA6PkXgAwKe6u9rSHNfhNbrakPK2b9+uQCCg9evX9/j+t771LV155ZWyLMvjyIDBiRYPUt77778vSbrxxht7fL++vl7Tp0/XkCH8fxh8xvpMspy1eOhqAwZAQ0ODQqGQpkyZcsl7LS0tOnbsmO64444ERAY45NPEw//iIeW9//77uuGGGxQIBC55r76+XpI0c+ZMr8MCBi1aPEhp586dU2Njo5YsWdLj1rxvvfWWJKmwsNDr0AAXdLkwAZS12gBX/elPf9L58+f18ssv6+WXX77seSQe+FHA+kwBy1nHVYBnPIC7GhoaJEmrV6/WV77ylUveX758ubKyshQOh70ODRi0SDxIae+//77S0tK0fPlyBYPBmPfOnDmj//u//9Ott94aPfbxxx/r3nvvVW1trcaOHavnn39ec+bM8TpswB7rM8lhi4dRbYDLGhoaNGnSpEuSjiT9+c9/lmVZMd1sFRUVys3N1ccff6wdO3boH/7hH3To0CFlZ2d7GTZgj08TD6PakNIaGhp03XXX9fjehx9+KOmLEW3t7e3asmWLnnjiCQ0fPlzf+ta3NGPGDG3dutWzeIHBgBYPUlZLS4tOnDhhO/EcOnRImZmZGjt2bPScGTNmRM8Dkk3AfKaAcTi4gG0RAPdcWLGgt8STmZmpSZMmSepu8YRCoZhzQqGQTp48ObCBAv1lWZLlcDh0ApaKoqsNKevCiLbeEs/06dOjE0szMzMViURizolEIsrMzBzYQIFBhsSDlPWDH/xAxhjNmDGjx/f/8pe/aM+ePdHXU6ZMUXt7u/72t79Fjx08ePCyiQtItO55PM6L10g8wOcyMzO1cOFCrVy5UmfOnNHrr7+uhoYGLVy4MNGhAT2zutwpHuMZD/Alzz//vMrLyzVy5EiNHTtWGzduZCg14DISD/Alo0eP1n/8x38kOgzAHuszybp08du46/AYiQcAfCpgdbmwVpv3XW084wEAeCrpWjyWZenYsWPKysrqcf8UAPAbY4xOnz6t/Px8d3e6NV3Ol8wxDC7QsWPHVFBQkOgwAMB1zc3NMStjOBWwLMddZYEETCAdsMRTU1Ojn/3sZ2ppadHMmTP1i1/8QjfffHOfn8vKypIk/e/R5xQKDev13L/e86IrsUrSDX+ot3Xe/juKXK3PTXZiS0RcySyZ7ydSiZFkov99G+wGJPFs3LhRlZWVeuGFF1RcXKzVq1dr3rx5amxs1JgxY3r97IXutVBomEKh4b2emzXUzfDtdevZv6b33YT2YqP78suS+X4i1Rj3Hx9YXS6MakuRwQXPPPOMli1bpvvuu0/XXnutXnjhBQ0fPlz//u//PhCXA4BBqXtUm/PiNdcTz7lz51RfX6/S0tIvLjJkiEpLS2OWJ7mgs7NTkUgkpgAAUpfrieeTTz5RV1eXcnJyYo7n5OSopaXlkvOrq6sVDoejhYEFAGCTT5fMSfg8nqqqKrW1tUVLc3NzokMCAF/wa1eb64MLRo0apbS0NLW2tsYcb21tVW5u7iXnB4PBHrclBgCkJtdbPOnp6SoqKtLOnTujxyzL0s6dO1VSUuL25QBg8PJpV9uADKeurKxUeXm5brzxRt18881avXq1Ojo6dN999w3E5QBgUApYxvEE0IBlXIrGvgFJPIsXL9bHH3+sxx9/XC0tLbr++uu1bdu2SwYc9Oav97zY5xyLZdsL+6xn15lf27re4Tv7ntwqSZO3/NG1+uzWZZed+tz+nn7n5v2Mpz5gMBuwlQtWrFihFStWDFT1AACrS3K64k2qdLUBADxgXEg8CVgkNOHDqQEAgwstHgDwqYCxFDDO1moLmBRanRoAMMB8+oyHrjYAgKdo8QCAX1mWC9si0NUGALCLxOM9O5NDZw/7ns3aGpwFc5FknczJhMn+4XcD3OPrxAMAg1nAshRw2GBxuuROf5B4AMCvLMuFUW3eJx5GtQEAPEWLBwD8yqctHhIPAPiVTxMPXW0AAE/R4gEAvzJdktON3FirDQBgl1+HU9PVBgDwVNK2eG74Q72k3peCsDdL3N6KBHa20e42OFYRSObYklkyb42OFOTTwQVJm3gAAH3waeKhqw0A4ClaPADgV5Zx3mJxOiquH0g8AOBXlnGhq837xENXGwDAU7R4AMCvXNkIjhYPAMAuy3Kn9NNTTz2lQCCghx56KK7PkXgAAHF799139atf/UqFhXbnQH6BxAMAfmUZd0qc2tvbdc899+jFF1/UVVddFffnk/YZz/47ipQ1tPfw3J3Zba+u2cO+Z+u8F+fZWzHBjmSewc5M/f6x811ZFQJ9MpZkHD7jMd2JJxKJxBwOBoMKBoM9fqSiokJ33HGHSktL9ZOf/CTuS9LiAQCooKBA4XA4Wqqrq3s8b8OGDXrvvfcu+74dSdviAQD0wbgwj+fzFk9zc7NCoVD0cE+tnebmZn3/+9/Xm2++qYyMjH5fksQDAH7l4gTSUCgUk3h6Ul9frxMnTuhrX/ta9FhXV5d2796tX/7yl+rs7FRaWlqflyTxAABsmTNnjj744IOYY/fdd5+mTZumRx991FbSkUg8AOBfHi+Zk5WVpenTp8ccu/LKKzVy5MhLjveGxAMAPmUs5ztXJ2DnaxIPAKD/amtr4/4MiQcA/Mqnq1MnbeJxa+trtyfXJWJiaCpMJGTCZPwG098P9JMlFxKPG4HEhwmkAABPuZ54Vq1apUAgEFOmTZvm9mUAAJZLxWMD0tV23XXXaceOHV9c5Iqk7dEDAP8ynxendXhsQDLCFVdcodzcXFvndnZ2qrOzM/r64oXqAACpZUCe8Rw6dEj5+fmaOHGi7rnnHh09evSy51ZXV8csTFdQUDAQIQFAyjFWwJXiNdcTT3FxsdatW6dt27ZpzZo1ampq0je+8Q2dPn26x/OrqqrU1tYWLc3NzW6HBACpiWc83crKyqJ/LiwsVHFxscaPH6/f/e53Wrp06SXn97bnAwAg9Qz4U/8RI0bommuu0eHDhwf6UgAwuJiA5LSrLAGDCwZ8Hk97e7uOHDmivLy8gb4UAAwqfn3G43qL55FHHtGCBQs0fvx4HTt2TCtXrlRaWpqWLFni9qWSeja8nfrsbqMtubdaQjJjpn7/8LvBb1xPPB999JGWLFmikydPavTo0br11lu1d+9ejR492u1LAcDgZrnQ1ZYKgws2bNjgdpUAgJ6YQHdxVIc7ocSDtdoAAJ5iLRsA8Ck3BgewERwAwD5riAvPeLzva6OrDQDgKVo8AOBXjGoDAHjJmICMw1FthlFtAIBUl/ItnkTN6rZXn70VCZZtL7R1njQ4Zpy7eQ8G0yx9frcU5NPBBSmfeAAgVRlLLgynZlQbACDF0eIBAL9yZVuEFFidGgDgDXdGtaXA1tcAAPSGFg8A+JU1pLs4qsOdUOJB4gEAn3JnkVC62gAAKS5gTCIWTLi8SCSicDis/XfcpKyhvTfImMQWy85W2i/Oc3cbbSYlDk5sox0vI8lSW1ubQqGQ49ou/Hfybw/nKBR01n6IdFr6yrOtrsVmB11tAOBXPn3GQ1cbAMBTtHgAwKf8OriAxAMAPsUEUgAAbKDFAwB+5dPBBSQeAPApvz7joasNAOApWjwA4FN+HVyQtInnhj/US+r9B2E2fCw3VyVIxJbhzIb3j0RtKY+LGBee8SRg7Rq62gAAnkraFg8AoHd+HVxA4gEAnzLG+TOaRCwTTVcbAMBTtHgAwK9c6GoTXW0AALuMGSJjnHVcJWJLNrraAACeosUDAH5lBZx3ldHVBgCwi5ULEoDZ8PFze8a5m5gNn3rcvKfcz9QR9zOe3bt3a8GCBcrPz1cgENCWLVti3jfG6PHHH1deXp6GDRum0tJSHTp0yK14AQCfuzCB1GnxWtyJp6OjQzNnzlRNTU2P7z/99NP6+c9/rhdeeEHvvPOOrrzySs2bN09nz551HCwA4AsXRrU5LV6Lu6utrKxMZWVlPb5njNHq1av1ox/9SAsXLpQkvfzyy8rJydGWLVt09913O4sWAOB7rqa6pqYmtbS0qLS0NHosHA6ruLhYe/bs6fEznZ2dikQiMQUA0LdB09XWm5aWFklSTk5OzPGcnJzoexerrq5WOByOloKCAjdDAoCUdWFUm9PitYRPIK2qqlJbW1u0NDc3JzokAMAAcnU4dW5uriSptbVVeXl50eOtra26/vrre/xMMBhUMBh0MwwAGBT8Oo/H1RbPhAkTlJubq507d0aPRSIRvfPOOyopKXHzUgAw6BnjwjMeP0wgbW9v1+HDh6Ovm5qadODAAWVnZ2vcuHF66KGH9JOf/ERTpkzRhAkT9OMf/1j5+fm688473YwbAOBTcSeeffv2afbs2dHXlZWVkqTy8nKtW7dOP/zhD9XR0aH7779fp06d0q233qpt27YpIyPDvajjMJhmw7u5kkMyYzZ86mEVkv7x6+rUcSeeWbNm9RpoIBDQk08+qSeffNJRYACA3vl16+uEj2oDAAwuvl4kFAAGM7+OaiPxAIBP+TXx0NUGAPAUiQcAfMpYbqzXFt8116xZo8LCQoVCIYVCIZWUlOiNN96Iqw662gDApxLR1TZ27Fg99dRTmjJliowx+s1vfqOFCxdq//79uu6662zVQeIBANi2YMGCmNc//elPtWbNGu3du5fEE69UmGiazBMmZw/7Xp/nvDivwdVrDqaJhINBKvw76jZ3JpB2f/7iLWnsrKPZ1dWlTZs2qaOjI65l0XjGAwA+ZZmAK0WSCgoKYraoqa6uvux1P/jgA2VmZioYDGr58uXavHmzrr32Wttx0+IBAKi5uVmhUCj6urfWztSpU3XgwAG1tbXp1VdfVXl5uerq6mwnHxIPAPiVGzuIfv75C6PU7EhPT9fkyZMlSUVFRXr33Xf13HPP6Ve/+pWtz5N4AMCnkmUCqWVZ6uzstH0+iQcAYFtVVZXKyso0btw4nT59WuvXr1dtba22b99uuw4SDwD4VCJaPCdOnNB3v/tdHT9+XOFwWIWFhdq+fbu++c1v2q6DxAMAPpWIxPPSSy85up7EcGoAgMdo8QCAT1lmiCyHE0idfr4/SDxxSuZtl5N5+2A3VyVI5nuAxBtMKxwY48IOpGyLAABIdbR4AMCnkmUeT7xIPADgU35NPHS1AQA8RYsHAHzqy6tLO6nDayQeAPAputoAALCBFg8A+JRfWzwkHgDwKZ7xIEayriKQzLO67dY1e9j3bNbo3moJSD2sgJE4JB4A8CljnHeVGeNSMHEg8QCAT/n1GQ+j2gAAnqLFAwA+ZVwYXMCoNgCAbXS1AQBgAy0eAPApv7Z4SDwA4FNMIEXcUmEyp5ux2a3L7sTQZdsLbZzFxD/0zo2/u6fPf6Yb/vCuWyH5HokHAHzKr11tcQ8u2L17txYsWKD8/HwFAgFt2bIl5v17771XgUAgpsyfP9+teAEAn7vQ1ea0eC3uxNPR0aGZM2eqpqbmsufMnz9fx48fj5ZXXnnFUZAAgNQRd1dbWVmZysrKej0nGAwqNzfXVn2dnZ3q7OyMvo5EIvGGBACDklFARg672hx+vj8GZB5PbW2txowZo6lTp+qBBx7QyZMnL3tudXW1wuFwtBQUFAxESACQci4843FavOZ64pk/f75efvll7dy5U//2b/+muro6lZWVqaurq8fzq6qq1NbWFi3Nzc1uhwQASCKuj2q7++67o3+eMWOGCgsLNWnSJNXW1mrOnDmXnB8MBhUMBt0OAwBSnl/n8Qz4kjkTJ07UqFGjdPjw4YG+FAAMKnS1XcZHH32kkydPKi8vb6AvBQDwgbi72trb22NaL01NTTpw4ICys7OVnZ2tJ554QosWLVJubq6OHDmiH/7wh5o8ebLmzZsX13X231GkrKG9hzdYtptN5u+ZiNUS7Ou7PrvbaL84z91ttJN1a3S7kjm2ROj7ew7MNp+WXOhqS8CotrgTz759+zR79uzo68rKSklSeXm51qxZo4aGBv3mN7/RqVOnlJ+fr7lz5+pf//VfeY4DAJDUj8Qza9YsmV426d6+fbujgAAA9vh1yRzWagMAn7IUcNxVloiuNjaCAwB4ihYPAPiVG8Oh6WoDANjFBFIAAGygxQMAPsWoNgCAp6zPi9M6vJa0ieeGP9RLfQzzszN7erDMnEb/2F2RYNn2Qlvn7Trza1vnufl3NxGrCCRzbEh+SZt4AAC9o6sNAOApyzgflWYNzDJyvWJUGwDAU7R4AMCnjAIyDpe8cfr5/iDxAIBPMYEUAAAbaPEAgE91Dy5wXofXSDwA4FM840kAv28fDP9wc2Ko25J5MqebsfHvaOrwdeIBgMHMr4MLSDwA4FPGdBendXiNUW0AAE/R4gEAnzIKyGJwAQDAK35dJJSuNgCAp2jxAIBPMaoNAOAp83lxWofX6GoDAHgq5Vs8yTyrG4nn9t8Pu+xtpe3u37VkXkWAVUj6h642AICnrM+L0zq8RlcbAMBTtHgAwKf8Oo+HxAMAPuXXZzx0tQEAPEXiAQCfMi6VeFRXV+umm25SVlaWxowZozvvvFONjY1x1UHiAQCfutDV5rTEo66uThUVFdq7d6/efPNNnT9/XnPnzlVHR4ftOnjGAwCwbdu2bTGv161bpzFjxqi+vl633XabrTpIPADgU27O44lEIjHHg8GggsFgn59va2uTJGVnZ9u+Jonnc6xwMDgl7n66N1Pfbcn6d5d/Ry/l5nDqgoKCmOMrV67UqlWrev2sZVl66KGHdMstt2j69Om2rxnXMx47D5XOnj2riooKjRw5UpmZmVq0aJFaW1vjuQwAwGPNzc1qa2uLlqqqqj4/U1FRoYMHD2rDhg1xXSuuxGPnodLDDz+s1157TZs2bVJdXZ2OHTumu+66K66gAAB9M/qiu62/5cKotlAoFFP66mZbsWKFXn/9de3atUtjx46NK+64utr6eqjU1taml156SevXr9ftt98uSVq7dq2++tWvau/evfr6178eV3AAgMszcqGrLc6tr40xevDBB7V582bV1tZqwoQJcV/T0TOeix8q1dfX6/z58yotLY2eM23aNI0bN0579uzpMfF0dnaqs7Mz+vriB1wAgORRUVGh9evXa+vWrcrKylJLS4skKRwOa9iwYbbq6Pc8np4eKrW0tCg9PV0jRoyIOTcnJyca3MWqq6sVDoej5eIHXACAnlnGnRKPNWvWqK2tTbNmzVJeXl60bNy40XYd/W7xXHio9Pbbb/e3CklSVVWVKisro68jkQjJBwBsSMQOpMY437O0X4nnwkOl3bt3xzxUys3N1blz53Tq1KmYVk9ra6tyc3N7rMvuWHEAQGqIq6vNGKMVK1Zo8+bNeuutty55qFRUVKShQ4dq586d0WONjY06evSoSkpK3IkYACApMUvmuCGuFk9fD5XC4bCWLl2qyspKZWdnKxQK6cEHH1RJSUnKjGhL5u2DEb/BNClxsPzdHUz31K87kMaVeNasWSNJmjVrVszxtWvX6t5775UkPfvssxoyZIgWLVqkzs5OzZs3T88//7wrwQIA/C+uxGPnoVJGRoZqampUU1PT76AAAH1jB1IAgKf82tXGfjwAAE/R4gEAnzKmuzitw2skHgDwKUsBWXGutdZTHV6jqw0A4ClaPADgU/1Za62nOrxG4gEAv3LhGY/jxd76gcQzQOzMdk6FmdODRTLPhnc7tsFisKzkkIxIPADgU34dXEDiAQCf8utwaka1AQA8RYsHAHzKr0vmkHgAwKf8OpyarjYAgKdo8QCATxk5n4aTgAYPiQcA/Kq7q83hcGq62gAAqY4WTwIl82x49E8iZsO7vSLBsu2FNs4aPH/X3FiF5PT5z3TDH951K6Qov87jIfEAgE/5dTg1XW0AAE/R4gEAn6KrDQDgKbraAACwgRYPAPiUcWHJHLraAAC2+XXlArraAACeosXjA2zRO3ASNTk3EVtf29d3fbOHfc9WTS/Oa3AaTFQyT7juu66BaVf4dXVqEg8A+JRfh1PT1QYA8BQtHgDwKb/O4yHxAIBP+fUZD11tAABP0eIBAJ/y6zweEg8A+BRdbQAA2ECLBwB8yq/zeEg8KcSNLXrjqSsVJPNs+GRmd0UCe9toS7vO/LrPc9y+B6lwT/06nJquNgCAp+JKPNXV1brpppuUlZWlMWPG6M4771RjY2PMObNmzVIgEIgpy5cvdzVoAMDnLR7jsCQg7rgST11dnSoqKrR37169+eabOn/+vObOnauOjo6Y85YtW6bjx49Hy9NPP+1q0ACAL4ZTOy1ei+sZz7Zt22Jer1u3TmPGjFF9fb1uu+226PHhw4crNzfXVp2dnZ3q7OyMvo5EIvGEBADwGUfPeNra2iRJ2dnZMcd/+9vfatSoUZo+fbqqqqr06aefXraO6upqhcPhaCkoKHASEgAMGqa/3WtfKr4a1WZZlh566CHdcsstmj59evT4d77zHY0fP175+flqaGjQo48+qsbGRv3+97/vsZ6qqipVVlZGX0ciEZIPANhgjAsrF/gp8VRUVOjgwYN6++23Y47ff//90T/PmDFDeXl5mjNnjo4cOaJJkyZdUk8wGFQwGOxvGAAAn+lXV9uKFSv0+uuva9euXRo7dmyv5xYXF0uSDh8+3J9LAQAuw3KpeC2uFo8xRg8++KA2b96s2tpaTZgwoc/PHDhwQJKUl5fXrwABAD3rHg7trK8s6be+rqio0Pr167V161ZlZWWppaVFkhQOhzVs2DAdOXJE69ev19///d9r5MiRamho0MMPP6zbbrtNhYX2ZjBjYA2mWd1u4nfrHzsrEkj2fzc3uXlPB8v9dEtciWfNmjWSuieJftnatWt17733Kj09XTt27NDq1avV0dGhgoICLVq0SD/60Y9cCxgA0G1QbItg+hj+UFBQoLq6OkcBAQDscWPlAbZFAACkPFanBgCfMp//47QOr5F4AMCn6GoDAMAGWjwA4FN+3QiOxAMAPmWMC894ErBYG11tAABP0eJBj5ip3z+DZTa8238/7Fi23e7qJ+7+bna+a1/f8/T5z3TDH951K6QoutoAAJ6iqw0AABto8QCATxk57ypL+rXaAADJwzLGhW0R6GoDACSx3bt3a8GCBcrPz1cgENCWLVviroPEAwA+ZVz6Jx4dHR2aOXOmampq+h03XW0A4FOJGE5dVlamsrIyR9ck8QAAFIlEYl4Hg0EFg8EBuRaJB44MlgmTbnNjUmI8dbktMbHZq2v2sO/ZOu/FeQ1OgonR9/ccmAf4llwYXPD55wsKCmKOr1y5UqtWrXJU9+WQeADAp9wc1dbc3KxQKBQ9PlCtHYnEAwCQFAqFYhLPQCLxAIBPsQMpAMBTbj7jsau9vV2HDx+Ovm5qatKBAweUnZ2tcePG2aqDxAMAsG3fvn2aPXt29HVlZaUkqby8XOvWrbNVB4kHAHwqES2eWbNmOV7RmsQDAD7l12c8LJkDAPAULR4A8CnjQlcbo9qQsvw+Uz8Rknn78WSOze6KBHa30t515td9npOwra8DlgIBZ6u1WQnY/JquNgCAp2jxAIBPWTIKeDyqzQ0kHgDwKfP5gGqndXiNrjYAgKdo8QCAT1mSC11t3iPxAIBPMaoNAAAbaPEAgE9ZshRw2GJJRIuHxAMAPkXiARxK5tnwySyZfzc3Y3P7ftpZkUCSZg/7no2z7K2WgG5xPeNZs2aNCgsLo1uklpSU6I033oi+f/bsWVVUVGjkyJHKzMzUokWL1Nra6nrQAIAv5vE4LV6LK/GMHTtWTz31lOrr67Vv3z7dfvvtWrhwoT788ENJ0sMPP6zXXntNmzZtUl1dnY4dO6a77rprQAIHgMHOCliuFK/F1dW2YMGCmNc//elPtWbNGu3du1djx47VSy+9pPXr1+v222+XJK1du1Zf/epXtXfvXn3961/vsc7Ozk51dnZGX0cikXi/AwDAR/o9nLqrq0sbNmxQR0eHSkpKVF9fr/Pnz6u0tDR6zrRp0zRu3Djt2bPnsvVUV1crHA5HS0FBQX9DAoBBxchy/E/Sd7VJ0gcffKDMzEwFg0EtX75cmzdv1rXXXquWlhalp6drxIgRMefn5OSopaXlsvVVVVWpra0tWpqbm+P+EgAwGBl1uVK8FveotqlTp+rAgQNqa2vTq6++qvLyctXV1fU7gGAwqGAw2O/PAwD8Je7Ek56ersmTJ0uSioqK9O677+q5557T4sWLde7cOZ06dSqm1dPa2qrc3FzXAgYAdOueg+O/eTyOl8yxLEudnZ0qKirS0KFDtXPnzuh7jY2NOnr0qEpKSpxeBgBwEculpzxei6vFU1VVpbKyMo0bN06nT5/W+vXrVVtbq+3btyscDmvp0qWqrKxUdna2QqGQHnzwQZWUlFx2RBvQH8k8KTGZJfPvloit0e3WZ2dy6NW/r+j1/UjkU2mE+1tf+1VciefEiRP67ne/q+PHjyscDquwsFDbt2/XN7/5TUnSs88+qyFDhmjRokXq7OzUvHnz9Pzzzw9I4AAw2HUPDgg4rsNrcSWel156qdf3MzIyVFNTo5qaGkdBAQD6Nmif8QAAEA8WCQUAn3JjrbVETCAl8QCAT1nqkhw+47ES8IyHrjYAgKdo8QCAT9HVBgDwlGVc6GozST6c2gvGXJhF6/1sWqSW0+c/s3EWf88ulqy/m724JLux2a+vb5HIp328f0bSl//7NrgFTJL9Eh999BFbIwBISc3NzRo7dqzjeiKRiMLhsEYOL9KQgLP2g2U+08lP69XW1qZQKOQ4NjuSrsWTn5+v5uZmZWVlKRDobkJGIhEVFBSoubnZsx/GbX7/Dn6PX/L/dyD+xOvvdzDG6PTp08rPz3c1nu5nPM66ynjGI2nIkCGX/T+CUCjk27+wF/j9O/g9fsn/34H4E68/3yEcDg9QNP6TdIkHAGCPMZYsp2u1GVo8AACburvJnC4SylptPQoGg1q5cqWvdyr1+3fwe/yS/78D8SdeKnyHZJB0o9oAAL27MKotnHGtAoE0R3UZ06W2s38a3KPaAAD2dD/hoasNAIBe0eIBAJ/qHpHGqDYAgEfc2LY6EVtf09UGAPCULxJPTU2Nrr76amVkZKi4uFh//OMfEx2SLatWrVIgEIgp06ZNS3RYvdq9e7cWLFig/Px8BQIBbdmyJeZ9Y4wef/xx5eXladiwYSotLdWhQ4cSE2wP+or/3nvvveSezJ8/PzHB9qC6ulo33XSTsrKyNGbMGN15551qbGyMOefs2bOqqKjQyJEjlZmZqUWLFqm1tTVBEV/KzneYNWvWJfdh+fLlCYo41po1a1RYWBhdnaCkpERvvPFG9P1k+v2NMTLGcli8H9ic9Iln48aNqqys1MqVK/Xee+9p5syZmjdvnk6cOJHo0Gy57rrrdPz48Wh5++23Ex1Srzo6OjRz5kzV1NT0+P7TTz+tn//853rhhRf0zjvv6Morr9S8efN09uxZjyPtWV/xS9L8+fNj7skrr7ziYYS9q6urU0VFhfbu3as333xT58+f19y5c9XR0RE95+GHH9Zrr72mTZs2qa6uTseOHdNdd92VwKhj2fkOkrRs2bKY+/D0008nKOJYY8eO1VNPPaX6+nrt27dPt99+uxYuXKgPP/xQUnL9/hf243FavA88yd18882moqIi+rqrq8vk5+eb6urqBEZlz8qVK83MmTMTHUa/STKbN2+OvrYsy+Tm5pqf/exn0WOnTp0ywWDQvPLKKwmIsHcXx2+MMeXl5WbhwoUJiac/Tpw4YSSZuro6Y0z37z106FCzadOm6Dl//vOfjSSzZ8+eRIXZq4u/gzHG/N3f/Z35/ve/n7ig4nTVVVeZX//610nz+7e1tRlJZlj61WZ4cKKjMiz9aiPJtLW1eRZ/Urd4zp07p/r6epWWlkaPDRkyRKWlpdqzZ08CI7Pv0KFDys/P18SJE3XPPffo6NGjiQ6p35qamtTS0hJzP8LhsIqLi31zPySptrZWY8aM0dSpU/XAAw/o5MmTiQ7pstra2iRJ2dnZkqT6+nqdP38+5h5MmzZN48aNS9p7cPF3uOC3v/2tRo0apenTp6uqqkqfftr7njaJ0NXVpQ0bNqijo0MlJSVJ9/sb0+VK8VpSj2r75JNP1NXVpZycnJjjOTk5+p//+Z8ERWVfcXGx1q1bp6lTp+r48eN64okn9I1vfEMHDx5UVlZWosOLW0tLiyT1eD8uvJfs5s+fr7vuuksTJkzQkSNH9C//8i8qKyvTnj17lJbmbAa42yzL0kMPPaRbbrlF06dPl9R9D9LT0zVixIiYc5P1HvT0HSTpO9/5jsaPH6/8/Hw1NDTo0UcfVWNjo37/+98nMNovfPDBByopKdHZs2eVmZmpzZs369prr9WBAweS6vd3Yyg0w6lTTFlZWfTPhYWFKi4u1vjx4/W73/1OS5cuTWBkg9fdd98d/fOMGTNUWFioSZMmqba2VnPmzElgZJeqqKjQwYMHk/65YG8u9x3uv//+6J9nzJihvLw8zZkzR0eOHNGkSZO8DvMSU6dO1YEDB9TW1qZXX31V5eXlqqurS3RYKSOpu9pGjRqltLS0S0aMtLa2Kjc3N0FR9d+IESN0zTXX6PDhw4kOpV8u/Oapcj8kaeLEiRo1alTS3ZMVK1bo9ddf165du2L2p8rNzdW5c+d06tSpmPOT8R5c7jv0pLi4WJKS5j6kp6dr8uTJKioqUnV1tWbOnKnnnnsu6X5/vw4uSOrEk56erqKiIu3cuTN6zLIs7dy5UyUlJQmMrH/a29t15MgR5eXlJTqUfpkwYYJyc3Nj7kckEtE777zjy/shdW+1fvLkyaS5J8YYrVixQps3b9Zbb72lCRMmxLxfVFSkoUOHxtyDxsZGHT16NGnuQV/foScHDhyQpKS5DxezLEudnZ1J9/s7H0ptJaSrLelHtW3YsMEEg0Gzbt0686c//cncf//9ZsSIEaalpSXRofXpn//5n01tba1pamoy//Vf/2VKS0vNqFGjzIkTJxId2mWdPn3a7N+/3+zfv99IMs8884zZv3+/+etf/2qMMeapp54yI0aMMFu3bjUNDQ1m4cKFZsKECebMmTMJjrxbb/GfPn3aPPLII2bPnj2mqanJ7Nixw3zta18zU6ZMMWfPnk106MYYYx544AETDodNbW2tOX78eLR8+umn0XOWL19uxo0bZ9566y2zb98+U1JSYkpKShIYday+vsPhw4fNk08+afbt22eamprM1q1bzcSJE81tt92W4Mi7PfbYY6aurs40NTWZhoYG89hjj5lAIGD+8z//0xiTHL//hVFtQ9NyTPoVeY7K0LQcz0e1JX3iMcaYX/ziF2bcuHEmPT3d3HzzzWbv3r2JDsmWxYsXm7y8PJOenm6+8pWvmMWLF5vDhw8nOqxe7dq1y0i6pJSXlxtjuodU//jHPzY5OTkmGAyaOXPmmMbGxsQG/SW9xf/pp5+auXPnmtGjR5uhQ4ea8ePHm2XLliXV/8T0FLsks3bt2ug5Z86cMf/0T/9krrrqKjN8+HDz7W9/2xw/fjxxQV+kr+9w9OhRc9ttt5ns7GwTDAbN5MmTzQ9+8ANP/8PXm3/8x38048ePN+np6Wb06NFmzpw50aRjTHL8/hcSzxVpo83QK3IclSvSRnueeNiPBwB85sJ+PGlDshUIOHtiYoylLuv/ebofT1I/4wEApB6GUwOAbxnJ8ag07zu9SDwA4FPu7MfDIqEAgBRHiwcAfKp78qfDFg9dbQAA+5wnnkQ846GrDQDgKVo8AOBXLgwuUAIGF5B4AMCn/PqMh642AICnaPEAgG8xuAAA4CnT/YzGSeln4qmpqdHVV1+tjIwMFRcX649//KPtz5J4AABx2bhxoyorK7Vy5Uq99957mjlzpubNm6cTJ07Y+jyrUwOAz1xYnVpKkztdbV1xrU5dXFysm266Sb/85S8ldW+UV1BQoAcffFCPPfZYn5+nxQMAvnbZLZBslm6RSCSmdHZ29ni1c+fOqb6+XqWlpdFjQ4YMUWlpqfbs2WMrYhIPAPhMenq6cnNzJXW5UjIzM1VQUKBwOBwt1dXVPV77k08+UVdXl3JycmKO5+TkqKWlxVb8jGoDAJ/JyMhQU1OTzp0750p9xhgFArFddsFg0JW6e0LiAQAfysjIUEZGhufXHTVqlNLS0tTa2hpzvLW19fNWWN/oagMA2Jaenq6ioiLt3LkzesyyLO3cuVMlJSW26qDFAwCIS2VlpcrLy3XjjTfq5ptv1urVq9XR0aH77rvP1udJPACAuCxevFgff/yxHn/8cbW0tOj666/Xtm3bLhlwcDnM4wEAeIpnPAAAT5F4AACeIvEAADxF4gEAeIrEAwDwFIkHAOApEg8AwFMkHgCAp0g8AABPkXgAAJ4i8QAAPPX/AQeqkNI6j37DAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# let's visualize it in a more graphical way\n", "visualize_matrix(dbf.h0.matrix, r\"$H_0$\")" @@ -297,21 +235,10 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "7b864712-219c-44b6-8337-19ef0100e318", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# since we didn't perform yet any evolutionary step they are the same\n", "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" @@ -327,21 +254,10 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "da3d3aaa-17e1-492e-bcd3-b510f44a5391", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# diagonal part of the H target\n", "visualize_matrix(dbf.diagonal_h_matrix)" @@ -349,18 +265,10 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "24d0dfa1-7039-4d7d-8aa3-5a937b9ab0b8", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "HS norm of the off diagonal part of H: 1440.0\n" - ] - } - ], + "outputs": [], "source": [ "# Hilbert-Schmidt norm of the off-diagonal part\n", "# which we want to bring to be close to zero\n", @@ -381,21 +289,10 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "id": "95f8d86f-07d4-498c-acb1-f6f6a4614c24", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "6.708203932499369" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# define a quantum state\n", "# for example the ground state of a multi-qubit Z hamiltonian\n", @@ -413,24 +310,15 @@ "source": [ "#### Call the `DoubleBracketIteration` to perform a DBF iteration\n", "\n", - "If the DBF object is called, a Double Bracket Iteration iteration is performed. This can be done customizing the iteration by setting the iteration step and the desired `IterationGeneratorType`. If no generator is provided, the one passed at the initialization time is used (default is `IterationGeneratorType.canonical`)." + "If the DBF object is called, a Double Bracket Iteration iteration is performed. This can be done customizing the iteration by setting the iteration step and the desired `DoubleBracketGeneratorType`. If no generator is provided, the one passed at the initialization time is used (default is `DoubleBracketGeneratorType.canonical`)." ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "id": "9a886261-8aa6-4df0-a31b-9c39847db124", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Initial value of the off-diagonal norm: 1440.0\n", - "One step later off-diagonal norm: 1168.2530943739996\n" - ] - } - ], + "outputs": [], "source": [ "# perform one evolution step\n", "\n", @@ -453,21 +341,10 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "id": "cc74812d-7c2c-44e4-afc2-e235968801b4", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" ] @@ -482,18 +359,10 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "id": "aad79966-7a11-4a45-aba5-4a4bb8315c50", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "100%|█████████████████████████████████████████████████████████████████████████| 1000/1000 [00:06<00:00, 147.68trial/s, best loss: 828.3951090043593]\n" - ] - } - ], + "outputs": [], "source": [ "# restart\n", "dbf.h = dbf.h0\n", @@ -511,42 +380,20 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "id": "49483a47-d29d-440e-a4bc-143bfe6bb3cf", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "visualize_matrix(dbf.h.matrix)" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "id": "6bdaf7f9-7e49-4a16-8b29-ae1f9746cd9b", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" ] @@ -565,7 +412,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "id": "59a6a485-a714-4e14-b27a-1df2930068ee", "metadata": {}, "outputs": [], @@ -588,21 +435,10 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "id": "7e0b2f18-ca53-4f34-9fcf-0052dcc31dc5", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeAAAAF2CAYAAAC260vLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABbfUlEQVR4nO3deVhU5f//8ecM+44gq6LgkvuKSq5ZIG6VmmUW39IyzdTMbP9VblmmlR/TzKw+aotW2mJ9rFTc0xARdyRXVFIWFRGQbWDO7w9icgRkm+Ew8H5cF5fMmfvc53VuD7w5Z86iURRFQQghhBA1Sqt2ACGEEKI+kgIshBBCqEAKsBBCCKECKcBCCCGECqQACyGEECqQAiyEEEKoQAqwEEIIoQIpwEIIIYQKpAALIYQQKpACLEQtsXHjRjp37oy9vT0ajYb09HS1I5VKo9Ewa9asGl/u2LFjcXZ2rlBbtTKW5dy5c2g0GlatWqV2FFGLSAEWddqqVavQaDTs379f7Si3dfXqVUaNGoWDgwNLly7lq6++wsnJSbU8v/32W60qYDVhzZo1LFq0SO0Yoh6xVjuAEAJiYmLIzMzkrbfeIiwsTO04/PbbbyxdurTUIpyTk4O1de3+1VGVjGvWrOHYsWNMmzbN5HmaNm1KTk4ONjY2Ju9bWK7a/VMkRD2RmpoKgLu7u7pBKsDe3l7tCOWqLRkLCgrQ6/XY2trWmkyi9pBD0EIABw8eZPDgwbi6uuLs7ExoaCh79+41aqPT6Zg9ezYtW7bE3t4eT09P+vTpQ2RkpKFNcnIyTzzxBI0bN8bOzg4/Pz+GDRvGuXPnylx2//79GTNmDADdu3dHo9EwduxYAAIDAw3f3zpP//79Da937NiBRqNh7dq1vP322zRu3Bh7e3tCQ0M5ffp0ifmjo6MZMmQIDRo0wMnJiY4dO/Lhhx8CRZ+1Ll26FCj6LLX4q1hpn69WZPyKPw7Ys2cP06dPx8vLCycnJ0aMGMHly5fLHJ9bXbx4keHDh+Ps7IyXlxcvvvgihYWFRm1uzZiZmcm0adMIDAzEzs4Ob29vBgwYwIEDBwzj+euvv3L+/HnD+gYGBhrmT01NZdy4cfj4+GBvb0+nTp344osvjJZZ/Dnv+++/z6JFi2jevDl2dnYcP368zM+A//rrLx588EE8PDywt7enW7du/PLLL0ZtKrLdCcske8Ci3ouLi6Nv3764urry8ssvY2Njw/Lly+nfvz87d+4kJCQEgFmzZjFv3jyeeuopevToQUZGBvv37+fAgQMMGDAAgJEjRxIXF8ezzz5LYGAgqampREZGcuHCBaNf6Dd7/fXXadWqFZ9++ilz5swhKCiI5s2bV2ld3n33XbRaLS+++CLXr19nwYIFREREEB0dbWgTGRnJvffei5+fH8899xy+vr7Ex8ezYcMGnnvuOZ5++mkuXbpEZGQkX331lcnGr9izzz5LgwYNmDlzJufOnWPRokVMmTKF7777rtxlFRYWMnDgQEJCQnj//ffZsmULH3zwAc2bN+eZZ54pc76JEyfy/fffM2XKFNq2bcvVq1fZvXs38fHxdO3alddff53r16/z999/85///AfAcMJXTk4O/fv35/Tp00yZMoWgoCDWrVvH2LFjSU9P57nnnjNa1sqVK8nNzWXChAnY2dnh4eGBXq8vddx69+5No0aNePXVV3FycmLt2rUMHz6cH374gREjRgAV2+6EhVKEqMNWrlypAEpMTEyZbYYPH67Y2toqZ86cMUy7dOmS4uLiovTr188wrVOnTsrQoUPL7OfatWsKoLz33nsmy9m0aVNlzJgxJdrfddddyl133WV4vX37dgVQ2rRpo+Tl5Rmmf/jhhwqgHD16VFEURSkoKFCCgoKUpk2bKteuXTPqU6/XG76fPHmyUtavB0CZOXOm4XVFx694HcPCwoyW9fzzzytWVlZKenp6qcsrNmbMGAVQ5syZYzS9S5cuSnBw8G0zurm5KZMnT75t/0OHDlWaNm1aYvqiRYsUQPn6668N0/Lz85WePXsqzs7OSkZGhqIoipKQkKAAiqurq5KammrUR/F7K1euNEwLDQ1VOnTooOTm5hqm6fV6pVevXkrLli0N08rb7oTlkkPQol4rLCxk8+bNDB8+nGbNmhmm+/n58eijj7J7924yMjKAos9n4+LiOHXqVKl9OTg4YGtry44dO7h27VqN5L/VE088ga2treF13759ATh79ixQdKg4ISGBadOmlfi8+ebDzBVVmfErNmHCBKNl9e3bl8LCQs6fP1+hZU6cONHodd++fQ3rVxZ3d3eio6O5dOlShZZxs99++w1fX18eeeQRwzQbGxumTp1KVlYWO3fuNGo/cuRIvLy8bttnWloa27ZtY9SoUWRmZnLlyhWuXLnC1atXGThwIKdOneLixYuG7Lfb7oTlkgIs6rXLly+TnZ1Nq1atSrzXpk0b9Ho9iYmJAMyZM4f09HTuuOMOOnTowEsvvcSRI0cM7e3s7Jg/fz6///47Pj4+9OvXjwULFpCcnFxj69OkSROj1w0aNAAw/EFw5swZANq3b2+S5VVm/Cqa8Xbs7e1LFLcGDRqUO++CBQs4duwYAQEB9OjRg1mzZpVbtIudP3+eli1botUa/7ps06aN4f2bBQUFldvn6dOnURSFN998Ey8vL6OvmTNnAv+emFfedicslxRgISqoX79+nDlzhhUrVtC+fXs+//xzunbtyueff25oM23aNE6ePMm8efOwt7fnzTffpE2bNhw8eLBKyyxrr/TWk46KWVlZlTpdUZQqLd8cqpOxrHnLM2rUKM6ePcuSJUvw9/fnvffeo127dvz+++9V6u92HBwcym1T/Jnwiy++SGRkZKlfLVq0ACq23QnLJAVY1GteXl44Ojpy4sSJEu/99ddfaLVaAgICDNM8PDx44okn+Oabb0hMTKRjx44lzghu3rw5L7zwAps3b+bYsWPk5+fzwQcfVClfgwYNSr0jVkUP196q+OSuY8eO3bZdRQ9HV3b81OTn58ekSZNYv349CQkJeHp68vbbbxveL2udmzZtyqlTp0qcSPXXX38Z3q+s4sP1NjY2hIWFlfrl4uJiaF+R7U5YHinAol6zsrIiPDycn3/+2ehSoZSUFNasWUOfPn1wdXUFiu5WdTNnZ2datGhBXl4eANnZ2eTm5hq1ad68OS4uLoY2ldW8eXP27t1Lfn6+YdqGDRtKHNatqK5duxIUFMSiRYtKFPab90CL78JV3u0wKzN+aiksLOT69etG07y9vfH39zf6f3FycirRDmDIkCEkJycbnaVdUFDAkiVLcHZ25q677qp0Jm9vb/r378/y5ctJSkoq8f7Nl2WVt90JyyWXIYl6YcWKFWzcuLHE9Oeee465c+cSGRlJnz59mDRpEtbW1ixfvpy8vDwWLFhgaNu2bVv69+9PcHAwHh4e7N+/33BpC8DJkycJDQ1l1KhRtG3bFmtra3766SdSUlIYPXp0lXI/9dRTfP/99wwaNIhRo0Zx5swZvv766ypfpqTValm2bBn33XcfnTt35oknnsDPz4+//vqLuLg4Nm3aBEBwcDAAU6dOZeDAgVhZWZW5DhUdP7VkZmbSuHFjHnzwQTp16oSzszNbtmwhJibG6MhEcHAw3333HdOnT6d79+44Oztz3333MWHCBJYvX87YsWOJjY0lMDCQ77//nj179rBo0SKjPdXKWLp0KX369KFDhw6MHz+eZs2akZKSQlRUFH///TeHDx8Gyt/uhAVT9yRsIcyr+NKXsr4SExMVRVGUAwcOKAMHDlScnZ0VR0dH5e6771b+/PNPo77mzp2r9OjRQ3F3d1ccHByU1q1bK2+//baSn5+vKIqiXLlyRZk8ebLSunVrxcnJSXFzc1NCQkKUtWvXVjhnaZdLffDBB0qjRo0UOzs7pXfv3sr+/fvLvAxp3bp1RvOWdvmLoijK7t27lQEDBiguLi6Kk5OT0rFjR2XJkiWG9wsKCpRnn31W8fLyUjQajdElSdxyiU9Fx6+sdSzOvn379tuO0ZgxYxQnJ6cS02fOnFnikqmbM+bl5SkvvfSS0qlTJ8P6durUSfn444+N5snKylIeffRRxd3dXQGMLklKSUlRnnjiCaVhw4aKra2t0qFDhxJjWjzWpV2GVtb/w5kzZ5THH39c8fX1VWxsbJRGjRop9957r/L9998b2pS33QnLpVGUWnR2hhBCCFFPyGfAQgghhAqkAAshhBAqkAIshBBCqEAKsBBCCKECKcBCCCGECqQACyGEECqQG3GYiF6v59KlS7i4uFTpqTJCCCEsn6IoZGZm4u/vX+IBHreSAmwily5dqjX3vBVCCKGuxMREGjdufNs2UoBNpPh2dImJiVW+961Op2Pz5s2Eh4djY2NjynhmIXnNS/Kal+Q1L0vLC6bJnJGRQUBAQIVuUSoF2ESKDzu7urpWqwA7Ojri6upqERus5DUvyWtekte8LC0vmDZzRT6KlJOwhBBCCBVIARZCCCFUIAVYCCGEUIF8BiyEEGai1+vJz883SV86nQ5ra2tyc3MpLCw0SZ/mZGl5oWKZbWxssLKyMsnypAALIYQZ5Ofnk5CQgF6vN0l/iqLg6+tLYmKiRdxrwNLyQsUzu7u74+vrW+31kgIshBAmpigKSUlJWFlZERAQUO4NGSpCr9eTlZWFs7OzSfozN0vLC+VnVhSF7OxsUlNTAfDz86vW8qQACyGEiRUUFJCdnY2/vz+Ojo4m6bP4cLa9vb1FFDRLywsVy+zg4ABAamoq3t7e1TocbRmjUk/kpV7F6nwyealX1Y4ihKiG4s8PbW1tVU4izKH4jyqdTletfqQA1xKXftlK9INTcVizhegHp3Lpl61qRxJCVJOlfPYpKsdU/69SgGuB3NSrxM9bDopSNEFRiH/3U3JlT1gIIeosKcC1QHZi0r/Ft5heT05isjqBhBDiFv3792fatGlmXcasWbPo3LmzWZdRm0gBrgUcA/xAe8shDY0GhwBfdQIJIeqlsWPHotFoSnydPn2aH3/8kbfeekvtiGU6d+4cGo2GQ4cOqR2lwqQA1wL23p60efVpoyKssdKisZAzB4UQdcegQYNISkoy+goKCsLDw6NCT/gRFSe/4WsJ//tDCVm3GF2romcKKwWFnFv1g8qphBBqy029SlrssRo7J8TOzg5fX1+jLysrK6ND0H/99ReOjo6sWbPGMN/atWtxcHDg+PHjAKSnpzN16lR8fHxwdXXlnnvu4fDhw0bLevfdd/Hx8cHFxYVx48aRm5t722zXrl0jIiICLy8vHBwcaNmyJStXrgQgKCgIgC5duqDRaOjfv79hvs8//5w2bdpgb29P69at+fjjjw3vFe85f/vtt/Tp0wdfX186duzIzp07qzyGFSXXAdcidt6e5A8Mwe5CKvqcPC6u30KTiGE4+HmpHU0IoYJLv2wl/t3loFdAq6Hp1MdwHTVU7Vi0bt2a999/n0mTJtGnTx+0Wi0TJ05k/vz5tG3bFoBRo0ZhY2PDr7/+SoMGDVi+fDmhoaGcPHkSDw8P1q5dy6xZs1i6dCl9+vThq6++YvHixTRr1qzM5b755pscP36c33//nYYNG3L69GlycnIA2LdvHz169GDLli20a9fOcAnY6tWrmTFjBh999BFdunTh4MGDjB8/HicnJ8aMGWPo+6WXXmLhwoU0adKEzz77jPvuu4+EhAQ8PT3NNo5SgGsZxcmeRg8OIvGrn1EKCklYsY62r09SO5YQopr2jX2F/KvpFW6vFOrJT7upvV7h/KIvSfryFzRWFT94aevpTo9V8yvcfsOGDTg7OxteDx48mHXr1pVoN2nSJH777Tf+7//+D1tbW7p3786zzz4LwO7du4mJieHkyZN4eXmh1Wp5//33Wb9+Pd9//z0TJkxg0aJFjBs3jnHjxgEwd+5ctmzZctu94AsXLtClSxe6desGQGBgoOE9L6+iHRVPT098ff89f2bmzJl88MEHPPDAA0DRnvLx48dZvny5UQGeMmUKI0eOJCMjg48//phNmzbx3//+l5dffrnCY1dZUoBrocaPDCXpp0gKsrJJ/m0ngY8Nx7GJv9qxhBDVkH81nbzLadXv5+aibAZ33303y5YtM7x2cnIqs+2KFSu444470Gq1xMXFGa6PPXz4MFlZWTRv3tyofU5ODmfOnAEgPj6eiRMnGr3fs2dPtm/fXubynnnmGUaOHMmBAwcIDw9n+PDh9OrVq8z2N27c4MyZM4wbN47x48cbphcUFODm5lZi2cWsra3p1q0b8fHxZfZtCrX6M+Bdu3Zx33334e/vj0ajYf369WW2nThxIhqNhkWLFhlNT0tLIyIiAldXV9zd3Rk3bhxZWVlGbY4cOULfvn2xt7cnICCABQsWmGFtKs7GxZkmj94PFP0VfPbztarmEUJUn62nO3ZeHhX+svVwL70fj0r241l6P2VxcnKiRYsWhq/b3e/48OHD3Lhxgxs3bpCUlGSYnpWVhZ+fH7t27eLAgQMcOnSIQ4cOceLECV566aVK5bnZ4MGDOX/+PM8//zyXLl0iNDSUF198scz2xb/rP/vsM0OGQ4cOcezYMfbu3VvlHKZSq/eAb9y4QadOnXjyyScNhw9K89NPP7F37178/UvuJUZERJCUlERkZCQ6nY4nnniCCRMmGE4eyMjIIDw8nLCwMD755BOOHj3Kk08+ibu7OxMmTDDbupUn4OEhJK79FV16JimRfxL4+AicWzRVLY8Qonoqcxi4WNFnwJ+CXg9aLU2n/h/NRg2tFfdWTktLY+zYsbz++uskJSURERHBgQMHcHBwoGvXriQnJ2NtbU2LFi1KzdumTRuio6N5/PHHDdMqUhS9vLwYM2YMY8aMoW/fvrz00ku8//77hs98b36MoI+PD/7+/pw9e5aIiIjb9rt371769OkDFO0hx8bGMmXKlAqNRVXV6gI8ePBgBg8efNs2Fy9e5Nlnn2XTpk0MHWp8ckJ8fDwbN24kJibG8JnBkiVLGDJkCO+//z7+/v6sXr2a/Px8VqxYga2tLe3atePQoUMsXLhQ1QJs7eRA4OMjOLX4S1AUzn72HR3nm++zCCFE7eN/fyged3YmJzEZu0be5NvbqB3JYOLEiQQEBPDGG2+Ql5dHly5dePHFF1m6dClhYWH07NmTiIgI3nvvPVq3bs2lS5f49ddfGTFiBN26deO5555j7NixdOvWjd69e7N69Wri4uJuexLWjBkzCA4Opl27duTl5bFhwwbatGkDgLe3Nw4ODmzcuJHGjRtjb2+Pm5sbs2fPZurUqbi5uTFo0CDy8vLYv38/165dY/r06Ya+ly5dSvPmzQkICODzzz/n2rVrPPnkk2Ydw1pdgMuj1+t57LHHeOmll2jXrl2J96OionB3dzcUX4CwsDC0Wi3R0dGMGDGCqKgo+vXrZ3TT9IEDBzJ//nyuXbtGgwYNSl12Xl4eeXl5htcZGRlA0c25q3qD7uL5iv/1vv8ezq/5H/lXrnF5ZwxpR/7CpU3z23VRo27NW9tJXvOSvMZ9K4qCXq+v9vOAbRs2wLZhAxRFIT8z09CvOSiKctv+i9/78ssv+e2334iNjUWr1eLg4MCXX35Jv379GDJkCIMHD+Z///sfr7zyCuPGjePy5cv4+vrSt29fvLy80Ov1PPTQQ5w+fZqXX36Z3NxcHnjgASZOnMjmzZvLXL6NjQ2vvfYa586dw8HBgT59+rBmzRr0ej1arZZFixYxd+5cZsyYQd++fdm2bRtPPvkk9vb2fPDBB7z00ks4OTnRoUMHpk6davT/88477zB//nwOHz5MixYtWL9+PR4eHqVm0ev1KIqCTqcr8TSkymxPGkW59R6ItZNGo+Gnn35i+PDhhmnz5s1j+/btbNq0CY1GQ2BgINOmTTNcq/bOO+/wxRdfcOLECaO+vL29mT17Ns888wzh4eEEBQWxfPlyw/vHjx+nXbt2HD9+3PDX1a1mzZrF7NmzS0xfs2aNyR4/BmB94CT2m/YBUBDkR+7oUJP1LYQwD2tra3x9fQkICJAnItVyFy5coFOnTuzatYsOHTpUaJ78/HwSExNJTk6moKDA6L3s7GweffRRrl+/jqur6237sdg94NjYWD788EMOHDigyhNHXnvtNaPDFxkZGQQEBBAeHl7uoJdFp9MRGRnJgAEDsLEpOtSkHxBOzJEXyEu6jHVCEr0bNcOtU2uTrEN1lZa3NpO85iV5/5Wbm0tiYiLOzs7Y29ubpE9FUcjMzMTFxcUinrJkKXmLL7lycnLCxcWlQplzc3NxcHCgX79+Jf5/i4+GVoTFFuA//viD1NRUmjRpYphWWFjICy+8wKJFizh37hy+vr6kpqYazVdQUEBaWprhOjFfX19SUlKM2hS/vvlaslvZ2dlhZ2dXYrqNjU21f5iN+rCxodm4h4ifW3TnlvOfr6Prstm1aoM2xTrXJMlrXpK36HeRRqNBq9Wa7ISp4kOhxf3WdpaStzibVqs1/F4tL3Nx29K2ncpsS7V3VMrx2GOPceTIEaNTy/39/XnppZfYtGkTUHRdV3p6OrGxsYb5tm3bhl6vJyQkxNBm165dRsftIyMjadWqVZmf/9Y030H9cGxadIZ3+qF40vYdUTmREELUDYGBgSiKospTmGp1Ac7KyjIUV4CEhAQOHTrEhQsX8PT0pH379kZfNjY2+Pr60qpVK6DoNPdBgwYxfvx49u3bx549e5gyZQqjR482XLL06KOPYmtry7hx44iLi+O7777jww8/NDq8rDattRXNnhpleH12+TdYyEf3QgghylCrC/D+/fvp0qULXbp0AWD69Ol06dKFGTNmVLiP1atX07p1a0JDQxkyZAh9+vTh008/Nbzv5ubG5s2bSUhIIDg4mBdeeIEZM2aoeglSabxDexquA844foYrf+xXOZEQojzyh3LdZKr/11r9GXD//v0rtaLnzp0rMc3Dw8PoiR2l6dixI3/88Udl49UojVZLswkPc+Tlort0nV3+LQ37BMsjC4WohYovTcnPz8fBwUHlNMLUsrOzgcp93luaWl2AhbGGfbvh2rYFGcdPk3XmAilbo/Ad0FvtWEKIW1hbW+Po6Mjly5exsbExyUlIer2e/Px8cnNza/VJTcUsLS+Un1lRFLKzs0lNTcXd3b3ENcCVJQXYgmg0GppPfISDU98CIOGz7/C++0601tXbCIQQpqXRaPDz8yMhIYHz58+bpE9FUcjJycHBwaFWXQVRFkvLCxXP7O7ufturZCpKCrCFadC9A+5d2pJ+8DjZF5JI3rgL/3vvVjuWEOIWtra2tGzZkvz8fJP0p9Pp2LVrF/369bOIy7wsLS9ULLONjU2193yLSQG2MBqNhuZPjyZ2YtGJaAmfr8M3vA9aW8vYwIWoT7RarcluxGFlZUVBQQH29vYWUdAsLS/UfGbLODAvjLh3boPnnZ0ByE2+zKVftqkbSAghRKVJAbZQzSaONnyfsOoHCnPzbtNaCCFEbSMF2EK5tm6O1109AMi/co2/f9isciIhhBCVIQXYgjV7ejT8c6be+a9+ouBGjsqJhBBCVJQUYAvm3CwA3/A+AOjSM0n87leVEwkhhKgoKcAWLuiph9BYFf03nl/9C7rrmSonEkIIURFSgC2cY4AffkOLrgMuvJHD+TX/UzmREEKIipACXAcEPTkSjU3RJd2J3/1Gftp1lRMJIYQojxTgOsDe14tGwwcAoM/N49yXP6mcSAghRHmkANcRgWNHoLWzBeDvHzaRvOVPclOvqpxKCCFEWaQA1xF2ng0IeGgwAIqugLg3/sOe4c9w6ZetKicTQghRGinAdYjvoL7GE/QK8e9+KnvCQghRC0kBrkPyS7sESa8nJzG55sMIIYS4LSnAdYhjgJ/hzlgGWi0OAdV/bqUQQgjTkgJch9h7e9LmtaeNpjX9v/ux9/ZUKZEQQoiySAGuY/zvD6XltLGG1wWZN9QLI4QQokxSgOsg//vvwcrBDoCULX9SmJevciIhhBC3kgJcB1k7OuB1951A0R7wld2xKicSQghxKynAdZTf4LsM3yf/tlPFJEIIIUojBbiOahDcDjufopOvru49KPeHFkKIWkYKcB2l0WrxHdQPAKVQT/Lm3SonEkIIcTMpwHWYHIYWQojaSwpwHeYU2AjXti0AyDyZQNbp8yonEkIIUUwKcB3nO+TfveCk32UvWAghagspwHWc74DeaKytAEje+Af6gkKVEwkhhAApwHWejZsLDXsHA5B/NZ1r+4+qnEgIIQRIAa4X/G4+DP3bDvWCCCGEMJACXA949uqCjZsLAJd37qPgRrbKiYQQQkgBrge0Njb4DOgNgD5PR+rWKJUTCSGEkAJcT/jJ2dBCCFGrSAGuJ1zaNMexaSMA0g/Gk3MpReVEQghRv0kBric0Gg1+Q2/eC96lYhohhBBSgOsR34F9QaMBIPn3nSiKonIiIYSov6QA1yP2Pg1pENwegJy/U7h+9KTKiYQQov6SAlzPGB2GlmuChRBCNVKA6xmvu3pg5WAHQOqWPynMy1c5kRBC1E9SgOsZa0cHvO++E4CCrGyu7I5VOZEQQtRPtboA79q1i/vuuw9/f380Gg3r1683vKfT6XjllVfo0KEDTk5O+Pv78/jjj3Pp0iWjPtLS0oiIiMDV1RV3d3fGjRtHVlaWUZsjR47Qt29f7O3tCQgIYMGCBTWxeqrxlVtTCiGE6mp1Ab5x4wadOnVi6dKlJd7Lzs7mwIEDvPnmmxw4cIAff/yREydOcP/99xu1i4iIIC4ujsjISDZs2MCuXbuYMGGC4f2MjAzCw8Np2rQpsbGxvPfee8yaNYtPP/3U7OunlgZd22Hn4wlA2t5D5F1NVzeQEELUQ9ZqB7idwYMHM3jw4FLfc3NzIzIy0mjaRx99RI8ePbhw4QJNmjQhPj6ejRs3EhMTQ7du3QBYsmQJQ4YM4f3338ff35/Vq1eTn5/PihUrsLW1pV27dhw6dIiFCxcaFeq6RKPV4jeoH+e++AmlUE9K5B6ajB6qdiwhhKhXavUecGVdv34djUaDu7s7AFFRUbi7uxuKL0BYWBharZbo6GhDm379+mFra2toM3DgQE6cOMG1a9dqNH9N8h0sh6GFEEJNtXoPuDJyc3N55ZVXeOSRR3B1dQUgOTkZb29vo3bW1tZ4eHiQnJxsaBMUFGTUxsfHx/BegwYNSl1eXl4eeXl5htcZGRlA0WfTOp2uSutQPF9V568M20beuLRpTmb8GbJOnuNa/BmcWzSpVB81mdcUJK95SV7zkrzmZ4rMlZm3ThRgnU7HqFGjUBSFZcuW1cgy582bx+zZs0tM37x5M46OjtXq+9ZD6+ZiHeCBffwZAPZ+8gX59wRXqZ+aymsqkte8JK95SV7zq07m7OyKP+7V4gtwcfE9f/4827ZtM+z9Avj6+pKammrUvqCggLS0NHx9fQ1tUlKMH0xQ/Lq4TWlee+01pk+fbnidkZFBQEAA4eHhRhkquy6RkZEMGDAAGxubKvVRqeX17svebQdQCgpxPpVEyLsD0VhbVXz+Gs5bXZLXvCSveUle8zNF5uKjoRVh0QW4uPieOnWK7du34+npafR+z549SU9PJzY2luDgor27bdu2odfrCQkJMbR5/fXX0el0hgGPjIykVatWZR5+BrCzs8POzq7EdBsbm2pvbKboo0LLaehBw97BXN65j/y0dDIPxePZs0vl+6mhvKYiec1L8pqX5DW/6mSuzHy1+iSsrKwsDh06xKFDhwBISEjg0KFDXLhwAZ1Ox4MPPsj+/ftZvXo1hYWFJCcnk5ycTH5+0d2d2rRpw6BBgxg/fjz79u1jz549TJkyhdGjR+Pv7w/Ao48+iq2tLePGjSMuLo7vvvuODz/80Gjvti7zG9rf8H3Sb/KcYCGEqCm1eg94//793H333YbXxUVxzJgxzJo1i19++QWAzp07G823fft2+vfvD8Dq1auZMmUKoaGhaLVaRo4cyeLFiw1t3dzc2Lx5M5MnTyY4OJiGDRsyY8aMOnsJ0q08e3bGxs0F3fVMLu/aR0HWDaydndSOJYQQdV6tLsD9+/e/7SPzKvI4PQ8PD9asWXPbNh07duSPP/6odL66QGtjg8+A3vz9/Ub0eTpSt+3F//5QtWMJIUSdV6sPQYuaIYehhRCi5kkBFri0boZjYCMA0g/Fk3MxpZw5hBBCVJcUYIFGo8Hv5gc0bNylYhohhKgfpAALAHwH9QONBoDk33dW6PN1IYQQVScFWABg7+2JR7f2AOT8ncL1IydUTiSEEHWbFGBh4Dukv+H7pN/lZCwhhDAnKcDCwLt/D6wciu7ulbrlTwpz88qZQwghRFVJARYGVg72eN99JwAFWdlc2R2rciIhhKi7pAALI743XxMsh6GFEMJspAALIw26tMXOp+ihFlejDpJx4qzKiYQQom6SAiyMaLRanJs3KXqhV4gZ+yqXftmqbighhKiDpAALI7mpV7kadejfCYpC/Lufkpt6VbVMQghRF0kBFkayE5Pg1ptw6PXkJCarE0gIIeooKcDCiGOAH2g1xhM1GhwCfNUJJIQQdZQUYGHE3tuTNq8+bVSEHfy9sff2VDGVEELUPVKARQn+94fSe/0y7P29Aci5mCKfAQshhIlJARalsvf2xG/wv09IurwrRsU0QghR90gBFmXy6h9i+P7y9r0qJhFCiLpHCrAok3OLJjg0Ljr56trB4+SnZ6icSAgh6g4pwKJMGo0G7+K9YL3ClT/2qxtICCHqECnA4ra87v73MHSqHIYWQgiTkQIsbsu1TXPs/rkEKS3mKAVZN1ROJIQQdYMUYHFbGq0Wr/49AFB0BVzZc0DlREIIUTdIARbl8r7pbOjUHdEqJhFCiLpDCrAol3un1tg0cAXgatQhCnPzVE4khBCWTwqwKJfGygqvft0B0OfmcXXvIXUDCSFEHSAFWFTIzYehL8thaCGEqDYpwKJCGnRrj7WzIwBXdsei1+lUTiSEEJZNCrCoEK2NDQ37BANQkJXNtf3HVE4khBCWTQqwqDDvu+80fJ+6XQ5DCyFEdUgBFhXmEdIJrb0dAJd37UMp1KucSAghLJcUYFFhVvZ2NOzVBQBdeibXj/ylciIhhLBcUoBFpdz8iMIrO+UZwUIIUVVSgEWlNOzdFY2NNQBXdsWAoqicSAghLJMUYFEp1k6OePToCED+5TS0l66qnEgIISyTFGBRaTefDW198oKKSYQQwnJJARaV1rBPMBqrok3H+q8LKHIYWgghKq3SBTgnJ4eLFy+WmB4XF2eSQKL2s3V3xb1LWwC06VncOJOociIhhLA8lSrA33//PS1btmTo0KF07NiR6Oh/b8bw2GOPmTycqL28+/97GPrKzn0qJhFCCMtUqQI8d+5cYmNjOXToECtXrmTcuHGsWbMGQA5D1jNed3U3fH9ll1yOJIQQlWVdmcY6nQ4fHx8AgoOD2bVrFyNGjOD06dNoNBqzBBS1k52XB67t7yDj2EmyzyaSfeESjk381Y4lhBAWo1J7wN7e3hw5csTw2sPDg8jISOLj442mi/qh4U17wanyiEIhhKiUShXgr776Cm9vb6Nptra2fPPNN+zcudOkwQB27drFfffdh7+/PxqNhvXr1xu9rygKM2bMwM/PDwcHB8LCwjh16pRRm7S0NCIiInB1dcXd3Z1x48aRlZVl1ObIkSP07dsXe3t7AgICWLBggcnXpS7y7HdTAZaHMwghRKVUqgA3btwYX1/fUt/r3bu3SQLd7MaNG3Tq1ImlS5eW+v6CBQtYvHgxn3zyCdHR0Tg5OTFw4EByc3MNbSIiIoiLiyMyMpINGzawa9cuJkyYYHg/IyOD8PBwmjZtSmxsLO+99x6zZs3i008/Nfn61DUO/t4U+jQAIDP+DLnJl1VOJIQQlqNSnwHXtMGDBzN48OBS31MUhUWLFvHGG28wbNgwAL788kt8fHxYv349o0ePJj4+no0bNxITE0O3bt0AWLJkCUOGDOH999/H39+f1atXk5+fz4oVK7C1taVdu3YcOnSIhQsXGhVqUbqCVk2wSrkGQOrOfTR5eKjKiYQQwjJUuQBfuFC1OyC5u7vj6upa1cUaJCQkkJycTFhYmGGam5sbISEhREVFMXr0aKKionB3dzcUX4CwsDC0Wi3R0dGMGDGCqKgo+vXrh62traHNwIEDmT9/PteuXaNBgwalLj8vL4+8vDzD64yMDKDoRDWdTleldSqer6rz1zSdTkdBqybY7ToMQMq2vfg9EK5yqrJZ4vje/G9tJ3nNS/KanykyV2beKhfgwMDASs+j0WiYOXMmM2bMqOpiDZKTkwEMZ2UX8/HxMbyXnJxc4jNra2trPDw8jNoEBQWV6KP4vbIK8Lx585g9e3aJ6Zs3b8bR0bEKa/SvyMjIas1foxq6ofd0RXs1g+uH/+L3dT+gODmoneq2LGp8kbzmJnnNy9LyQvUyZ2dnV7htlQuwXl+/H8b+2muvMX36dMPrjIwMAgICCA8Pr/Ievk6nIzIykgEDBmBjY2OqqGZTnDdg0F1cXP0/NEAnW3f8h4SqHa1Uljq+ktc8JK95WVpeME3m4qOhFVHlAhwUFFSla3+nTZvG1KlTq7pYg+KTwVJSUvDz8zNMT0lJoXPnzoY2qampRvMVFBSQlpZmmN/X15eUlBSjNsWvyzrhDMDOzg47O7sS021sbKq9sZmij5rkffedXFz9PwDS/thP0wcHqZzo9ixtfCWveUle87K0vFC9zJWZr8oFeNWqVVWaryqHrksTFBSEr68vW7duNRTcjIwMoqOjeeaZZwDo2bMn6enpxMbGEhwcDMC2bdvQ6/WEhIQY2rz++uvodDrDwEVGRtKqVasyDz8LY853BGLv50Vu0mWu7T+GLiMLG1dntWMJIUStVuUCfNddd5kyR6mysrI4ffq04XVCQgKHDh3Cw8ODJk2aMG3aNObOnUvLli0JCgrizTffxN/fn+HDhwPQpk0bBg0axPjx4/nkk0/Q6XRMmTKF0aNH4+9fdNemRx99lNmzZzNu3DheeeUVjh07xocffsh//vMfs69fXaHRaPDuH8KFbzagFBZyZXcsfkPMv30IIYQlM9njCHU6HYmJiZw4cYK0tDST9Ll//366dOlCly5dAJg+fTpdunQxnMT18ssv8+yzzzJhwgS6d+9OVlYWGzduxN7e3tDH6tWrad26NaGhoQwZMoQ+ffoYXePr5ubG5s2bSUhIIDg4mBdeeIEZM2bIJUiV5HXTM4LlrlhCCFG+al0HnJmZyddff823337Lvn37yM/PR1EUNBoNjRs3Jjw83FAcq6J///63fciDRqNhzpw5zJkzp8w2Hh4ehgdGlKVjx4788ccfVcooiri1b4ltwwbkX7lGWvQhCrJzsHas3WdDCyGEmqq8B7xw4UICAwNZuXIlYWFhrF+/nkOHDnHy5EmioqKYOXMmBQUFhIeHM2jQoBK3iBR1i0arxeuuHgDo83RcjTqkbiAhhKjlqrwHHBMTw65du2jXrl2p7/fo0YMnn3ySTz75hJUrV/LHH3/QsmXLKgcVtZ93/xAu/rAJgNTte/EJ7alyIiGEqL2qXIC/+eabCrWzs7Nj4sSJVV2MsCDuXdpi7epMQUYWV/88QGFePlZ2tuXPKIQQ9VC1TsJycXGhX79+PP/883z11VfExcXd9jNbUbdpra3w+ucJSYXZuaTtk0dUCiFEWSpVgG/d650/fz4tW7Zk27ZtPPnkk3Ts2BEXFxd69erFs88+y8qVKzl8+LBJA4vazbt/iOH7y3I2tBBClKlCh6CTk5OZNGkS7u7uPPLII4bpkyZNMnyfk5ODk5MTzz77LGlpaezdu5fPP/+c/Px8CgsLTZ9c1EoNunfAytGBwuwcLv8Rg76gAK11rX7olhBCqKJCvxk//fRTdDodK1asKLONg0PRJSePPPIIHTt2BIpu+3j8+HETxBSWwsrOloa9u5ISuYeCjBukHziOR4+OascSQohap0KHoKdOnYqHhwcjR46sVOfW1taGYizqD6+7/z0MLTflEEKI0lWoALu7u/PFF18wbtw4c+cRdYDnnZ3R2hXdV/vyzn0o9fzJWUIIUZpKnYQ1ZMgQo9dPPfUUy5YtIyYmxvBw+qo8IUnULdaODnje2RmA/KvpXD96Ut1AQghRC1Xr7JhTp06xbt06MjMzsf7nRJvZs2fTv39/unbtSufOnav9cHphmbz6h3B5ZwxQdFMO906tVU4khBC1S7UK8M6dO4GiQhwbG8uBAwc4cOAAM2bMID09HSsrK+644w7i4uJMElZYjoZ9uqGxskIpLCR5024CHrkXB5+GascSQohawyTXh7Rs2ZKWLVsyevRow7SEhAT279/PwYMHTbEIYWFsXJxwbOrHjbN/o7t2nT+HT6LNa0/jf3+o2tGEEKJWMNsFmkFBQQQFBfHQQw+ZaxGiFstNvcqNhIv/TlAU4t/9FI87O2Pv7aleMCGEqCWqfCvKCxcuVKr9xYsXy28k6ozsxCS49bakej05icnqBBJCiFqmygW4e/fuPP3008TExJTZ5vr163z22We0b9+eH374oaqLEhbIMcAPtLecEa/V4BDgq04gIYSoZap8CPr48eO8/fbbDBgwAHt7e4KDg/H398fe3p5r165x/Phx4uLi6Nq1KwsWLChxCZOo2+y9PWnz6tPEz1tu2BNuENxeDj8LIcQ/qrwH7OnpycKFC0lKSuKjjz6iZcuWXLlyhVOnTgEQERFBbGwsUVFRUnzrKf/7QwlZ/QFoizaz7HN/y005hBDiH9U+CcvBwYFBgwbx4IMPmiKPqGOcmwXQsHdXrvyxn7zL10g//BcNurRVO5YQQqiuWs8DLubm5iaf8Yoy+Qzobfg+JXKPikmEEKL2MEkBVhSF5cuX07t3b/r06cO0adNue3KWqF8a9glGa2cLQOq2KPQF8nhKIYQwSQEGOHjwIF27dqVPnz7ExcXRt29fXnzxRVN1LyyYtaMDDfsEA6BLz+Ra7DGVEwkhhPpMdiOONWvWMGDAAMPrI0eOMGzYMBo1asTzzz9vqsUIC+UzoDepW6OAosPQniGdVE4khBDqMskesIeHBwEBAUbTOnbsyEcffcSyZctMsQhh4Tx7dsHK0QGAyzui0efrVE4khBDqMkkB7ty5MytXriwxvUWLFpW+Y5aom6zsbPG6qzsABVnZXI0+rHIiIYRQl0kK8Ny5c1m8eDGPPfYYUVFR3Lhxg9TUVN555x2CgoJMsQhRB8jZ0EII8S+TfAZ85513snfvXp577jn69u2L8s+dj+zt7Vm3bp0pFiHqAI/uHbB2daYgI4srf8RQmJuHlb2d2rGEEEIVJjsJq1OnTuzYsYPU1FRiY2PR6/WEhITQsKE8A1YU0drY4H13CJd+3kphTh5X9hzAJ7Sn2rGEEEIVVS7At/tst127dgBkZ2eXaOfu7o6rq2tVFyssnM+A3lz6eStQdBhaCrAQor6qcgEODAys9DwajYaZM2cyY8aMqi5WWLgGXdpi6+FGftp1rv55gIIb2Vg7OaodSwghalyVC7BebqovqkBjZYV3aC/+Xvc7+nwdl3fF4Df4LrVjCSFEjatyAQ4KCkKj0ZTf8BbTpk1j6tSpVV2sqAN8BvTm73W/A0WHoaUACyHqoyoX4FWrVlVpvqocuhZ1i1v7ltj5eJKXcpW06CPormdi4+aidiwhhKhRVS7Ad90ley2iajRaLT5hvbiw+n8ohYWk7thHo2GhascSQogaZbKHMQhRGXJTDiFEfScFWKjCpVUzHBr7AnDtwDHyrl5TOZEQQtQsKcBCFRqN5t+9YL1C6ra96gYSQogaJgVYqEYOQwsh6jMpwEI1zs0CcGpe9BjL60dOkJt8WeVEQghRc6QAC1X5hN20F7w1SsUkQghRs6QAC1X5hPUyfC+HoYUQ9YkUYKEqxwA/XFo3AyDzr7NkJyapnEgIIWqGxRfgwsJC3nzzTYKCgnBwcKB58+a89dZbhmcSAyiKwowZM/Dz88PBwYGwsDBOnTpl1E9aWhoRERG4urri7u7OuHHjyMrKqunVqZeMTsba8qeKSYQQouZYfAGeP38+y5Yt46OPPiI+Pp758+ezYMEClixZYmizYMECFi9ezCeffEJ0dDROTk4MHDiQ3NxcQ5uIiAji4uKIjIxkw4YN7Nq1iwkTJqixSvXOzY8kTNkih6GFEPWDxRfgP//8k2HDhjF06FACAwN58MEHCQ8PZ9++fUDR3u+iRYt44403GDZsGB07duTLL7/k0qVLrF+/HoD4+Hg2btzI559/TkhICH369GHJkiV8++23XLp0ScW1qx/sfb1w69gKgBtnEsk6U/azpoUQoq6o8r2ga4tevXrx6aefcvLkSe644w4OHz7M7t27WbhwIQAJCQkkJycTFhZmmMfNzY2QkBCioqIYPXo0UVFRuLu7061bN0ObsLAwtFot0dHRjBgxosRy8/LyyMvLM7zOyMgAQKfTodPpqrQuxfNVdf6aZsq8De+5k+tHTgCQtPkPAp8aVe0+b1Wfx7cmSF7zkrzmZ4rMlZnX4gvwq6++SkZGBq1bt8bKyorCwkLefvttIiIiAEhOTgbAx8fHaD4fHx/De8nJyXh7exu9b21tjYeHh6HNrebNm8fs2bNLTN+8eTOOjtV7wHxkZGS15q9ppsirKczBUaNBoyic+2Urx/2coAqPu6yI+ji+NUnympfkNb/qZM7Ozq5wW4svwGvXrmX16tWsWbOGdu3acejQIaZNm4a/vz9jxowx23Jfe+01pk+fbnidkZFBQEAA4eHhuLq6VqlPnU5HZGQkAwYMwMbGxlRRzcbUeY/8+RfpsXFor2XSt0UbXFo1M0HKf9X38TU3yWtektf8TJG5+GhoRVh8AX7ppZd49dVXGT16NAAdOnTg/PnzzJs3jzFjxuDrW3TD/5SUFPz8/AzzpaSk0LlzZwB8fX1JTU016regoIC0tDTD/Leys7PDzs6uxHQbG5tqb2ym6KMmmSqvb3hf0mPjALi6PRqP9q2q3Wdp6uv41hTJa16S1/yqk7ky81n8SVjZ2dlotcarYWVlhV6vByAoKAhfX1+2bt1qeD8jI4Po6Gh69iw6+7Znz56kp6cTGxtraLNt2zb0ej0hISE1sBYCwLt/DzRWVkDR5UjKP/+HQghRF1l8Ab7vvvt4++23+fXXXzl37hw//fQTCxcuNJw4pdFomDZtGnPnzuWXX37h6NGjPP744/j7+zN8+HAA2rRpw6BBgxg/fjz79u1jz549TJkyhdGjR+Pv76/i2tUvNm4ueIR0BCAv5SrXj50qZw4hhLBcFn8IesmSJbz55ptMmjSJ1NRU/P39efrpp5kxY4ahzcsvv8yNGzeYMGEC6enp9OnTh40bN2Jvb29os3r1aqZMmUJoaCharZaRI0eyePFiNVapXvMZ0Jurfx4Eim5N6d7RPIehhRBCbRZfgF1cXFi0aBGLFi0qs41Go2HOnDnMmTOnzDYeHh6sWbPGDAlFZXj1647W1gZ9vo7UrX9yx7QxhsPSQghRl1j8IWhRt1g7OeLZqysA+WnXuXbwuMqJhBDCPKQAi1rH6N7Q8oQkIUQdJQVY1DoNe3fFyqHoEq/U7dHoLehOOkIIUVFSgEWtY2VvR8O+3QEoyMgiLeaoyomEEML0pACLWsknrJfhezkMLYSoi6QAi1rJ887OWDsX3VP78s4YCvPyVU4khBCmJQVY1EpaWxu8+hfdhawwO4erUQdVTiSEEKYlBVjUWnI2tBCiLpMCLGqtBsHtsXF3AeDK7lgKsnNUTiSEEKYjBVjUWlprK7zvKXpghj4vn/Nfric39arKqYQQwjSkAIta7ebD0OdW/cie4c9w6Zett5lDCCEsgxRgUavZ+3kZT9ArxL/7qewJCyEsnhRgUavlXEwpOVGvJycxuebDCCGECUkBFrWaY4AfaDTGE7VaHAJ81QkkhBAmIgVY1Gr23p60ee1po2l+g/th7+2pUiIhhDANKcCi1vO/P5SO771ieJ0RfwZFUVRMJIQQ1ScFWFgEr77dcOvYCoAbZxNJiz6sciIhhKgeKcDCYjR55D7D9xe+2aBiEiGEqD4pwMJiePXrhr2/NwBp0YfJOnNB5URCCFF1UoCFxdBYWdHk4aGG1xe+lb1gIYTlkgIsLIrfvXcbHlOYvPEP8q6mqxtICCGqSAqwsCjWTg40Gj4AAEVXwMUfN6mcSAghqkYKsLA4jUcNRmNlBcDfP2yiMDdP5URCCFF5UoCFxbH39sQ7tOgpSbr0TJI37lI5kRBCVJ4UYGGRmjxyr+H7C9/8iqLXq5hGCCEqTwqwsEiubZrj3qUNANnnL3J17yF1AwkhRCVJARYWy+jGHGvkkiQhhGWRAiwsVsM+wTg0Lnoq0rX9R8k8dU7dQEIIUQlSgIXF0mi1NBl982fBshcshLAcUoCFRfMbehfWrk4ApGzeTd7lNJUTCSFExUgBFhbNysGeRiPCAVAKCvn7+40qJxJCiIqRAiwsXsCDg9BY/3Njjp8iKczJVTmREEKUTwqwsHh2Xh74DOgNQEFGFkm/7VQ5kRBClE8KsKgTjG7M8a3cmEMIUftJARZ1gssdQTTo1h6AnMQkruyOVTmREELcnhRgUWcY355SLkkSQtRuUoBFneHZswuOTf0BSD94nIy/zqicSAghyiYFWNQZGq2WgJtuzJH4za8qphFCiNuTAizqFL/B/bBxcwEgZcuf5KZeVTmREEKUTgqwqFOs7O1oNPKfG3MUFvL32t9VTiSEEKWTAizqnMYjB6KxsQbg4vpICrJzVE4khBAlSQEWdY6dZwN8B/YFoCArm6QNO9QNJIQQpagTBfjixYv83//9H56enjg4ONChQwf2799veF9RFGbMmIGfnx8ODg6EhYVx6tQpoz7S0tKIiIjA1dUVd3d3xo0bR1ZWVk2vijCRJqOHGr5P/O5XlMJCFdMIIURJFl+Ar127Ru/evbGxseH333/n+PHjfPDBBzRo0MDQZsGCBSxevJhPPvmE6OhonJycGDhwILm5/94zOCIigri4OCIjI9mwYQO7du1iwoQJaqySMAHnFk3x6NERgJyLKVz+Y385cwghRM2yVjtAdc2fP5+AgABWrlxpmBYUFGT4XlEUFi1axBtvvMGwYcMA+PLLL/Hx8WH9+vWMHj2a+Ph4Nm7cSExMDN26dQNgyZIlDBkyhPfffx9/f/+aXSlhEk0evY+0fUeAohtzNOjdVeVEQgjxL4svwL/88gsDBw7koYceYufOnTRq1IhJkyYxfvx4ABISEkhOTiYsLMwwj5ubGyEhIURFRTF69GiioqJwd3c3FF+AsLAwtFot0dHRjBgxosRy8/LyyMvLM7zOyMgAQKfTodPpqrQuxfNVdf6aVtvzunRti2NgI7LPXeT64b9IO/IXUHvz3qq2j++tJK95SV7zM0Xmysxr8QX47NmzLFu2jOnTp/P//t//IyYmhqlTp2Jra8uYMWNITk4GwMfHx2g+Hx8fw3vJycl4e3sbvW9tbY2Hh4ehza3mzZvH7NmzS0zfvHkzjo6O1VqnyMjIas1f02pzXuu2AdifuwjAwY++gOF9a3Xe0khe85K85mVpeaF6mbOzsyvc1uILsF6vp1u3brzzzjsAdOnShWPHjvHJJ58wZswYsy33tddeY/r06YbXGRkZBAQEEB4ejqura5X61Ol0REZGMmDAAGxsbEwV1WwsIa8+NJ/oP4+jS8/A5kQi+dezCHtwRK3NezNLGN+bSV7zkrzmZ4rMxUdDK8LiC7Cfnx9t27Y1mtamTRt++OEHAHx9fQFISUnBz8/P0CYlJYXOnTsb2qSmphr1UVBQQFpammH+W9nZ2WFnZ1diuo2NTbU3NlP0UZNqdV4bGxo/OIiEz9eCXo/ttgPoQ0OxaVT6/2ttVKvHtxSS17wkr/lVJ3Nl5rP4s6B79+7NiRMnjKadPHmSpk2bAkUnZPn6+rJ161bD+xkZGURHR9OzZ08AevbsSXp6OrGx/z7Cbtu2bej1ekJCQmpgLYQ5NX4gHI2VFQA2f10g+sGpXPplazlzCSGEeVl8AX7++efZu3cv77zzDqdPn2bNmjV8+umnTJ48GQCNRsO0adOYO3cuv/zyC0ePHuXxxx/H39+f4cOHA0V7zIMGDWL8+PHs27ePPXv2MGXKFEaPHi1nQNcB+oIC4+uAFYX4dz+V+0QLIVRl8Yegu3fvzk8//cRrr73GnDlzCAoKYtGiRURERBjavPzyy9y4cYMJEyaQnp5Onz592LhxI/b29oY2q1evZsqUKYSGhqLVahk5ciSLFy9WY5WEiWUnJpWcqNeTk5iMvbdnzQcSQgjqQAEGuPfee7n33nvLfF+j0TBnzhzmzJlTZhsPDw/WrFljjnhCZY4BfqDVgF4xmm7j5qxSIiGEqAOHoIUoj723J21efRq0xpv7qY++kltUCiFUIwVY1Av+94cSsu5Dcob3wdq1aM83be9hzv53ncrJhBD1lRRgUW/YeXtS2CaQtm89V3RIGji34geu7I4tZ04hhDA9KcCi3nHv2o4Wk/49SS9u1uLST9QSQggzkgIs6qUmEffjdXfRNd4FWdkcffV9CnPzyplLCCFMRwqwqJc0Gg1t35iMY9NGAGSducBf7y5HUZRy5hRCCNOQAizqLWsnBzq++yJWjkXXgydv/IO/f9ikciohRH0hBVjUa05BjWnz+iTD61P/WUX6kRO3mUMIIUxDCrCo93xCe9Lk0fsAUAoLOfb6B+RdvaZyKiFEXScFWAig+aQI3LsUPVUr7/I1jr3xH/QFBSqnEkLUZVKAhQC01la0n/s8dl4NAEg/GM+Zj+XWpEII85ECLMQ/7Dzd6fDOC2isix5deGHN/0jZGqVyKiFEXSUFWIibuHVoRctpYw2v4+cu5UbC3+oFEkLUWVKAhbhF45ED8R3UF4DCnDyOvPoeBTeyVU4lhKhrpAALcQuNRkPrV5/GuUVTALLPX+L4Wx/LTTqEECYlBViIUljZ29Fh3gtYOzsCcHlHNBdW/6JyKiFEXSIFWIgyOAb40W7WVMPr0x+vJm3/URUTCSHqEinAQtxGwz7BBD45suiFXuHYm4vITb2qbighRJ0gBViIcjQb9xAed3YCQHctg8MvvsvVvYekEAshqkUKsBDl0FhZ0X72c9j7egGQdfIch6a9zZ7hz3Dpl60qpxNCWCopwEJUgI2bC61efsp4ol4hft5ycpIvqxNKCGHRpAALUUFaO9uSExWFA5NmkrptL4peX/OhhBAWSwqwEBXkGOAHWk2J6bmXLnP0/33AvjEvc3lXjFwvLISoECnAQlSQvbcnbV59GrT//NhoNNj7exvezzp1niMvLyBm7Ctc2R0rhVgIcVvWagcQwpL43x+Kx52dyUlMxiHAFzsvD65GHeTsZ2vJjD8DQOaJBA6/+C6ubZsT9NTDePbsjEZTcs9ZCFG/SQEWopLsvT2x9/Y0vG7YqyuePbtwZXcsCZ+tJfNkAgAZx89wePo7uLZvSbPxD+PRo6MUYiGEgRRgIUxAo9Hg1bcbDfsEc2VXDGc/W0vW6fMAZBw7xaHn5uLWsRXNJjxMg+D2UoiFEFKAhTAljUaD1109aNi3G5d37OPs52u5cTYRgOtHTnBwyhzcu7Sl2fhRODT2JTsxCccAP6M9aiFE/SAFWAgz0Gi1eN9zJ179e5C6NYqzn68j+/xFANIPHufApFk3NdbQYvL/0STiPtkzFqIekQIshBlptFp8BvTG+547SdnyJwn/XUf2hSTjRorC6Y++4uzna3EKaoxTE38cmzbCrrEP2tRr6PPywcZGnRUQQpiNFGAhaoDGygrfgX3xDu3F2U+/5fyX60u00efmkRl/xnA2NYAjsHvFbzj4e+PYxB/Hpv44BTbCsWkjHJv4oy8oIOfv5Gofxs5NvSqHw4WoYVKAhahBWmsrGj84iPNf/wx64+uE7X0bkptyFW69flhRyLmYQs7FFK5GHSyzb6dmjXFs0ggrBzus7O2wcrDHysEOrZ1d0TQH+3+m22Fl/897DnZc2R3LmY/XFC1Xq6HVC+Pwv/8eNFotaLUVPiyel3oVq/PJ5KVexaaRb6XHppip/hgwRT+1KYuMr/n7MdUYV5QUYCFqWPENPeLf/RT0etBqafPqBPzvD6UwL5+cv5O5cf4imWcTOR21nwaFGnIuXKIwO/e2/d44+zc3zv5dvXB6hRPvfc6J9z7/d5pGg0arRWP1T0H+53tDgbbSos/LpyDzBg5A9Jot2DRwxdrJ8d/5NUX/wj/FXFN0whoazU2TNOgys8hLTTMs2s7HExs3l3+jUMYfA7dMzk/PJC/lyr/9+DbE1t3VqI2iKDhcv86BH/eU+kdGfnoGeck39eHnVaKPishPzyAv6d/7hVeln+I+isdXzSwV7UdRFBzS0znw059lj28NZalMPw5A9LdbafPq0/jfH1rpfipDCrAQKrj1hh7Ff7Vb2dni3LwJzs2b4NG3G3FednQdMgRra2vyr1zjxvmLZJ+7xNX9R7iyY1/NhFUUlMJClMLCCs+iu5aB7lpGtRedl3KVvJTqP/YxL/mKUTEtZgVkJaeVnKG0PpIuG/2ir3IWE/RTm7Lcrh9LHV/0CvHvforHnZ3N+pGMFGAhVHLrDT1uR6PRYOflgZ2XBx7dOtCwXzeu7IoxPoyt1dLt87exdnKgMCePwtw89Dm5FObmU5ibWzQtJ4/C3Fz0//ybn3ad1G17SyzPtW0LNFZWRQ+YUPQohXoU/T9fhXq46fvC3LxSi62VkwMaKytAAQXDoXVF+ec1yk3TKCryuoKS625thUarLfvWnrdMV/RK0ZGFW5VyOF2v6NFqSt6RV1HK6kNTqTPVi/opJXcl+jFFH2r0o1D0f6HRljxuYRHrpNeTk5gsBVgIYaysw9hubVtUuq9Lv2wt9XB4ReWmXmXP8GdK/DFw5zf/qdQvr7L66fXjUpP003v9x0b96HQ6fvvtN4YMGYLNLWeZV7QPU2Uxdx9q9GMp43u7fhwCzPs5sDyMQQgL5X9/KL3Xf0zXpbPovf7jKn9eVd1+Sjyk4p8iXtk9h9rUj2Qxbz+1KYsp+6ks2QMWwoJV5jC2Ofvxvz8U1+B27PjhZ/qPHIZzFc8gLeuzcTX6qW1ZZHzN348pxrgypAALIUzCztuTwqa+2FXzD4La8kdFbcsi42v+fkw1xhUlh6CFEEIIFUgBFkIIIVQgBVgIIYRQQZ0qwO+++y4ajYZp06YZpuXm5jJ58mQ8PT1xdnZm5MiRpKSkGM134cIFhg4diqOjI97e3rz00ksUFJS8HlEIIYQwlTpTgGNiYli+fDkdO3Y0mv7888/zv//9j3Xr1rFz504uXbrEAw88YHi/sLCQoUOHkp+fz59//skXX3zBqlWrmDFjRk2vghBCiHqkThTgrKwsIiIi+Oyzz2jQoIFh+vXr1/nvf//LwoULueeeewgODmblypX8+eef7N1bdPefzZs3c/z4cb7++ms6d+7M4MGDeeutt1i6dCn5+flqrZIQQog6rk5chjR58mSGDh1KWFgYc+fONUyPjY1Fp9MRFhZmmNa6dWuaNGlCVFQUd955J1FRUXTo0AEfHx9Dm4EDB/LMM88QFxdHly5dSl1mXl4eeXl5htcZGUW34tPpdOh0uiqtR/F8VZ2/pkle85K85iV5zcvS8oJpMldmXosvwN9++y0HDhwgJiamxHvJycnY2tri7u5uNN3Hx4fk5GRDm5uLb/H7xe+VZd68ecyePbvE9PXr1+Po6FjZ1TDy888/V2v+miZ5zUvympfkNS9LywvVy5ydnQ1Q9r3Lb2LRBTgxMZHnnnuOyMhI7O3ta3TZr732GtOnTze8vnjxIm3btuWpp56q0RxCCCFqn8zMTNzc3G7bxqILcGxsLKmpqXTt2tUwrbCwkF27dvHRRx+xadMm8vPzSU9PN9oLTklJwde36DZjvr6+7Ntn/Fi34rOki9uUxs7ODjs7O8NrZ2dnEhMTcXFxqdRTOG6WkZFBQEAAiYmJuLpW/nmWNU3ympfkNS/Ja16WlhdMk1lRFDIzM/H39y+3rUUX4NDQUI4ePWo07YknnqB169a88sorBAQEYGNjw9atWxk5ciQAJ06c4MKFC/Ts2ROAnj178vbbb5Oamoq3tzcAkZGRuLq60rZt2wpn0Wq1NG7c2CTr5erqajEbLEhec5O85iV5zcvS8kL1M5e351vMoguwi4sL7du3N5rm5OSEp6enYfq4ceOYPn06Hh4euLq68uyzz9KzZ0/uvPNOAMLDw2nbti2PPfYYCxYsIDk5mTfeeIPJkycb7eEKIYQQpmTRBbgi/vOf/6DVahk5ciR5eXkMHDiQjz/+2PC+lZUVGzZs4JlnnqFnz544OTkxZswY5syZo2JqIYQQdV2dK8A7duwwem1vb8/SpUtZunRpmfM0bdqU3377zczJymdnZ8fMmTMtZs9b8pqX5DUvyWtelpYXaj6zRqnIudJCCCGEMKk6cScsIYQQwtJIARZCCCFUIAVYCCGEUIEUYCGEEEIFUoBr2NKlSwkMDMTe3p6QkJASd+G61bp162jdujX29vZ06NChxs7WnjdvHt27d8fFxQVvb2+GDx/OiRMnbjvPqlWr0Gg0Rl81dYvQWbNmlVh269atbzuPWmNbLDAwsERmjUbD5MmTS21f0+O7a9cu7rvvPvz9/dFoNKxfv97ofUVRmDFjBn5+fjg4OBAWFsapU6fK7beyPwOmyKvT6XjllVfo0KEDTk5O+Pv78/jjj3Pp0qXb9lmV7coUeQHGjh1bYtmDBg0qt181xhcodVvWaDS89957ZfZprvGtyO+vijwr/lZV3ebLIgW4Bn333XdMnz6dmTNncuDAATp16sTAgQNJTU0ttf2ff/7JI488wrhx4zh48CDDhw9n+PDhHDt2zOxZd+7cyeTJk9m7dy+RkZHodDrCw8O5cePGbedzdXUlKSnJ8HX+/HmzZy3Wrl07o2Xv3r27zLZqjm2xmJgYo7yRkZEAPPTQQ2XOU5Pje+PGDTp16lTmJXwLFixg8eLFfPLJJ0RHR+Pk5MTAgQPJzc0ts8/K/gyYKm92djYHDhzgzTff5MCBA/z444+cOHGC+++/v9x+K7NdmSpvsUGDBhkt+5tvvrltn2qNL2CUMykpiRUrVqDRaAx3ISyLOca3Ir+/yntWfGmqss3fliJqTI8ePZTJkycbXhcWFir+/v7KvHnzSm0/atQoZejQoUbTQkJClKefftqsOUuTmpqqAMrOnTvLbLNy5UrFzc2t5kLdZObMmUqnTp0q3L42jW2x5557TmnevLmi1+tLfV/N8QWUn376yfBar9crvr6+ynvvvWeYlp6ertjZ2SnffPNNmf1U9mfAVHlLs2/fPgVQzp8/X2abym5XVVVa3jFjxijDhg2rVD+1aXyHDRum3HPPPbdtU1Pje+vvr/T0dMXGxkZZt26doU18fLwCKFFRUaX2UdVt/nZkD7iG5OfnExsba/RsYq1WS1hYGFFRUaXOExUVZdQeip5VXFZ7c7p+/ToAHh4et22XlZVF06ZNCQgIYNiwYcTFxdVEPABOnTqFv78/zZo1IyIiggsXLpTZtjaNLRRtH19//TVPPvnkbR/moeb43iwhIYHk5GSjMXRzcyMkJKTMMazKz4A5Xb9+HY1GU+JxpbeqzHZlajt27MDb25tWrVrxzDPPcPXq1TLb1qbxTUlJ4ddff2XcuHHltq2J8b3191d5z4ovTVW2+fJIAa4hV65cobCwsNRnD5f13OGynlV8u+cUm4Ner2fatGn07t27xL23b9aqVStWrFjBzz//zNdff41er6dXr178/fffZs8YEhLCqlWr2LhxI8uWLSMhIYG+ffuSmZlZavvaMrbF1q9fT3p6OmPHji2zjZrje6vicarMGFblZ8BccnNzeeWVV3jkkUdue9P9ym5XpjRo0CC+/PJLtm7dyvz589m5cyeDBw+msLCw1Pa1aXy/+OILXFxcyj2kWxPjW9rvr4o8K/5WVdnmy1PnbkUpTG/y5MkcO3as3M9mevbsaXjKFECvXr1o06YNy5cv56233jJrxsGDBxu+79ixIyEhITRt2pS1a9dW6K9wtf33v/9l8ODBt32EmZrjW5fodDpGjRqFoigsW7bstm3V3K5Gjx5t+L5Dhw507NiR5s2bs2PHDkJDQ8267OpasWIFERER5Z4kWBPjW9HfX2qQPeAa0rBhQ6ysrEqcZXfzs4lv5evrW6n25jBlyhQ2bNjA9u3bK/24RRsbG7p06cLp06fNlK5s7u7u3HHHHWUuuzaMbbHz58+zZcsWnnrqqUrNp+b4Fo9TZcawKj8DplZcfM+fP2947GhllLddmVOzZs1o2LBhmcuuDeML8Mcff3DixIlKb89g+vEt6/eXr6+v4VnxNyvv93Fxm4rOUx4pwDXE1taW4OBgtm7dapim1+vZunWr0V7NzXr27GnUHoqeVVxWe1NSFIUpU6bw008/sW3bNoKCgirdR2FhIUePHsXPz88MCW8vKyuLM2fOlLlsNcf2VitXrsTb25uhQ4dWaj41xzcoKAhfX1+jMczIyCA6OrrMMazKz4ApFRffU6dOsWXLFjw9PSvdR3nblTn9/fffXL16tcxlqz2+xf773/8SHBxMp06dKj2vqca3vN9fwcHBhmfFF7v1WfG3qso2X5GgooZ8++23ip2dnbJq1Srl+PHjyoQJExR3d3clOTlZURRFeeyxx5RXX33V0H7Pnj2KtbW18v777yvx8fHKzJkzFRsbG+Xo0aNmz/rMM88obm5uyo4dO5SkpCTDV3Z2tqHNrXlnz56tbNq0STlz5owSGxurjB49WrG3t1fi4uLMnveFF15QduzYoSQkJCh79uxRwsLClIYNGyqpqamlZlVzbG9WWFioNGnSRHnllVdKvKf2+GZmZioHDx5UDh48qADKwoULlYMHDxrOGn733XcVd3d35eeff1aOHDmiDBs2TAkKClJycnIMfdxzzz3KkiVLDK/L+xkwV978/Hzl/vvvVxo3bqwcOnTIaJvOy8srM29525W58mZmZiovvviiEhUVpSQkJChbtmxRunbtqrRs2VLJzc0tM69a41vs+vXriqOjo7Js2bJS+6ip8a3I76+JEycqTZo0UbZt26bs379f6dmzp9KzZ0+jflq1aqX8+OOPhtcV2eYrQwpwDVuyZInSpEkTxdbWVunRo4eyd+9ew3t33XWXMmbMGKP2a9euVe644w7F1tZWadeunfLrr7/WSE6g1K+VK1eWmXfatGmGdfPx8VGGDBmiHDhwoEbyPvzww4qfn59ia2urNGrUSHn44YeV06dPl5lVUdQb25tt2rRJAZQTJ06UeE/t8d2+fXup20BxJr1er7z55puKj4+PYmdnp4SGhpZYj6ZNmyozZ840mna7nwFz5U1ISChzm96+fXuZecvbrsyVNzs7WwkPD1e8vLwUGxsbpWnTpsr48eNLFNLaMr7Fli9frjg4OCjp6eml9lFT41uR3185OTnKpEmTlAYNGiiOjo7KiBEjlKSkpBL93DxPRbb5ypDHEQohhBAqkM+AhRBCCBVIARZCCCFUIAVYCCGEUIEUYCGEEEIFUoCFEEIIFUgBFkIIIVQgBVgIIYRQgRRgIYTZBQYGsmjRIrVjCFGrSAEWoo4ZO3Ysw4cPB6B///5Mmzatxpa9atWqUp+vGxMTw4QJE2oshxCWQB5HKIQoV35+Pra2tlWe38vLy4RphKgbZA9YiDpq7Nix7Ny5kw8//BCNRoNGo+HcuXMAHDt2jMGDB+Ps7IyPjw+PPfYYV65cMczbv39/pkyZwrRp02jYsCEDBw4EYOHChXTo0AEnJycCAgKYNGkSWVlZAOzYsYMnnniC69evG5Y3a9YsoOQh6AsXLjBs2DCcnZ1xdXVl1KhRRo95mzVrFp07d+arr74iMDAQNzc3Ro8ebfSg9u+//54OHTrg4OCAp6cnYWFh3Lhxw0yjKYTpSQEWoo768MMP6dmzJ+PHjycpKYmkpCQCAgJIT0/nnnvuoUuXLuzfv5+NGzeSkpLCqFGjjOb/4osvsLW1Zc+ePXzyyScAaLVaFi9eTFxcHF988QXbtm3j5ZdfBqBXr14sWrQIV1dXw/JefPHFErn0ej3Dhg0jLS2NnTt3EhkZydmzZ3n44YeN2p05c4b169ezYcMGNmzYwM6dO3n33XcBSEpK4pFHHuHJJ58kPj6eHTt28MADDyC3theWRA5BC1FHubm5YWtri6Ojo9EDwz/66CO6dOnCO++8Y5i2YsUKAgICOHnyJHfccQcALVu2ZMGCBUZ93vx5cmBgIHPnzmXixIl8/PHH2Nra4ubmhkajue0Dyrdu3crRo0dJSEggICAAgC+//JJ27doRExND9+7dgaJCvWrVKlxcXAB47LHH2Lp1K2+//TZJSUkUFBTwwAMP0LRpUwA6dOhQjdESoubJHrAQ9czhw4fZvn07zs7Ohq/WrVsDRXudxYKDg0vMu2XLFkJDQ2nUqBEuLi489thjXL16lezs7AovPz4+noCAAEPxBWjbti3u7u7Ex8cbpgUGBhqKL4Cfnx+pqakAdOrUidDQUDp06MBDDz3EZ599xrVr1yo+CELUAlKAhahnsrKyuO+++zh06JDR16lTp+jXr5+hnZOTk9F8586d495776Vjx4788MMPxMbGsnTpUqDoJC1Ts7GxMXqt0WjQ6/UAWFlZERkZye+//07btm1ZsmQJrVq1IiEhweQ5hDAXKcBC1GG2trYUFhYaTevatStxcXEEBgbSokULo69bi+7NYmNj0ev1fPDBB9x5553ccccdXLp0qdzl3apNmzYkJiaSmJhomHb8+HHS09Np27ZthddNo9HQu3dvZs+ezcGDB7G1teWnn36q8PxCqE0KsBB1WGBgINHR0Zw7d44rV66g1+uZPHkyaWlpPPLII8TExHDmzBk2bdrEE088cdvi2aJFC3Q6HUuWLOHs2bN89dVXhpOzbl5eVlYWW7du5cqVK6Uemg4LC6NDhw5ERERw4MAB9u3bx+OPP85dd91Ft27dKrRe0dHRvPPOO+zfv58LFy7w448/cvnyZdq0aVO5ARJCRVKAhajDXnzxRaysrGjbti1eXl5cuHABf39/9uzZQ2FhIeHh4XTo0IFp06bh7u6OVlv2r4ROnTqxcOFC5s+fT/v27Vm9ejXz5s0zatOrVy8mTpzIww8/jJeXV4mTuKBoz/Xnn3+mQYMG9OvXj7CwMJo1a8Z3331X4fVydXVl165dDBkyhDvuuIM33niDDz74gMGDB1d8cIRQmUaR8/aFEEKIGid7wEIIIYQKpAALIYQQKpACLIQQQqhACrAQQgihAinAQgghhAqkAAshhBAqkAIshBBCqEAKsBBCCKECKcBCCCGECqQACyGEECqQAiyEEEKoQAqwEEIIoYL/D7wxSmNXG5aBAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "plot_histories(histories, labels)" ] @@ -617,37 +453,10 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "id": "a6fd1e33-3620-4f3b-b705-a120f6da0027", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "100%|███████████████████████████████████████████████████████████████████████████| 500/500 [00:03<00:00, 139.57trial/s, best loss: 828.4416826609863]\n", - "New optimized step at iteration 1/20: 0.007905620677085556\n", - "New optimized step at iteration 2/20: 0.007805271769771582\n", - "New optimized step at iteration 3/20: 0.010246844819985524\n", - "New optimized step at iteration 4/20: 0.005907716931047463\n", - "New optimized step at iteration 5/20: 0.009034340720421006\n", - "New optimized step at iteration 6/20: 0.005354106626311928\n", - "New optimized step at iteration 7/20: 0.00641629177927186\n", - "New optimized step at iteration 8/20: 0.009953940710537906\n", - "New optimized step at iteration 9/20: 0.0058391008557497955\n", - "New optimized step at iteration 10/20: 0.008776919053600729\n", - "New optimized step at iteration 11/20: 0.004927886698230342\n", - "New optimized step at iteration 12/20: 0.0029794074593601505\n", - "New optimized step at iteration 13/20: 0.0009112070946712646\n", - "New optimized step at iteration 14/20: 0.018740586232013773\n", - "New optimized step at iteration 15/20: 0.00024087612658448834\n", - "New optimized step at iteration 16/20: 0.0018747278198779527\n", - "New optimized step at iteration 17/20: 0.0011877968058805026\n", - "New optimized step at iteration 18/20: 0.025601681401882653\n", - "New optimized step at iteration 19/20: 0.0021360282290642726\n" - ] - } - ], + "outputs": [], "source": [ "# restart\n", "dbf_2 = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=iterationtype)\n", @@ -685,21 +494,10 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "id": "0f0212bf-b642-4fea-9203-037876e0b266", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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/e9/ef3118t87KoTScBWRON964T29dFxKQn2L99D99GR+DXwt2BkQtiGm9fSSEtIrXQ96ddumiCakt17771GTbRubm4lll20aBFNmjRBo9GwY8cOwzOohw4dIj09vchIYFlZWZw5cwaAuLg4nn/+eaP1ERERbNq0qcT9vfDCCzz00EPs37+fPn36MGTIEO65554Sy2dkZHDmzBlGjhzJs88+a1iel5eHp6dnkX3r2dvb07FjR+Li4kqsu7qz6iborVu3MmjQIIKDg1EUhZUrV5ZY9vnnn0dRFObOnWu0PCkpiaioKDw9PfH29mbkyJGkp6cblTl8+DDdunXD2dmZkJAQZs2aZYZvUzrF+9YVcKsedQDQ5evYMOcvi8QjhK3x8PPEM9CrzC/XWu7F1uPu51Guejz8PIutpyRubm40atTI8LrTmMKHDh0iIyODjIwMrl69alienp5OUFAQBw8eNHqdOHGC114r+9X47fr378/58+d5+eWXuXz5Mr169eLVV18tsbz+9+lXX31lFMfhw4eJjo6ucBw1gVVfAWdkZNCmTRuefvppQ9NGcVasWMGuXbsIDg4usi4qKoorV64QHR2NVqvlqaeeYtSoUYaODWlpafTp04fIyEi++OILjhw5wtNPP423tzejRo0y23crTuEEXL+JG26+9mQkZXD4j/30HNObwGZFv58Q4pbyNAPrdDrS0tI4ufoYK//fT6j5KoqdwtAPhtFpWETpFVSBpKQkRowYwdtvv83ly5cZNWoU+/fvx83Njfbt25OQkIC9vb1RM3FhzZo1Y/fu3Tz55JOGZbt27Sp1v35+fgwfPpzhw4fTrVs3XnvtNT788EMcHR0BjKbqCwgIIDg4mLNnzxIVFWVYrj++he3atYvu3bsDBVfI+/btMzSp10RWnYD79+9P//7971jm0qVLvPjii6xdu5aBAwcarYuLi2PNmjXExMQY7mfMmzePAQMG8OGHHxIcHMzSpUvJzc1l0aJFODo60qJFCw4ePMicOXOqPAEXboJWMm/QY8xQVr+3ElVVif5oNU98/UyVxiNETdBx2N00vbcZN85dp1ZobbyCfCwdksHzzz9PSEgI77zzDllZWbRr147XXnuNzz//nMjISCIiIhgyZAizZs2iSZMmXL58mT///JOhQ4fSsWNHxo0bx4gRI+jYsSNdunRh6dKlxMbG0qBB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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "plot_histories(histories, labels)" ] @@ -714,45 +512,30 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "id": "82b89092-07e5-4788-9ae0-8907df2428eb", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "visualize_matrix(dbf_1.h.matrix)" ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "id": "ac8ed320-04a8-42af-a980-48ab4f1fff7c", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "visualize_matrix(dbf_2.h.matrix)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -771,7 +554,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.0" + "version": "3.11.4" } }, "nbformat": 4, diff --git a/src/qibo/models/dbi/double_bracket.py b/src/qibo/models/dbi/double_bracket.py index 486dad8be0..2291cb8d57 100644 --- a/src/qibo/models/dbi/double_bracket.py +++ b/src/qibo/models/dbi/double_bracket.py @@ -8,7 +8,7 @@ from qibo.hamiltonians import Hamiltonian -class IterationGeneratorType(Enum): +class DoubleBracketGeneratorType(Enum): """Define DBF evolution.""" canonical = auto() @@ -27,13 +27,13 @@ class DoubleBracketIteration: Args: hamiltonian (Hamiltonian): Starting Hamiltonian; - mode (IterationGeneratorType): type of generator of the evolution. + mode (DoubleBracketGeneratorType): type of generator of the evolution. Example: .. testcode:: import numpy as np - from qibo.models.double_bracket import DoubleBracketIteration, IterationGeneratorType + from qibo.models.double_bracket import DoubleBracketIteration, DoubleBracketGeneratorType from qibo.quantum_info import random_hermitian nqubits = 4 @@ -47,31 +47,31 @@ class DoubleBracketIteration: def __init__( self, hamiltonian: Hamiltonian, - mode: IterationGeneratorType = IterationGeneratorType.canonical, + mode: DoubleBracketGeneratorType = DoubleBracketGeneratorType.canonical, ): self.h = hamiltonian self.h0 = deepcopy(self.h) self.mode = mode def __call__( - self, step: float, mode: IterationGeneratorType = None, d: np.array = None + self, step: float, mode: DoubleBracketGeneratorType = None, d: np.array = None ): if mode is None: mode = self.mode - if mode is IterationGeneratorType.canonical: + if mode is DoubleBracketGeneratorType.canonical: operator = self.backend.calculate_matrix_exp( 1.0j * step, self.commutator(self.diagonal_h_matrix, self.h.matrix), ) - elif mode is IterationGeneratorType.single_commutator: + elif mode is DoubleBracketGeneratorType.single_commutator: if d is None: raise_error(ValueError, f"Cannot use group_commutator with matrix {d}") operator = self.backend.calculate_matrix_exp( 1.0j * step, self.commutator(d, self.h.matrix), ) - elif mode is IterationGeneratorType.group_commutator: + elif mode is DoubleBracketGeneratorType.group_commutator: if d is None: raise_error(ValueError, f"Cannot use group_commutator with matrix {d}") operator = ( diff --git a/tests/test_models_dbi.py b/tests/test_models_dbi.py index 064f3375cc..a3b22d1bbe 100644 --- a/tests/test_models_dbi.py +++ b/tests/test_models_dbi.py @@ -4,8 +4,8 @@ from qibo.hamiltonians import Hamiltonian from qibo.models.dbi.double_bracket import ( + DoubleBracketGeneratorType, DoubleBracketIteration, - IterationGeneratorType, ) from qibo.quantum_info import random_hermitian @@ -17,7 +17,8 @@ def test_double_bracket_iteration_canonical(backend, nqubits): h0 = random_hermitian(2**nqubits, backend=backend) dbf = DoubleBracketIteration( - Hamiltonian(nqubits, h0, backend=backend), mode=IterationGeneratorType.canonical + Hamiltonian(nqubits, h0, backend=backend), + mode=DoubleBracketGeneratorType.canonical, ) initial_off_diagonal_norm = dbf.off_diagonal_norm for _ in range(NSTEPS): @@ -32,12 +33,12 @@ def test_double_bracket_iteration_group_commutator(backend, nqubits): d = backend.cast(np.diag(np.diag(backend.to_numpy(h0)))) dbf = DoubleBracketIteration( Hamiltonian(nqubits, h0, backend=backend), - mode=IterationGeneratorType.group_commutator, + mode=DoubleBracketGeneratorType.group_commutator, ) initial_off_diagonal_norm = dbf.off_diagonal_norm with pytest.raises(ValueError): - dbf(mode=IterationGeneratorType.group_commutator, step=0.01) + dbf(mode=DoubleBracketGeneratorType.group_commutator, step=0.01) for _ in range(NSTEPS): dbf(step=0.01, d=d) @@ -51,12 +52,12 @@ def test_double_bracket_iteration_single_commutator(backend, nqubits): d = backend.cast(np.diag(np.diag(backend.to_numpy(h0)))) dbf = DoubleBracketIteration( Hamiltonian(nqubits, h0, backend=backend), - mode=IterationGeneratorType.single_commutator, + mode=DoubleBracketGeneratorType.single_commutator, ) initial_off_diagonal_norm = dbf.off_diagonal_norm with pytest.raises(ValueError): - dbf(mode=IterationGeneratorType.single_commutator, step=0.01) + dbf(mode=DoubleBracketGeneratorType.single_commutator, step=0.01) for _ in range(NSTEPS): dbf(step=0.01, d=d) @@ -81,7 +82,7 @@ def test_hyperopt_step(backend, nqubits): assert step != initial_step # evolve following the optimized first step - for generator in IterationGeneratorType: + for generator in DoubleBracketGeneratorType: dbf(mode=generator, step=step, d=d) # find the following step size with look_ahead @@ -96,7 +97,7 @@ def test_hyperopt_step(backend, nqubits): # evolve following the optimized first step for gentype in range(look_ahead): - dbf(mode=IterationGeneratorType(gentype + 1), step=step, d=d) + dbf(mode=DoubleBracketGeneratorType(gentype + 1), step=step, d=d) def test_energy_fluctuations(backend): From dc4f362fc3f51ed282f1045575add26c1c47d569 Mon Sep 17 00:00:00 2001 From: simone bordoni Date: Fri, 24 Nov 2023 15:14:49 +0400 Subject: [PATCH 067/143] corrections from reviews --- doc/source/code-examples/advancedexamples.rst | 7 +- src/qibo/transpiler/abstract.py | 95 ------------------ src/qibo/transpiler/decompositions.py | 11 +-- src/qibo/transpiler/pipeline.py | 7 +- src/qibo/transpiler/placer.py | 3 +- src/qibo/transpiler/router.py | 28 +++++- src/qibo/transpiler/unroller.py | 96 ++++++++++++------- tests/test_transpiler_abstract.py | 23 ----- tests/test_transpiler_blocks.py | 1 - tests/test_transpiler_decompositions.py | 39 ++++---- tests/test_transpiler_pipeline.py | 9 +- tests/test_transpiler_router.py | 21 +--- tests/test_transpiler_unroller.py | 11 ++- 13 files changed, 134 insertions(+), 217 deletions(-) delete mode 100644 tests/test_transpiler_abstract.py diff --git a/doc/source/code-examples/advancedexamples.rst b/doc/source/code-examples/advancedexamples.rst index 6b9b526cca..821b6e1141 100644 --- a/doc/source/code-examples/advancedexamples.rst +++ b/doc/source/code-examples/advancedexamples.rst @@ -2011,10 +2011,9 @@ Multiple transpilation steps can be implemented using the :class:`qibo.transpile from qibo import gates from qibo.models import Circuit from qibo.transpiler.pipeline import Passes, assert_transpiling - from qibo.transpiler.abstract import NativeGates from qibo.transpiler.optimizer import Preprocessing from qibo.transpiler.router import ShortestPaths - from qibo.transpiler.unroller import DefaultUnroller + from qibo.transpiler.unroller import Unroller, NativeGates from qibo.transpiler.placer import Random # Define connectivity as nx.Graph @@ -2040,7 +2039,7 @@ Multiple transpilation steps can be implemented using the :class:`qibo.transpile # Routing step custom_passes.append(ShortestPaths(connectivity=star_connectivity())) # Gate decomposition step - custom_passes.append(DefaultUnroller(native_gates=NativeGates.default())) + custom_passes.append(Unroller(native_gates=NativeGates.default())) # Define the general pipeline custom_pipeline = Passes(custom_passes, connectivity=star_connectivity(), native_gates=NativeGates.default()) @@ -2061,6 +2060,6 @@ Multiple transpilation steps can be implemented using the :class:`qibo.transpile ) In this case circuits will first be transpiled to respect the 5-qubit star connectivity, with qubit 2 as the middle qubit. This will potentially add some SWAP gates. -Then all gates will be converted to native. The :class:`qibo.transpiler.unroller.NativeGates` transpiler used in this example assumes Z, RZ, GPI2 or U3 as +Then all gates will be converted to native. The :class:`qibo.transpiler.unroller.Unroller` transpiler used in this example assumes Z, RZ, GPI2 or U3 as the single-qubit native gates, and supports CZ and iSWAP as two-qubit natives. In this case we restricted the two-qubit gate set to CZ only. The final_layout contains the final logical-physical qubit mapping. diff --git a/src/qibo/transpiler/abstract.py b/src/qibo/transpiler/abstract.py index 2ae59c24cc..439045e72a 100644 --- a/src/qibo/transpiler/abstract.py +++ b/src/qibo/transpiler/abstract.py @@ -1,66 +1,11 @@ from abc import ABC, abstractmethod -from enum import Flag, auto from typing import Tuple import networkx as nx -from qibo import gates -from qibo.config import raise_error from qibo.models import Circuit -class NativeGates(Flag): - """Define native gates supported by the unroller. - A native gate set should contain at least one two-qubit gate (CZ or iSWAP) - and at least one single qubit gate (GPI2 or U3). - Gates I, Z, RZ and M are always included in the single qubit native gates set. - - Should have the same names with qibo gates. - """ - - I = auto() - Z = auto() - RZ = auto() - M = auto() - GPI2 = auto() - U3 = auto() - CZ = auto() - iSWAP = auto() - - @classmethod - def default(cls): - """Return default native gates set.""" - return cls.CZ | cls.GPI2 | cls.I | cls.Z | cls.RZ | cls.M - - @classmethod - def from_gatelist(cls, gatelist: list): - """Create a NativeGates object containing all gates from a gatelist.""" - natives = cls(0) - for gate in gatelist: - natives |= cls.from_gate(gate) - return natives - - @classmethod - def from_gate(cls, gate: gates.Gate): - """Create a NativeGates object from a gate. - The gate can be either a class:`qibo.gates.Gate` or an instance of this class. - """ - if isinstance(gate, gates.Gate): - return cls.from_gate(gate.__class__) - try: - return getattr(cls, gate.__name__) - except AttributeError: - raise ValueError(f"Gate {gate} cannot be used as native.") - - def single_qubit_natives(self): - """Return single qubit native gates in the native gates set.""" - return self & (self.GPI2 | self.U3) | (self.I | self.Z | self.RZ | self.M) - - def two_qubit_natives(self): - """Return two qubit native gates in the native gates set.""" - return self & (self.CZ | self.iSWAP) - - class Placer(ABC): @abstractmethod def __init__(self, connectivity: nx.Graph, *args): @@ -111,43 +56,3 @@ def __call__(self, circuit: Circuit, *args) -> Circuit: Returns: (:class:`qibo.models.circuit.Circuit`): circuit with optimized number of gates. """ - - -class Unroller(ABC): - @abstractmethod - def __init__(self, native_gates: NativeGates, *args): - """An unroller decomposes gates into native gates.""" - - @abstractmethod - def __call__(self, circuit: Circuit, *args) -> Circuit: - """Find initial qubit mapping - - Args: - circuit (:class:`qibo.models.circuit.Circuit`): circuit to be optimized - - Returns: - (:class:`qibo.models.circuit.Circuit`): circuit with native gates. - """ - - -def _find_gates_qubits_pairs(circuit: Circuit): - """Translate qibo circuit into a list of pairs of qubits to be used by the router and placer. - - Args: - circuit (:class:`qibo.models.circuit.Circuit`): circuit to be transpiled. - - Returns: - (list): list containing qubits targeted by two qubit gates. - """ - translated_circuit = [] - for gate in circuit.queue: - if isinstance(gate, gates.M): - pass - elif len(gate.qubits) == 2: - translated_circuit.append(sorted(gate.qubits)) - elif len(gate.qubits) >= 3: - raise_error( - ValueError, "Gates targeting more than 2 qubits are not supported" - ) - - return translated_circuit diff --git a/src/qibo/transpiler/decompositions.py b/src/qibo/transpiler/decompositions.py index 6b874310fc..cb106d423b 100644 --- a/src/qibo/transpiler/decompositions.py +++ b/src/qibo/transpiler/decompositions.py @@ -47,26 +47,25 @@ def __call__(self, gate): ] -def _u3_to_gpi2(t, p, l, optimize=True): - """Decompose a U3 gate into GPI2 gates. +def _u3_to_gpi2(t, p, l): + """Decompose a U3 gate into GPI2 gates, the decomposition is optimized to use the minimum number of gates.. Args: t (float): theta parameter of U3 gate. p (float): phi parameter of U3 gate. l (float): lambda parameter of U3 gate. - optimize (bool): if True, the decomposition is optimized to use the minimum number of gates. Returns: decomposition (list): list of native gates that decompose the U3 gate. """ decomposition = [] - if l != 0.0 or not optimize: + if l != 0.0: decomposition.append(gates.RZ(0, l)) decomposition.append(gates.GPI2(0, 0)) - if t != -np.pi or not optimize: + if t != -np.pi: decomposition.append(gates.RZ(0, t + np.pi)) decomposition.append(gates.GPI2(0, 0)) - if p != -np.pi or not optimize: + if p != -np.pi: decomposition.append(gates.RZ(0, p + np.pi)) return decomposition diff --git a/src/qibo/transpiler/pipeline.py b/src/qibo/transpiler/pipeline.py index b01fc9a142..b88da8da8f 100644 --- a/src/qibo/transpiler/pipeline.py +++ b/src/qibo/transpiler/pipeline.py @@ -7,7 +7,7 @@ from qibo.config import raise_error from qibo.models import Circuit from qibo.quantum_info.random_ensembles import random_statevector -from qibo.transpiler.abstract import NativeGates, Optimizer, Placer, Router, Unroller +from qibo.transpiler.abstract import Optimizer, Placer, Router from qibo.transpiler.exceptions import TranspilerPipelineError from qibo.transpiler.optimizer import Preprocessing from qibo.transpiler.placer import Trivial, assert_placement @@ -15,7 +15,8 @@ from qibo.transpiler.star_connectivity import StarConnectivity from qibo.transpiler.unroller import ( DecompositionError, - DefaultUnroller, + NativeGates, + Unroller, assert_decomposition, ) @@ -167,7 +168,7 @@ def default(self, connectivity: nx.Graph): # default router pass default_passes.append(StarConnectivity()) # default unroller pass - default_passes.append(DefaultUnroller(native_gates=self.native_gates)) + default_passes.append(Unroller(native_gates=self.native_gates)) return default_passes def __call__(self, circuit): diff --git a/src/qibo/transpiler/placer.py b/src/qibo/transpiler/placer.py index cb9ed21a2b..aa33536445 100644 --- a/src/qibo/transpiler/placer.py +++ b/src/qibo/transpiler/placer.py @@ -6,8 +6,9 @@ from qibo import gates from qibo.config import raise_error from qibo.models import Circuit -from qibo.transpiler.abstract import Placer, Router, _find_gates_qubits_pairs +from qibo.transpiler.abstract import Placer, Router from qibo.transpiler.exceptions import PlacementError +from qibo.transpiler.router import _find_gates_qubits_pairs def assert_placement(circuit: Circuit, layout: dict) -> bool: diff --git a/src/qibo/transpiler/router.py b/src/qibo/transpiler/router.py index d0a32e23d9..8bea586444 100644 --- a/src/qibo/transpiler/router.py +++ b/src/qibo/transpiler/router.py @@ -7,10 +7,9 @@ from qibo import gates from qibo.config import log, raise_error from qibo.models import Circuit -from qibo.transpiler.abstract import Router, _find_gates_qubits_pairs +from qibo.transpiler.abstract import Router from qibo.transpiler.blocks import Block, CircuitBlocks from qibo.transpiler.exceptions import ConnectivityError -from qibo.transpiler.placer import assert_placement def assert_connectivity(connectivity: nx.Graph, circuit: Circuit): @@ -248,7 +247,6 @@ def _initial_checks(self, qubits: int): "You are using more physical qubits than required by the circuit, some ancillary qubits will be added to the circuit." ) new_circuit = Circuit(nodes) - assert_placement(new_circuit, self._mapping) self._transpiled_circuit = new_circuit def _add_gates(self, circuit: Circuit, matched_gates: int): @@ -344,6 +342,30 @@ def _remap_circuit(self, qubit_map): return new_circuit +def _find_gates_qubits_pairs(circuit: Circuit): + """Helper method for :meth:`qibo.transpiler.router.ShortestPaths`. + Translate qibo circuit into a list of pairs of qubits to be used by the router and placer. + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): circuit to be transpiled. + + Returns: + (list): list containing qubits targeted by two qubit gates. + """ + translated_circuit = [] + for gate in circuit.queue: + if isinstance(gate, gates.M): + pass + elif len(gate.qubits) == 2: + translated_circuit.append(sorted(gate.qubits)) + elif len(gate.qubits) >= 3: + raise_error( + ValueError, "Gates targeting more than 2 qubits are not supported" + ) + + return translated_circuit + + class CircuitMap: """Class to keep track of the circuit and physical-logical mapping during routing, this class also implements the initial two qubit blocks decomposition. diff --git a/src/qibo/transpiler/unroller.py b/src/qibo/transpiler/unroller.py index 1c1c342402..2965102082 100644 --- a/src/qibo/transpiler/unroller.py +++ b/src/qibo/transpiler/unroller.py @@ -1,19 +1,64 @@ +from enum import Flag, auto + from qibo import gates from qibo.config import raise_error from qibo.models import Circuit -from qibo.transpiler.abstract import NativeGates, Unroller from qibo.transpiler.decompositions import cz_dec, gpi2_dec, iswap_dec, opt_dec, u3_dec from qibo.transpiler.exceptions import DecompositionError +class NativeGates(Flag): + """Define native gates supported by the unroller. + A native gate set should contain at least one two-qubit gate (CZ or iSWAP) + and at least one single qubit gate (GPI2 or U3). + Gates I, Z, RZ and M are always included in the single qubit native gates set. + + Should have the same names with qibo gates. + """ + + I = auto() + Z = auto() + RZ = auto() + M = auto() + GPI2 = auto() + U3 = auto() + CZ = auto() + iSWAP = auto() + + @classmethod + def default(cls): + """Return default native gates set.""" + return cls.CZ | cls.GPI2 | cls.I | cls.Z | cls.RZ | cls.M + + @classmethod + def from_gatelist(cls, gatelist: list): + """Create a NativeGates object containing all gates from a gatelist.""" + natives = cls(0) + for gate in gatelist: + natives |= cls.from_gate(gate) + return natives + + @classmethod + def from_gate(cls, gate: gates.Gate): + """Create a NativeGates object from a gate. + The gate can be either a class:`qibo.gates.Gate` or an instance of this class. + """ + if isinstance(gate, gates.Gate): + return cls.from_gate(gate.__class__) + try: + return getattr(cls, gate.__name__) + except AttributeError: + raise ValueError(f"Gate {gate} cannot be used as native.") + + # TODO: Make setting single-qubit native gates more flexible -class DefaultUnroller(Unroller): +class Unroller: """Translates a circuit to native gates. Args: circuit (:class:`qibo.models.circuit.Circuit`): circuit model to translate into native gates. - native_gates (:class:`qibo.transpiler.abstract.NativeGates`): native gates supported by the quantum hardware. + native_gates (:class:`qibo.transpiler.unroller.NativeGates`): native gates to use in the transpiled circuit. Returns: (:class:`qibo.models.circuit.Circuit`): equivalent circuit with native gates. @@ -53,36 +98,24 @@ def assert_decomposition( Args: circuit (:class:`qibo.models.circuit.Circuit`): circuit model to check. - native_gates (:class:`qibo.transpiler.abstract.NativeGates`): - native gates supported by the quantum hardware. + native_gates (:class:`qibo.transpiler.unroller.NativeGates`): + native gates in the transpiled circuit. """ for gate in circuit.queue: if isinstance(gate, gates.M): continue - if len(gate.qubits) == 1: + if len(gate.qubits) <= 2: try: native_type_gate = NativeGates.from_gate(gate) - if not (native_type_gate & native_gates.single_qubit_natives()): + if not (native_type_gate & native_gates): raise_error( DecompositionError, - f"{gate.name} is not a single qubit native gate.", + f"{gate.name} is not a native gate.", ) except ValueError: raise_error( DecompositionError, - f"{gate.name} is not a single qubit native gate.", - ) - elif len(gate.qubits) == 2: - try: - native_type_gate = NativeGates.from_gate(gate) - if not (native_type_gate & native_gates.two_qubit_natives()): - raise_error( - DecompositionError, - f"{gate.name} is not a two qubits native gate.", - ) - except ValueError: - raise_error( - DecompositionError, f"{gate.name} is not a two qubits native gate." + f"{gate.name} is not a native gate.", ) else: raise_error( @@ -98,7 +131,7 @@ def translate_gate( Args: gate (:class:`qibo.gates.abstract.Gate`): gate to be decomposed. - native_gates (:class:`qibo.transpiler.abstract.NativeGates`): native gates supported by the quantum hardware. + native_gates (:class:`qibo.transpiler.unroller.NativeGates`): native gates to use in the decomposition. Returns: (list): List of native gates that decompose the input gate. @@ -106,15 +139,13 @@ def translate_gate( if isinstance(gate, (gates.M, gates.I, gates.Align)): return gate elif len(gate.qubits) == 1: - return _translate_single_qubit_gates(gate, native_gates.single_qubit_natives()) + return _translate_single_qubit_gates(gate, native_gates) else: decomposition_2q = _translate_two_qubit_gates(gate, native_gates) final_decomposition = [] for gate in decomposition_2q: if len(gate.qubits) == 1: - final_decomposition += _translate_single_qubit_gates( - gate, native_gates.single_qubit_natives() - ) + final_decomposition += _translate_single_qubit_gates(gate, native_gates) else: final_decomposition.append(gate) return final_decomposition @@ -127,7 +158,7 @@ def _translate_single_qubit_gates(gate: gates.Gate, single_qubit_natives: Native Args: gate (:class:`qibo.gates.abstract.Gate`): gate to be decomposed. - single_qubit_natives (:class:`qibo.transpiler.abstract.NativeGates`): single qubit native gates. + single_qubit_natives (:class:`qibo.transpiler.unroller.NativeGates`): single qubit native gates. Returns: (list): List of native gates that decompose the input gate. @@ -147,13 +178,14 @@ def _translate_two_qubit_gates(gate: gates.Gate, native_gates: NativeGates): Args: gate (:class:`qibo.gates.abstract.Gate`): gate to be decomposed. - native_gates (:class:`qibo.transpiler.abstract.NativeGates`): native gates supported by the quantum hardware. + native_gates (:class:`qibo.transpiler.unroller.NativeGates`): native gates supported by the quantum hardware. Returns: (list): List of native gates that decompose the input gate. """ - two_qubit_natives = native_gates.two_qubit_natives() - if two_qubit_natives is NativeGates.CZ | NativeGates.iSWAP: + if ( + native_gates & (NativeGates.CZ | NativeGates.iSWAP) + ) is NativeGates.CZ | NativeGates.iSWAP: # Check for a special optimized decomposition. if gate.__class__ in opt_dec.decompositions: return opt_dec(gate) @@ -172,9 +204,9 @@ def _translate_two_qubit_gates(gate: gates.Gate, native_gates: NativeGates): return cz_dec(gate) else: # pragma: no cover return iswap_dec(gate) - elif two_qubit_natives is NativeGates.CZ: + elif native_gates & NativeGates.CZ: return cz_dec(gate) - elif two_qubit_natives is NativeGates.iSWAP: + elif native_gates & NativeGates.iSWAP: if gate.__class__ in iswap_dec.decompositions: return iswap_dec(gate) else: diff --git a/tests/test_transpiler_abstract.py b/tests/test_transpiler_abstract.py deleted file mode 100644 index 9967e5295a..0000000000 --- a/tests/test_transpiler_abstract.py +++ /dev/null @@ -1,23 +0,0 @@ -import pytest - -from qibo import gates -from qibo.models import Circuit -from qibo.transpiler.abstract import _find_gates_qubits_pairs - - -def test_circuit_representation(): - circuit = Circuit(5) - circuit.add(gates.CNOT(1, 0)) - circuit.add(gates.CNOT(2, 0)) - circuit.add(gates.X(1)) - circuit.add(gates.CZ(3, 0)) - circuit.add(gates.CNOT(4, 0)) - repr = _find_gates_qubits_pairs(circuit) - assert repr == [[0, i + 1] for i in range(4)] - - -def test_circuit_representation_fail(): - circuit = Circuit(5) - circuit.add(gates.TOFFOLI(0, 1, 2)) - with pytest.raises(ValueError): - repr = _find_gates_qubits_pairs(circuit) diff --git a/tests/test_transpiler_blocks.py b/tests/test_transpiler_blocks.py index 4d2446c806..48207890bd 100644 --- a/tests/test_transpiler_blocks.py +++ b/tests/test_transpiler_blocks.py @@ -1,4 +1,3 @@ -import numpy as np import pytest from qibo import Circuit, gates diff --git a/tests/test_transpiler_decompositions.py b/tests/test_transpiler_decompositions.py index 194e6da420..5ce8d97cca 100644 --- a/tests/test_transpiler_decompositions.py +++ b/tests/test_transpiler_decompositions.py @@ -5,8 +5,9 @@ from qibo.backends import NumpyBackend from qibo.models import Circuit from qibo.quantum_info.random_ensembles import random_unitary -from qibo.transpiler.abstract import NativeGates -from qibo.transpiler.unroller import assert_decomposition, translate_gate +from qibo.transpiler.unroller import NativeGates, assert_decomposition, translate_gate + +default_natives = NativeGates.Z | NativeGates.RZ | NativeGates.M | NativeGates.I def assert_matrices_allclose(gate, natives, backend): @@ -42,45 +43,45 @@ def assert_matrices_allclose(gate, natives, backend): @pytest.mark.parametrize("gatename", ["H", "X", "Y", "I"]) def test_pauli_to_native(backend, gatename, natives): gate = getattr(gates, gatename)(0) - assert_matrices_allclose(gate, natives=natives, backend=backend) + assert_matrices_allclose(gate, natives=natives | default_natives, backend=backend) @pytest.mark.parametrize("natives", [NativeGates.U3, NativeGates.GPI2]) @pytest.mark.parametrize("gatename", ["RX", "RY", "RZ"]) def test_rotations_to_native(backend, gatename, natives): gate = getattr(gates, gatename)(0, theta=0.1) - assert_matrices_allclose(gate, natives=natives, backend=backend) + assert_matrices_allclose(gate, natives=natives | default_natives, backend=backend) @pytest.mark.parametrize("natives", [NativeGates.U3, NativeGates.GPI2]) @pytest.mark.parametrize("gatename", ["S", "SDG", "T", "TDG", "SX"]) def test_special_single_qubit_to_native(backend, gatename, natives): gate = getattr(gates, gatename)(0) - assert_matrices_allclose(gate, natives=natives, backend=backend) + assert_matrices_allclose(gate, natives=natives | default_natives, backend=backend) @pytest.mark.parametrize("natives", [NativeGates.U3, NativeGates.GPI2]) def test_u1_to_native(backend, natives): gate = gates.U1(0, theta=0.5) - assert_matrices_allclose(gate, natives=natives, backend=backend) + assert_matrices_allclose(gate, natives=natives | default_natives, backend=backend) @pytest.mark.parametrize("natives", [NativeGates.U3, NativeGates.GPI2]) def test_u2_to_native(backend, natives): gate = gates.U2(0, phi=0.1, lam=0.3) - assert_matrices_allclose(gate, natives=natives, backend=backend) + assert_matrices_allclose(gate, natives=natives | default_natives, backend=backend) @pytest.mark.parametrize("natives", [NativeGates.U3, NativeGates.GPI2]) def test_u3_to_native(backend, natives): gate = gates.U3(0, theta=0.2, phi=0.1, lam=0.3) - assert_matrices_allclose(gate, natives=natives, backend=backend) + assert_matrices_allclose(gate, natives=natives | default_natives, backend=backend) @pytest.mark.parametrize("natives", [NativeGates.U3, NativeGates.GPI2]) def test_gpi2_to_native(backend, natives): gate = gates.GPI2(0, phi=0.123) - assert_matrices_allclose(gate, natives=natives, backend=backend) + assert_matrices_allclose(gate, natives=natives | default_natives, backend=backend) @pytest.mark.parametrize("gatename", ["CNOT", "CZ", "SWAP", "iSWAP", "FSWAP"]) @@ -94,7 +95,7 @@ def test_gpi2_to_native(backend, natives): ) def test_two_qubit_to_native(backend, gatename, natives_1q, natives_2q): gate = getattr(gates, gatename)(0, 1) - assert_matrices_allclose(gate, natives_1q | natives_2q, backend) + assert_matrices_allclose(gate, natives_1q | natives_2q | default_natives, backend) @pytest.mark.parametrize( @@ -108,7 +109,7 @@ def test_two_qubit_to_native(backend, gatename, natives_1q, natives_2q): @pytest.mark.parametrize("gatename", ["CRX", "CRY", "CRZ"]) def test_controlled_rotations_to_native(backend, gatename, natives_1q, natives_2q): gate = getattr(gates, gatename)(0, 1, 0.3) - assert_matrices_allclose(gate, natives_1q | natives_2q, backend) + assert_matrices_allclose(gate, natives_1q | natives_2q | default_natives, backend) @pytest.mark.parametrize( @@ -121,7 +122,7 @@ def test_controlled_rotations_to_native(backend, gatename, natives_1q, natives_2 ) def test_cu1_to_native(backend, natives_1q, natives_2q): gate = gates.CU1(0, 1, theta=0.4) - assert_matrices_allclose(gate, natives_1q | natives_2q, backend) + assert_matrices_allclose(gate, natives_1q | natives_2q | default_natives, backend) @pytest.mark.parametrize( @@ -134,7 +135,7 @@ def test_cu1_to_native(backend, natives_1q, natives_2q): ) def test_cu2_to_native(backend, natives_1q, natives_2q): gate = gates.CU2(0, 1, phi=0.2, lam=0.3) - assert_matrices_allclose(gate, natives_1q | natives_2q, backend) + assert_matrices_allclose(gate, natives_1q | natives_2q | default_natives, backend) @pytest.mark.parametrize( @@ -147,7 +148,7 @@ def test_cu2_to_native(backend, natives_1q, natives_2q): ) def test_cu3_to_native(backend, natives_1q, natives_2q): gate = gates.CU3(0, 1, theta=0.2, phi=0.3, lam=0.4) - assert_matrices_allclose(gate, natives_1q | natives_2q, backend) + assert_matrices_allclose(gate, natives_1q | natives_2q | default_natives, backend) @pytest.mark.parametrize( @@ -160,7 +161,7 @@ def test_cu3_to_native(backend, natives_1q, natives_2q): ) def test_fSim_to_native(backend, natives_1q, natives_2q): gate = gates.fSim(0, 1, theta=0.3, phi=0.1) - assert_matrices_allclose(gate, natives_1q | natives_2q, backend) + assert_matrices_allclose(gate, natives_1q | natives_2q | default_natives, backend) @pytest.mark.parametrize("seed", [None, 10, np.random.default_rng(10)]) @@ -175,7 +176,7 @@ def test_fSim_to_native(backend, natives_1q, natives_2q): def test_GeneralizedfSim_to_native(backend, natives_1q, natives_2q, seed): unitary = random_unitary(2, seed=seed, backend=backend) gate = gates.GeneralizedfSim(0, 1, unitary, phi=0.1) - assert_matrices_allclose(gate, natives_1q | natives_2q, backend) + assert_matrices_allclose(gate, natives_1q | natives_2q | default_natives, backend) @pytest.mark.parametrize( @@ -189,7 +190,7 @@ def test_GeneralizedfSim_to_native(backend, natives_1q, natives_2q, seed): @pytest.mark.parametrize("gatename", ["RXX", "RZZ", "RYY"]) def test_rnn_to_native(backend, gatename, natives_1q, natives_2q): gate = getattr(gates, gatename)(0, 1, theta=0.1) - assert_matrices_allclose(gate, natives_1q | natives_2q, backend) + assert_matrices_allclose(gate, natives_1q | natives_2q | default_natives, backend) @pytest.mark.parametrize( @@ -202,7 +203,7 @@ def test_rnn_to_native(backend, gatename, natives_1q, natives_2q): ) def test_TOFFOLI_to_native(backend, natives_1q, natives_2q): gate = gates.TOFFOLI(0, 1, 2) - assert_matrices_allclose(gate, natives_1q | natives_2q, backend) + assert_matrices_allclose(gate, natives_1q | natives_2q | default_natives, backend) @pytest.mark.parametrize("seed", [None, 10, np.random.default_rng(10)]) @@ -220,7 +221,7 @@ def test_unitary_to_native(backend, nqubits, natives_1q, natives_2q, seed): # transform to SU(2^nqubits) form u = u / np.sqrt(np.linalg.det(u)) gate = gates.Unitary(u, *range(nqubits)) - assert_matrices_allclose(gate, natives_1q | natives_2q, backend) + assert_matrices_allclose(gate, natives_1q | natives_2q | default_natives, backend) def test_count_1q(): diff --git a/tests/test_transpiler_pipeline.py b/tests/test_transpiler_pipeline.py index 04786c2430..1c72b3eeaa 100644 --- a/tests/test_transpiler_pipeline.py +++ b/tests/test_transpiler_pipeline.py @@ -1,12 +1,9 @@ -import itertools - import networkx as nx import numpy as np import pytest from qibo import gates from qibo.models import Circuit -from qibo.transpiler.abstract import NativeGates from qibo.transpiler.optimizer import Preprocessing from qibo.transpiler.pipeline import ( Passes, @@ -16,7 +13,7 @@ ) from qibo.transpiler.placer import Random, ReverseTraversal, Trivial from qibo.transpiler.router import ShortestPaths -from qibo.transpiler.unroller import DefaultUnroller +from qibo.transpiler.unroller import NativeGates, Unroller def generate_random_circuit(nqubits, ngates, seed=None): @@ -165,7 +162,7 @@ def test_custom_passes(circ): custom_passes.append(Preprocessing(connectivity=star_connectivity())) custom_passes.append(Random(connectivity=star_connectivity())) custom_passes.append(ShortestPaths(connectivity=star_connectivity())) - custom_passes.append(DefaultUnroller(native_gates=NativeGates.default())) + custom_passes.append(Unroller(native_gates=NativeGates.default())) custom_pipeline = Passes( custom_passes, connectivity=star_connectivity(), @@ -197,7 +194,7 @@ def test_custom_passes_reverse(circ): ) ) custom_passes.append(ShortestPaths(connectivity=star_connectivity())) - custom_passes.append(DefaultUnroller(native_gates=NativeGates.default())) + custom_passes.append(Unroller(native_gates=NativeGates.default())) custom_pipeline = Passes( custom_passes, connectivity=star_connectivity(), diff --git a/tests/test_transpiler_router.py b/tests/test_transpiler_router.py index 28a0c9b15f..870a5b59db 100644 --- a/tests/test_transpiler_router.py +++ b/tests/test_transpiler_router.py @@ -6,14 +6,7 @@ from qibo.models import Circuit from qibo.transpiler.optimizer import Preprocessing from qibo.transpiler.pipeline import assert_circuit_equivalence -from qibo.transpiler.placer import ( - Custom, - PlacementError, - Random, - Subgraph, - Trivial, - assert_placement, -) +from qibo.transpiler.placer import Custom, Random, Subgraph, Trivial, assert_placement from qibo.transpiler.router import ( CircuitMap, ConnectivityError, @@ -120,18 +113,6 @@ def test_insufficient_qubits(): transpiler(circuit, initial_layout) -def test_incorrect_initial_layout(): - placer = Trivial() - circuit = Circuit(4) - circuit.add(gates.CNOT(1, 0)) - circuit.add(gates.CNOT(2, 0)) - circuit.add(gates.CNOT(3, 0)) - initial_layout = placer(circuit) - transpiler = ShortestPaths(connectivity=star_connectivity()) - with pytest.raises(PlacementError): - transpiler(circuit, initial_layout) - - @pytest.mark.parametrize("gates", [5, 25]) @pytest.mark.parametrize("qubits", [3, 5]) @pytest.mark.parametrize("placer", [Trivial, Random]) diff --git a/tests/test_transpiler_unroller.py b/tests/test_transpiler_unroller.py index 99785e4b22..0a848ddcbc 100644 --- a/tests/test_transpiler_unroller.py +++ b/tests/test_transpiler_unroller.py @@ -2,10 +2,10 @@ from qibo import gates from qibo.models import Circuit -from qibo.transpiler.abstract import NativeGates from qibo.transpiler.unroller import ( DecompositionError, - DefaultUnroller, + NativeGates, + Unroller, assert_decomposition, ) @@ -82,6 +82,9 @@ def test_unroller(natives_1q, natives_2q): circuit.add(gates.RZZ(0, 1, 0.3)) circuit.add(gates.fSim(0, 1, 0.4, 0.5)) circuit.add(gates.TOFFOLI(0, 1, 2)) - unroller = DefaultUnroller(native_gates=natives_1q | natives_2q) + unroller = Unroller(native_gates=natives_1q | natives_2q) translated_circuit = unroller(circuit) - assert_decomposition(translated_circuit, native_gates=natives_1q | natives_2q) + assert_decomposition( + translated_circuit, + native_gates=natives_1q | natives_2q | NativeGates.RZ | NativeGates.Z, + ) From 469ad0e915150dd71cc685ae758a5c638e5a6e09 Mon Sep 17 00:00:00 2001 From: simone bordoni Date: Fri, 24 Nov 2023 15:38:45 +0400 Subject: [PATCH 068/143] improve coverage --- src/qibo/transpiler/unroller.py | 8 -------- tests/test_transpiler_unroller.py | 23 +++++++++++++++++++++++ 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/qibo/transpiler/unroller.py b/src/qibo/transpiler/unroller.py index 2965102082..ef5f0c8d30 100644 --- a/src/qibo/transpiler/unroller.py +++ b/src/qibo/transpiler/unroller.py @@ -81,14 +81,6 @@ def __call__(self, circuit: Circuit): ) return translated_circuit - def is_satisfied(self, circuit: Circuit): - """Return True if a circuit is correctly decomposed into native gates, otherwise False.""" - try: - assert_decomposition(circuit=circuit, native_gates=self.native_gates) - except DecompositionError: - return False - return True - def assert_decomposition( circuit: Circuit, diff --git a/tests/test_transpiler_unroller.py b/tests/test_transpiler_unroller.py index 0a848ddcbc..26529c8f2c 100644 --- a/tests/test_transpiler_unroller.py +++ b/tests/test_transpiler_unroller.py @@ -7,9 +7,32 @@ NativeGates, Unroller, assert_decomposition, + translate_gate, ) +def test_native_gates_from_gatelist(): + natives = NativeGates.from_gatelist([gates.RZ, gates.CZ(0, 1)]) + assert natives == NativeGates.RZ | NativeGates.CZ + + +def test_native_gates_from_gatelist_fail(): + with pytest.raises(ValueError): + NativeGates.from_gatelist([gates.RZ, gates.X(0)]) + + +def test_translate_gate_error_1q(): + natives = NativeGates(0) + with pytest.raises(DecompositionError): + translate_gate(gates.X(0), natives) + + +def test_translate_gate_error_2q(): + natives = NativeGates(0) + with pytest.raises(DecompositionError): + translate_gate(gates.CZ(0, 1), natives) + + def test_assert_decomposition(): circuit = Circuit(2) circuit.add(gates.CZ(0, 1)) From c9b57a3bb3dee40673c929fc55467a33a7b1190f Mon Sep 17 00:00:00 2001 From: simone bordoni Date: Sat, 25 Nov 2023 01:31:59 +0400 Subject: [PATCH 069/143] fixed coverage --- tests/test_transpiler_router.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/test_transpiler_router.py b/tests/test_transpiler_router.py index 870a5b59db..621f7f69e3 100644 --- a/tests/test_transpiler_router.py +++ b/tests/test_transpiler_router.py @@ -12,6 +12,7 @@ ConnectivityError, Sabre, ShortestPaths, + _find_gates_qubits_pairs, assert_connectivity, ) @@ -113,6 +114,13 @@ def test_insufficient_qubits(): transpiler(circuit, initial_layout) +def test_find_pairs_error(): + circuit = Circuit(3) + circuit.add(gates.TOFFOLI(0, 1, 2)) + with pytest.raises(ValueError): + _find_gates_qubits_pairs(circuit) + + @pytest.mark.parametrize("gates", [5, 25]) @pytest.mark.parametrize("qubits", [3, 5]) @pytest.mark.parametrize("placer", [Trivial, Random]) From b38bcd93eab4f5f696c404f5d91ea3b252a771e8 Mon Sep 17 00:00:00 2001 From: Andrea Date: Sat, 25 Nov 2023 12:15:30 +0100 Subject: [PATCH 070/143] Fix tests --- examples/dbi/dbi.ipynb | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/examples/dbi/dbi.ipynb b/examples/dbi/dbi.ipynb index 3c82cf2700..ac4d1b0a3a 100644 --- a/examples/dbi/dbi.ipynb +++ b/examples/dbi/dbi.ipynb @@ -21,11 +21,9 @@ "metadata": {}, "outputs": [], "source": [ - "# install extra dependences\n", - "# seaborn is a plotting library\n", - "!pip install seaborn\n", - "# hyperopt is required to optimize the DBF step\n", - "!pip install hyperopt" + "# Uncomment these lines if you don't have the following packages\n", + "# !pip install seaborn # plotting library\n", + "# !pip install hyperopt # required to optimize the DBF step" ] }, { @@ -554,7 +552,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.4" + "version": "3.10.12" } }, "nbformat": 4, From 70c0d1eb43a7171e4d4def3781a1b7452994e7b9 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Sun, 26 Nov 2023 18:10:29 +0100 Subject: [PATCH 071/143] try changing installations --- examples/dbi/dbi.ipynb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/dbi/dbi.ipynb b/examples/dbi/dbi.ipynb index ac4d1b0a3a..ed2e3ba4e7 100644 --- a/examples/dbi/dbi.ipynb +++ b/examples/dbi/dbi.ipynb @@ -17,13 +17,12 @@ { "cell_type": "code", "execution_count": null, - "id": "91dc69bf-0404-4bd1-9990-0a8cf00951e6", + "id": "e1f362b8-eb73-456e-ae48-94c5f2a12649", "metadata": {}, "outputs": [], "source": [ - "# Uncomment these lines if you don't have the following packages\n", - "# !pip install seaborn # plotting library\n", - "# !pip install hyperopt # required to optimize the DBF step" + "!python -m pip install seaborn # plotting library\n", + "!python -m pip install hyperopt # required to optimize the DBF step" ] }, { @@ -531,6 +530,7 @@ { "cell_type": "code", "execution_count": null, + "id": "685ca784", "metadata": {}, "outputs": [], "source": [] @@ -552,7 +552,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.10.0" } }, "nbformat": 4, From 739009e4a7017a0e5a5fb5a78c579beb393165cd Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Mon, 27 Nov 2023 13:55:28 +0400 Subject: [PATCH 072/143] update tests --- tests/test_gates_density_matrix.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/test_gates_density_matrix.py b/tests/test_gates_density_matrix.py index cd0c025c5d..2b6c3fabd1 100644 --- a/tests/test_gates_density_matrix.py +++ b/tests/test_gates_density_matrix.py @@ -78,14 +78,15 @@ def test_one_qubit_gates(backend, gatename, gatekwargs): @pytest.mark.parametrize("gatename", ["H", "X", "Y", "Z", "S", "SDG", "T", "TDG"]) def test_controlled_by_one_qubit_gates(backend, gatename): nqubits = 2 - initial_rho = random_density_matrix(2**nqubits, backend=backend) + initial_rho = random_density_matrix(2**nqubits, seed=1, backend=backend) gate = getattr(gates, gatename)(1).controlled_by(0) - final_rho = apply_gates(backend, [gate], 2, initial_rho) + final_rho = apply_gates(backend, [gate], 2, np.copy(initial_rho)) matrix = backend.to_numpy(backend.matrix(getattr(gates, gatename)(1))) cmatrix = np.eye(4, dtype=matrix.dtype) cmatrix[2:, 2:] = matrix - target_rho = np.einsum("ab,bc,cd->ad", cmatrix, initial_rho, cmatrix.conj().T) + cmatrix = backend.cast(cmatrix, dtype=cmatrix.dtype) + target_rho = np.einsum("ab,bc,cd->ad", cmatrix, initial_rho, np.transpose(np.conj(cmatrix))) backend.assert_allclose(final_rho, target_rho) @@ -93,6 +94,7 @@ def test_controlled_by_one_qubit_gates(backend, gatename): "gatename,gatekwargs", [ ("CNOT", {}), + ("CY", {}), ("CZ", {}), ("SWAP", {}), ("CRX", {"theta": 0.123}), @@ -111,8 +113,8 @@ def test_two_qubit_gates(backend, gatename, gatekwargs): gate = getattr(gates, gatename)(0, 1, **gatekwargs) final_rho = apply_gates(backend, [gate], 2, initial_rho) - matrix = backend.to_numpy(gate.matrix(backend)) - target_rho = np.einsum("ab,bc,cd->ad", matrix, initial_rho, matrix.conj().T) + matrix = gate.matrix(backend) + target_rho = np.einsum("ab,bc,cd->ad", matrix, initial_rho, np.transpose(np.conj(matrix))) backend.assert_allclose(final_rho, target_rho, atol=PRECISION_TOL) From 66c837e31ae519c1d80ba3c63504678946e855a9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 27 Nov 2023 09:56:41 +0000 Subject: [PATCH 073/143] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/test_gates_density_matrix.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/test_gates_density_matrix.py b/tests/test_gates_density_matrix.py index 2b6c3fabd1..c40825099c 100644 --- a/tests/test_gates_density_matrix.py +++ b/tests/test_gates_density_matrix.py @@ -86,7 +86,9 @@ def test_controlled_by_one_qubit_gates(backend, gatename): cmatrix = np.eye(4, dtype=matrix.dtype) cmatrix[2:, 2:] = matrix cmatrix = backend.cast(cmatrix, dtype=cmatrix.dtype) - target_rho = np.einsum("ab,bc,cd->ad", cmatrix, initial_rho, np.transpose(np.conj(cmatrix))) + target_rho = np.einsum( + "ab,bc,cd->ad", cmatrix, initial_rho, np.transpose(np.conj(cmatrix)) + ) backend.assert_allclose(final_rho, target_rho) @@ -114,7 +116,9 @@ def test_two_qubit_gates(backend, gatename, gatekwargs): final_rho = apply_gates(backend, [gate], 2, initial_rho) matrix = gate.matrix(backend) - target_rho = np.einsum("ab,bc,cd->ad", matrix, initial_rho, np.transpose(np.conj(matrix))) + target_rho = np.einsum( + "ab,bc,cd->ad", matrix, initial_rho, np.transpose(np.conj(matrix)) + ) backend.assert_allclose(final_rho, target_rho, atol=PRECISION_TOL) From d6940c52d5c1bdcf5a72892a144b6d10c788536b Mon Sep 17 00:00:00 2001 From: Sam-XiaoyueLi Date: Tue, 28 Nov 2023 11:17:58 +0800 Subject: [PATCH 074/143] Replace iterationtype by generatortype, created additional dbi file --- examples/dbi/dbi.ipynb | 645 +++++++++++++++++- .../additional_double_bracket_functions.py | 3 + 2 files changed, 643 insertions(+), 5 deletions(-) create mode 100644 src/qibo/models/dbi/additional_double_bracket_functions.py diff --git a/examples/dbi/dbi.ipynb b/examples/dbi/dbi.ipynb index ed2e3ba4e7..e608c647e7 100644 --- a/examples/dbi/dbi.ipynb +++ b/examples/dbi/dbi.ipynb @@ -165,7 +165,7 @@ "outputs": [], "source": [ "# here we set the canonical generator\n", - "iterationtype = DoubleBracketGeneratorType.canonical" + "generatortype = DoubleBracketGeneratorType.canonical" ] }, { @@ -185,7 +185,7 @@ "metadata": {}, "outputs": [], "source": [ - "dbf = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=iterationtype)" + "dbf = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=generatortype)" ] }, { @@ -322,7 +322,7 @@ "# initial value of the off-diagonal norm\n", "print(f\"Initial value of the off-diagonal norm: {dbf.off_diagonal_norm}\")\n", "\n", - "dbf(step=0.01, mode=iterationtype)\n", + "dbf(step=0.01, mode=generatortype)\n", "\n", "# after one step\n", "print(f\"One step later off-diagonal norm: {dbf.off_diagonal_norm}\")" @@ -415,7 +415,7 @@ "outputs": [], "source": [ "# restart\n", - "dbf_1 = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=iterationtype)\n", + "dbf_1 = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=generatortype)\n", "off_diagonal_norm_history = [dbf_1.off_diagonal_norm]\n", "histories, labels = [], [\"Fixed step\"]\n", "\n", @@ -456,7 +456,7 @@ "outputs": [], "source": [ "# restart\n", - "dbf_2 = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=iterationtype)\n", + "dbf_2 = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=generatortype)\n", "off_diagonal_norm_history = [dbf_2.off_diagonal_norm]\n", "\n", "# set the number of evolution steps\n", @@ -558,3 +558,638 @@ "nbformat": 4, "nbformat_minor": 5 } +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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# set the qibo backend (we suggest qibojit if N >= 20)\n", + "# Alternatives: tensorflow (not optimized), numpy (when CPU not supported by jit)\n", + "set_backend(\"qibojit\", \"numba\")\n", + "\n", + "# hamiltonian parameters\n", + "nqubits = 5\n", + "h = 3\n", + "\n", + "# define the hamiltonian\n", + "h = hamiltonians.TFIM(nqubits=nqubits, h=h)\n", + "\n", + "# vosualize the matrix\n", + "visualize_matrix(h.matrix, title=\"Target hamiltonian\")" + ] + }, + { + "cell_type": "markdown", + "id": "4794e779-bf2d-4ab5-97ce-f876d9522a35", + "metadata": {}, + "source": [ + "#### The generator of the evolution\n", + "\n", + "The model is implemented following the procedure presented in [1], and the first practical step is to define the generator of the iteration $\\hat{\\mathcal{U}}_{\\ell}$, which executes one diagonalization step $$\\hat{H}_{\\ell} = \\hat{\\mathcal{U}}_{\\ell}^{\\dagger} \\hat{H} \\hat{\\mathcal{U}}_{\\ell}.$$\n", + "In `Qibo`, we define the iteration type through a `DoubleBracketGeneratorType` object, which can be chosen between one of the following:\n", + "- `canonical`: the generator of the iteration at step $k+1$ is defined using the commutator between the off diagonal part $\\sigma(\\hat{H_k})$ and the diagonal part $\\Delta(\\hat{H}_k)$ of the target evolved hamiltonian:\n", + " $$\\hat{\\mathcal{U}}_{k+1}=\\exp\\bigl\\{s[\\Delta(\\hat{H}_k), \\sigma(\\hat{H}_k)]\\bigr\\}.$$ \n", + "- `single_commutator`: the evolution follows a similar procedure of the previous point in this list, but any additional matrix $D_k$ can be used to control the evolution at each step:\n", + " $$ \\hat{\\mathcal{U}}_{k+1}=\\exp\\bigl\\{s[D_k, \\hat{H}_k]\\bigr\\}. $$\n", + "- `group_commutator`: the following group commutator is used to compute the evolution:\n", + " $$ \\hat{\\mathcal{U}}_{k+1}= e^{is\\hat{H_k}} e^{isD_k} e^{-is\\hat{H_k}} e^{-isD_k}, $$\n", + "which approximates the canonical commutator for small $s$.\n", + "\n", + "In order to set one of this evolution generators one can do as follow:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "26a487e9-366b-4203-b660-e3d4af2bcb68", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DoubleBracketGeneratorType.canonical\n", + "DoubleBracketGeneratorType.single_commutator\n", + "DoubleBracketGeneratorType.group_commutator\n" + ] + } + ], + "source": [ + "# we have a look inside the DoubleBracketGeneratorType class\n", + "for generator in DoubleBracketGeneratorType:\n", + " print(generator)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "da8dce89-27f6-403d-982a-58d531fade48", + "metadata": {}, + "outputs": [], + "source": [ + "# here we set the canonical generator\n", + "generatortype = DoubleBracketGeneratorType.canonical" + ] + }, + { + "cell_type": "markdown", + "id": "fc4f9f75-0548-4533-a13c-3aba3191e608", + "metadata": {}, + "source": [ + "#### The `DoubleBracketIteration` class\n", + "\n", + "A `DoubleBracketIteration` object can be initialize by calling the `qibo.models.double_braket.DoubleBracketIteration` model and passing the target hamiltonian and the generator type we want to use to perform the evolutionary steps." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "055870ec-55f2-4b99-a622-e3aa4c7dd0e9", + "metadata": {}, + "outputs": [], + "source": [ + "dbf = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=generatortype)" + ] + }, + { + "cell_type": "markdown", + "id": "b38cf803-60b4-467a-be8e-cbad5d81f14a", + "metadata": {}, + "source": [ + "#### `DoubleBracketIteration` features" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "9e278c3d-9f34-4a40-b453-4e030c751ef5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Backend: qibojit (numba)\n" + ] + } + ], + "source": [ + "# on which qibo backend am I running the algorithm?\n", + "print(f\"Backend: {dbf.backend}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "5b8e142b-a0a2-41bd-a16a-265a420b7360", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initial form of the target hamiltonian:\n", + "[[-5.-0.j -3.-0.j -3.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", + " [-3.-0.j -1.-0.j -0.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", + " [-3.-0.j -0.-0.j -1.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", + " ...\n", + " [-0.-0.j -0.-0.j -0.-0.j ... -1.-0.j -0.-0.j -3.-0.j]\n", + " [-0.-0.j -0.-0.j -0.-0.j ... -0.-0.j -1.-0.j -3.-0.j]\n", + " [-0.-0.j -0.-0.j -0.-0.j ... -3.-0.j -3.-0.j -5.-0.j]]\n" + ] + } + ], + "source": [ + "# the initial target hamiltonian is a qibo hamiltonian\n", + "# thus the matrix can be accessed typing h.matrix\n", + "print(f\"Initial form of the target hamiltonian:\\n{dbf.h0.matrix}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "4f9d1d41-3df7-49cf-96ca-fa1019c00c33", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# let's visualize it in a more graphical way\n", + "visualize_matrix(dbf.h0.matrix, r\"$H_0$\")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "7b864712-219c-44b6-8337-19ef0100e318", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# since we didn't perform yet any evolutionary step they are the same\n", + "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" + ] + }, + { + "cell_type": "markdown", + "id": "5e576bc4-4e79-4c71-9ea0-b3012e9f2ba1", + "metadata": {}, + "source": [ + "which shows $\\hat{H}$ is now identical to $\\hat{H}_0$ since no evolution step has been performed yet." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "da3d3aaa-17e1-492e-bcd3-b510f44a5391", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# diagonal part of the H target\n", + "visualize_matrix(dbf.diagonal_h_matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "24d0dfa1-7039-4d7d-8aa3-5a937b9ab0b8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "HS norm of the off diagonal part of H: 1440.0\n" + ] + } + ], + "source": [ + "# Hilbert-Schmidt norm of the off-diagonal part\n", + "# which we want to bring to be close to zero\n", + "print(f\"HS norm of the off diagonal part of H: {dbf.off_diagonal_norm}\")" + ] + }, + { + "cell_type": "markdown", + "id": "d75e35ab-66f4-49f9-af19-679c20065a11", + "metadata": {}, + "source": [ + "Finally, the energy fluctuation of the system at step $k$ over a given state $\\mu$\n", + "\n", + "$$ \\Xi(\\mu) = \\sqrt{\\langle \\mu | \\hat{H}_k^2 | \\mu \\rangle - \\langle \\mu | \\hat{H}_k | \\mu \\rangle^2} $$\n", + "\n", + "can be computed:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "95f8d86f-07d4-498c-acb1-f6f6a4614c24", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "6.708203932499369" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# define a quantum state\n", + "# for example the ground state of a multi-qubit Z hamiltonian\n", + "Z = hamiltonians.Z(nqubits=nqubits)\n", + "state = Z.ground_state()\n", + "\n", + "# compute energy fluctuations using current H and given state\n", + "dbf.energy_fluctuation(state)" + ] + }, + { + "cell_type": "markdown", + "id": "3d5b37f3-2477-49a0-9f80-7da5ddda1fff", + "metadata": {}, + "source": [ + "#### Call the `DoubleBracketIteration` to perform a DBF iteration\n", + "\n", + "If the DBF object is called, a Double Bracket Iteration iteration is performed. This can be done customizing the iteration by setting the iteration step and the desired `DoubleBracketGeneratorType`. If no generator is provided, the one passed at the initialization time is used (default is `DoubleBracketGeneratorType.canonical`)." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "9a886261-8aa6-4df0-a31b-9c39847db124", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initial value of the off-diagonal norm: 1440.0\n", + "One step later off-diagonal norm: 1168.2530943739994\n" + ] + } + ], + "source": [ + "# perform one evolution step\n", + "\n", + "# initial value of the off-diagonal norm\n", + "print(f\"Initial value of the off-diagonal norm: {dbf.off_diagonal_norm}\")\n", + "\n", + "dbf(step=0.01, mode=generatortype)\n", + "\n", + "# after one step\n", + "print(f\"One step later off-diagonal norm: {dbf.off_diagonal_norm}\")" + ] + }, + { + "cell_type": "markdown", + "id": "b78dd05d-ffe3-435a-b5ec-2a42f28066b2", + "metadata": {}, + "source": [ + "We can check now if something happened by plotting the drift:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "cc74812d-7c2c-44e4-afc2-e235968801b4", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" + ] + }, + { + "cell_type": "markdown", + "id": "3465a422-eebf-4e80-ae96-bba894132330", + "metadata": {}, + "source": [ + "The set step can be good, but maybe not the best one. In order to do this choice in a wiser way, we can call the DBF hyperoptimization routine to search for a better initial step. The `dbf.hyperopt_step` method is built on top of the [`hyperopt`](https://hyperopt.github.io/hyperopt/) package. Any algorithm or sampling space provided by the official package can be used. We are going to use the default options (we sample new steps from a uniform space following a _Tree of Parzen estimators algorithm_)." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "aad79966-7a11-4a45-aba5-4a4bb8315c50", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "100%|██████████| 1000/1000 [00:03<00:00, 258.54trial/s, best loss: 1301.8618493572444]\n", + "0.999959832862263\n" + ] + } + ], + "source": [ + "# restart\n", + "dbf.h = dbf.h0\n", + "\n", + "# optimization of the step, we allow to search in [1e-5, 1]\n", + "step = dbf.hyperopt_step(\n", + " step_min = 1e-5,\n", + " step_max = 1,\n", + " space = hp.uniform,\n", + " optimizer = tpe,\n", + " max_evals = 1000,\n", + " verbose = True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "49483a47-d29d-440e-a4bc-143bfe6bb3cf", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "visualize_matrix(dbf.h.matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "6bdaf7f9-7e49-4a16-8b29-ae1f9746cd9b", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" + ] + }, + { + "cell_type": "markdown", + "id": "b5f1d00e-e763-40d9-822f-e0e8d4c57d9a", + "metadata": {}, + "source": [ + "#### Let's evolve the model for `NSTEPS`\n", + "\n", + "We know recover the initial hamiltonian, and we perform a sequence of DBF iteration steps, in order to show how this mechanism can lead to a proper diagonalization of the target hamiltonian.\n", + "\n", + "#### Method 1: fixed step" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "59a6a485-a714-4e14-b27a-1df2930068ee", + "metadata": {}, + "outputs": [], + "source": [ + "# restart\n", + "dbf_1 = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=generatortype)\n", + "off_diagonal_norm_history = [dbf_1.off_diagonal_norm]\n", + "histories, labels = [], [\"Fixed step\"]\n", + "\n", + "# set the number of evolution steps\n", + "NSTEPS = 20\n", + "step = 0.005\n", + "\n", + "for s in range(NSTEPS):\n", + " dbf_1(step=step)\n", + " off_diagonal_norm_history.append(dbf_1.off_diagonal_norm)\n", + "\n", + "histories.append(off_diagonal_norm_history)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "7e0b2f18-ca53-4f34-9fcf-0052dcc31dc5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_histories(histories, labels)" + ] + }, + { + "cell_type": "markdown", + "id": "eb797d6c-0eba-4da4-b492-8b5d70f9123f", + "metadata": {}, + "source": [ + "#### Method 2: optimizing the step" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "a6fd1e33-3620-4f3b-b705-a120f6da0027", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "100%|██████████| 500/500 [00:01<00:00, 395.91trial/s, best loss: 830.741659158309] \n", + "New optimized step at iteration 1/20: 0.01404582562364698\n", + "New optimized step at iteration 2/20: 0.00482699842450417\n", + "New optimized step at iteration 3/20: 0.007163610307149949\n", + "New optimized step at iteration 4/20: 0.005723837311966835\n", + "New optimized step at iteration 5/20: 0.010405764803590473\n", + "New optimized step at iteration 6/20: 0.007528815620413614\n", + "New optimized step at iteration 7/20: 0.007887770624463187\n", + "New optimized step at iteration 8/20: 0.006301358802023468\n", + "New optimized step at iteration 9/20: 0.009969449232968781\n", + "New optimized step at iteration 10/20: 0.006765387147882551\n", + "New optimized step at iteration 11/20: 0.0058573752572720714\n", + "New optimized step at iteration 12/20: 0.013901736820231686\n", + "New optimized step at iteration 13/20: 0.0029898714608809357\n", + "New optimized step at iteration 14/20: 0.025178568486685336\n", + "New optimized step at iteration 15/20: 0.0028045604719951554\n", + "New optimized step at iteration 16/20: 0.00300057233068024\n", + "New optimized step at iteration 17/20: 0.000530435165988968\n", + "New optimized step at iteration 18/20: 0.003916417493158211\n", + "New optimized step at iteration 19/20: 0.0017852716197505059\n" + ] + } + ], + "source": [ + "# restart\n", + "dbf_2 = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=generatortype)\n", + "off_diagonal_norm_history = [dbf_2.off_diagonal_norm]\n", + "\n", + "# set the number of evolution steps\n", + "NSTEPS = 20\n", + "\n", + "# optimize first step\n", + "step = dbf_2.hyperopt_step(\n", + " step_min = 1e-5,\n", + " step_max = 1,\n", + " space = hp.uniform,\n", + " optimizer = tpe,\n", + " max_evals = 500,\n", + " verbose = True\n", + ")\n", + "\n", + "for s in range(NSTEPS):\n", + " if s != 0:\n", + " step = dbf_2.hyperopt_step(\n", + " step_min = 1e-5,\n", + " step_max = 1,\n", + " space = hp.uniform,\n", + " optimizer = tpe,\n", + " max_evals = 100,\n", + " )\n", + " print(f\"New optimized step at iteration {s}/{NSTEPS}: {step}\")\n", + " dbf_2(step=step)\n", + " off_diagonal_norm_history.append(dbf_2.off_diagonal_norm)\n", + "\n", + "histories.append(off_diagonal_norm_history)\n", + "labels.append(\"Optimizing step\")" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "0f0212bf-b642-4fea-9203-037876e0b266", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_histories(histories, labels)" + ] + }, + { + "cell_type": "markdown", + "id": "32341937-4178-41d2-a10e-5e4d2634098e", + "metadata": {}, + "source": [ + "The hyperoptimization can lead to a faster convergence of the algorithm." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "82b89092-07e5-4788-9ae0-8907df2428eb", + "metadata": {}, + "outputs": [], + "source": [ + "visualize_matrix(dbf_1.h.matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ac8ed320-04a8-42af-a980-48ab4f1fff7c", + "metadata": {}, + "outputs": [], + "source": [ + "visualize_matrix(dbf_2.h.matrix)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/qibo/models/dbi/additional_double_bracket_functions.py b/src/qibo/models/dbi/additional_double_bracket_functions.py new file mode 100644 index 0000000000..b4f6000094 --- /dev/null +++ b/src/qibo/models/dbi/additional_double_bracket_functions.py @@ -0,0 +1,3 @@ +import numpy as np +from double_bracket import DoubleBracketGeneratorType, DoubleBracketIteration + From ce146490646fd44ca83b90fafda11b1ed7d21b0f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 03:18:22 +0000 Subject: [PATCH 075/143] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/qibo/models/dbi/additional_double_bracket_functions.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/qibo/models/dbi/additional_double_bracket_functions.py b/src/qibo/models/dbi/additional_double_bracket_functions.py index b4f6000094..1720b22de0 100644 --- a/src/qibo/models/dbi/additional_double_bracket_functions.py +++ b/src/qibo/models/dbi/additional_double_bracket_functions.py @@ -1,3 +1,2 @@ import numpy as np from double_bracket import DoubleBracketGeneratorType, DoubleBracketIteration - From 0b5ef3ebe3c6b222bef1f9d3b10ac2d3f8cd53b4 Mon Sep 17 00:00:00 2001 From: Sam-XiaoyueLi Date: Tue, 28 Nov 2023 14:17:59 +0800 Subject: [PATCH 076/143] Additonal file contains visualization and flow routine; example notebook 1 for testing canonical flow on TFIM --- examples/dbi/E1_canonical.ipynb | 0 .../additional_double_bracket_functions.py | 66 ++++++++++++++++++- 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 examples/dbi/E1_canonical.ipynb diff --git a/examples/dbi/E1_canonical.ipynb b/examples/dbi/E1_canonical.ipynb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/qibo/models/dbi/additional_double_bracket_functions.py b/src/qibo/models/dbi/additional_double_bracket_functions.py index 1720b22de0..089b66df1e 100644 --- a/src/qibo/models/dbi/additional_double_bracket_functions.py +++ b/src/qibo/models/dbi/additional_double_bracket_functions.py @@ -1,2 +1,66 @@ -import numpy as np from double_bracket import DoubleBracketGeneratorType, DoubleBracketIteration +from copy import deepcopy + +import numpy as np +import matplotlib.pyplot as plt +import seaborn as sns + +from hyperopt import hp, tpe + +from qibo.config import raise_error +from qibo.hamiltonians import Hamiltonian + +class DoubleBracketIterationStrategies(DoubleBracketIteration): + def __init__( + self, + hamiltonian: Hamiltonian, + NSTEPS: int = 5, + please_be_verbose = True, + please_use_hyperopt = True, + mode: DoubleBracketGeneratorType = DoubleBracketGeneratorType.canonical, + ): + super().__init__(hamiltonian, mode) + self.NSTEPS = NSTEPS + self.please_be_verbose = please_be_verbose + self.pleas_use_hyperopt = please_use_hyperopt + + @staticmethod + def visualize_matrix(matrix, title=""): + """Visualize hamiltonian in a heatmap form.""" + fig, ax = plt.subplots(figsize=(5,5)) + ax.set_title(title) + try: + im = ax.imshow(np.absolute(matrix), cmap="inferno") + except TypeError: + im = ax.imshow(np.absolute(matrix.get()), cmap="inferno") + fig.colorbar(im, ax=ax) + + @staticmethod + def visualize_drift(h0, h): + """Visualize drift (absolute difference) of the evolved hamiltonian w.r.t. h0.""" + fig, ax = plt.subplots(figsize=(5,5)) + ax.set_title(r"Drift: $|\hat{H}_0 - \hat{H}_{\ell}|$") + try: + im = ax.imshow(np.absolute(h0 - h), cmap="inferno") + except TypeError: + im = ax.imshow(np.absolute((h0 - h).get()), cmap="inferno") + + fig.colorbar(im, ax=ax) + + @staticmethod + def plot_histories(histories, labels): + """Plot off-diagonal norm histories over a sequential evolution.""" + colors = sns.color_palette("inferno", n_colors=len(histories)).as_hex() + plt.figure(figsize=(5,5*6/8)) + for i, (h, l) in enumerate(zip(histories, labels)): + plt.plot(h, lw=2, color=colors[i], label=l, marker='.') + plt.legend() + plt.xlabel("Iterations") + plt.ylabel(r"$\| \sigma(\hat{H}) \|^2$") + plt.title("Loss function histories") + plt.grid(True) + plt.show() + + def flow_forward(step): + super().__call__(step) + \ No newline at end of file From bd24e57e2fe8c4332d8ec13e43bf25f4c404e4b6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 06:18:45 +0000 Subject: [PATCH 077/143] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../additional_double_bracket_functions.py | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/qibo/models/dbi/additional_double_bracket_functions.py b/src/qibo/models/dbi/additional_double_bracket_functions.py index 089b66df1e..93fc596775 100644 --- a/src/qibo/models/dbi/additional_double_bracket_functions.py +++ b/src/qibo/models/dbi/additional_double_bracket_functions.py @@ -1,44 +1,43 @@ -from double_bracket import DoubleBracketGeneratorType, DoubleBracketIteration -from copy import deepcopy -import numpy as np import matplotlib.pyplot as plt +import numpy as np import seaborn as sns - +from double_bracket import DoubleBracketGeneratorType, DoubleBracketIteration from hyperopt import hp, tpe from qibo.config import raise_error from qibo.hamiltonians import Hamiltonian + class DoubleBracketIterationStrategies(DoubleBracketIteration): def __init__( - self, - hamiltonian: Hamiltonian, + self, + hamiltonian: Hamiltonian, NSTEPS: int = 5, - please_be_verbose = True, - please_use_hyperopt = True, + please_be_verbose=True, + please_use_hyperopt=True, mode: DoubleBracketGeneratorType = DoubleBracketGeneratorType.canonical, ): super().__init__(hamiltonian, mode) self.NSTEPS = NSTEPS self.please_be_verbose = please_be_verbose self.pleas_use_hyperopt = please_use_hyperopt - + @staticmethod def visualize_matrix(matrix, title=""): """Visualize hamiltonian in a heatmap form.""" - fig, ax = plt.subplots(figsize=(5,5)) + fig, ax = plt.subplots(figsize=(5, 5)) ax.set_title(title) try: im = ax.imshow(np.absolute(matrix), cmap="inferno") except TypeError: im = ax.imshow(np.absolute(matrix.get()), cmap="inferno") fig.colorbar(im, ax=ax) - + @staticmethod def visualize_drift(h0, h): """Visualize drift (absolute difference) of the evolved hamiltonian w.r.t. h0.""" - fig, ax = plt.subplots(figsize=(5,5)) + fig, ax = plt.subplots(figsize=(5, 5)) ax.set_title(r"Drift: $|\hat{H}_0 - \hat{H}_{\ell}|$") try: im = ax.imshow(np.absolute(h0 - h), cmap="inferno") @@ -46,14 +45,14 @@ def visualize_drift(h0, h): im = ax.imshow(np.absolute((h0 - h).get()), cmap="inferno") fig.colorbar(im, ax=ax) - + @staticmethod def plot_histories(histories, labels): """Plot off-diagonal norm histories over a sequential evolution.""" colors = sns.color_palette("inferno", n_colors=len(histories)).as_hex() - plt.figure(figsize=(5,5*6/8)) + plt.figure(figsize=(5, 5 * 6 / 8)) for i, (h, l) in enumerate(zip(histories, labels)): - plt.plot(h, lw=2, color=colors[i], label=l, marker='.') + plt.plot(h, lw=2, color=colors[i], label=l, marker=".") plt.legend() plt.xlabel("Iterations") plt.ylabel(r"$\| \sigma(\hat{H}) \|^2$") @@ -63,4 +62,3 @@ def plot_histories(histories, labels): def flow_forward(step): super().__call__(step) - \ No newline at end of file From 46dcad8c2af39ba84570ad383449def5f8b1ab1d Mon Sep 17 00:00:00 2001 From: Sam-XiaoyueLi Date: Tue, 28 Nov 2023 15:42:27 +0800 Subject: [PATCH 078/143] Additional functions flow_forwards_invariant for unchanging generator types --- examples/dbi/E1_canonical.ipynb | 140 ++++ examples/dbi/dbi.ipynb | 645 +----------------- .../additional_double_bracket_functions.py | 60 +- 3 files changed, 201 insertions(+), 644 deletions(-) diff --git a/examples/dbi/E1_canonical.ipynb b/examples/dbi/E1_canonical.ipynb index e69de29bb2..696074bf4b 100644 --- a/examples/dbi/E1_canonical.ipynb +++ b/examples/dbi/E1_canonical.ipynb @@ -0,0 +1,140 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from copy import deepcopy\n", + "\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "\n", + "from hyperopt import hp, tpe\n", + "\n", + "from qibo import hamiltonians, set_backend\n", + "from qibo.models.dbi.double_bracket import DoubleBracketGeneratorType, DoubleBracketIteration\n", + "from qibo.models.dbi.additional_double_bracket_functions import DoubleBracketIterationStrategies" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "OMP: Info #276: omp_set_nested routine deprecated, please use omp_set_max_active_levels instead.\n", + "[Qibo 0.2.3|INFO|2023-11-28 15:32:03]: Using qibojit (numba) backend on /CPU:0\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# set the qibo backend (we suggest qibojit if N >= 20)\n", + "# alternatives: tensorflow (not optimized), numpy (when CPU not supported by jit)\n", + "set_backend(\"qibojit\", \"numba\")\n", + "\n", + "# hamiltonian parameters\n", + "nqubits = 5\n", + "h = 3\n", + "\n", + "# define the hamiltonian\n", + "h = hamiltonians.TFIM(nqubits=nqubits, h=h)\n", + "\n", + "# vosualize the matrix\n", + "dbi = DoubleBracketIterationStrategies(h)\n", + "dbi.visualize_matrix(h.matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 0%| | 0/100 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "dbi.visualize_matrix(dbi.h.matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "DBF", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/dbi/dbi.ipynb b/examples/dbi/dbi.ipynb index e608c647e7..ed2e3ba4e7 100644 --- a/examples/dbi/dbi.ipynb +++ b/examples/dbi/dbi.ipynb @@ -165,7 +165,7 @@ "outputs": [], "source": [ "# here we set the canonical generator\n", - "generatortype = DoubleBracketGeneratorType.canonical" + "iterationtype = DoubleBracketGeneratorType.canonical" ] }, { @@ -185,7 +185,7 @@ "metadata": {}, "outputs": [], "source": [ - "dbf = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=generatortype)" + "dbf = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=iterationtype)" ] }, { @@ -322,7 +322,7 @@ "# initial value of the off-diagonal norm\n", "print(f\"Initial value of the off-diagonal norm: {dbf.off_diagonal_norm}\")\n", "\n", - "dbf(step=0.01, mode=generatortype)\n", + "dbf(step=0.01, mode=iterationtype)\n", "\n", "# after one step\n", "print(f\"One step later off-diagonal norm: {dbf.off_diagonal_norm}\")" @@ -415,7 +415,7 @@ "outputs": [], "source": [ "# restart\n", - "dbf_1 = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=generatortype)\n", + "dbf_1 = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=iterationtype)\n", "off_diagonal_norm_history = [dbf_1.off_diagonal_norm]\n", "histories, labels = [], [\"Fixed step\"]\n", "\n", @@ -456,7 +456,7 @@ "outputs": [], "source": [ "# restart\n", - "dbf_2 = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=generatortype)\n", + "dbf_2 = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=iterationtype)\n", "off_diagonal_norm_history = [dbf_2.off_diagonal_norm]\n", "\n", "# set the number of evolution steps\n", @@ -558,638 +558,3 @@ "nbformat": 4, "nbformat_minor": 5 } -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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# set the qibo backend (we suggest qibojit if N >= 20)\n", - "# Alternatives: tensorflow (not optimized), numpy (when CPU not supported by jit)\n", - "set_backend(\"qibojit\", \"numba\")\n", - "\n", - "# hamiltonian parameters\n", - "nqubits = 5\n", - "h = 3\n", - "\n", - "# define the hamiltonian\n", - "h = hamiltonians.TFIM(nqubits=nqubits, h=h)\n", - "\n", - "# vosualize the matrix\n", - "visualize_matrix(h.matrix, title=\"Target hamiltonian\")" - ] - }, - { - "cell_type": "markdown", - "id": "4794e779-bf2d-4ab5-97ce-f876d9522a35", - "metadata": {}, - "source": [ - "#### The generator of the evolution\n", - "\n", - "The model is implemented following the procedure presented in [1], and the first practical step is to define the generator of the iteration $\\hat{\\mathcal{U}}_{\\ell}$, which executes one diagonalization step $$\\hat{H}_{\\ell} = \\hat{\\mathcal{U}}_{\\ell}^{\\dagger} \\hat{H} \\hat{\\mathcal{U}}_{\\ell}.$$\n", - "In `Qibo`, we define the iteration type through a `DoubleBracketGeneratorType` object, which can be chosen between one of the following:\n", - "- `canonical`: the generator of the iteration at step $k+1$ is defined using the commutator between the off diagonal part $\\sigma(\\hat{H_k})$ and the diagonal part $\\Delta(\\hat{H}_k)$ of the target evolved hamiltonian:\n", - " $$\\hat{\\mathcal{U}}_{k+1}=\\exp\\bigl\\{s[\\Delta(\\hat{H}_k), \\sigma(\\hat{H}_k)]\\bigr\\}.$$ \n", - "- `single_commutator`: the evolution follows a similar procedure of the previous point in this list, but any additional matrix $D_k$ can be used to control the evolution at each step:\n", - " $$ \\hat{\\mathcal{U}}_{k+1}=\\exp\\bigl\\{s[D_k, \\hat{H}_k]\\bigr\\}. $$\n", - "- `group_commutator`: the following group commutator is used to compute the evolution:\n", - " $$ \\hat{\\mathcal{U}}_{k+1}= e^{is\\hat{H_k}} e^{isD_k} e^{-is\\hat{H_k}} e^{-isD_k}, $$\n", - "which approximates the canonical commutator for small $s$.\n", - "\n", - "In order to set one of this evolution generators one can do as follow:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "26a487e9-366b-4203-b660-e3d4af2bcb68", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "DoubleBracketGeneratorType.canonical\n", - "DoubleBracketGeneratorType.single_commutator\n", - "DoubleBracketGeneratorType.group_commutator\n" - ] - } - ], - "source": [ - "# we have a look inside the DoubleBracketGeneratorType class\n", - "for generator in DoubleBracketGeneratorType:\n", - " print(generator)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "da8dce89-27f6-403d-982a-58d531fade48", - "metadata": {}, - "outputs": [], - "source": [ - "# here we set the canonical generator\n", - "generatortype = DoubleBracketGeneratorType.canonical" - ] - }, - { - "cell_type": "markdown", - "id": "fc4f9f75-0548-4533-a13c-3aba3191e608", - "metadata": {}, - "source": [ - "#### The `DoubleBracketIteration` class\n", - "\n", - "A `DoubleBracketIteration` object can be initialize by calling the `qibo.models.double_braket.DoubleBracketIteration` model and passing the target hamiltonian and the generator type we want to use to perform the evolutionary steps." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "055870ec-55f2-4b99-a622-e3aa4c7dd0e9", - "metadata": {}, - "outputs": [], - "source": [ - "dbf = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=generatortype)" - ] - }, - { - "cell_type": "markdown", - "id": "b38cf803-60b4-467a-be8e-cbad5d81f14a", - "metadata": {}, - "source": [ - "#### `DoubleBracketIteration` features" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "9e278c3d-9f34-4a40-b453-4e030c751ef5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Backend: qibojit (numba)\n" - ] - } - ], - "source": [ - "# on which qibo backend am I running the algorithm?\n", - "print(f\"Backend: {dbf.backend}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "5b8e142b-a0a2-41bd-a16a-265a420b7360", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Initial form of the target hamiltonian:\n", - "[[-5.-0.j -3.-0.j -3.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", - " [-3.-0.j -1.-0.j -0.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", - " [-3.-0.j -0.-0.j -1.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", - " ...\n", - " [-0.-0.j -0.-0.j -0.-0.j ... -1.-0.j -0.-0.j -3.-0.j]\n", - " [-0.-0.j -0.-0.j -0.-0.j ... -0.-0.j -1.-0.j -3.-0.j]\n", - " [-0.-0.j -0.-0.j -0.-0.j ... -3.-0.j -3.-0.j -5.-0.j]]\n" - ] - } - ], - "source": [ - "# the initial target hamiltonian is a qibo hamiltonian\n", - "# thus the matrix can be accessed typing h.matrix\n", - "print(f\"Initial form of the target hamiltonian:\\n{dbf.h0.matrix}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "4f9d1d41-3df7-49cf-96ca-fa1019c00c33", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# let's visualize it in a more graphical way\n", - "visualize_matrix(dbf.h0.matrix, r\"$H_0$\")" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "7b864712-219c-44b6-8337-19ef0100e318", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# since we didn't perform yet any evolutionary step they are the same\n", - "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" - ] - }, - { - "cell_type": "markdown", - "id": "5e576bc4-4e79-4c71-9ea0-b3012e9f2ba1", - "metadata": {}, - "source": [ - "which shows $\\hat{H}$ is now identical to $\\hat{H}_0$ since no evolution step has been performed yet." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "da3d3aaa-17e1-492e-bcd3-b510f44a5391", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# diagonal part of the H target\n", - "visualize_matrix(dbf.diagonal_h_matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "24d0dfa1-7039-4d7d-8aa3-5a937b9ab0b8", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "HS norm of the off diagonal part of H: 1440.0\n" - ] - } - ], - "source": [ - "# Hilbert-Schmidt norm of the off-diagonal part\n", - "# which we want to bring to be close to zero\n", - "print(f\"HS norm of the off diagonal part of H: {dbf.off_diagonal_norm}\")" - ] - }, - { - "cell_type": "markdown", - "id": "d75e35ab-66f4-49f9-af19-679c20065a11", - "metadata": {}, - "source": [ - "Finally, the energy fluctuation of the system at step $k$ over a given state $\\mu$\n", - "\n", - "$$ \\Xi(\\mu) = \\sqrt{\\langle \\mu | \\hat{H}_k^2 | \\mu \\rangle - \\langle \\mu | \\hat{H}_k | \\mu \\rangle^2} $$\n", - "\n", - "can be computed:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "95f8d86f-07d4-498c-acb1-f6f6a4614c24", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "6.708203932499369" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# define a quantum state\n", - "# for example the ground state of a multi-qubit Z hamiltonian\n", - "Z = hamiltonians.Z(nqubits=nqubits)\n", - "state = Z.ground_state()\n", - "\n", - "# compute energy fluctuations using current H and given state\n", - "dbf.energy_fluctuation(state)" - ] - }, - { - "cell_type": "markdown", - "id": "3d5b37f3-2477-49a0-9f80-7da5ddda1fff", - "metadata": {}, - "source": [ - "#### Call the `DoubleBracketIteration` to perform a DBF iteration\n", - "\n", - "If the DBF object is called, a Double Bracket Iteration iteration is performed. This can be done customizing the iteration by setting the iteration step and the desired `DoubleBracketGeneratorType`. If no generator is provided, the one passed at the initialization time is used (default is `DoubleBracketGeneratorType.canonical`)." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "9a886261-8aa6-4df0-a31b-9c39847db124", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Initial value of the off-diagonal norm: 1440.0\n", - "One step later off-diagonal norm: 1168.2530943739994\n" - ] - } - ], - "source": [ - "# perform one evolution step\n", - "\n", - "# initial value of the off-diagonal norm\n", - "print(f\"Initial value of the off-diagonal norm: {dbf.off_diagonal_norm}\")\n", - "\n", - "dbf(step=0.01, mode=generatortype)\n", - "\n", - "# after one step\n", - "print(f\"One step later off-diagonal norm: {dbf.off_diagonal_norm}\")" - ] - }, - { - "cell_type": "markdown", - "id": "b78dd05d-ffe3-435a-b5ec-2a42f28066b2", - "metadata": {}, - "source": [ - "We can check now if something happened by plotting the drift:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "cc74812d-7c2c-44e4-afc2-e235968801b4", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" - ] - }, - { - "cell_type": "markdown", - "id": "3465a422-eebf-4e80-ae96-bba894132330", - "metadata": {}, - "source": [ - "The set step can be good, but maybe not the best one. In order to do this choice in a wiser way, we can call the DBF hyperoptimization routine to search for a better initial step. The `dbf.hyperopt_step` method is built on top of the [`hyperopt`](https://hyperopt.github.io/hyperopt/) package. Any algorithm or sampling space provided by the official package can be used. We are going to use the default options (we sample new steps from a uniform space following a _Tree of Parzen estimators algorithm_)." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "aad79966-7a11-4a45-aba5-4a4bb8315c50", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "100%|██████████| 1000/1000 [00:03<00:00, 258.54trial/s, best loss: 1301.8618493572444]\n", - "0.999959832862263\n" - ] - } - ], - "source": [ - "# restart\n", - "dbf.h = dbf.h0\n", - "\n", - "# optimization of the step, we allow to search in [1e-5, 1]\n", - "step = dbf.hyperopt_step(\n", - " step_min = 1e-5,\n", - " step_max = 1,\n", - " space = hp.uniform,\n", - " optimizer = tpe,\n", - " max_evals = 1000,\n", - " verbose = True\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "49483a47-d29d-440e-a4bc-143bfe6bb3cf", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "visualize_matrix(dbf.h.matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "6bdaf7f9-7e49-4a16-8b29-ae1f9746cd9b", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" - ] - }, - { - "cell_type": "markdown", - "id": "b5f1d00e-e763-40d9-822f-e0e8d4c57d9a", - "metadata": {}, - "source": [ - "#### Let's evolve the model for `NSTEPS`\n", - "\n", - "We know recover the initial hamiltonian, and we perform a sequence of DBF iteration steps, in order to show how this mechanism can lead to a proper diagonalization of the target hamiltonian.\n", - "\n", - "#### Method 1: fixed step" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "59a6a485-a714-4e14-b27a-1df2930068ee", - "metadata": {}, - "outputs": [], - "source": [ - "# restart\n", - "dbf_1 = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=generatortype)\n", - "off_diagonal_norm_history = [dbf_1.off_diagonal_norm]\n", - "histories, labels = [], [\"Fixed step\"]\n", - "\n", - "# set the number of evolution steps\n", - "NSTEPS = 20\n", - "step = 0.005\n", - "\n", - "for s in range(NSTEPS):\n", - " dbf_1(step=step)\n", - " off_diagonal_norm_history.append(dbf_1.off_diagonal_norm)\n", - "\n", - "histories.append(off_diagonal_norm_history)" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "7e0b2f18-ca53-4f34-9fcf-0052dcc31dc5", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_histories(histories, labels)" - ] - }, - { - "cell_type": "markdown", - "id": "eb797d6c-0eba-4da4-b492-8b5d70f9123f", - "metadata": {}, - "source": [ - "#### Method 2: optimizing the step" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "a6fd1e33-3620-4f3b-b705-a120f6da0027", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "100%|██████████| 500/500 [00:01<00:00, 395.91trial/s, best loss: 830.741659158309] \n", - "New optimized step at iteration 1/20: 0.01404582562364698\n", - "New optimized step at iteration 2/20: 0.00482699842450417\n", - "New optimized step at iteration 3/20: 0.007163610307149949\n", - "New optimized step at iteration 4/20: 0.005723837311966835\n", - "New optimized step at iteration 5/20: 0.010405764803590473\n", - "New optimized step at iteration 6/20: 0.007528815620413614\n", - "New optimized step at iteration 7/20: 0.007887770624463187\n", - "New optimized step at iteration 8/20: 0.006301358802023468\n", - "New optimized step at iteration 9/20: 0.009969449232968781\n", - "New optimized step at iteration 10/20: 0.006765387147882551\n", - "New optimized step at iteration 11/20: 0.0058573752572720714\n", - "New optimized step at iteration 12/20: 0.013901736820231686\n", - "New optimized step at iteration 13/20: 0.0029898714608809357\n", - "New optimized step at iteration 14/20: 0.025178568486685336\n", - "New optimized step at iteration 15/20: 0.0028045604719951554\n", - "New optimized step at iteration 16/20: 0.00300057233068024\n", - "New optimized step at iteration 17/20: 0.000530435165988968\n", - "New optimized step at iteration 18/20: 0.003916417493158211\n", - "New optimized step at iteration 19/20: 0.0017852716197505059\n" - ] - } - ], - "source": [ - "# restart\n", - "dbf_2 = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=generatortype)\n", - "off_diagonal_norm_history = [dbf_2.off_diagonal_norm]\n", - "\n", - "# set the number of evolution steps\n", - "NSTEPS = 20\n", - "\n", - "# optimize first step\n", - "step = dbf_2.hyperopt_step(\n", - " step_min = 1e-5,\n", - " step_max = 1,\n", - " space = hp.uniform,\n", - " optimizer = tpe,\n", - " max_evals = 500,\n", - " verbose = True\n", - ")\n", - "\n", - "for s in range(NSTEPS):\n", - " if s != 0:\n", - " step = dbf_2.hyperopt_step(\n", - " step_min = 1e-5,\n", - " step_max = 1,\n", - " space = hp.uniform,\n", - " optimizer = tpe,\n", - " max_evals = 100,\n", - " )\n", - " print(f\"New optimized step at iteration {s}/{NSTEPS}: {step}\")\n", - " dbf_2(step=step)\n", - " off_diagonal_norm_history.append(dbf_2.off_diagonal_norm)\n", - "\n", - "histories.append(off_diagonal_norm_history)\n", - "labels.append(\"Optimizing step\")" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "0f0212bf-b642-4fea-9203-037876e0b266", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_histories(histories, labels)" - ] - }, - { - "cell_type": "markdown", - "id": "32341937-4178-41d2-a10e-5e4d2634098e", - "metadata": {}, - "source": [ - "The hyperoptimization can lead to a faster convergence of the algorithm." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "82b89092-07e5-4788-9ae0-8907df2428eb", - "metadata": {}, - "outputs": [], - "source": [ - "visualize_matrix(dbf_1.h.matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ac8ed320-04a8-42af-a980-48ab4f1fff7c", - "metadata": {}, - "outputs": [], - "source": [ - "visualize_matrix(dbf_2.h.matrix)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.5" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/src/qibo/models/dbi/additional_double_bracket_functions.py b/src/qibo/models/dbi/additional_double_bracket_functions.py index 93fc596775..569351d366 100644 --- a/src/qibo/models/dbi/additional_double_bracket_functions.py +++ b/src/qibo/models/dbi/additional_double_bracket_functions.py @@ -1,8 +1,8 @@ - +from copy import deepcopy import matplotlib.pyplot as plt import numpy as np import seaborn as sns -from double_bracket import DoubleBracketGeneratorType, DoubleBracketIteration +from qibo.models.dbi.double_bracket import DoubleBracketGeneratorType, DoubleBracketIteration from hyperopt import hp, tpe from qibo.config import raise_error @@ -60,5 +60,57 @@ def plot_histories(histories, labels): plt.grid(True) plt.show() - def flow_forward(step): - super().__call__(step) + def flow_step( + self, + step: float, + mode: DoubleBracketGeneratorType = None, + d: np.array = None, + update_h = False + ): + """"Computes the flowed hamiltonian after one double bracket iteration (and updates)""" + if mode is None: + mode = self.mode + + if mode is DoubleBracketGeneratorType.canonical: + operator = self.backend.calculate_matrix_exp( + 1.0j * step, + self.commutator(self.diagonal_h_matrix, self.h.matrix), + ) + elif mode is DoubleBracketGeneratorType.single_commutator: + if d is None: + raise_error(ValueError, f"Cannot use group_commutator with matrix {d}") + operator = self.backend.calculate_matrix_exp( + 1.0j * step, + self.commutator(d, self.h.matrix), + ) + elif mode is DoubleBracketGeneratorType.group_commutator: + if d is None: + raise_error(ValueError, f"Cannot use group_commutator with matrix {d}") + operator = ( + self.h.exp(-step) + @ self.backend.calculate_matrix_exp(-step, d) + @ self.h.exp(step) + @ self.backend.calculate_matrix_exp(step, d) + ) + operator_dagger = self.backend.cast( + np.matrix(self.backend.to_numpy(operator)).getH() + ) + if update_h is True: + self.h.matrix = operator @ self.h.matrix @ operator_dagger + return operator @ self.h.matrix @ operator_dagger + + def flow_forwards_invariant(self, H = None, step = 0.1): + """Execute multiple Double Bracket iterations with the same flow generator """ + if H is None: + H = deepcopy(self.h) + for s in range(self.NSTEPS): + if self.pleas_use_hyperopt is True: + step = self.hyperopt_step( + step_min = 1e-5, + step_max = 1, + space = hp.uniform, + optimizer = tpe, + max_evals = 100, + verbose = True + ) + self.flow_step(step, update_h = True) \ No newline at end of file From 7b74a3429a90eb3fdadf29e86ffe7d84388a1340 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 07:43:07 +0000 Subject: [PATCH 079/143] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../additional_double_bracket_functions.py | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/qibo/models/dbi/additional_double_bracket_functions.py b/src/qibo/models/dbi/additional_double_bracket_functions.py index 569351d366..c56b630b75 100644 --- a/src/qibo/models/dbi/additional_double_bracket_functions.py +++ b/src/qibo/models/dbi/additional_double_bracket_functions.py @@ -1,12 +1,16 @@ from copy import deepcopy + import matplotlib.pyplot as plt import numpy as np import seaborn as sns -from qibo.models.dbi.double_bracket import DoubleBracketGeneratorType, DoubleBracketIteration from hyperopt import hp, tpe from qibo.config import raise_error from qibo.hamiltonians import Hamiltonian +from qibo.models.dbi.double_bracket import ( + DoubleBracketGeneratorType, + DoubleBracketIteration, +) class DoubleBracketIterationStrategies(DoubleBracketIteration): @@ -61,13 +65,13 @@ def plot_histories(histories, labels): plt.show() def flow_step( - self, - step: float, + self, + step: float, mode: DoubleBracketGeneratorType = None, d: np.array = None, - update_h = False + update_h=False, ): - """"Computes the flowed hamiltonian after one double bracket iteration (and updates)""" + """ "Computes the flowed hamiltonian after one double bracket iteration (and updates)""" if mode is None: mode = self.mode @@ -99,18 +103,18 @@ def flow_step( self.h.matrix = operator @ self.h.matrix @ operator_dagger return operator @ self.h.matrix @ operator_dagger - def flow_forwards_invariant(self, H = None, step = 0.1): - """Execute multiple Double Bracket iterations with the same flow generator """ + def flow_forwards_invariant(self, H=None, step=0.1): + """Execute multiple Double Bracket iterations with the same flow generator""" if H is None: H = deepcopy(self.h) for s in range(self.NSTEPS): if self.pleas_use_hyperopt is True: step = self.hyperopt_step( - step_min = 1e-5, - step_max = 1, - space = hp.uniform, - optimizer = tpe, - max_evals = 100, - verbose = True + step_min=1e-5, + step_max=1, + space=hp.uniform, + optimizer=tpe, + max_evals=100, + verbose=True, ) - self.flow_step(step, update_h = True) \ No newline at end of file + self.flow_step(step, update_h=True) From 9395dee83d9f8e0bb6fa2c30e8a8f8a3dafd8c3e Mon Sep 17 00:00:00 2001 From: Sam-XiaoyueLi Date: Tue, 28 Nov 2023 19:57:23 +0800 Subject: [PATCH 080/143] Revert to 70c0d1eb43a7171e4d4def3781a1b7452994e7b9 --- examples/dbi/E1_canonical.ipynb | 140 ------------------ .../additional_double_bracket_functions.py | 120 --------------- 2 files changed, 260 deletions(-) delete mode 100644 examples/dbi/E1_canonical.ipynb delete mode 100644 src/qibo/models/dbi/additional_double_bracket_functions.py diff --git a/examples/dbi/E1_canonical.ipynb b/examples/dbi/E1_canonical.ipynb deleted file mode 100644 index 696074bf4b..0000000000 --- a/examples/dbi/E1_canonical.ipynb +++ /dev/null @@ -1,140 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from copy import deepcopy\n", - "\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "import seaborn as sns\n", - "\n", - "from hyperopt import hp, tpe\n", - "\n", - "from qibo import hamiltonians, set_backend\n", - "from qibo.models.dbi.double_bracket import DoubleBracketGeneratorType, DoubleBracketIteration\n", - "from qibo.models.dbi.additional_double_bracket_functions import DoubleBracketIterationStrategies" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "OMP: Info #276: omp_set_nested routine deprecated, please use omp_set_max_active_levels instead.\n", - "[Qibo 0.2.3|INFO|2023-11-28 15:32:03]: Using qibojit (numba) backend on /CPU:0\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# set the qibo backend (we suggest qibojit if N >= 20)\n", - "# alternatives: tensorflow (not optimized), numpy (when CPU not supported by jit)\n", - "set_backend(\"qibojit\", \"numba\")\n", - "\n", - "# hamiltonian parameters\n", - "nqubits = 5\n", - "h = 3\n", - "\n", - "# define the hamiltonian\n", - "h = hamiltonians.TFIM(nqubits=nqubits, h=h)\n", - "\n", - "# vosualize the matrix\n", - "dbi = DoubleBracketIterationStrategies(h)\n", - "dbi.visualize_matrix(h.matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 0%| | 0/100 [00:00" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "dbi.visualize_matrix(dbi.h.matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "DBF", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/src/qibo/models/dbi/additional_double_bracket_functions.py b/src/qibo/models/dbi/additional_double_bracket_functions.py deleted file mode 100644 index c56b630b75..0000000000 --- a/src/qibo/models/dbi/additional_double_bracket_functions.py +++ /dev/null @@ -1,120 +0,0 @@ -from copy import deepcopy - -import matplotlib.pyplot as plt -import numpy as np -import seaborn as sns -from hyperopt import hp, tpe - -from qibo.config import raise_error -from qibo.hamiltonians import Hamiltonian -from qibo.models.dbi.double_bracket import ( - DoubleBracketGeneratorType, - DoubleBracketIteration, -) - - -class DoubleBracketIterationStrategies(DoubleBracketIteration): - def __init__( - self, - hamiltonian: Hamiltonian, - NSTEPS: int = 5, - please_be_verbose=True, - please_use_hyperopt=True, - mode: DoubleBracketGeneratorType = DoubleBracketGeneratorType.canonical, - ): - super().__init__(hamiltonian, mode) - self.NSTEPS = NSTEPS - self.please_be_verbose = please_be_verbose - self.pleas_use_hyperopt = please_use_hyperopt - - @staticmethod - def visualize_matrix(matrix, title=""): - """Visualize hamiltonian in a heatmap form.""" - fig, ax = plt.subplots(figsize=(5, 5)) - ax.set_title(title) - try: - im = ax.imshow(np.absolute(matrix), cmap="inferno") - except TypeError: - im = ax.imshow(np.absolute(matrix.get()), cmap="inferno") - fig.colorbar(im, ax=ax) - - @staticmethod - def visualize_drift(h0, h): - """Visualize drift (absolute difference) of the evolved hamiltonian w.r.t. h0.""" - fig, ax = plt.subplots(figsize=(5, 5)) - ax.set_title(r"Drift: $|\hat{H}_0 - \hat{H}_{\ell}|$") - try: - im = ax.imshow(np.absolute(h0 - h), cmap="inferno") - except TypeError: - im = ax.imshow(np.absolute((h0 - h).get()), cmap="inferno") - - fig.colorbar(im, ax=ax) - - @staticmethod - def plot_histories(histories, labels): - """Plot off-diagonal norm histories over a sequential evolution.""" - colors = sns.color_palette("inferno", n_colors=len(histories)).as_hex() - plt.figure(figsize=(5, 5 * 6 / 8)) - for i, (h, l) in enumerate(zip(histories, labels)): - plt.plot(h, lw=2, color=colors[i], label=l, marker=".") - plt.legend() - plt.xlabel("Iterations") - plt.ylabel(r"$\| \sigma(\hat{H}) \|^2$") - plt.title("Loss function histories") - plt.grid(True) - plt.show() - - def flow_step( - self, - step: float, - mode: DoubleBracketGeneratorType = None, - d: np.array = None, - update_h=False, - ): - """ "Computes the flowed hamiltonian after one double bracket iteration (and updates)""" - if mode is None: - mode = self.mode - - if mode is DoubleBracketGeneratorType.canonical: - operator = self.backend.calculate_matrix_exp( - 1.0j * step, - self.commutator(self.diagonal_h_matrix, self.h.matrix), - ) - elif mode is DoubleBracketGeneratorType.single_commutator: - if d is None: - raise_error(ValueError, f"Cannot use group_commutator with matrix {d}") - operator = self.backend.calculate_matrix_exp( - 1.0j * step, - self.commutator(d, self.h.matrix), - ) - elif mode is DoubleBracketGeneratorType.group_commutator: - if d is None: - raise_error(ValueError, f"Cannot use group_commutator with matrix {d}") - operator = ( - self.h.exp(-step) - @ self.backend.calculate_matrix_exp(-step, d) - @ self.h.exp(step) - @ self.backend.calculate_matrix_exp(step, d) - ) - operator_dagger = self.backend.cast( - np.matrix(self.backend.to_numpy(operator)).getH() - ) - if update_h is True: - self.h.matrix = operator @ self.h.matrix @ operator_dagger - return operator @ self.h.matrix @ operator_dagger - - def flow_forwards_invariant(self, H=None, step=0.1): - """Execute multiple Double Bracket iterations with the same flow generator""" - if H is None: - H = deepcopy(self.h) - for s in range(self.NSTEPS): - if self.pleas_use_hyperopt is True: - step = self.hyperopt_step( - step_min=1e-5, - step_max=1, - space=hp.uniform, - optimizer=tpe, - max_evals=100, - verbose=True, - ) - self.flow_step(step, update_h=True) From 81fb6eca3fe3d45e2aaf0b055872770bacd11703 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Tue, 28 Nov 2023 15:17:19 +0100 Subject: [PATCH 081/143] fixing python version in metadata --- examples/dbi/dbi.ipynb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/dbi/dbi.ipynb b/examples/dbi/dbi.ipynb index ed2e3ba4e7..4bb9b286c0 100644 --- a/examples/dbi/dbi.ipynb +++ b/examples/dbi/dbi.ipynb @@ -21,8 +21,8 @@ "metadata": {}, "outputs": [], "source": [ - "!python -m pip install seaborn # plotting library\n", - "!python -m pip install hyperopt # required to optimize the DBF step" + "!pip install seaborn # plotting library\n", + "!pip install hyperopt # required to optimize the DBF step" ] }, { @@ -538,9 +538,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python (ipykernel)", "language": "python", - "name": "python3" + "name": "python" }, "language_info": { "codemirror_mode": { From 9580e4488f24d15b8da93e8425b1a5ddf74032cb Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Tue, 28 Nov 2023 16:19:43 +0100 Subject: [PATCH 082/143] use magic command %pip --- examples/dbi/dbi.ipynb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/dbi/dbi.ipynb b/examples/dbi/dbi.ipynb index 4bb9b286c0..d04aa22b83 100644 --- a/examples/dbi/dbi.ipynb +++ b/examples/dbi/dbi.ipynb @@ -17,12 +17,12 @@ { "cell_type": "code", "execution_count": null, - "id": "e1f362b8-eb73-456e-ae48-94c5f2a12649", + "id": "b42faf70-f501-4579-802e-9c36085ec16c", "metadata": {}, "outputs": [], "source": [ - "!pip install seaborn # plotting library\n", - "!pip install hyperopt # required to optimize the DBF step" + "%pip install seaborn # plotting library\n", + "%pip install hyperopt # required to optimize the DBF step" ] }, { @@ -538,9 +538,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python (ipykernel)", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": "python" + "name": "python3" }, "language_info": { "codemirror_mode": { From 9b301622866d84fbaeba55570e94110cfc6c7770 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Tue, 28 Nov 2023 17:09:03 +0100 Subject: [PATCH 083/143] add energy fluctuations in VQE --- src/qibo/models/variational.py | 18 ++++++++++++++++++ tests/test_models_variational.py | 5 +++++ 2 files changed, 23 insertions(+) diff --git a/src/qibo/models/variational.py b/src/qibo/models/variational.py index 7172bf07d8..b3128248f9 100644 --- a/src/qibo/models/variational.py +++ b/src/qibo/models/variational.py @@ -1,5 +1,7 @@ +import numpy as np from qibo.config import raise_error from qibo.models.evolution import StateEvolution +from qibo.hamiltonians import Hamiltonian class VQE: @@ -33,6 +35,7 @@ def __init__(self, circuit, hamiltonian): """Initialize circuit ansatz and hamiltonian.""" self.circuit = circuit self.hamiltonian = hamiltonian + self.backend = hamiltonian.backend def minimize( self, @@ -115,6 +118,21 @@ def _loss(params, circuit, hamiltonian): ) self.circuit.set_parameters(parameters) return result, parameters, extra + + def energy_fluctuation(self, state): + """ + Evaluate energy fluctuation + + .. math:: + \\Xi_{k}(\\mu) = \\sqrt{\\langle\\mu|\\hat{H}_{k}^2|\\mu\\rangle - \\langle\\mu|\\hat{H}_{k}|\\mu\\rangle^2} \\, + + for a given state :math:`|\\mu\\rangle`. + """ + energy = self.hamiltonian.expectation(state) + h = self.hamiltonian.matrix + h2 = Hamiltonian(nqubits=self.hamiltonian.nqubits, matrix=h @ h, backend=self.backend) + average_h2 = self.backend.calculate_expectation_state(h2, state, normalize=True) + return np.sqrt(average_h2 - energy**2) class AAVQE: diff --git a/tests/test_models_variational.py b/tests/test_models_variational.py index 795a7b57b2..2ef522fc50 100644 --- a/tests/test_models_variational.py +++ b/tests/test_models_variational.py @@ -132,6 +132,11 @@ def test_vqe(backend, method, options, compile, filename): if filename is not None: assert_regression_fixture(backend, params, filename) + # test energy fluctuation + state = v.hamiltonian.ground_state + energy_fluctuation = v.energy_fluctuation(state) + assert energy_fluctuation != 0 + @pytest.mark.parametrize( "solver,dense", From 50f9491bed507ea21d89d49abab8756766caec57 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Tue, 28 Nov 2023 17:13:14 +0100 Subject: [PATCH 084/143] fix docstrings --- src/qibo/models/variational.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibo/models/variational.py b/src/qibo/models/variational.py index b3128248f9..feaf0261fb 100644 --- a/src/qibo/models/variational.py +++ b/src/qibo/models/variational.py @@ -124,7 +124,7 @@ def energy_fluctuation(self, state): Evaluate energy fluctuation .. math:: - \\Xi_{k}(\\mu) = \\sqrt{\\langle\\mu|\\hat{H}_{k}^2|\\mu\\rangle - \\langle\\mu|\\hat{H}_{k}|\\mu\\rangle^2} \\, + \\Xi_{k}(\\mu) = \\sqrt{\\langle\\mu|\\hat{H}^2|\\mu\\rangle - \\langle\\mu|\\hat{H}|\\mu\\rangle^2} \\, for a given state :math:`|\\mu\\rangle`. """ From 3ddad062673fa8205685a6cdd0e512090e3fbb8d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 16:14:07 +0000 Subject: [PATCH 085/143] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/qibo/models/variational.py | 9 ++++++--- tests/test_models_variational.py | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/qibo/models/variational.py b/src/qibo/models/variational.py index feaf0261fb..95b247511b 100644 --- a/src/qibo/models/variational.py +++ b/src/qibo/models/variational.py @@ -1,7 +1,8 @@ import numpy as np + from qibo.config import raise_error -from qibo.models.evolution import StateEvolution from qibo.hamiltonians import Hamiltonian +from qibo.models.evolution import StateEvolution class VQE: @@ -118,7 +119,7 @@ def _loss(params, circuit, hamiltonian): ) self.circuit.set_parameters(parameters) return result, parameters, extra - + def energy_fluctuation(self, state): """ Evaluate energy fluctuation @@ -130,7 +131,9 @@ def energy_fluctuation(self, state): """ energy = self.hamiltonian.expectation(state) h = self.hamiltonian.matrix - h2 = Hamiltonian(nqubits=self.hamiltonian.nqubits, matrix=h @ h, backend=self.backend) + h2 = Hamiltonian( + nqubits=self.hamiltonian.nqubits, matrix=h @ h, backend=self.backend + ) average_h2 = self.backend.calculate_expectation_state(h2, state, normalize=True) return np.sqrt(average_h2 - energy**2) diff --git a/tests/test_models_variational.py b/tests/test_models_variational.py index 2ef522fc50..deeb0bffcd 100644 --- a/tests/test_models_variational.py +++ b/tests/test_models_variational.py @@ -135,7 +135,7 @@ def test_vqe(backend, method, options, compile, filename): # test energy fluctuation state = v.hamiltonian.ground_state energy_fluctuation = v.energy_fluctuation(state) - assert energy_fluctuation != 0 + assert energy_fluctuation != 0 @pytest.mark.parametrize( From 5838d417d107d87e6d788bea539de5a81f701d6d Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Tue, 28 Nov 2023 17:19:16 +0100 Subject: [PATCH 086/143] add seaborn to test extra deps --- poetry.lock | 269 +++++++++++++++++++++++++++---------------------- pyproject.toml | 1 + 2 files changed, 150 insertions(+), 120 deletions(-) diff --git a/poetry.lock b/poetry.lock index ab543ddbf8..618664ceb6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. [[package]] name = "absl-py" @@ -24,13 +24,13 @@ files = [ [[package]] name = "anyio" -version = "4.0.0" +version = "4.1.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" files = [ - {file = "anyio-4.0.0-py3-none-any.whl", hash = "sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f"}, - {file = "anyio-4.0.0.tar.gz", hash = "sha256:f7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a"}, + {file = "anyio-4.1.0-py3-none-any.whl", hash = "sha256:56a415fbc462291813a94528a779597226619c8e78af7de0507333f700011e5f"}, + {file = "anyio-4.1.0.tar.gz", hash = "sha256:5a0bec7085176715be77df87fc66d6c9d70626bd752fcc85f57cdbee5b3760da"}, ] [package.dependencies] @@ -39,20 +39,9 @@ idna = ">=2.8" sniffio = ">=1.1" [package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.22)"] - -[[package]] -name = "appnope" -version = "0.1.3" -description = "Disable App Nap on macOS >= 10.9" -optional = false -python-versions = "*" -files = [ - {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, - {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, -] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] [[package]] name = "astroid" @@ -863,7 +852,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]] @@ -875,7 +863,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]] @@ -1071,13 +1058,13 @@ scipy = ">=0.9" [[package]] name = "exceptiongroup" -version = "1.1.3" +version = "1.2.0" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, - {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, ] [package.extras] @@ -1223,53 +1210,53 @@ files = [ [[package]] name = "fonttools" -version = "4.45.0" +version = "4.45.1" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.45.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:18138744540413eb2ebeff6ce8b9d617926f1ed08da5d1676f99f1966988264e"}, - {file = "fonttools-4.45.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0b3d240933045b9dbbe6e8c1e28ffe89be72c9be927b6e572e55be5e2b2604f7"}, - {file = "fonttools-4.45.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5853263505f407b69c0d1cbf3ed1c30f985b9505523989b20aa18a5231d4a08a"}, - {file = "fonttools-4.45.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c21f306f1e71146cf7587916d6de5e9c4bf26057aad602a6c7fad4b6e05bf1f"}, - {file = "fonttools-4.45.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1bb4f01018b9f4e2d7b07c2bf79e2ef498acb6f99321b72b5c44b1333481f569"}, - {file = "fonttools-4.45.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d0e6603c3b00604574d84fabbcf9dee81efa7c89d38ed4dcbf4e6c654e1ebb99"}, - {file = "fonttools-4.45.0-cp310-cp310-win32.whl", hash = "sha256:c3e676e50a0713c9a1e46185b806967d3c012643d1936ca814eb9ab62027c090"}, - {file = "fonttools-4.45.0-cp310-cp310-win_amd64.whl", hash = "sha256:e819f14d315024750b1ad2842da605051444b944cd983ea987359ace5213bcb9"}, - {file = "fonttools-4.45.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a6d68b97b967a3361e0ddf14425e4fe030c9f19462b445ce0b190c4a6834eb46"}, - {file = "fonttools-4.45.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:619227c7b9088add4d4e5959bf0fa3c29a71c191baa8b989bf532645876b2168"}, - {file = "fonttools-4.45.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cafe001811ad1ac2a5d357fc99c490357d758569f69511d14da0311c02814e15"}, - {file = "fonttools-4.45.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:756c6f4324fd4bb4d7517462d7237ff65e45da7a002f9e6e08a48c25a11bf073"}, - {file = "fonttools-4.45.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ecc97628be1bf7fa93463e1e791915da66de51df8e655a5a6c846fd9b8ceaa98"}, - {file = "fonttools-4.45.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:636177ffc4479bc824a356c00a3c9a74a2ce591fa6057109321e0a0ffd126e40"}, - {file = "fonttools-4.45.0-cp311-cp311-win32.whl", hash = "sha256:cac462dbd9058778c89bc608ac29ba93ab3fbc37f305d260aa2d771cfb0fa694"}, - {file = "fonttools-4.45.0-cp311-cp311-win_amd64.whl", hash = "sha256:2bd3f33a5d5630cc20cf3f8631074cac6eafdb2aa3ac8745966c3b4bf93656b4"}, - {file = "fonttools-4.45.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5b3da7791a58c97763d1704c2b76a9d654b8f2ef233e64248960bd2c6e669fe4"}, - {file = "fonttools-4.45.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4fbc3d8acb578ba0932fcabc01a962f23b0dd254ab103dd0606128fff0175095"}, - {file = "fonttools-4.45.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f69e07ebfd89d96485349dc10bd81a027fc0e927f988fa31bd9cd06359e06ed"}, - {file = "fonttools-4.45.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b122fe802839bfc8f9603233e5fcbdc98b5e27876f7945b426adfea983918a7b"}, - {file = "fonttools-4.45.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8f8736e885700ae22970519b8f5c7f4c2f29c6e9459d05c649c4e99012c20b23"}, - {file = "fonttools-4.45.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:70f047ba37c6aac3d331b71bb784373e251bd86678da72526edc8585e79418e1"}, - {file = "fonttools-4.45.0-cp312-cp312-win32.whl", hash = "sha256:fdb43f68bce545f494fed1bfb60d2c32b53f410758919112923c2d600cb9a24c"}, - {file = "fonttools-4.45.0-cp312-cp312-win_amd64.whl", hash = "sha256:102a7ca8700a078265c002c29d2ae498edeb14b636375ceec2425b561ce08037"}, - {file = "fonttools-4.45.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4b154cbf93515e4eb477f5cf99de79b46c17229781f321907940bdbabbd64708"}, - {file = "fonttools-4.45.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f546a1b676622638a12c721d89cfb513ad7189548eadac885cdd555e35021557"}, - {file = "fonttools-4.45.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c5a0612049e0d06b467c3a0837d9efe37934acab64ba922f00e1d07c1555a7"}, - {file = "fonttools-4.45.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f27166d00e0cd3ea49461b053f55e75676f1109e5483170a14d70c397d082a4c"}, - {file = "fonttools-4.45.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:980ba4e673439db22a00501fac087957ce0731351b042816f6c02df81cadc612"}, - {file = "fonttools-4.45.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:83b70b99f3f55b046cb51ca20fc15702567710233b2cd757a79e1916c25a25f8"}, - {file = "fonttools-4.45.0-cp38-cp38-win32.whl", hash = "sha256:fe8ad943f62bf16273154ebcdf855c44a3b46eac36abea338c209209439b4eb6"}, - {file = "fonttools-4.45.0-cp38-cp38-win_amd64.whl", hash = "sha256:6fb1fdcee2b36e012283805ef0380e4508dbb504950b1c94d0343f8dbbad7d7e"}, - {file = "fonttools-4.45.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5bbcb75ffcea64543ab8203e132e2019b226f59a4a6958637e78c21f9ca560ff"}, - {file = "fonttools-4.45.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ade07953b35ebf66c445a5e02f28ecd038ea588dc7673c555afe319b6e3c5168"}, - {file = "fonttools-4.45.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54ac8be3f693062fc08550213edd40db8f4fe1dd095a1246ed18e887fc254d76"}, - {file = "fonttools-4.45.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc991712aaea9d545b13ec480aaf2ebd12ccdea180fce864dd9863f5134f5a06"}, - {file = "fonttools-4.45.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:420139743e21d832de230757fb7b0c285d8024d602af8064d9506fa055bb62ae"}, - {file = "fonttools-4.45.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:58da830a52c05f18a7cc8a279a8bdddf2e45cdc685b360699653fb3405557459"}, - {file = "fonttools-4.45.0-cp39-cp39-win32.whl", hash = "sha256:715e18f67f0587a16476c7f62b8ff9a165ddceb8c2a262fb08df9f71c7790f0e"}, - {file = "fonttools-4.45.0-cp39-cp39-win_amd64.whl", hash = "sha256:dd26fda8c879558216458a801c1dba52f35dca0e96640fd9c75e86b6574cf1c3"}, - {file = "fonttools-4.45.0-py3-none-any.whl", hash = "sha256:835cf5d0e1b37bbed1d64c286611cc4da9ff19df952400f191ba9142b3cb97f6"}, - {file = "fonttools-4.45.0.tar.gz", hash = "sha256:c1c79d7d4093396892575115c214b24f09e68997cb5c0ab2d99bfdaff74c64b6"}, + {file = "fonttools-4.45.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:45fa321c458ea29224067700954ec44493ae869b47e7c5485a350a149a19fb53"}, + {file = "fonttools-4.45.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0dc7617d96b1e668eea9250e1c1fe62d0c78c3f69573ce7e3332cc40e6d84356"}, + {file = "fonttools-4.45.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ed3bda541e86725f6b4e1b94213f13ed1ae51a5a1f167028534cedea38c010"}, + {file = "fonttools-4.45.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f4a5870e3b56788fb196da8cf30d0dfd51a76dc3b907861d018165f76ae4c2"}, + {file = "fonttools-4.45.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a3c11d9687479f01eddef729aa737abcdea0a44fdaffb62a930a18892f186c9b"}, + {file = "fonttools-4.45.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:316cec50581e844c3ab69d7c82455b54c7cf18236b2f09e722faf665fbfcac58"}, + {file = "fonttools-4.45.1-cp310-cp310-win32.whl", hash = "sha256:e2277cba9f0b525e30de2a9ad3cb4219aa4bc697230c1645666b0deee9f914f0"}, + {file = "fonttools-4.45.1-cp310-cp310-win_amd64.whl", hash = "sha256:1b9e9ad2bcded9a1431afaa57c8d3c39143ac1f050862d66bddd863c515464a2"}, + {file = "fonttools-4.45.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff6a698bdd435d24c379f6e8a54908cd9bb7dda23719084d56bf8c87709bf3bd"}, + {file = "fonttools-4.45.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c980d60cd6ec1376206fe55013d166e5627ad0b149b5c81e74eaa913ab6134f"}, + {file = "fonttools-4.45.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a12dee6523c02ca78aeedd0a5e12bfa9b7b29896350edd5241542897b072ae23"}, + {file = "fonttools-4.45.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37cd1ced6efb3dd6fe82e9f9bf92fd74ac58a5aefc284045f59ecd517a5fb9ab"}, + {file = "fonttools-4.45.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e3d24248221bd7151dfff0d88b1b5da02dccd7134bd576ce8888199827bbaa19"}, + {file = "fonttools-4.45.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ba6c23591427844dfb0a13658f1718489de75de6a46b64234584c0d17573162d"}, + {file = "fonttools-4.45.1-cp311-cp311-win32.whl", hash = "sha256:cebcddbe9351b67166292b4f71ffdbfcce01ba4b07d4267824eb46b277aeb19a"}, + {file = "fonttools-4.45.1-cp311-cp311-win_amd64.whl", hash = "sha256:f22eb69996a0bd49f76bdefb30be54ce8dbb89a0d1246874d610f05c2aa2e69e"}, + {file = "fonttools-4.45.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:794de93e83297db7b4943f2431e206d8b1ea69cb3ae14638a49cc50332bf0db8"}, + {file = "fonttools-4.45.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4ba17822a6681d06849078daaf6e03eccc9f467efe7c4c60280e28a78e8e5df9"}, + {file = "fonttools-4.45.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e50f794d09df0675da8d9dbd7c66bfcab2f74a708343aabcad41936d26556891"}, + {file = "fonttools-4.45.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b07b857d4f9de3199a8c3d1b1bf2078c0f37447891ca1a8d9234106b9a27aff"}, + {file = "fonttools-4.45.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:777ba42b94a27bb7fb2b4082522fccfd345667c32a56011e1c3e105979af5b79"}, + {file = "fonttools-4.45.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:21e96b99878348c74aa58059b8578d7586f9519cbcdadacf56486737038aa043"}, + {file = "fonttools-4.45.1-cp312-cp312-win32.whl", hash = "sha256:5cbf02cda8465b69769d07385f5d11e7bba19954e7787792f46fe679ec755ebb"}, + {file = "fonttools-4.45.1-cp312-cp312-win_amd64.whl", hash = "sha256:800e354e0c3afaeb8d9552769773d02f228e98c37b8cb03041157c3d0687cffc"}, + {file = "fonttools-4.45.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6eb2c54f7a07c92108daabcf02caf31df97825738db02a28270633946bcda4d0"}, + {file = "fonttools-4.45.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:43a3d267334109ff849c37cf3629476b5feb392ef1d2e464a167b83de8cd599c"}, + {file = "fonttools-4.45.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e1aefc2bf3c43e0f33f995f828a7bbeff4adc9393a7760b11456dbcf14388f6"}, + {file = "fonttools-4.45.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f53a19dcdd5737440839b8394eeebb35da9ec8109f7926cb6456639b5b58e47"}, + {file = "fonttools-4.45.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a17706b9cc24b27721613fe5773d93331ab7f0ecaca9955aead89c6b843d3a7"}, + {file = "fonttools-4.45.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fb36e5f40191274a95938b40c0a1fa7f895e36935aea8709e1d6deff0b2d0d4f"}, + {file = "fonttools-4.45.1-cp38-cp38-win32.whl", hash = "sha256:46eabddec12066829b8a1efe45ae552ba2f1796981ecf538d5f68284c354c589"}, + {file = "fonttools-4.45.1-cp38-cp38-win_amd64.whl", hash = "sha256:b6de2f0fcd3302fb82f94801002cb473959e998c14c24ec28234adb674aed345"}, + {file = "fonttools-4.45.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:392d0e3cc23daee910193625f7cf1b387aff9dd5b6f1a5f4a925680acb6dcbc2"}, + {file = "fonttools-4.45.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4b9544b1346d99848ac0e9b05b5d45ee703d7562fc4c9c48cf4b781de9632e57"}, + {file = "fonttools-4.45.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8717db3e4895e4820ade64ea379187738827ee60748223cb0438ef044ee208c6"}, + {file = "fonttools-4.45.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e29d5f298d616a93a4c5963682dc6cc8cc09f6d89cad2c29019fc5fb3b4d9472"}, + {file = "fonttools-4.45.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cb472905da3049960e80fc1cf808231880d79727a8410e156bf3e5063a1c574f"}, + {file = "fonttools-4.45.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ba299f1fbaa2a1e33210aaaf6fa816d4059e4d3cfe2ae9871368d4ab548c1c6a"}, + {file = "fonttools-4.45.1-cp39-cp39-win32.whl", hash = "sha256:105099968b58a5b4cef6f3eb409db8ea8578b302a9d05e23fecba1b8b0177b5f"}, + {file = "fonttools-4.45.1-cp39-cp39-win_amd64.whl", hash = "sha256:847f3f49dd3423e5a678c098e2ba92c7f4955d4aab3044f6a507b0bb0ecb07e0"}, + {file = "fonttools-4.45.1-py3-none-any.whl", hash = "sha256:3bdd7dfca8f6c9f4779384064027e8477ad6a037d6a327b09381f43e0247c6f3"}, + {file = "fonttools-4.45.1.tar.gz", hash = "sha256:6e441286d55fe7ec7c4fb36812bf914924813776ff514b744b510680fc2733f2"}, ] [package.extras] @@ -1630,13 +1617,13 @@ sparktrials = ["pyspark"] [[package]] name = "idna" -version = "3.4" +version = "3.6" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, ] [[package]] @@ -1700,24 +1687,23 @@ files = [ [[package]] name = "ipython" -version = "8.17.2" +version = "8.18.1" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.9" files = [ - {file = "ipython-8.17.2-py3-none-any.whl", hash = "sha256:1e4d1d666a023e3c93585ba0d8e962867f7a111af322efff6b9c58062b3e5444"}, - {file = "ipython-8.17.2.tar.gz", hash = "sha256:126bb57e1895594bb0d91ea3090bbd39384f6fe87c3d57fd558d0670f50339bb"}, + {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, + {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, ] [package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +prompt-toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" stack-data = "*" traitlets = ">=5" @@ -1896,13 +1882,13 @@ test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] [[package]] name = "jupyterlab-pygments" -version = "0.2.2" +version = "0.3.0" description = "Pygments theme using JupyterLab CSS variables" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "jupyterlab_pygments-0.2.2-py2.py3-none-any.whl", hash = "sha256:2405800db07c9f770863bcf8049a529c3dd4d3e28536638bd7c1c01d2748309f"}, - {file = "jupyterlab_pygments-0.2.2.tar.gz", hash = "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d"}, + {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, + {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, ] [[package]] @@ -2121,6 +2107,8 @@ description = "Clang Python Bindings, mirrored from the official LLVM repo: http optional = false python-versions = "*" files = [ + {file = "libclang-16.0.6-1-py2.py3-none-manylinux2014_aarch64.whl", hash = "sha256:88bc7e7b393c32e41e03ba77ef02fdd647da1f764c2cd028e69e0837080b79f6"}, + {file = "libclang-16.0.6-1-py2.py3-none-manylinux2014_armv7l.whl", hash = "sha256:d80ed5827736ed5ec2bcedf536720476fd9d4fa4c79ef0cb24aea4c59332f361"}, {file = "libclang-16.0.6-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:da9e47ebc3f0a6d90fb169ef25f9fbcd29b4a4ef97a8b0e3e3a17800af1423f4"}, {file = "libclang-16.0.6-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:e1a5ad1e895e5443e205568c85c04b4608e4e973dae42f4dfd9cb46c81d1486b"}, {file = "libclang-16.0.6-py2.py3-none-manylinux2010_x86_64.whl", hash = "sha256:9dcdc730939788b8b69ffd6d5d75fe5366e3ee007f1e36a99799ec0b0c001492"}, @@ -2210,6 +2198,16 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -2841,13 +2839,13 @@ testing = ["funcsigs", "pytest"] [[package]] name = "pexpect" -version = "4.8.0" +version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" files = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, ] [package.dependencies] @@ -3225,13 +3223,13 @@ email = ["email-validator (>=1.0.3)"] [[package]] name = "pygments" -version = "2.17.1" +version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" files = [ - {file = "pygments-2.17.1-py3-none-any.whl", hash = "sha256:1b37f1b1e1bff2af52ecaf28cc601e2ef7077000b227a0675da25aef85784bc4"}, - {file = "pygments-2.17.1.tar.gz", hash = "sha256:e45a0e74bf9c530f564ca81b8952343be986a29f6afe7f5ad95c5f06b7bdf5e8"}, + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, ] [package.extras] @@ -3773,7 +3771,7 @@ scipy = "^1.10.1" type = "git" url = "https://github.com/qiboteam/qibojit.git" reference = "HEAD" -resolved_reference = "1d335f312bea3d1a522289332f53a2649c69d300" +resolved_reference = "6b7dd42b2af92c0788063172c668ba3b01b5e1a2" [[package]] name = "recommonmark" @@ -4085,46 +4083,67 @@ test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeo [[package]] name = "scs" -version = "3.2.4" +version = "3.2.4.post1" description = "Splitting conic solver" optional = false python-versions = ">=3.7" files = [ - {file = "scs-3.2.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e8e23f70a7ae7cfa44f2a780e083e0eafd9fa90a4a4c10f47238248864b13c86"}, - {file = "scs-3.2.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b4a8b87d30c199a99cb96e9a26e72e034d3e9445229d8c51a9bff082c25b5f"}, - {file = "scs-3.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:084cf35d036aae4e72459f64e36bca46e4e328b866f6524a7b21f59345e66ac4"}, - {file = "scs-3.2.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1956274820f6d6f9a83243b27c0cfa2783618e28c370ac97f193e06afd3c0aa5"}, - {file = "scs-3.2.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dd81e0193943531683b1bf186893956ed32602ec442cae4408ef439edb7ad1f"}, - {file = "scs-3.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:ae7c59399cbc364bec596e75e7a301234c1f6a8b8bd82ff80354f322b5789bc1"}, - {file = "scs-3.2.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:189a1f3dd2e7359a98b648e58d2a9dcbf4f6ef17d8c55f11591a92a7dbe9cf01"}, - {file = "scs-3.2.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397c112c9d0b013f9a164129f3fd218fe5cd0872e70254270b6ba5692c200d9d"}, - {file = "scs-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:a192aedb6008363895a31b24201b5171b52345a9083431bcd39e67f969420707"}, - {file = "scs-3.2.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:50ee8cda8e3daaa0ee0480a8e6efd4201a25ec0a179687ed92f95c9098e8fcf8"}, - {file = "scs-3.2.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc460c2b95f919a17d8d610acfea22a280bfaeb19990080a013a56c00acb27ab"}, - {file = "scs-3.2.4-cp37-cp37m-win_amd64.whl", hash = "sha256:0d8bdcf9bf57a51a3ce7329c4ca54ca2c0c2637750f81675c1229f00a74e8d40"}, - {file = "scs-3.2.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:28cea65a9ed1e4ab301794a26aac2c2969763ad9fab40c82e148a154bd28415a"}, - {file = "scs-3.2.4-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:35de1ddb073fde2f987212be93a078b6a9d640f4a6102fccaa8df4b6ed82d73e"}, - {file = "scs-3.2.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ac0ef5ed17390ced8638f3984a904daa734ece8362f77a09c7f9cff9d58351"}, - {file = "scs-3.2.4-cp38-cp38-win_amd64.whl", hash = "sha256:c661438a404fac0118f6de46def9db260f1135b7d89c6f52d252378abaefa45d"}, - {file = "scs-3.2.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f4e10681576a2de7dd9880ee20581fa1bb7da8af006e6cb6b915c1932b0c7ce2"}, - {file = "scs-3.2.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5b2e6fbfa5b15724aa28599eaf88567741a583615d43d626f92c71cfd3d5cae"}, - {file = "scs-3.2.4-cp39-cp39-win_amd64.whl", hash = "sha256:fc8180564c4048516b9c742d5fd962cc26d0dd9982466b63103d922af9e96cff"}, - {file = "scs-3.2.4.tar.gz", hash = "sha256:09ffaa670d8608901db94addd8581376498cd9818eb5ef27fed3560f0bf0661b"}, + {file = "scs-3.2.4.post1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51fed30d2a4a1e6fbfc1e52b4cb3adeecbe89d7c47f3539b49afbb852415fe19"}, + {file = "scs-3.2.4.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb0524c0b9c3ed0d65dae161475accf3efa8e170938eb93251a60e9709b156ee"}, + {file = "scs-3.2.4.post1-cp310-cp310-win_amd64.whl", hash = "sha256:534519819eea96f18902a9fce15c4ec562b99d23b38dc843a48cb137b5641613"}, + {file = "scs-3.2.4.post1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d04ee4d19ac6d0f5053663bc48fcd5c5faed534272f13b10a4e173c814eea69"}, + {file = "scs-3.2.4.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c23b4299ab77ff5f654573d5667dc982292a8ef2b979053b38c40663919f13"}, + {file = "scs-3.2.4.post1-cp311-cp311-win_amd64.whl", hash = "sha256:ae4624938d3e3a8b7e508029275c6ad7a978fd48c158d0818f69f4ae764bf945"}, + {file = "scs-3.2.4.post1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:40294e22bfe509bdf7fd65a6b77c38cec22dcb3567ff5a75f3c41a1faf2ef1d5"}, + {file = "scs-3.2.4.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a2337acb0604770b6df1473254065a51c210ff9c82fc7c4490595510287a337"}, + {file = "scs-3.2.4.post1-cp312-cp312-win_amd64.whl", hash = "sha256:8689e75a57e59846e65d1c4b9d57e9964b00fcbb8e67fc77f98cf6e0a0530abd"}, + {file = "scs-3.2.4.post1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ad991b00d0a87c85db57bf2f1863c21bdc4e2f13837f6c35e809f5936bc6f165"}, + {file = "scs-3.2.4.post1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a28af160a44268e726a59d6cf340629b82940c1a643c4c87fe777e9cbe550d75"}, + {file = "scs-3.2.4.post1-cp37-cp37m-win_amd64.whl", hash = "sha256:f6283f725f3fee63d4631c2532d01a5b2ea65883b04d3da3be06084b1c60171b"}, + {file = "scs-3.2.4.post1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b3a622cf2120ae765f0f3ad5c6f4f86796d317e29132bab2ad4af3c14d9bf4d"}, + {file = "scs-3.2.4.post1-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:4b5259137c263304effa2b28d0125437ac23569e6e7753c115ae1206ec5033fd"}, + {file = "scs-3.2.4.post1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424710bc19b0506feee7e05e6d2b7af98acf09af5bd5353126164cbd46ac923f"}, + {file = "scs-3.2.4.post1-cp38-cp38-win_amd64.whl", hash = "sha256:e21bdc8046648846e2c204a6c5cf24eaaedd2b8f5e0a2ab41a647b0247b8d592"}, + {file = "scs-3.2.4.post1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cea0f7e9473f43f7edf1641d020ead7e39653a81c540fbdba8f3b7b8480038c9"}, + {file = "scs-3.2.4.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6126f1d7ed5ff368cb8c1836715b17a50074314579eefc6d511995a3ab93d70"}, + {file = "scs-3.2.4.post1-cp39-cp39-win_amd64.whl", hash = "sha256:18788befa5284bb1f49149bac7f813703de60ef5b6bf7698a9f1c3a5a49b78e4"}, + {file = "scs-3.2.4.post1.tar.gz", hash = "sha256:7015d7a56d1d5b53264fd277289ea169949309e26101677ff88cd0e5030d032f"}, ] [package.dependencies] numpy = "*" scipy = "*" +[[package]] +name = "seaborn" +version = "0.13.0" +description = "Statistical data visualization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "seaborn-0.13.0-py3-none-any.whl", hash = "sha256:70d740828c48de0f402bb17234e475eda687e3c65f4383ea25d0cc4728f7772e"}, + {file = "seaborn-0.13.0.tar.gz", hash = "sha256:0e76abd2ec291c655b516703c6a022f0fd5afed26c8e714e8baef48150f73598"}, +] + +[package.dependencies] +matplotlib = ">=3.3,<3.6.1 || >3.6.1" +numpy = ">=1.20,<1.24.0 || >1.24.0" +pandas = ">=1.2" + +[package.extras] +dev = ["flake8", "flit", "mypy", "pandas-stubs", "pre-commit", "pytest", "pytest-cov", "pytest-xdist"] +docs = ["ipykernel", "nbconvert", "numpydoc", "pydata_sphinx_theme (==0.10.0rc2)", "pyyaml", "sphinx (<6.0.0)", "sphinx-copybutton", "sphinx-design", "sphinx-issues"] +stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] + [[package]] name = "setuptools" -version = "69.0.0" +version = "69.0.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.0.0-py3-none-any.whl", hash = "sha256:eb03b43f23910c5fd0909cb677ad017cd9531f493d27f8b3f5316ff1fb07390e"}, - {file = "setuptools-69.0.0.tar.gz", hash = "sha256:4c65d4f7891e5b046e9146913b87098144de2ca2128fbc10135b8556a6ddd946"}, + {file = "setuptools-69.0.2-py3-none-any.whl", hash = "sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2"}, + {file = "setuptools-69.0.2.tar.gz", hash = "sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6"}, ] [package.extras] @@ -4690,18 +4709,18 @@ telegram = ["requests"] [[package]] name = "traitlets" -version = "5.13.0" +version = "5.14.0" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" files = [ - {file = "traitlets-5.13.0-py3-none-any.whl", hash = "sha256:baf991e61542da48fe8aef8b779a9ea0aa38d8a54166ee250d5af5ecf4486619"}, - {file = "traitlets-5.13.0.tar.gz", hash = "sha256:9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5"}, + {file = "traitlets-5.14.0-py3-none-any.whl", hash = "sha256:f14949d23829023013c47df20b4a76ccd1a85effb786dc060f34de7948361b33"}, + {file = "traitlets-5.14.0.tar.gz", hash = "sha256:fcdaa8ac49c04dfa0ed3ee3384ef6dfdb5d6f3741502be247279407679296772"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.6.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "typing-extensions" @@ -4743,13 +4762,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "wcwidth" -version = "0.2.11" +version = "0.2.12" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.11-py2.py3-none-any.whl", hash = "sha256:c4b153acf29f1f0d7fb1b00d097cce82b73de7a2016321c8d7ca71bd76dd848b"}, - {file = "wcwidth-0.2.11.tar.gz", hash = "sha256:25eb3ecbec328cdb945f56f2a7cfe784bdf7a73a8197398c7a7c65e7fe93e9ae"}, + {file = "wcwidth-0.2.12-py2.py3-none-any.whl", hash = "sha256:f26ec43d96c8cbfed76a5075dac87680124fa84e0855195a6184da9c187f133c"}, + {file = "wcwidth-0.2.12.tar.gz", hash = "sha256:f01c104efdf57971bcb756f054dd58ddec5204dd15fa31d6503ea57947d97c02"}, ] [[package]] @@ -4782,13 +4801,13 @@ watchdog = ["watchdog (>=2.3)"] [[package]] name = "wheel" -version = "0.41.3" +version = "0.42.0" description = "A built-package format for Python" optional = false python-versions = ">=3.7" files = [ - {file = "wheel-0.41.3-py3-none-any.whl", hash = "sha256:488609bc63a29322326e05560731bf7bfea8e48ad646e1f5e40d366607de0942"}, - {file = "wheel-0.41.3.tar.gz", hash = "sha256:4d4987ce51a49370ea65c0bfd2234e8ce80a12780820d9dc462597a6e60d0841"}, + {file = "wheel-0.42.0-py3-none-any.whl", hash = "sha256:177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d"}, + {file = "wheel-0.42.0.tar.gz", hash = "sha256:c45be39f7882c9d34243236f2d63cbd58039e360f85d0913425fbd7ceea617a8"}, ] [package.extras] @@ -4848,6 +4867,16 @@ files = [ {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, + {file = "wrapt-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecee4132c6cd2ce5308e21672015ddfed1ff975ad0ac8d27168ea82e71413f55"}, + {file = "wrapt-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2020f391008ef874c6d9e208b24f28e31bcb85ccff4f335f15a3251d222b92d9"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2feecf86e1f7a86517cab34ae6c2f081fd2d0dac860cb0c0ded96d799d20b335"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:240b1686f38ae665d1b15475966fe0472f78e71b1b4903c143a842659c8e4cb9"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9008dad07d71f68487c91e96579c8567c98ca4c3881b9b113bc7b33e9fd78b8"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6447e9f3ba72f8e2b985a1da758767698efa72723d5b59accefd716e9e8272bf"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:acae32e13a4153809db37405f5eba5bac5fbe2e2ba61ab227926a22901051c0a"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49ef582b7a1152ae2766557f0550a9fcbf7bbd76f43fbdc94dd3bf07cc7168be"}, + {file = "wrapt-1.14.1-cp311-cp311-win32.whl", hash = "sha256:358fe87cc899c6bb0ddc185bf3dbfa4ba646f05b1b0b9b5a27c2cb92c2cea204"}, + {file = "wrapt-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:26046cd03936ae745a502abf44dac702a5e6880b2b01c29aea8ddf3353b68224"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, @@ -4913,4 +4942,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "17f4fa7be9ead59d5867dd3bba8fb3ae1d1028418a5ddb0ef139a4b73edca8a6" +content-hash = "f2a30ac62bad1f17dae11f3fd4c0e51c417cb225a92978ea6ffa8dac3ecc6922" diff --git a/pyproject.toml b/pyproject.toml index e2d0867d82..3dd5d2061a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,6 +63,7 @@ dill = "^0.3.6" pytest-cov = "^4.0.0" pylint = "^2.16.2" hyperopt = "^0.2.6" +seaborn = "^0.13.0" qibojit = { git = "https://github.com/qiboteam/qibojit.git" } tensorflow = { version = "^2.12.0", markers = "sys_platform == 'linux' or sys_platform == 'darwin'" } # TODO: the marker is a temporary solution due to the lack of the tensorflow-io 0.32.0's wheels for Windows, this package is one of From 8ab66ffb956c38ee95d865a9169dc2ffa1da0f15 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Tue, 28 Nov 2023 17:20:47 +0100 Subject: [PATCH 087/143] comment pip lines --- examples/dbi/dbi.ipynb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/dbi/dbi.ipynb b/examples/dbi/dbi.ipynb index d04aa22b83..2edd8529a6 100644 --- a/examples/dbi/dbi.ipynb +++ b/examples/dbi/dbi.ipynb @@ -21,8 +21,9 @@ "metadata": {}, "outputs": [], "source": [ - "%pip install seaborn # plotting library\n", - "%pip install hyperopt # required to optimize the DBF step" + "# uncomment the following lines when you run this notebook on your local device\n", + "#pip install seaborn # plotting library\n", + "#pip install hyperopt # required to optimize the DBF step" ] }, { From 26b08ace7f0b6620f374fe9f4ba023738c783b81 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Tue, 28 Nov 2023 17:29:42 +0100 Subject: [PATCH 088/143] fix state --- tests/test_models_variational.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_models_variational.py b/tests/test_models_variational.py index 2ef522fc50..ce5571c9bc 100644 --- a/tests/test_models_variational.py +++ b/tests/test_models_variational.py @@ -133,7 +133,7 @@ def test_vqe(backend, method, options, compile, filename): assert_regression_fixture(backend, params, filename) # test energy fluctuation - state = v.hamiltonian.ground_state + state = v.hamiltonian.ground_state.state() energy_fluctuation = v.energy_fluctuation(state) assert energy_fluctuation != 0 From 7e04bcd1b88f9f79e0413aa50e7ad767585210c1 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Tue, 28 Nov 2023 17:47:31 +0100 Subject: [PATCH 089/143] fix tests --- tests/test_models_variational.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_models_variational.py b/tests/test_models_variational.py index 225e5a7cb9..58c489bd32 100644 --- a/tests/test_models_variational.py +++ b/tests/test_models_variational.py @@ -133,9 +133,9 @@ def test_vqe(backend, method, options, compile, filename): assert_regression_fixture(backend, params, filename) # test energy fluctuation - state = v.hamiltonian.ground_state.state() + state = np.ones(2**nqubits) / np.sqrt(2**nqubits) energy_fluctuation = v.energy_fluctuation(state) - assert energy_fluctuation != 0 + assert energy_fluctuation >= 0 @pytest.mark.parametrize( From 4edc067b3bc51bec63942e4b49eb0acfe763e9e1 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Tue, 28 Nov 2023 23:18:56 +0100 Subject: [PATCH 090/143] back to hyperopt as dep and using matplotlib for cmaps --- examples/dbi/dbi.ipynb | 335 +++++++++++++++++++++++++++++++++-------- 1 file changed, 269 insertions(+), 66 deletions(-) diff --git a/examples/dbi/dbi.ipynb b/examples/dbi/dbi.ipynb index 2edd8529a6..913899989c 100644 --- a/examples/dbi/dbi.ipynb +++ b/examples/dbi/dbi.ipynb @@ -16,19 +16,7 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "b42faf70-f501-4579-802e-9c36085ec16c", - "metadata": {}, - "outputs": [], - "source": [ - "# uncomment the following lines when you run this notebook on your local device\n", - "#pip install seaborn # plotting library\n", - "#pip install hyperopt # required to optimize the DBF step" - ] - }, - { - "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "f270b1ea-ee6a-4eac-a0ff-3d7dae296cf0", "metadata": {}, "outputs": [], @@ -37,7 +25,6 @@ "\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", - "import seaborn as sns\n", "\n", "from hyperopt import hp, tpe\n", "\n", @@ -55,7 +42,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "id": "4aec7b46-19b9-4004-93c0-a90255e58fd9", "metadata": {}, "outputs": [], @@ -83,10 +70,10 @@ "\n", "def plot_histories(histories, labels):\n", " \"\"\"Plot off-diagonal norm histories over a sequential evolution.\"\"\"\n", - " colors = sns.color_palette(\"inferno\", n_colors=len(histories)).as_hex()\n", + " colors = plt.get_cmap(\"coolwarm\", len(histories))\n", " plt.figure(figsize=(5,5*6/8))\n", " for i, (h, l) in enumerate(zip(histories, labels)):\n", - " plt.plot(h, lw=2, color=colors[i], label=l, marker='.')\n", + " plt.plot(h, lw=2, color=colors(i), label=l, marker='.')\n", " plt.legend()\n", " plt.xlabel(\"Iterations\")\n", " plt.ylabel(r\"$\\| \\sigma(\\hat{H}) \\|^2$\")\n", @@ -107,10 +94,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "id": "2c4ed408-68ed-4054-825c-2a7df0979a4f", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Qibo 0.2.3|INFO|2023-11-28 23:17:34]: Using qibojit (numba) backend on /CPU:0\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# set the qibo backend (we suggest qibojit if N >= 20)\n", "set_backend(\"qibojit\", \"numba\")\n", @@ -148,10 +153,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "id": "26a487e9-366b-4203-b660-e3d4af2bcb68", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DoubleBracketGeneratorType.canonical\n", + "DoubleBracketGeneratorType.single_commutator\n", + "DoubleBracketGeneratorType.group_commutator\n" + ] + } + ], "source": [ "# we have a look inside the DoubleBracketGeneratorType class\n", "for generator in DoubleBracketGeneratorType:\n", @@ -160,7 +175,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, "id": "da8dce89-27f6-403d-982a-58d531fade48", "metadata": {}, "outputs": [], @@ -181,7 +196,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 41, "id": "055870ec-55f2-4b99-a622-e3aa4c7dd0e9", "metadata": {}, "outputs": [], @@ -199,10 +214,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 42, "id": "9e278c3d-9f34-4a40-b453-4e030c751ef5", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Backend: qibojit (numba)\n" + ] + } + ], "source": [ "# on which qibo backend am I running the algorithm?\n", "print(f\"Backend: {dbf.backend}\")" @@ -210,10 +233,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 43, "id": "5b8e142b-a0a2-41bd-a16a-265a420b7360", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initial form of the target hamiltonian:\n", + "[[-5.-0.j -3.-0.j -3.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", + " [-3.-0.j -1.-0.j -0.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", + " [-3.-0.j -0.-0.j -1.-0.j ... -0.-0.j -0.-0.j -0.-0.j]\n", + " ...\n", + " [-0.-0.j -0.-0.j -0.-0.j ... -1.-0.j -0.-0.j -3.-0.j]\n", + " [-0.-0.j -0.-0.j -0.-0.j ... -0.-0.j -1.-0.j -3.-0.j]\n", + " [-0.-0.j -0.-0.j -0.-0.j ... -3.-0.j -3.-0.j -5.-0.j]]\n" + ] + } + ], "source": [ "# the initial target hamiltonian is a qibo hamiltonian\n", "# thus the matrix can be accessed typing h.matrix\n", @@ -222,10 +260,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 44, "id": "4f9d1d41-3df7-49cf-96ca-fa1019c00c33", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# let's visualize it in a more graphical way\n", "visualize_matrix(dbf.h0.matrix, r\"$H_0$\")" @@ -233,10 +282,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 45, "id": "7b864712-219c-44b6-8337-19ef0100e318", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# since we didn't perform yet any evolutionary step they are the same\n", "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" @@ -252,10 +312,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 46, "id": "da3d3aaa-17e1-492e-bcd3-b510f44a5391", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZ4AAAGiCAYAAADXxKDZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAn2klEQVR4nO3df3BV9Z3/8dclkBuU5GL4kR9LgiAKVUycppJmtBQkBbI7DFT+QOtMo0t1cANTzLrV7LSCbjth7YxiWxo7WxfsTBGLU3B0RliNJIy7RCWaQdrdDGHTEhcSKt8hgWgumPP5/hG49kpIzs05OTef5PlgPjPck3M/531zHd5+3p/P+ZyQMcYIAICAjEt2AACAsYXEAwAIFIkHABAoEg8AIFAkHgBAoEg8AIBAkXgAAIEi8QAAAkXiAQAEisQDAAgUiQcA4NrmzZsVCoXi2rx58xLqY/wwxQYAGKVuueUWvfXWW7HX48cnlkpIPACAhIwfP17Z2dlDf7+PsQAAAtLT06MLFy740pcxRqFQKO5YOBxWOBzu9/xjx44pNzdXaWlpKikpUXV1tfLz811fL8RjEQDALj09PZo1K1vt7Z2+9Ddp0iSdP38+7timTZu0efPmK8594403dP78ec2dO1enTp3Sk08+qf/7v//T0aNHlZ6e7up6JB4AsExXV5cikYj+98/PKiNjose+PtPsmY+ora1NGRkZseMDjXj+2tmzZzVz5kw988wzWrt2ratrUmoDAEtlZEz0nHi+6CsjLvG4NXnyZN10001qaWlx/R6WUwOApYz53Jfmxfnz53X8+HHl5OS4fg+JBwAsZUyvLy0Rjz76qOrr6/WnP/1J//Vf/6Vvf/vbSklJ0b333uu6D0ptAADXPv74Y9177706c+aMpk2bpjvvvFMNDQ2aNm2a6z5IPABgKcd8LsdjqSzR9+/atcvT9SQSDwBYy485Gq/vHwrmeAAAgWLEAwCW6lsc4HXEk9jiAj+QeADAUsb5XMbxmHg8vn8oKLUBAALFiAcAbGU+72te+wgYiQcALMWqNgAAXGDEAwC2cj6XnIve+wgYiQcALNVXakvx3EfQKLUBAALFiAcAbOV8LjneRjyU2gAA7lmaeCi1AQACxYgHAKzV68MNoOzVBgBwKeR8rpDjrXAVotQGABjtGPEAgK2czyWPIx5WtQEA3LM08VBqAwAEihEPAFgqZD5XyHhcXMBjEQAArjmO5HhcDu04/sSSAEptAIBAMeIBAEv13ccT8txH0Eg8AGArp9eHVW3B71xAqQ0AEChGPABgK+dzyWOpjRtIAQCuhZxeH/Zqo9QGABjlRtyIx3EcnTx5Uunp6QqFPA4hAWAEMMbo3Llzys3N1bhxPv7/vvFhcYHhsQg6efKk8vLykh0GAPiura1NM2bM8K2/kON4LpWFknAD6bAlnm3btumnP/2p2tvbVVhYqJ///OdasGDBoO9LT0+XJP3pxHPKyJg44LmZk9f5EisADC8jycT+fRvrhiXxvPzyy6qsrNTzzz+v4uJibd26VcuWLVNzc7OmT58+4Hsvl9cyMiYqI+OaQa5EKQ6ALYz/0wdOrw+r2kbJ4oJnnnlGDz74oB544AHdfPPNev7553XNNdfo3//934fjcgAwJvWtavPeguZ74rlw4YIaGxtVWlr6xUXGjVNpaakOHTp0xfnRaFRdXV1xDQAwevmeeD755BP19vYqKysr7nhWVpba29uvOL+6ulqRSCTWWFgAAC45vf60gCX9Pp6qqip1dnbGWltbW7JDAgAr2Fpq831xwdSpU5WSkqKOjo644x0dHcrOzr7i/HA4rHA47HcYAIARyvcRT2pqqoqKilRbWxs75jiOamtrVVJS4vflAGDssrTUNizLqSsrK1VeXq6vfe1rWrBggbZu3aru7m498MADw3E5ABiTQo7xfANoyDE+RePesCSeNWvW6C9/+YueeOIJtbe367bbbtO+ffuuWHAwkL6bQwden7544vcG7efAZ792fU0AwPAbtp0L1q9fr/Xr1w9X9wAAp1fyuuPNaCm1AQACYHxIPEnYJDTpy6kBAGMLIx4AsFTIOAoZb3u1hcwo2p0aADDMLJ3jodQGAAgUIx4AsJXj+PBYBEptAAC3SDzBc3NzqJubTN32BQDwzurEAwBjWchxFPI4YPG65c5QkHgAwFaO48OqtuATD6vaAACBYsQDALaydMRD4gEAW1maeCi1AQACxYgHAGxleiWvD3JjrzYAgFu2Lqem1AYACNSoH/G43ZGAHQ4AWMfSxQWjPvEAwKhlaeKh1AYACBQjHgCwlWO8j1i8roobAhIPANjKMT6U2oJPPJTaAACBYsQDALby5UFwjHgAAG45jj9tiLZs2aJQKKSNGzcm9D4SDwAgYe+//75+9atfqaCgIOH3kngAwFaO8acl6Pz587rvvvv0b//2b7ruuusSfj9zPJewwwEA6xhHMh7neExf4unq6oo7HA6HFQ6H+31LRUWF/u7v/k6lpaX68Y9/nPAlGfEAAJSXl6dIJBJr1dXV/Z63a9cuffDBB1f9uRuMeADAVsaH+3gujXja2tqUkZERO9zfaKetrU3f//739eabbyotLW3IlyTxAICtfLyBNCMjIy7x9KexsVGnT5/WV7/61dix3t5eHTx4UL/4xS8UjUaVkpIy6CVJPAAAV5YsWaKPPvoo7tgDDzygefPm6bHHHnOVdCQSDwDYK+Atc9LT0zV//vy4Y9dee62mTJlyxfGBkHgAwFLG8f7k6iQ8+ZrEAwAYurq6uoTfQ+IBAFtZujs1iSdBbm8MbVm1YNBz5ux9z2s4AMYyRz4kHj8CSQw3kAIAAuV74tm8ebNCoVBcmzdvnt+XAQA4PrWADUup7ZZbbtFbb731xUXGU9EDAN+ZS81rHwEblowwfvx4ZWdnuzo3Go0qGo3GXn95ozoAwOgyLHM8x44dU25urmbPnq377rtPJ06cuOq51dXVcRvT5eXlDUdIADDqGCfkSwua74mnuLhYO3bs0L59+1RTU6PW1lZ94xvf0Llz5/o9v6qqSp2dnbHW1tbmd0gAMDoxx9OnrKws9veCggIVFxdr5syZ+t3vfqe1a9decf5Az3wAAIw+wz7rP3nyZN10001qaWkZ7ksBwNhiQpLXUlkSFhcM+30858+f1/Hjx5WTkzPclwKAMcXWOR7fRzyPPvqoVqxYoZkzZ+rkyZPatGmTUlJSdO+99/p9qRHNza4EPEYbwFjke+L5+OOPde+99+rMmTOaNm2a7rzzTjU0NGjatGl+XwoAxjbHh1LbaFhcsGvXLr+7BAD0x4T6mqc+/AklEezVBgAIFHvZAICl/FgcwIPgAADuOeN8mOMJvtZGqQ0AEChGPABgK1a1AQCCZExIxuOqNsOqNgDAaMeIJ4nc7kjADgcA+mXp4gISDwBYyjjyYTk1q9oAAKMcIx4AsJUvj0UYBbtTAwCC4c+qtlHw6GsAAAbCiAcAbOWM62ue+vAnlESQeADAUv5sEkqpDQAwyjHisYCfN5pykykweti6uIDEAwC2snSOh1IbACBQjHgAwFK2Li4g8QCApWyd46HUBgAIFCMeALCVpYsLSDwAYClb53gotQEAAsWIBwAsZeviAhLPKOJmV4KWVQtc9TVn73tewwEw3IwPczzBP4CUUhsAIFiMeADAUrYuLiDxAICljPE+R2MotQEARjtGPABgKx9KbaLUBgBwy5hxMsZb4cokodZGqQ0AEChGPABgKyfkvVRGqQ0A4BY7F8AKbnckYIcDAMMl4TmegwcPasWKFcrNzVUoFNLevXvjfm6M0RNPPKGcnBxNnDhRpaWlOnbsmF/xAgAuuXwDqdcWtIQTT3d3twoLC7Vt27Z+f/7000/rZz/7mZ5//nm9++67uvbaa7Vs2TL19PR4DhYA8IXLq9q8tqAlXGorKytTWVlZvz8zxmjr1q364Q9/qJUrV0qSfvOb3ygrK0t79+7VPffc4y1aAID1fE11ra2tam9vV2lpaexYJBJRcXGxDh061O97otGourq64hoAYHBjptQ2kPb2dklSVlZW3PGsrKzYz76surpakUgk1vLy8vwMCQBGrcur2ry2oCX9BtKqqip1dnbGWltbW7JDAgAMI1+XU2dnZ0uSOjo6lJOTEzve0dGh2267rd/3hMNhhcNhP8MAgDHB1vt4fB3xzJo1S9nZ2aqtrY0d6+rq0rvvvquSkhI/LwUAY54xPszx2HAD6fnz59XS0hJ73draqqamJmVmZio/P18bN27Uj3/8Y914442aNWuWfvSjHyk3N1erVq3yM24AgKUSTjyHDx/W4sWLY68rKyslSeXl5dqxY4d+8IMfqLu7Ww899JDOnj2rO++8U/v27VNaWpp/UWPYscMBMPLZujt1woln0aJFAwYaCoX01FNP6amnnvIUGABgYLY++jrpq9oAAGMLm4QCgKVsXdVG4gEAS9maeCi1AQACReIBAEsZx4/92hK7Zk1NjQoKCpSRkaGMjAyVlJTojTfeSKgPSm0AYKlklNpmzJihLVu26MYbb5QxRi+++KJWrlypDz/8ULfccourPkg8AADXVqxYEff6Jz/5iWpqatTQ0EDiQTDc3hi6eOL3Bj3nwGe/9hoOMKb4cwNp3/u//EgaN/to9vb2avfu3eru7k5oWzTmeADAUo4J+dIkKS8vL+4RNdXV1Ve97kcffaRJkyYpHA5r3bp12rNnj26++WbXcTPiAQCora1NGRkZsdcDjXbmzp2rpqYmdXZ26pVXXlF5ebnq6+tdJx8SDwDYyo8niF56/+VVam6kpqZqzpw5kqSioiK9//77eu655/SrX/3K1ftJPABgqZFyA6njOIpGo67PJ/EAAFyrqqpSWVmZ8vPzde7cOe3cuVN1dXXav3+/6z5IPABgqWSMeE6fPq3vfve7OnXqlCKRiAoKCrR//35961vfct0HiQcALJWMxPPCCy94up7EcmoAQMAY8QCApRwzTo7HG0i9vn8oSDwIhJtdCXiMNpAYY3x4AimPRQAAjHaMeADAUiPlPp5EkXgAwFK2Jh5KbQCAQDHiAQBL/fXu0l76CBqJBwAsRakNAAAXGPEAgKVsHfGQeADAUszxAB653ZFg8cTvuTrPzW4JAIJH4gEASxnjvVRmjE/BJIDEAwCWsnWOh1VtAIBAMeIBAEsZHxYXsKoNAOAapTYAAFxgxAMAlrJ1xEPiAQBLcQMpEBC3N4a6udGUm0yB4JF4AMBStpbaEl5ccPDgQa1YsUK5ubkKhULau3dv3M/vv/9+hUKhuLZ8+XK/4gUAXHK51Oa1BS3hxNPd3a3CwkJt27btqucsX75cp06dirWXXnrJU5AAgNEj4VJbWVmZysrKBjwnHA4rOzvbVX/RaFTRaDT2uqurK9GQAGBMMgrJyGOpzeP7h2JY7uOpq6vT9OnTNXfuXD388MM6c+bMVc+trq5WJBKJtby8vOEICQBGnctzPF5b0HxPPMuXL9dvfvMb1dbW6l//9V9VX1+vsrIy9fb29nt+VVWVOjs7Y62trc3vkAAAI4jvq9ruueee2N9vvfVWFRQU6IYbblBdXZ2WLFlyxfnhcFjhcNjvMABg1LP1Pp5h3zJn9uzZmjp1qlpaWob7UgAwplBqu4qPP/5YZ86cUU5OznBfCgBggYRLbefPn48bvbS2tqqpqUmZmZnKzMzUk08+qdWrVys7O1vHjx/XD37wA82ZM0fLli3zNXBgMG52JeAx2rCZIx9KbUlY1ZZw4jl8+LAWL14ce11ZWSlJKi8vV01NjY4cOaIXX3xRZ8+eVW5urpYuXap/+Zd/YR4HACBpCIln0aJFMgM8pHv//v2eAgIAuGPrljns1QYAlnIU8lwqS0apjQfBAQACxYgHAGzlx3JoSm0AALe4gRQAABcY8QCApVjVBgAIlHOpee0jaCQejGludyRghwPAPyQeALAUpTYAQKAc431VmnP1jWiGDavaAACBYsQDAJYyCsl43PLG6/uHgsQDAJbiBlIAAFxgxAMAlupbXOC9j6CReADAUszxAKOY2xtDW1YtcHXenL3veQkHsBqJBwAsZeviAhIPAFjKmL7mtY+gsaoNABAoRjwAYCmjkBwWFwAAgmLrJqGU2gAAgWLEAwCWYlUbACBQ5lLz2kfQKLUBAALFiAfwkdsdCdw8SpvHaGMwlNoAAIFyLjWvfQSNUhsAIFCMeADAUrbex0PiAQBL2TrHQ6kNABAoEg8AWMr41BJRXV2t22+/Xenp6Zo+fbpWrVql5ubmhPog8QCApS6X2ry2RNTX16uiokINDQ168803dfHiRS1dulTd3d2u+2COBwDg2r59++Je79ixQ9OnT1djY6MWLlzoqg8SDwBYys/7eLq6uuKOh8NhhcPhQd/f2dkpScrMzHR9TRIPkARudiVoWbXAVV9ud0vA6OPncuq8vLy445s2bdLmzZsHfK/jONq4caPuuOMOzZ8/3/U1E5rjcTOp1NPTo4qKCk2ZMkWTJk3S6tWr1dHRkchlAAABa2trU2dnZ6xVVVUN+p6KigodPXpUu3btSuhaCSUeN5NKjzzyiF577TXt3r1b9fX1OnnypO6+++6EggIADM7oi3LbUNvlVW0ZGRlxbbAy2/r16/X666/rwIEDmjFjRkJxJ1RqG2xSqbOzUy+88IJ27typu+66S5K0fft2feUrX1FDQ4O+/vWvJxQcAODqjHwotSX46GtjjDZs2KA9e/aorq5Os2bNSvianuZ4vjyp1NjYqIsXL6q0tDR2zrx585Sfn69Dhw71m3ii0aii0Wjs9ZcnuAAAI0dFRYV27typV199Venp6Wpvb5ckRSIRTZw40VUfQ76Pp79Jpfb2dqWmpmry5Mlx52ZlZcWC+7Lq6mpFIpFY+/IEFwCgf47xpyWipqZGnZ2dWrRokXJycmLt5Zdfdt3HkEc8lyeV3nnnnaF2IUmqqqpSZWVl7HVXVxfJBwBcSMYTSI3x/szSISWey5NKBw8ejJtUys7O1oULF3T27Nm4UU9HR4eys7P77cvtWnEAwOiQUKnNGKP169drz549evvtt6+YVCoqKtKECRNUW1sbO9bc3KwTJ06opKTEn4gBAJKSs2WOHxIa8Qw2qRSJRLR27VpVVlYqMzNTGRkZ2rBhg0pKSljRBiTI7Y2h3Gg6dtn6BNKEEk9NTY0kadGiRXHHt2/frvvvv1+S9Oyzz2rcuHFavXq1otGoli1bpl/+8pe+BAsAsF9CicfNpFJaWpq2bdumbdu2DTkoAMDgeAIpACBQtpbaeB4PACBQjHgAwFLG9DWvfQSNxAMAlnIUkpPgXmv99RE0Sm0AgEAx4gEASw1lr7X++ggaiQcAbOXDHI/nzd6GgMQDWI4dDmAbEg8AWMrWxQUkHgCwlK3LqVnVBgAIFCMeALCUrVvmkHgAwFK2Lqem1AYACBQjHgCwlJH323CSMOAh8QCArfpKbR6XU1NqAwCMdox4gDHC7Y4Eiyd+b9BzDnz2a6/hwAe23sdD4gEAS9m6nJpSGwAgUIx4AMBSlNoAAIGi1AYAgAuMeADAUsaHLXMotQEAXLN15wJKbQCAQDHiARDHzc2hbm4yddsXhs7W3alJPABgKVuXU1NqAwAEihEPAFjK1vt4SDwAYClb53gotQEAAsWIBwAsZet9PCQeALAUpTYAAFxgxAMAlrL1Ph4SD4CEud2RgB0Ohpety6kptQEAApVQ4qmurtbtt9+u9PR0TZ8+XatWrVJzc3PcOYsWLVIoFIpr69at8zVoAMClEY/x2JIQd0KJp76+XhUVFWpoaNCbb76pixcvaunSperu7o4778EHH9SpU6di7emnn/Y1aADAF8upvbagJTTHs2/fvrjXO3bs0PTp09XY2KiFCxfGjl9zzTXKzs521Wc0GlU0Go297urqSiQkAIBlPM3xdHZ2SpIyMzPjjv/2t7/V1KlTNX/+fFVVVenTTz+9ah/V1dWKRCKxlpeX5yUkABgzzFDLa3/VrFrV5jiONm7cqDvuuEPz58+PHf/Od76jmTNnKjc3V0eOHNFjjz2m5uZm/f73v++3n6qqKlVWVsZed3V1kXwAwAVjfNi5wKbEU1FRoaNHj+qdd96JO/7QQw/F/n7rrbcqJydHS5Ys0fHjx3XDDTdc0U84HFY4HB5qGAAAywyp1LZ+/Xq9/vrrOnDggGbMmDHgucXFxZKklpaWoVwKAHAVjk8taAmNeIwx2rBhg/bs2aO6ujrNmjVr0Pc0NTVJknJycoYUIACgf33Lob3Vykb8o68rKiq0c+dOvfrqq0pPT1d7e7skKRKJaOLEiTp+/Lh27typv/3bv9WUKVN05MgRPfLII1q4cKEKCgqG5QMAGLnc7kjQsmrBoOfM2fue13AwQiSUeGpqaiT13ST617Zv3677779fqampeuutt7R161Z1d3crLy9Pq1ev1g9/+EPfAgYA9BkTj0Uwgyx/yMvLU319vaeAAADu+LHzAI9FAACMeuxODQCWMpf+eO0jaCQeALAUpTYAAFxgxAMAlrL1QXAkHgCwlDE+zPEkYbM2Sm0AgEAx4gGQdG52JVg88Xuu+nK7W8JoQKkNABAoSm0AALjAiAcALGXkvVQ24vdqAwCMHI4xPjwWgVIbAGAEO3jwoFasWKHc3FyFQiHt3bs34T5IPABgKePTn0R0d3ersLBQ27ZtG3LclNoAwFLJWE5dVlamsrIyT9ck8QAA1NXVFfc6HA4rHA4Py7VIPACs4PbG0LF0o6kjHxYXXHp/Xl5e3PFNmzZp8+bNnvq+GhIPAFjKz1VtbW1tysjIiB0frtGOROIBAEjKyMiISzzDicQDAJbiCaQAgED5Ocfj1vnz59XS0hJ73draqqamJmVmZio/P99VHyQeAIBrhw8f1uLFi2OvKysrJUnl5eXasWOHqz5IPABgqWSMeBYtWuR5R2sSDwBYytY5HrbMAQAEihEPAFjK+FBqY1UbAHg0lnY4cEKOQiFvu7U5SXj4NaU2AECgGPEAgKUcGYUCXtXmBxIPAFjKXFpQ7bWPoFFqAwAEihEPAFjKkXwotQWPxAMAlmJVGwAALjDiAQBLOXIU8jhiScaIh8QDAJYi8QCARfzc4WAk724wEiU0x1NTU6OCgoLYI1JLSkr0xhtvxH7e09OjiooKTZkyRZMmTdLq1avV0dHhe9AAgC/u4/HagpZQ4pkxY4a2bNmixsZGHT58WHfddZdWrlypP/zhD5KkRx55RK+99pp2796t+vp6nTx5UnffffewBA4AY50TcnxpQUuo1LZixYq41z/5yU9UU1OjhoYGzZgxQy+88IJ27typu+66S5K0fft2feUrX1FDQ4O+/vWv99tnNBpVNBqNve7q6kr0MwAALDLk5dS9vb3atWuXuru7VVJSosbGRl28eFGlpaWxc+bNm6f8/HwdOnToqv1UV1crEonEWl5e3lBDAoAxxcjx/GfEl9ok6aOPPtKkSZMUDoe1bt067dmzRzfffLPa29uVmpqqyZMnx52flZWl9vb2q/ZXVVWlzs7OWGtra0v4QwDAWGTU60sLWsKr2ubOnaumpiZ1dnbqlVdeUXl5uerr64ccQDgcVjgcHvL7AQB2STjxpKamas6cOZKkoqIivf/++3ruuee0Zs0aXbhwQWfPno0b9XR0dCg7O9u3gAEAffruwbHvPh7PW+Y4jqNoNKqioiJNmDBBtbW1sZ81NzfrxIkTKikp8XoZAMCXOD7N8gQtoRFPVVWVysrKlJ+fr3Pnzmnnzp2qq6vT/v37FYlEtHbtWlVWViozM1MZGRnasGGDSkpKrrqiDQBGOjc3h37uvDjgz7u6PlXm5If8Csl6CSWe06dP67vf/a5OnTqlSCSigoIC7d+/X9/61rckSc8++6zGjRun1atXKxqNatmyZfrlL385LIEDwFjXtzgg5LmPoIWMMcGPswbQ1dWlSCSiviqgt18oAATB7Yins7NTGRkZnq93+d/J3Gu/qXEhbzufOeZzneyu9y02N3gsAgAgUGwSCgCW8mOvtWTcQEriAQBLOeqV1ykJJwlzPJTaAACBYsQDAJai1AYACJRjfCi1GQv2ahtuX6zuHlGrvAHgqrq6Ph3k559J+ut/38a2EZd4zp07d+lvRiQfADZwuyvBuXPnLt2n6A9KbT7Jzc1VW1ub0tPTFQr1DSG7urqUl5entra2wG5w8pvtn8H2+CX7PwPxJ99QP4MxRufOnVNubq6v8fQlHm+lMhKPpHHjxmnGjBn9/iwjI8Pa/2Avs/0z2B6/ZP9nIP7kG8pn8HOkY7sRl3gAAO4Y48jxulebYcQDAHCpr0zmdZNQC5/HE4RwOKxNmzZZ/aRS2z+D7fFL9n8G4k++0fAZRoIRtzs1AGBgl3enjqTdrFAoxVNfxvSqs+ePge5OTakNACzVN8NDqQ0AgAEx4gEAS/WtSGNVGwAgIH48tjoZj76m1AYACJQViWfbtm26/vrrlZaWpuLiYr333nvJDsmVzZs3KxQKxbV58+YlO6wBHTx4UCtWrFBubq5CoZD27t0b93NjjJ544gnl5ORo4sSJKi0t1bFjx5ITbD8Gi//++++/4jtZvnx5coLtR3V1tW6//Xalp6dr+vTpWrVqlZqbm+PO6enpUUVFhaZMmaJJkyZp9erV6ujoSFLEV3LzGRYtWnTF97Bu3bokRRyvpqZGBQUFsd0JSkpK9MYbb8R+PpJ+/8YYGeN4bMEvbB7xiefll19WZWWlNm3apA8++ECFhYVatmyZTp8+nezQXLnlllt06tSpWHvnnXeSHdKAuru7VVhYqG3btvX786efflo/+9nP9Pzzz+vdd9/Vtddeq2XLlqmnpyfgSPs3WPyStHz58rjv5KWXXgowwoHV19eroqJCDQ0NevPNN3Xx4kUtXbpU3d3dsXMeeeQRvfbaa9q9e7fq6+t18uRJ3X333UmMOp6bzyBJDz74YNz38PTTTycp4ngzZszQli1b1NjYqMOHD+uuu+7SypUr9Yc//EHSyPr9X94k1GsLPvARbsGCBaaioiL2ure31+Tm5prq6uokRuXOpk2bTGFhYbLDGDJJZs+ePbHXjuOY7Oxs89Of/jR27OzZsyYcDpuXXnopCREO7MvxG2NMeXm5WblyZVLiGYrTp08bSaa+vt4Y0/f7njBhgtm9e3fsnP/+7/82ksyhQ4eSFeaAvvwZjDHmm9/8pvn+97+fvKASdN1115lf//rXI+b339nZaSSZianXm2vCsz21ianXG0mms7MzsPhH9IjnwoULamxsVGlpaezYuHHjVFpaqkOHDiUxMveOHTum3NxczZ49W/fdd59OnDiR7JCGrLW1Ve3t7XHfRyQSUXFxsTXfhyTV1dVp+vTpmjt3rh5++GGdOXMm2SFdVWdnpyQpMzNTktTY2KiLFy/GfQfz5s1Tfn7+iP0OvvwZLvvtb3+rqVOnav78+aqqqtKnnw78TJtk6O3t1a5du9Td3a2SkpIR9/s3pteXFrQRvartk08+UW9vr7KysuKOZ2Vl6X/+53+SFJV7xcXF2rFjh+bOnatTp07pySef1De+8Q0dPXpU6enpyQ4vYe3t7ZLU7/dx+Wcj3fLly3X33Xdr1qxZOn78uP75n/9ZZWVlOnTokFJSvN0B7jfHcbRx40bdcccdmj9/vqS+7yA1NVWTJ0+OO3ekfgf9fQZJ+s53vqOZM2cqNzdXR44c0WOPPabm5mb9/ve/T2K0X/joo49UUlKinp4eTZo0SXv27NHNN9+spqamEfX792MpNMupR5mysrLY3wsKClRcXKyZM2fqd7/7ndauXZvEyMaue+65J/b3W2+9VQUFBbrhhhtUV1enJUuWJDGyK1VUVOjo0aMjfl5wIFf7DA899MWD02699Vbl5ORoyZIlOn78uG644Yagw7zC3Llz1dTUpM7OTr3yyisqLy9XfX19ssMaNUZ0qW3q1KlKSUm5YsVIR0eHsrOzkxTV0E2ePFk33XSTWlpakh3KkFz+nY+W70OSZs+eralTp46472T9+vV6/fXXdeDAgbjnU2VnZ+vChQs6e/Zs3Pkj8Tu42mfoT3FxsSSNmO8hNTVVc+bMUVFRkaqrq1VYWKjnnntuxP3+bV1cMKITT2pqqoqKilRbWxs75jiOamtrVVJSksTIhub8+fM6fvy4cnJykh3KkMyaNUvZ2dlx30dXV5feffddK78PSfr444915syZEfOdGGO0fv167dmzR2+//bZmzZoV9/OioiJNmDAh7jtobm7WiRMnRsx3MNhn6E9TU5MkjZjv4cscx1E0Gh1xv3/vS6mdpJTaRvyqtl27dplwOGx27Nhh/vjHP5qHHnrITJ482bS3tyc7tEH94z/+o6mrqzOtra3mP//zP01paamZOnWqOX36dLJDu6pz586ZDz/80Hz44YdGknnmmWfMhx9+aP785z8bY4zZsmWLmTx5snn11VfNkSNHzMqVK82sWbPMZ599luTI+wwU/7lz58yjjz5qDh06ZFpbW81bb71lvvrVr5obb7zR9PT0JDt0Y4wxDz/8sIlEIqaurs6cOnUq1j799NPYOevWrTP5+fnm7bffNocPHzYlJSWmpKQkiVHHG+wztLS0mKeeesocPnzYtLa2mldffdXMnj3bLFy4MMmR93n88cdNfX29aW1tNUeOHDGPP/64CYVC5j/+4z+MMSPj9395VduElCyTOj7HU5uQkhX4qrYRn3iMMebnP/+5yc/PN6mpqWbBggWmoaEh2SG5smbNGpOTk2NSU1PN3/zN35g1a9aYlpaWZIc1oAMHDhhJV7Ty8nJjTN+S6h/96EcmKyvLhMNhs2TJEtPc3JzcoP/KQPF/+umnZunSpWbatGlmwoQJZubMmebBBx8cUf8T01/sksz27dtj53z22WfmH/7hH8x1111nrrnmGvPtb3/bnDp1KnlBf8lgn+HEiRNm4cKFJjMz04TDYTNnzhzzT//0T4H+wzeQv//7vzczZ840qampZtq0aWbJkiWxpGPMyPj9X04841OmmQnjszy18SnTAk88PI8HACxz+Xk8KeMyFQp5mzExxlGv8/8CfR7PiJ7jAQCMPiynBgBrGcnzqrTgi14kHgCwlD/P42GTUADAKMeIBwAs1Xfzp8cRD6U2AIB73hNPMuZ4KLUBAALFiAcAbOXD4gIlYXEBiQcALGXrHA+lNgBAoBjxAIC1WFwAAAiU6Zuj8dKGmHi2bdum66+/XmlpaSouLtZ7773n+r0kHgBAQl5++WVVVlZq06ZN+uCDD1RYWKhly5bp9OnTrt7P7tQAYJnLu1NLKfKn1Nab0O7UxcXFuv322/WLX/xCUt+D8vLy8rRhwwY9/vjjg76fEQ8AWO2qj0By2fp0dXXFtWg02u/VLly4oMbGRpWWlsaOjRs3TqWlpTp06JCriEk8AGCZ1NRUZWdnS+r1pU2aNEl5eXmKRCKxVl1d3e+1P/nkE/X29iorKyvueFZWltrb213Fz6o2ALBMWlqaWltbdeHCBV/6M8YoFIov2YXDYV/67g+JBwAslJaWprS0tMCvO3XqVKWkpKijoyPueEdHx6VR2OAotQEAXEtNTVVRUZFqa2tjxxzHUW1trUpKSlz1wYgHAJCQyspKlZeX62tf+5oWLFigrVu3qru7Ww888ICr95N4AAAJWbNmjf7yl7/oiSeeUHt7u2677Tbt27fvigUHV8N9PACAQDHHAwAIFIkHABAoEg8AIFAkHgBAoEg8AIBAkXgAAIEi8QAAAkXiAQAEisQDAAgUiQcAECgSDwAgUP8f9K/LTOoz7FUAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# diagonal part of the H target\n", "visualize_matrix(dbf.diagonal_h_matrix)" @@ -263,10 +334,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 47, "id": "24d0dfa1-7039-4d7d-8aa3-5a937b9ab0b8", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "HS norm of the off diagonal part of H: 1440.0\n" + ] + } + ], "source": [ "# Hilbert-Schmidt norm of the off-diagonal part\n", "# which we want to bring to be close to zero\n", @@ -287,10 +366,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 48, "id": "95f8d86f-07d4-498c-acb1-f6f6a4614c24", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "6.708203932499369" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# define a quantum state\n", "# for example the ground state of a multi-qubit Z hamiltonian\n", @@ -313,10 +403,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 49, "id": "9a886261-8aa6-4df0-a31b-9c39847db124", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initial value of the off-diagonal norm: 1440.0\n", + "One step later off-diagonal norm: 1168.2530943739996\n" + ] + } + ], "source": [ "# perform one evolution step\n", "\n", @@ -339,10 +438,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 50, "id": "cc74812d-7c2c-44e4-afc2-e235968801b4", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" ] @@ -357,10 +467,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 51, "id": "aad79966-7a11-4a45-aba5-4a4bb8315c50", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████| 1000/1000 [00:07<00:00, 135.71trial/s, best loss: 828.389600594478]\n" + ] + } + ], "source": [ "# restart\n", "dbf.h = dbf.h0\n", @@ -378,20 +496,42 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 52, "id": "49483a47-d29d-440e-a4bc-143bfe6bb3cf", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZ4AAAGiCAYAAADXxKDZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAqe0lEQVR4nO3df3CV5Z3//9cByQlKcjD8yI+SIIhCFYNtKmlGy4KkhGyHwcofaJ1pdCkObmCKWbeanVbQbSesnVFsm8aOdaGdKWJxCo52hNVIwrhLrEQYpN3NAJ+0xEJC5TskEOUAua/vH5FjD4TkPrnv3OdcyfPhXDOcO/e57vc5d+Dtdd3Xj5AxxggAgICMSnYAAICRhcQDAAgUiQcAECgSDwAgUCQeAECgSDwAgECReAAAgSLxAAACReIBAASKxAMACBSJBwDg2vr16xUKheLKrFmzEqrjmiGKDQAwTN166616++23Y6+vuSaxVELiAQAk5JprrlFOTs7g3+9jLACAgJw7d07nz5/3pS5jjEKhUNyxcDiscDjc5/mHDx9WXl6e0tPTVVJSopqaGhUUFLi+XohtEQDALufOndO0aTlqb+/0pb5x48bp7NmzccfWrVun9evXX3Hum2++qbNnz2rmzJk6ceKEnnrqKf31r3/VoUOHlJGR4ep6JB4AsExXV5cikYj+31+eU2bmWI91farpUx9VW1ubMjMzY8f7a/H8vdOnT2vq1Kl69tlntWLFClfXpKsNACyVmTnWc+L5vK7MuMTj1vjx43XzzTfryJEjrt/DcGoAsJQxF30pXpw9e1ZHjx5Vbm6u6/eQeADAUsb0+FIS8dhjj6mxsVF//vOf9T//8z/65je/qdGjR+v+++93XQddbQAA1z766CPdf//9OnXqlCZNmqS77rpLTU1NmjRpkus6SDwAYCnHXJTjsass0fdv3brV0/UkEg8AWMuPZzRe3z8YPOMBAASKFg8AWKp3cIDXFk9igwv8QOIBAEsZ56KM4zHxeHz/YNDVBgAIFC0eALCVudhbvNYRMBIPAFiKUW0AALhAiwcAbOVclJwL3usIGIkHACzV29U22nMdQaOrDQAQKFo8AGAr56LkeGvx0NUGAHDP0sRDVxsAIFC0eADAWj0+TABlrTYAgEsh56JCjreOqxBdbQCA4Y4WDwDYyrkoeWzxMKoNAOCepYmHrjYAQKBo8QCApULmokLG4+ACtkUAALjmOJLjcTi04/gTSwLoagMABIoWDwBYqnceT8hzHUEj8QCArZweH0a1Bb9yAV1tAIBA0eIBAFs5FyWPXW1MIAUAuBZyenxYq42uNgDAMJdyLR7HcXT8+HFlZGQoFPLYhASAFGCM0ZkzZ5SXl6dRo3z8/33jw+ACw7YIOn78uPLz85MdBgD4rq2tTVOmTPGtvpDjeO4qCyVhAumQJZ7a2lr9+Mc/Vnt7u+bMmaOf/vSnmjt37oDvy8jIkCT9+djzyswc2++5f3ngRV9ilaQv/b7Z1Xn7v1Hka31+chNbMuJKZal8PzGcGEkm9u/bSDckieeVV15RVVWVXnjhBRUXF2vjxo0qKytTS0uLJk+e3O97L3WvZWaOVWbmtf2emzHGz/Dddeu5v2bw3YTuYqP78u+l8v3EcGP8f3zg9Pgwqm2YDC549tlntXLlSj300EO65ZZb9MILL+jaa6/Vf/7nfw7F5QBgROod1ea9BM33xHP+/Hk1NzertLT084uMGqXS0lLt3bv3ivOj0ai6urriCgBg+PI98Xz88cfq6elRdnZ23PHs7Gy1t7dfcX5NTY0ikUisMLAAAFxyevwpAUv6PJ7q6mp1dnbGSltbW7JDAgAr2NrV5vvggokTJ2r06NHq6OiIO97R0aGcnJwrzg+HwwqHw36HAQBIUb63eNLS0lRUVKT6+vrYMcdxVF9fr5KSEr8vBwAjl6VdbUMynLqqqkoVFRX6yle+orlz52rjxo3q7u7WQw89NBSXA4ARKeQYzxNAQ47xKRr3hiTxLF++XH/729/05JNPqr29Xbfffrt27tx5xYCD/vzlgRcHnGOxclfhgPXs/vSXrq535J6BJ7dK0owdf/CtPrd1ueWmPr8/p+38vJ+J1AeMZEO2csHq1au1evXqoaoeAOD0SF5XvBkuXW0AgAAYHxJPEhYJTfpwagDAyEKLBwAsFTKOQsbbWm0hM4xWpwYADDFLn/HQ1QYACBQtHgCwleP4sC0CXW0AALdIPMFzMzl0wdjvuKztoLdgLpOqkzmZMDk4fG+Af6xOPAAwkoUcRyGPDRavS+4MBokHAGzlOD6Mags+8TCqDQAQKFo8AGArS1s8JB4AsJWliYeuNgBAoGjxAICtTI/kdSM31moDALhl63BqutoAAIFK2RbPl37fLKn/pSDczRJ3tyKBm220e42MVQRSObZUlspbo2MYsnRwQcomHgDAACxNPHS1AQACRYsHAGzlGO8tFq+j4gaBxAMAtnKMD11twSceutoAAIGixQMAtvJlIzhaPAAAtxzHnzJIGzZsUCgU0tq1axN6H4kHAJCw999/X7/4xS9UWOh2DuTnSDwAYCvH+FMSdPbsWT3wwAN68cUXdf311yf8/pR9xrP/G0XKGNN/eP7O7HZX14Kx33F13otl7lZMcCOVZ7AzU39w3HxWVoXAgIwjGY/PeExv4unq6oo7HA6HFQ6H+3xLZWWlvvGNb6i0tFQ//OEPE74kLR4AgPLz8xWJRGKlpqamz/O2bt2qDz744Ko/dyNlWzwAgAEYH+bxfNbiaWtrU2ZmZuxwX62dtrY2ffe739Vbb72l9PT0QV+SxAMAtvJxAmlmZmZc4ulLc3OzTp48qS9/+cuxYz09PdqzZ49+9rOfKRqNavTo0QNeksQDAHBl4cKF+vDDD+OOPfTQQ5o1a5Yef/xxV0lHIvEAgL0CXjInIyNDs2fPjjt23XXXacKECVcc7w+JBwAsZRzvO1cnYedrEg8AYPAaGhoSfg+JBwBsZenq1CmbePza+trvyXXJmBg6HCYSMmEycSPp9wOD5MiHxONHIIlhAikAIFC+J57169crFArFlVmzZvl9GQCA41MJ2JB0td166616++23P7/INSnbowcA9jKfFa91BGxIMsI111yjnJwcV+dGo1FFo9HY68sXqgMADC9D8ozn8OHDysvL0/Tp0/XAAw/o2LFjVz23pqYmbmG6/Pz8oQgJAIYd44R8KUHzPfEUFxdr8+bN2rlzp+rq6tTa2qqvfe1rOnPmTJ/nV1dXq7OzM1ba2tr8DgkAhiee8fQqLy+P/bmwsFDFxcWaOnWqfvvb32rFihVXnN/fng8AgOFnyJ/6jx8/XjfffLOOHDky1JcCgJHFhCSvXWVJGFww5PN4zp49q6NHjyo3N3eoLwUAI4qtz3h8b/E89thjWrJkiaZOnarjx49r3bp1Gj16tO6//36/L5XSs+Hd1Od2G23Jv9USUhkz9QeH7w228T3xfPTRR7r//vt16tQpTZo0SXfddZeampo0adIkvy8FACOb40NX23AYXLB161a/qwQA9MWEeounOvwJJRGs1QYACBRr2QCApfwYHMBGcAAA95xRPjzjCb6vja42AECgaPEAgK0Y1QYACJIxIRmPo9oMo9oAAMPdsG/xJGtWt7v63K1IsHJXoavzpJEx49zPezCSZunzvQ1Dlg4uGPaJBwCGK+PIh+HUjGoDAAxztHgAwFa+bIswDFanBgAEw59RbcNg62sAAPpDiwcAbOWM6i2e6vAnlESQeADAUv4sEkpXGwBgmAsZk4wFE66uq6tLkUhE+79xhzLG9N8gYxJbPDdbab9Y5u822kxKHJnYRjtRRpKjzs5OZWZmeq7t0r+Tf300W5lhb+2HrqijLzzX4VtsbtDVBgC2svQZD11tAIBA0eIBAEvZOriAxAMAlmICKQAALtDiAQBbWTq4gMQDAJay9RkPXW0AgEDR4gEAS9k6uCBlE8+Xft8sqf8vhNnw8fxclSAZW4YzG94eydpSHpcxPjzjScLaNXS1AQAClbItHgBA/2wdXEDiAQBLGeP9GU0ylommqw0AEChaPABgKx+62kRXGwDALWNGyRhvHVfJ2JKNrjYAQKBo8QCArZyQ964yutoAAG6xckESMBs+cX7POPcTs+GHHz/vKfdz+Ej4Gc+ePXu0ZMkS5eXlKRQKaceOHXE/N8boySefVG5ursaOHavS0lIdPnzYr3gBAJ+5NIHUawlawomnu7tbc+bMUW1tbZ8/f+aZZ/STn/xEL7zwgt577z1dd911Kisr07lz5zwHCwD43KVRbV5L0BLuaisvL1d5eXmfPzPGaOPGjfr+97+vpUuXSpJ+/etfKzs7Wzt27NB9993nLVoAgPV8TXWtra1qb29XaWlp7FgkElFxcbH27t3b53ui0ai6urriCgBgYCOmq60/7e3tkqTs7Oy449nZ2bGfXa6mpkaRSCRW8vPz/QwJAIatS6PavJagJX0CaXV1tTo7O2Olra0t2SEBAIaQr8Opc3JyJEkdHR3Kzc2NHe/o6NDtt9/e53vC4bDC4bCfYQDAiGDrPB5fWzzTpk1TTk6O6uvrY8e6urr03nvvqaSkxM9LAcCIZ4wPz3hsmEB69uxZHTlyJPa6tbVVBw4cUFZWlgoKCrR27Vr98Ic/1E033aRp06bpBz/4gfLy8nTPPff4GTcAwFIJJ559+/ZpwYIFsddVVVWSpIqKCm3evFnf+9731N3drYcfflinT5/WXXfdpZ07dyo9Pd2/qBMwkmbD+7mSQypjNvzwwyokg2Pr6tQJJ5758+f3G2goFNLTTz+tp59+2lNgAID+2br1ddJHtQEARharFwkFgJHM1lFtJB4AsJStiYeuNgBAoEg8AGAp4/ixXlti16yrq1NhYaEyMzOVmZmpkpISvfnmmwnVQVcbAFgqGV1tU6ZM0YYNG3TTTTfJGKNf/epXWrp0qfbv369bb73VVR0kHgCAa0uWLIl7/aMf/Uh1dXVqamoi8SRqOEw0TeUJkwvGfmfAc14sO+jrNUfSRMKRYDj8HfWbPxNIe99/+ZY0btbR7Onp0bZt29Td3Z3Qsmg84wEASzkm5EuRpPz8/Lgtampqaq563Q8//FDjxo1TOBzWqlWrtH37dt1yyy2u46bFAwBQW1ubMjMzY6/7a+3MnDlTBw4cUGdnp1599VVVVFSosbHRdfIh8QCArfzYQfSz918apeZGWlqaZsyYIUkqKirS+++/r+eff16/+MUvXL2fxAMAlkqVCaSO4ygajbo+n8QDAHCturpa5eXlKigo0JkzZ7RlyxY1NDRo165drusg8QCApZLR4jl58qS+/e1v68SJE4pEIiosLNSuXbv09a9/3XUdJB4AsFQyEs9LL73k6XoSw6kBAAGjxQMAlnLMKDkeJ5B6ff9gkHgSlMrbLqfy9sF+rkqQyvcAyTeSVjgwxocdSNkWAQAw3NHiAQBLpco8nkSReADAUrYmHrraAACBosUDAJb6+9WlvdQRNBIPAFiKrjYAAFygxQMAlrK1xUPiAQBL8YwHcVJ1FYFUntXttq4FY7/jskb/VkvA8MMKGMlD4gEASxnjvavMGJ+CSQCJBwAsZeszHka1AQACRYsHACxlfBhcwKg2AIBrdLUBAOACLR4AsJStLR4SDwBYigmkSNhwmMzpZ2xu63I7MXTlrkIXZzHxD/3z43f3zIWL+tLv3/crJOuReADAUrZ2tSU8uGDPnj1asmSJ8vLyFAqFtGPHjrifP/jggwqFQnFl8eLFfsULAPjMpa42ryVoCSee7u5uzZkzR7W1tVc9Z/HixTpx4kSsvPzyy56CBAAMHwl3tZWXl6u8vLzfc8LhsHJyclzVF41GFY1GY6+7uroSDQkARiSjkIw8drV5fP9gDMk8noaGBk2ePFkzZ87UI488olOnTl313JqaGkUikVjJz88fipAAYNi59IzHawma74ln8eLF+vWvf636+nr9x3/8hxobG1VeXq6enp4+z6+urlZnZ2estLW1+R0SACCF+D6q7b777ov9+bbbblNhYaFuvPFGNTQ0aOHChVecHw6HFQ6H/Q4DAIY9W+fxDPmSOdOnT9fEiRN15MiRob4UAIwodLVdxUcffaRTp04pNzd3qC8FALBAwl1tZ8+ejWu9tLa26sCBA8rKylJWVpaeeuopLVu2TDk5OTp69Ki+973vacaMGSorK0voOvu/UaSMMf2HN1K2m03lz5mM1RLcG7g+t9tov1jm7zbaqbo1ulupHFsyDPw5h2abT0c+dLUlYVRbwoln3759WrBgQex1VVWVJKmiokJ1dXU6ePCgfvWrX+n06dPKy8vTokWL9O///u88xwEASBpE4pk/f75MP5t079q1y1NAAAB3bF0yh7XaAMBSjkKeu8qS0dXGRnAAgEDR4gEAW/kxHJquNgCAW0wgBQDABVo8AGApRrUBAALlfFa81hG0lE08X/p9szTAMD83s6dHysxpDI7bFQlW7ip0dd7uT3/p6jw/f3eTsYpAKseG1JeyiQcA0D+62gAAgXKM91FpztAsI9cvRrUBAAJFiwcALGUUkvG45I3X9w8GiQcALMUEUgAAXKDFAwCW6h1c4L2OoJF4AMBSPONJAtu3D4Y9/JwY6rdUnszpZ2z8HR0+rE48ADCS2Tq4gMQDAJYyprd4rSNojGoDAASKFg8AWMooJIfBBQCAoNi6SChdbQCAQNHiAQBLMaoNABAo81nxWkfQ6GoDAARq2Ld4UnlWN5LP798Pt9xtpe3v71oqryLAKiSDQ1cbACBQzmfFax1Bo6sNABAoWjwAYClb5/GQeADAUrY+46GrDQAQKBIPAFjK+FQSUVNTozvuuEMZGRmaPHmy7rnnHrW0tCRUB4kHACx1qavNa0lEY2OjKisr1dTUpLfeeksXLlzQokWL1N3d7boOnvEAAFzbuXNn3OvNmzdr8uTJam5u1rx581zVQeIBAEv5OY+nq6sr7ng4HFY4HB7w/Z2dnZKkrKws19ck8XyGFQ5GpuTdT/9m6vstVX93+Tt6JT+HU+fn58cdX7dundavX9/vex3H0dq1a3XnnXdq9uzZrq+Z0DMeNw+Vzp07p8rKSk2YMEHjxo3TsmXL1NHRkchlAAABa2trU2dnZ6xUV1cP+J7KykodOnRIW7duTehaCSUeNw+VHn30Ub3++uvatm2bGhsbdfz4cd17770JBQUAGJjR591tgy2XRrVlZmbGlYG62VavXq033nhDu3fv1pQpUxKKO6GutoEeKnV2duqll17Sli1bdPfdd0uSNm3apC9+8YtqamrSV7/61YSCAwBcnZEPXW0Jbn1tjNGaNWu0fft2NTQ0aNq0aQlf09MznssfKjU3N+vChQsqLS2NnTNr1iwVFBRo7969fSaeaDSqaDQae335Ay4AQOqorKzUli1b9NprrykjI0Pt7e2SpEgkorFjx7qqY9DzePp6qNTe3q60tDSNHz8+7tzs7OxYcJerqalRJBKJlcsfcAEA+uYYf0oi6urq1NnZqfnz5ys3NzdWXnnlFdd1DLrFc+mh0rvvvjvYKiRJ1dXVqqqqir3u6uoi+QCAC8nYgdQY73uWDirxXHqotGfPnriHSjk5OTp//rxOnz4d1+rp6OhQTk5On3W5HSsOABgeEupqM8Zo9erV2r59u955550rHioVFRVpzJgxqq+vjx1raWnRsWPHVFJS4k/EAABJyVkyxw8JtXgGeqgUiUS0YsUKVVVVKSsrS5mZmVqzZo1KSkqGzYi2VN4+GIkbSZMSR8rv7ki6p7buQJpQ4qmrq5MkzZ8/P+74pk2b9OCDD0qSnnvuOY0aNUrLli1TNBpVWVmZfv7zn/sSLADAfgklHjcPldLT01VbW6va2tpBBwUAGBg7kAIAAmVrVxv78QAAAkWLBwAsZUxv8VpH0Eg8AGApRyE5Ca611lcdQaOrDQAQKFo8AGCpway11lcdQSPxAICtfHjG43mxt0Eg8QwRN7Odh8PM6ZEilWfD+x3bSDFSVnJIRSQeALCUrYMLSDwAYClbh1Mzqg0AEChaPABgKVuXzCHxAIClbB1OTVcbACBQtHgAwFJG3qfhJKHBQ+IBAFv1drV5HE5NVxsAYLijxZNEqTwbHoOTjNnwfq9IsHJXoYuzRs7vmh+rkJy5cFFf+v37foUUY+s8HhIPAFjK1uHUdLUBAAJFiwcALEVXGwAgUHS1AQDgAi0eALCU8WHJHLraAACu2bpyAV1tAIBA0eKxAFv0Dp1kTc5NxtbX7g1c34Kx33FV04tlB70GE5PKE64Hrmto2hW2rk5N4gEAS9k6nJquNgBAoGjxAIClbJ3HQ+IBAEvZ+oyHrjYAQKBo8QCApWydx0PiAQBL0dUGAIALtHgAwFK2zuMh8QwjfmzRm0hdw0Eqz4ZPZW5XJHC3jba0+9NfDniO3/dgONxTW4dT09UGAAhUQomnpqZGd9xxhzIyMjR58mTdc889amlpiTtn/vz5CoVCcWXVqlW+Bg0A+KzFYzyWJMSdUOJpbGxUZWWlmpqa9NZbb+nChQtatGiRuru7485buXKlTpw4ESvPPPOMr0EDAD4fTu21BC2hZzw7d+6Me71582ZNnjxZzc3NmjdvXuz4tddeq5ycHFd1RqNRRaPR2Ouurq5EQgIAWMbTM57Ozk5JUlZWVtzx3/zmN5o4caJmz56t6upqffLJJ1eto6amRpFIJFby8/O9hAQAI4YZbPfa3xWrRrU5jqO1a9fqzjvv1OzZs2PHv/Wtb2nq1KnKy8vTwYMH9fjjj6ulpUW/+93v+qynurpaVVVVsdddXV0kHwBwwRgfVi6wKfFUVlbq0KFDevfdd+OOP/zww7E/33bbbcrNzdXChQt19OhR3XjjjVfUEw6HFQ6HBxsGAMAyg+pqW716td544w3t3r1bU6ZM6ffc4uJiSdKRI0cGcykAwFU4PpWgJdTiMcZozZo12r59uxoaGjRt2rQB33PgwAFJUm5u7qACBAD0rXc4tLe+spTf+rqyslJbtmzRa6+9poyMDLW3t0uSIpGIxo4dq6NHj2rLli36x3/8R02YMEEHDx7Uo48+qnnz5qmw0N0MZgytkTSr2098b4PjZkUCyf335ic/7+lIuZ9+SSjx1NXVSeqdJPr3Nm3apAcffFBpaWl6++23tXHjRnV3dys/P1/Lli3T97//fd8CBgD0GhHbIpgBhj/k5+ersbHRU0AAAHf8WHmAbREAAMMeq1MDgKXMZ/95rSNoJB4AsBRdbQAAuECLBwAsZetGcCQeALCUMT4840nCYm10tQEAAkWLB31ipv7gjJTZ8H7/frixcpfb1U/8/d7cfNaBPueZCxf1pd+/71dIMXS1AQACRVcbAAAu0OIBAEsZee8qS/m12gAAqcMxxodtEehqAwCksD179mjJkiXKy8tTKBTSjh07Eq6DxAMAljI+/ZeI7u5uzZkzR7W1tYOOm642ALBUMoZTl5eXq7y83NM1STwAAHV1dcW9DofDCofDQ3ItEg88GSkTJv3mx6TEROryW3Jic1fXgrHfcXXei2UHvQQTZ+DPOTQP8B35MLjgs/fn5+fHHV+3bp3Wr1/vqe6rIfEAgKX8HNXW1tamzMzM2PGhau1IJB4AgKTMzMy4xDOUSDwAYCl2IAUABMrPZzxunT17VkeOHIm9bm1t1YEDB5SVlaWCggJXdZB4AACu7du3TwsWLIi9rqqqkiRVVFRo8+bNruog8QCApZLR4pk/f77nFa1JPABgKVuf8bBkDgAgULR4AMBSxoeuNka1YdiyfaZ+MqTy9uOpHJvbFQncbqW9+9NfDnhO0ra+DjkKhbyt1uYkYfNrutoAAIGixQMAlnJkFAp4VJsfSDwAYCnz2YBqr3UEja42AECgaPEAgKUcyYeutuCReADAUoxqAwDABVo8AGApR45CHlssyWjxkHgAwFIkHsCjVJ4Nn8pS+XvzMza/76ebFQkkacHY77g4y91qCeiV0DOeuro6FRYWxrZILSkp0Ztvvhn7+blz51RZWakJEyZo3LhxWrZsmTo6OnwPGgDw+TweryVoCSWeKVOmaMOGDWpubta+fft09913a+nSpfrjH/8oSXr00Uf1+uuva9u2bWpsbNTx48d17733DkngADDSOSHHlxK0hLralixZEvf6Rz/6kerq6tTU1KQpU6bopZde0pYtW3T33XdLkjZt2qQvfvGLampq0le/+tU+64xGo4pGo7HXXV1diX4GAIBFBj2cuqenR1u3blV3d7dKSkrU3NysCxcuqLS0NHbOrFmzVFBQoL179161npqaGkUikVjJz88fbEgAMKIYOZ7/S/muNkn68MMPNW7cOIXDYa1atUrbt2/XLbfcovb2dqWlpWn8+PFx52dnZ6u9vf2q9VVXV6uzszNW2traEv4QADASGfX4UoKW8Ki2mTNn6sCBA+rs7NSrr76qiooKNTY2DjqAcDiscDg86PcDAOyScOJJS0vTjBkzJElFRUV6//339fzzz2v58uU6f/68Tp8+Hdfq6ejoUE5Ojm8BAwB69c7BsW8ej+clcxzHUTQaVVFRkcaMGaP6+vrYz1paWnTs2DGVlJR4vQwA4DKOT095gpZQi6e6ulrl5eUqKCjQmTNntGXLFjU0NGjXrl2KRCJasWKFqqqqlJWVpczMTK1Zs0YlJSVXHdEGDEYqT0pMZan8vSVja3S39bmZHHrD7yr7/XlX1yfSeP+3vrZVQonn5MmT+va3v60TJ04oEomosLBQu3bt0te//nVJ0nPPPadRo0Zp2bJlikajKisr089//vMhCRwARrrewQEhz3UELaHE89JLL/X78/T0dNXW1qq2ttZTUACAgY3YZzwAACSCRUIBwFJ+rLWWjAmkJB4AsJSjHsnjMx4nCc946GoDAASKFg8AWIquNgBAoBzjQ1ebSfHh1EEw5tIs2uBn02J4OXPhoouz+D27XKp+b+7iktzG5r6+gXV1fTLAzz+V9Pf/vo1sIZNi38RHH33E1ggAhqW2tjZNmTLFcz1dXV2KRCKacG2RRoW8tR8cc1GnPmlWZ2enMjMzPcfmRsq1ePLy8tTW1qaMjAyFQr1NyK6uLuXn56utrS2wL8Zvtn8G2+OX7P8MxJ98g/0MxhidOXNGeXl5vsbT+4zHW1cZz3gkjRo16qr/R5CZmWntL+wltn8G2+OX7P8MxJ98g/kMkUhkiKKxT8olHgCAO8Y4cryu1WZo8QAAXOrtJvO6SChrtfUpHA5r3bp1Vu9UavtnsD1+yf7PQPzJNxw+QypIuVFtAID+XRrVFkm/RaHQaE91GdOjznN/Gtmj2gAA7vQ+4aGrDQCAftHiAQBL9Y5IY1QbACAgfmxbnYytr+lqAwAEyorEU1tbqxtuuEHp6ekqLi7WH/7wh2SH5Mr69esVCoXiyqxZs5IdVr/27NmjJUuWKC8vT6FQSDt27Ij7uTFGTz75pHJzczV27FiVlpbq8OHDyQm2DwPF/+CDD15xTxYvXpycYPtQU1OjO+64QxkZGZo8ebLuuecetbS0xJ1z7tw5VVZWasKECRo3bpyWLVumjo6OJEV8JTefYf78+Vfch1WrViUp4nh1dXUqLCyMrU5QUlKiN998M/bzVPr+jTEyxvFYgh/YnPKJ55VXXlFVVZXWrVunDz74QHPmzFFZWZlOnjyZ7NBcufXWW3XixIlYeffdd5MdUr+6u7s1Z84c1dbW9vnzZ555Rj/5yU/0wgsv6L333tN1112nsrIynTt3LuBI+zZQ/JK0ePHiuHvy8ssvBxhh/xobG1VZWammpia99dZbunDhghYtWqTu7u7YOY8++qhef/11bdu2TY2NjTp+/LjuvffeJEYdz81nkKSVK1fG3YdnnnkmSRHHmzJlijZs2KDm5mbt27dPd999t5YuXao//vGPklLr+7+0H4/XEnzgKW7u3LmmsrIy9rqnp8fk5eWZmpqaJEblzrp168ycOXOSHcagSTLbt2+PvXYcx+Tk5Jgf//jHsWOnT5824XDYvPzyy0mIsH+Xx2+MMRUVFWbp0qVJiWcwTp48aSSZxsZGY0zv9z1mzBizbdu22Dn/+7//aySZvXv3JivMfl3+GYwx5h/+4R/Md7/73eQFlaDrr7/e/PKXv0yZ77+zs9NIMmPTbjDXhqd7KmPTbjCSTGdnZ2Dxp3SL5/z582publZpaWns2KhRo1RaWqq9e/cmMTL3Dh8+rLy8PE2fPl0PPPCAjh07luyQBq21tVXt7e1x9yMSiai4uNia+yFJDQ0Nmjx5smbOnKlHHnlEp06dSnZIV9XZ2SlJysrKkiQ1NzfrwoULcfdg1qxZKigoSNl7cPlnuOQ3v/mNJk6cqNmzZ6u6ulqffNL/njbJ0NPTo61bt6q7u1slJSUp9/0b0+NLCVpKj2r7+OOP1dPTo+zs7Ljj2dnZ+r//+78kReVecXGxNm/erJkzZ+rEiRN66qmn9LWvfU2HDh1SRkZGssNLWHt7uyT1eT8u/SzVLV68WPfee6+mTZumo0eP6t/+7d9UXl6uvXv3avRobzPA/eY4jtauXas777xTs2fPltR7D9LS0jR+/Pi4c1P1HvT1GSTpW9/6lqZOnaq8vDwdPHhQjz/+uFpaWvS73/0uidF+7sMPP1RJSYnOnTuncePGafv27brlllt04MCBlPr+/RgKzXDqYaa8vDz258LCQhUXF2vq1Kn67W9/qxUrViQxspHrvvvui/35tttuU2FhoW688UY1NDRo4cKFSYzsSpWVlTp06FDKPxfsz9U+w8MPPxz782233abc3FwtXLhQR48e1Y033hh0mFeYOXOmDhw4oM7OTr366quqqKhQY2NjssMaNlK6q23ixIkaPXr0FSNGOjo6lJOTk6SoBm/8+PG6+eabdeTIkWSHMiiXvvPhcj8kafr06Zo4cWLK3ZPVq1frjTfe0O7du+P2p8rJydH58+d1+vTpuPNT8R5c7TP0pbi4WJJS5j6kpaVpxowZKioqUk1NjebMmaPnn38+5b5/WwcXpHTiSUtLU1FRkerr62PHHMdRfX29SkpKkhjZ4Jw9e1ZHjx5Vbm5uskMZlGnTpiknJyfufnR1dem9996z8n5IvVutnzp1KmXuiTFGq1ev1vbt2/XOO+9o2rRpcT8vKirSmDFj4u5BS0uLjh07ljL3YKDP0JcDBw5IUsrch8s5jqNoNJpy37/3odROUrraUn5U29atW004HDabN282f/rTn8zDDz9sxo8fb9rb25Md2oD+5V/+xTQ0NJjW1lbz3//936a0tNRMnDjRnDx5MtmhXdWZM2fM/v37zf79+40k8+yzz5r9+/ebv/zlL8YYYzZs2GDGjx9vXnvtNXPw4EGzdOlSM23aNPPpp58mOfJe/cV/5swZ89hjj5m9e/ea1tZW8/bbb5svf/nL5qabbjLnzp1LdujGGGMeeeQRE4lETENDgzlx4kSsfPLJJ7FzVq1aZQoKCsw777xj9u3bZ0pKSkxJSUkSo4430Gc4cuSIefrpp82+fftMa2uree2118z06dPNvHnzkhx5ryeeeMI0Njaa1tZWc/DgQfPEE0+YUChk/uu//ssYkxrf/6VRbWNGZ5u0a3I9lTGjswMf1ZbyiccYY37605+agoICk5aWZubOnWuampqSHZIry5cvN7m5uSYtLc184QtfMMuXLzdHjhxJdlj92r17t5F0RamoqDDG9A6p/sEPfmCys7NNOBw2CxcuNC0tLckN+u/0F/8nn3xiFi1aZCZNmmTGjBljpk6dalauXJlS/xPTV+ySzKZNm2LnfPrpp+af//mfzfXXX2+uvfZa881vftOcOHEieUFfZqDPcOzYMTNv3jyTlZVlwuGwmTFjhvnXf/3XQP/h688//dM/malTp5q0tDQzadIks3DhwljSMSY1vv9Lieea0ZPMmGuyPZVrRk8KPPGwHw8AWObSfjyjR2UpFPL2xMQYRz3O/xfofjwp/YwHADD8MJwaAKxlJM+j0oLv9CLxAICl/NmPh0VCAQDDHC0eALBU7+RPjy0eutoAAO55TzzJeMZDVxsAIFC0eADAVj4MLlASBheQeADAUrY+46GrDQAQKFo8AGAtBhcAAAJlep/ReCmDTDy1tbW64YYblJ6eruLiYv3hD39w/V4SDwAgIa+88oqqqqq0bt06ffDBB5ozZ47Kysp08uRJV+9ndWoAsMyl1aml0fKnq60nodWpi4uLdccdd+hnP/uZpN6N8vLz87VmzRo98cQTA76fFg8AWO2qWyC5LL26urriSjQa7fNq58+fV3Nzs0pLS2PHRo0apdLSUu3du9dVxCQeALBMWlqacnJyJPX4UsaNG6f8/HxFIpFYqamp6fPaH3/8sXp6epSdnR13PDs7W+3t7a7iZ1QbAFgmPT1dra2tOn/+vC/1GWMUCsV32YXDYV/q7guJBwAslJ6ervT09MCvO3HiRI0ePVodHR1xxzs6Oj5rhQ2MrjYAgGtpaWkqKipSfX197JjjOKqvr1dJSYmrOmjxAAASUlVVpYqKCn3lK1/R3LlztXHjRnV3d+uhhx5y9X4SDwAgIcuXL9ff/vY3Pfnkk2pvb9ftt9+unTt3XjHg4GqYxwMACBTPeAAAgSLxAAACReIBAASKxAMACBSJBwAQKBIPACBQJB4AQKBIPACAQJF4AACBIvEAAAJF4gEABOr/B3tglwUGPsrTAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "visualize_matrix(dbf.h.matrix)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 53, "id": "6bdaf7f9-7e49-4a16-8b29-ae1f9746cd9b", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "visualize_drift(dbf.h0.matrix, dbf.h.matrix)" ] @@ -410,7 +550,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 54, "id": "59a6a485-a714-4e14-b27a-1df2930068ee", "metadata": {}, "outputs": [], @@ -433,10 +573,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 55, "id": "7e0b2f18-ca53-4f34-9fcf-0052dcc31dc5", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeAAAAF2CAYAAAC260vLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABbgklEQVR4nO3deVxU9f7H8dcM+46oMCAo5K7hbmQuaSJumZppFtc0Ta+plVm2/Mo10zTzmmZqddUWbbHSumYqrqQhKmopmiuKC4uKgIDAwJzfH8TkCCjgDIeBz/Px4NHMOd/zPe/zbeDjOXMWjaIoCkIIIYSoUFq1AwghhBDVkRRgIYQQQgVSgIUQQggVSAEWQgghVCAFWAghhFCBFGAhhBBCBVKAhRBCCBVIARZCCCFUIAVYCCGEUIEUYCEqiU2bNtGqVSscHR3RaDSkpqaqHalYGo2G6dOnV/h6R4wYgaura6naqpWxJOfOnUOj0bBq1Sq1o4hKRAqwqNJWrVqFRqPhwIEDake5o2vXrjFkyBCcnJxYsmQJX375JS4uLqrl2bhxY6UqYBVhzZo1LFy4UO0YohqxVTuAEAL279/PjRs3eOeddwgNDVU7Dhs3bmTJkiXFFuGbN29ia1u5/3SUJ+OaNWs4evQoEydONHueevXqcfPmTezs7Mzet7Belfu3SIhqIjk5GQBPT091g5SCo6Oj2hHuqrJkzMvLw2AwYG9vX2kyicpDDkELARw6dIjevXvj7u6Oq6sr3bt3Z+/evSZt9Ho9M2bMoGHDhjg6OlKzZk06depERESEsU1iYiLPPvss/v7+ODg44OvrS//+/Tl37lyJ6+7atSvDhw8HoH379mg0GkaMGAFAYGCg8fXty3Tt2tX4fufOnWg0Gr777jveffdd/P39cXR0pHv37pw+fbrI8tHR0fTp04caNWrg4uJCixYt+PDDD4GC71qXLFkCFHyXWvhTqLjvV0szfoVfB+zZs4dJkyZRu3ZtXFxcGDhwIFeuXClxfG536dIlBgwYgKurK7Vr1+bVV18lPz/fpM3tGW/cuMHEiRMJDAzEwcEBb29vevTowcGDB43j+csvv3D+/Hnj9gYGBhqXT05OZtSoUfj4+ODo6EjLli35/PPPTdZZ+D3v/PnzWbhwIfXr18fBwYFjx46V+B3wX3/9xRNPPIGXlxeOjo60a9eOn3/+2aRNaT53wjrJHrCo9mJjY+ncuTPu7u689tpr2NnZsXz5crp27cquXbsICQkBYPr06cyZM4fnnnuOBx54gPT0dA4cOMDBgwfp0aMHAIMGDSI2NpYXXniBwMBAkpOTiYiIID4+3uQP+q3eeustGjduzCeffMLMmTMJCgqifv365dqW9957D61Wy6uvvkpaWhrz5s0jPDyc6OhoY5uIiAgeffRRfH19eemll9DpdBw/fpwNGzbw0ksv8e9//5vLly8TERHBl19+abbxK/TCCy9Qo0YNpk2bxrlz51i4cCETJkzg22+/veu68vPz6dmzJyEhIcyfP5+tW7fywQcfUL9+fZ5//vkSlxs7dizff/89EyZMoFmzZly7do3du3dz/Phx2rRpw1tvvUVaWhoXL17kP//5D4DxhK+bN2/StWtXTp8+zYQJEwgKCmLt2rWMGDGC1NRUXnrpJZN1rVy5kuzsbMaMGYODgwNeXl4YDIZix61jx47UqVOHN954AxcXF7777jsGDBjADz/8wMCBA4HSfe6ElVKEqMJWrlypAMr+/ftLbDNgwADF3t5eOXPmjHHa5cuXFTc3N6VLly7GaS1btlT69u1bYj/Xr19XAOX99983W8569eopw4cPL9L+4YcfVh5++GHj+x07diiA0rRpUyUnJ8c4/cMPP1QA5ciRI4qiKEpeXp4SFBSk1KtXT7l+/bpJnwaDwfh6/PjxSkl/HgBl2rRpxvelHb/CbQwNDTVZ18svv6zY2Ngoqampxa6v0PDhwxVAmTlzpsn01q1bK23btr1jRg8PD2X8+PF37L9v375KvXr1ikxfuHChAihfffWVcVpubq7SoUMHxdXVVUlPT1cURVHi4uIUQHF3d1eSk5NN+iict3LlSuO07t27K8HBwUp2drZxmsFgUB566CGlYcOGxml3+9wJ6yWHoEW1lp+fz5YtWxgwYAD33Xefcbqvry9PP/00u3fvJj09HSj4fjY2NpZTp04V25eTkxP29vbs3LmT69evV0j+2z377LPY29sb33fu3BmAs2fPAgWHiuPi4pg4cWKR75tvPcxcWmUZv0JjxowxWVfnzp3Jz8/n/PnzpVrn2LFjTd537tzZuH0l8fT0JDo6msuXL5dqHbfauHEjOp2Op556yjjNzs6OF198kYyMDHbt2mXSftCgQdSuXfuOfaakpLB9+3aGDBnCjRs3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yRh6eHgQEhJS4hiW53fAktLS0tBoNEUeV3q7snyuzG3nzp14e3vTuHFjnn/+ea5du1Zi28o0vklJSfzyyy+MGjXqrm0rYnxv//t1t2fFF6c8n/m7kQJcQa5evUp+fn6xzx4u6bnDJT2r+E7PKbYEg8HAxIkT6dixY5F7b9+qcePGrFixgp9++omvvvoKg8HAQw89xMWLFy2eMSQkhFWrVrFp0yaWLl1KXFwcnTt35saNG8W2ryxjW2j9+vWkpqYyYsSIEtuoOb63KxynsoxheX4HLCU7O5vXX3+dp5566o433S/r58qcevXqxRdffMG2bduYO3cuu3btonfv3uTn5xfbvjKN7+eff46bm9tdD+lWxPgW9/erNM+Kv115PvN3U+VuRSnMb/z48Rw9evSu38106NDB+JQpgIceeoimTZuyfPly3nnnHYtm7N27t/F1ixYtCAkJoV69enz33Xel+le42v773//Su3fvOz7CTM3xrUr0ej1DhgxBURSWLl16x7Zqfq6GDh1qfB0cHEyLFi2oX78+O3fupHv37hZd971asWIF4eHhdz1JsCLGt7R/v9Qge8AVpFatWtjY2BQ5y+7WZxPfTqfTlam9JUyYMIENGzawY8eOMj9u0c7OjtatW3P69GkLpSuZp6cnjRo1KnHdlWFsC50/f56tW7fy3HPPlWk5Nce3cJzKMobl+R0wt8Lie/78eeNjR8vibp8rS7rvvvuoVatWieuuDOML8Ntvv3HixIkyf57B/ONb0t8vnU5nfFb8re7297iwTWmXuRspwBXE3t6etm3bsm3bNuM0g8HAtm3bTPZqbtWhQweT9lDwrOKS2puToihMmDCBdevWsX37doKCgsrcR35+PkeOHMHX19cCCe8sIyODM2fOlLhuNcf2ditXrsTb25u+ffuWaTk1xzcoKAidTmcyhunp6URHR5c4huX5HTCnwuJ76tQptm7dSs2aNcvcx90+V5Z08eJFrl27VuK61R7fQv/9739p27YtLVu2LPOy5hrfu/39atu2rfFZ8YVuf1b87crzmS9NUFFBvvnmG8XBwUFZtWqVcuzYMWXMmDGKp6enkpiYqCiKogwbNkx54403jO337Nmj2NraKvPnz1eOHz+uTJs2TbGzs1OOHDli8azPP/+84uHhoezcuVNJSEgw/mRlZRnb3J53xowZyubNm5UzZ84o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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "plot_histories(histories, labels)" ] @@ -451,10 +602,37 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 56, "id": "a6fd1e33-3620-4f3b-b705-a120f6da0027", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "100%|███████████████████████████████████████████████████████████████████████████| 500/500 [00:03<00:00, 139.04trial/s, best loss: 828.4029086137314]\n", + "New optimized step at iteration 1/20: 0.00907435949552582\n", + "New optimized step at iteration 2/20: 0.011738278731277103\n", + "New optimized step at iteration 3/20: 0.0045987583077511385\n", + "New optimized step at iteration 4/20: 0.006865748082507235\n", + "New optimized step at iteration 5/20: 0.004652263378626265\n", + "New optimized step at iteration 6/20: 0.013253085844944746\n", + "New optimized step at iteration 7/20: 0.006779022070699562\n", + "New optimized step at iteration 8/20: 0.009886240467319665\n", + "New optimized step at iteration 9/20: 0.006399824883327991\n", + "New optimized step at iteration 10/20: 0.008592611420682158\n", + "New optimized step at iteration 11/20: 0.005012857617086527\n", + "New optimized step at iteration 12/20: 0.009802882048096942\n", + "New optimized step at iteration 13/20: 0.004481771967686691\n", + "New optimized step at iteration 14/20: 0.0028229524490823166\n", + "New optimized step at iteration 15/20: 0.002088243586292965\n", + "New optimized step at iteration 16/20: 0.0017036454928744684\n", + "New optimized step at iteration 17/20: 0.002065064398286409\n", + "New optimized step at iteration 18/20: 0.004597776617771068\n", + "New optimized step at iteration 19/20: 0.004651169821329501\n" + ] + } + ], "source": [ "# restart\n", "dbf_2 = DoubleBracketIteration(hamiltonian=deepcopy(h), mode=iterationtype)\n", @@ -492,10 +670,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 57, "id": "0f0212bf-b642-4fea-9203-037876e0b266", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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+iuhSmITojrKupjE1c27i3R8NIcJEybg6OjIunXr6NWrF3Xr1mXAgAGsX7+eS5cu8eqrrxrKhoWF8cYbb/Dwww/j7u5Os2bN+Pjjj432AwwbNsywIA0UbYIePXo0Q4cO5c0338Tf3x8vLy9mz55NXl4eU6dOxdvbm+DgYJYvX2445vYm6NGjR6NSqYp8bd682RBL4btPOzs7vv76a+6//35cXFxo2LAhv//+u9G1+P3332nYsCEajYa7776br776CpVKRWpqarHXTlEUZs6cSd26dXFyciIoKIjnnnsOKBi2ev78eZ5//nlDbHrbt2+nR48eODs7ExISwnPPPcfNm7cWttFf50ceeYQ6deoQEhLC4sWL7/j/aAqSgK2QplACvn0oUmFPjAxD/xlb8XM8mZl5JZYVQhQvfvnPbKx/N9F9R7Gx/t1cWPaT2c6VkpLC33//zfjx43F2djbaFxAQwMiRI/nhhx+M5j945513aN26NTExMYbV3qKiooCCZl+A5cuXk5iYaHhdnI0bN5KQkMDWrVtZsGABM2bM4N5776VWrVpER0fz9NNP89RTT3Hx4sVij//ggw9ITEw0fE2aNAk/Pz+aNGlS4jnffvttHnroIQ4fPszAgQMZOXKk4Q4/Li6OBx98kKFDh3Lo0CGeeuopoz8+ivPLL7/w/vvvs3TpUk6dOsXq1asNqyv9+uuvBAcHM3v2bEOMAGfOnKF///488MADHD58mB9++IHt27czceJEo7r113nLli1MmzaNSZMmGa6zuVj1RBw1VVkTcL1QV/r28mPd5mRS07X8+PslRo8IrYoQhbBK2zvfT87lq2UqqwA6rRZtcqEmX52OI0+9xskZC1Hdts7rnTj516Z79K+lljt16hSKopS4zGnTpk25fv06V65cwc/PD4Bu3brx8ssvo9PpGDduHDExMbz//vv07dsXX19fALy8vO64eAwUTEr04Ycfolarady4MfPnzyczM5P//e9/QMEKb2+99Rbbt29nxIgRRY739PTE07NgBMavv/7K0qVLWb9+/R3P+8gjj/Dwww+jVqt58803+fDDD9mzZw/9+/dn6dKlNG7cmHfeeQeAxo0bc/ToUebOnVtifRcuXCAgIICIiAgcHByoW7cunTp1Mrw/Ozs73N3djWKaN28eI0eONCxT27BhQz788EN69erFkiVLDKsZdevW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ffv2RY5dv349ffr0oU6dOri7u/Poo49y7do1MjMzy3z+48ePExISYki+AM2aNcPLy4vjx48btoWFhRmSL0BgYCDJyckAtG7dmj59+tCyZUseeughPvvsM65fv172iyCEFZAELEQNk5GRweDBgzl48KDR16lTp+jZs6ehnKurq9Fx586d495776VVq1b88ssvxMTEsHjxYqCgk5apOTg4GL1WqVTodDoA7OzsiIqK4q+//qJZs2YsWrSIxo0bExcXZ/I4hDAXScBCVGOOjo7k5+cbbWvXrh2xsbGEhYXRoEEDo6/bk25hMTEx6HQ63nvvPe666y4aNWpEQkJCqee7XdOmTYmPjyc+Pt6w7dixY6SmptKsWbMyvzeVSkW3bt2YNWsWBw4cwNHRkVWrVpX5eCEsTRKwENVYWFgY0dHRnDt3jqtXr6LT6ZgwYQIpKSk8/PDD7N27lzNnzvD333/z+OOP3zF5NmjQAK1Wy6JFizh79izffPONoXNW4fNlZGSwYcMGrl69WmzTdEREBC1btmTkyJHs37+fPXv28Nhjj9GrVy86dOhQpvcVHR3Nm2++yb59+7hw4QK//vorV65coWnTpuW7QEJYkCRgIaqxF198ETs7O5o1a4avry8XLlwgKCiIHTt2kJ+fT2RkJC1btmTy5Ml4eXmhVpf8K6F169YsWLCAt99+mxYtWrBixQrmzZtnVKZr1648/fTT/Oc//8HX17dIJy4ouHP97bffqFWrFj179iQiIoJ69erxww8/lPl9eXh4sHXrVgYOHEijRo147bXXeO+99xgwYEDZL44QFqZSpN++EEIIUeXkDlgIIYSwAEnAQgghhAVIAhZCCCEsQBKwEEIIYQGSgIUQQggLkAQshBBCWIAkYCGEEMICJAELIYQQFiAJWAghhLAAScBCCCGEBUgCFkIIISxAErAQQghhAf8PFSClMfkyUTwAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "plot_histories(histories, labels)" ] @@ -510,31 +699,45 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 58, "id": "82b89092-07e5-4788-9ae0-8907df2428eb", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAacAAAGdCAYAAAC2DrxTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAzC0lEQVR4nO3dfXSUxb0H8O8mJJsgyUKAvKxsIIAFBRK8CDHFUpCUkFouEW4Llp4bQbFqoEJuq+YeAV+7iudUfKGhvXpBzzGi9BastEIxhXA8EizhRsDepgSDRCBBqWQhIZuXZ+4fMasLgZ3NM8nOs/l+PM857u5knnn2Sfw588z8xiaEECAiItJIRKgbQEREdCkGJyIi0g6DExERaYfBiYiItMPgRERE2mFwIiIi7TA4ERGRdhiciIhIO/1C3QAiIgpec3MzWlpalNQVHR2NmJgYJXWpwuBERGQxzc3NSEtLRl1dg5L6kpOTUVNTo1WAYnAiIrKYlpYW1NU14JNPn0N8fKypujyeixg5fCVaWloYnIiIyLz4+FjTwUlXDE5ERBYlRBuEaDNdh44YnIiILEqIdgjRbroOHXEqORERaYc9JyIiizJEGwyTw3Jmf76nMDgREVlUOD9z4rAeERFphz0nIiKL6pgQYbbnpOeECAYnIiKLEkYbhGEyOJn8+Z7CYT0iItIOe05ERFYl2joOs3VoiMGJiMiiOFuPiIioF7HnRERkVUYbYLSar0NDDE5ERBbVMawXaboOHXFYj4iItMOeExGRVRltgGGu58RhPSIiUiuMgxOH9YiISDvsORERWVa7gkW0zK1HREQK2Yw22AxzA2A2DusRERHJYc+JiMiqjDbAZM9J1wkRDE5ERFYVxsGJw3pERKQd9pyIiCzKJtpgEyYnRGiavojBiYjIqgwDMExOBTcMNW1RjMN6RESkHfaciIgsqmOdk810HTpicCIisiqjXcFsPT0zRHBYj4iItMOeExGRVRltgMlhPV3XOTE4ERFZlM1oV5Bbj8N6REREUrTrORmGgVOnTiEuLg42m8nuKhGRBoQQOH/+PJxOJyIiFPYJhIIJESK4ntPevXvx7LPPoqKiAqdPn8bWrVuRl5cHAGhtbcUjjzyCP/3pT/jkk0/gcDiQnZ2Np59+Gk6nM6jzaBecTp06BZfLFepmEBEpV1tbi2HDhimrz2YYpoflbEEuwm1sbERGRgaWLFmCefPm+X3W1NSEgwcPYtWqVcjIyMCXX36JBx54AP/6r/+KAwcOBHWeHgtO69evx7PPPou6ujpkZGTgxRdfxJQpUwL+XFxcHADg+InnER8fe9WyCQPvVdJWIiIzxsbOvern7aIVR5u3+/77ZmW5ubnIzc3t8jOHw4Fdu3b5vffSSy9hypQpOHHiBFJTU6XP0yPB6c0330RhYSE2bNiAzMxMrFu3Djk5OaiqqkJiYuJVf7ZzKC8+Phbx8f0DnInDfkQUepG2KKlyyh9VGO0KZut19Lw8Ho/f23a7HXa73VzdABoaGmCz2TBw4MCgfq5HJkT86le/wtKlS7F48WLccMMN2LBhA/r374///u//7onTERH1SR2z9cwfAOByueBwOHyH2+023b7m5mY89NBDuOOOOxAfHx/UzyrvObW0tKCiogJFRUW+9yIiIpCdnY19+/ZdVt7r9cLr9fpeXxq9iYio59XW1voFELO9ptbWVvzoRz+CEALFxcVB/7zyntMXX3yB9vZ2JCUl+b2flJSEurq6y8q73W6/aM3JEEREkox2NQeA+Ph4v8NMcOoMTJ9++il27doVdK8J0GCdU1FRERoaGnxHbW1tqJtERGQJKof1VOkMTEePHsV7772HwYMHd6se5cN6Q4YMQWRkJOrr6/3er6+vR3Jy8mXlVT10IyKinnfhwgVUV1f7XtfU1KCyshIJCQlISUnBv/3bv+HgwYPYvn072tvbfSNmCQkJiI6Olj6P8p5TdHQ0Jk2ahNLSUt97hmGgtLQUWVlZqk9HRNR3KRzWk3XgwAHceOONuPHGGwEAhYWFuPHGG7F69WqcPHkSf/jDH/DZZ59h4sSJSElJ8R0ffPBBUOfpkankhYWFyM/Px0033YQpU6Zg3bp1aGxsxOLFi3vidEREfZLNEEEvou2qjmBMnz4dQlz5Z672WTB6JDgtWLAAn3/+OVavXo26ujpMnDgRO3bsuGySxNV0LLC9+vz9GbF3B6xnv/Ge1Pmc/cZJlatu/KNUORmx0XIL0mw2uQ5uk/e4idZYh+z3JkP2uw3F74fOdP7dVfn7AQDeti8Dlvm46X8ClFDzH+y+pMcyRCxbtgzLli3rqeqJiMhoB8x1nLTdbFC73HpERCRJKAhOQSZ+7S0hn0pORER0KfaciIgsyiYM2IS53Ho2Ybbr1TMYnIiIrCqMnzlxWI+IiLTDnhMRkVUZhoItMzisR0REKjE46UlmgW1mRLZUXbU4LVWuv32EVDmZRYXXRk2QqiscFnbKLIy82HJCqq5QLOw8qfihsczvkc6LqmXvlcoFsaFYXAsA9n6DApa52HLebHPoEpYOTkREfZnNMGAz+f9NZtMf9RQGJyIiqzIMBbP19AxOnK1HRETaYc+JiMiqwrjnxOBERGRVYRycOKxHRETaYc+JiMiqRDsQ5GaBl9ehZ8+JwYmIyKLCeSo5h/WIiEg7lu45yWydLZv5wWWkSJU7KQ5LlZMhm/lh9DW3Ka3P6mQzJ8hkYRCSQxqyGRFkyfzuVmucIUI2W4PK7002M0hz61mpcjKZH7QXxhMiLB2ciIj6tDAOThzWIyIi7bDnRERkVYYw3/MxO9uvhzA4ERFZlSEUDOvpGZw4rEdERNphz4mIyKqUbDaoZ8+JwYmIyKrCODhxWI+IiLTDnhMRkVWF8YQISwcnmYwIMlkCAPnMDzdHzpIqtxsvBywjm/nhVNvHUuVkrlU2u4Jq10ZNCFimWnEWhlBdq4yTreoyjagmm/1BZV0ymSRkMz/ERA2WKheq7CBKCQMQJof1hJ7BicN6RESkHUv3nIiI+jShYFhP054TgxMRkVWF8TMnDusREZF22HMiIrKqMO45MTgREVmUMMzvsq7pLu0c1iMiIv2w50REZFUc1rMu1QsxZRbXAkB13pSAZUZv6/1t1WUXJcsuUJQls2A6HLajV7noVPZeyWz5Dsgv/A3FotOE/hkBy/yz6SOpupq85802xzoMKAhOKhqinvJhvUcffRQ2m83vGDt2rOrTEBFRGOuRntO4cePw3nvvfX2SfmHfQSMi6n1h3HPqkajRr18/JCcn90TVRETUSXx1mK1DQz0yW+/o0aNwOp0YOXIkFi1ahBMnrjyG7fV64fF4/A4iIurblAenzMxMbNq0CTt27EBxcTFqamrwne98B+fPd/2Q0u12w+Fw+A6Xy6W6SUREYUkYNiWHjpQHp9zcXPzwhz9Eeno6cnJy8Kc//Qnnzp3DW2+91WX5oqIiNDQ0+I7a2lrVTSIiCk+GokNDPT5TYeDAgfjWt76F6urqLj+32+2w2+093QwiIrKQHs8QceHCBRw7dgwpKSk9fSoior5F2ADD5GF2s8Ieojw4/fznP0dZWRmOHz+ODz74ALfffjsiIyNxxx13qD4VEVGfFopnTnv37sWcOXPgdDphs9mwbds2/zYJgdWrVyMlJQWxsbHIzs7G0aNHg7425cN6n332Ge644w6cPXsWQ4cOxS233ILy8nIMHTpU9amkVuPLbA8OyGcdkM1iIJP9YUbs3VJ11UaclionkwFA563LVd8DlZkkVGZ+kCV7r6oV31OZzBSyGUS8bV9KlZPJ/qD6HsjWZ7MF/n94nf+uVGtsbERGRgaWLFmCefPmXfb52rVr8cILL+DVV19FWloaVq1ahZycHPztb39DTEyM9HmUB6fNmzerrpKIiLrSOTRnqo7giufm5iI3N7fLz4QQWLduHR555BHMnTsXAPDaa68hKSkJ27Ztw8KFC6XPw6zkRERWJWxqDuCy9aZerzfo5tTU1KCurg7Z2dm+9xwOBzIzM7Fv376g6mJwIiIiuFwuvzWnbrc76Drq6uoAAElJSX7vJyUl+T6TxaR3REQWpWIRbefjw9raWsTHx/veD/USHwYnIiKrMiIUPHPqSK4XHx/vF5y6ozOnan19vd/yofr6ekycODGoujisR0RESqSlpSE5ORmlpaW+9zweD/bv34+srKyg6mLPiYjIqkIwW+/ChQt+GX9qampQWVmJhIQEpKamYsWKFXjyySdx3XXX+aaSO51O5OXlBXUeBiciIosSwgZhMsODCHLLjAMHDmDGjBm+14WFhQCA/Px8bNq0CQ8++CAaGxtxzz334Ny5c7jllluwY8eOoNY4AQxOREQUhOnTp0NcJaLZbDY8/vjjePzxx02dx9LBSWbltuqsA6faPpYqJ0M284PLkMtLeBKBM0SEA5X3VCarBqA284PunP3GBSzzycW9UnXZ+w2SKnexpestdbojVJkkQkLhhAjdWDo4ERH1ZcKAgqnkegYnztYjIiLtsOdERGRVQsFsPU23zGBwIiKyKDWz9fQMThzWIyIi7bDnRERkVUZEx2GqDjVNUY3BiYjIotQkfuWwHhERkRRL95xUbo0su7BTZgtrWbILQGUX194cOStgmd14Waou1WQWxKq+BzLfr8xCbiA0CztDtfBXZoHtyNhpUnWpXLQuS/X3pvMC7HCeEGHp4ERE1KeF8TMnDusREZF22HMiIrKocJ4QweBERGRR4fzMicN6RESkHfaciIisKownRDA4ERFZVDg/c+KwHhERaYc9JyIiiwrnCREMTkGSzUohk8VAZYYLQC77Q3XeFKm60t89I1VOZktvQC77g0wWCdm6QkVlJgnV24PHSm6Z/s+mjwKWUX0PdM6YoTWh4JmTnhvhcliPiIj0w54TEZFFhfOECAYnIiKLEsL8MyPBYT0iIiI57DkREVmVgmE9cFiPiIhUEiICQpgbABOajutxWI+IiLTDnhMRkVUZNvPDchzWIyIilZghgoImhJ6pfmUzPxzKTZQqN3uXmdb4O9l6WF1lIWKz9f5IuWzmh4ttX/ZwS7rv2qgJActUM0NEnxL0X9LevXsxZ84cOJ1O2Gw2bNu2ze9zIQRWr16NlJQUxMbGIjs7G0ePHlXVXiIi+krnIlyzh46CDk6NjY3IyMjA+vXru/x87dq1eOGFF7Bhwwbs378f11xzDXJyctDc3Gy6sURE9LXO2XpmDx0FPayXm5uL3NzcLj8TQmDdunV45JFHMHfuXADAa6+9hqSkJGzbtg0LFy4011oiIuoTlIbMmpoa1NXVITs72/eew+FAZmYm9u3b1+XPeL1eeDwev4OIiALjsJ6kuro6AEBSUpLf+0lJSb7PLuV2u+FwOHyHy+VS2SQiorDVOVvP7KGjkA82FhUVoaGhwXfU1taGuklERBRiSqeSJycnAwDq6+uRkpLie7++vh4TJ07s8mfsdjvsdrvKZhAR9QnhvM5Jac8pLS0NycnJKC0t9b3n8Xiwf/9+ZGVlqTwVEVGfJ4SCZ06aBqege04XLlxAdXW173VNTQ0qKyuRkJCA1NRUrFixAk8++SSuu+46pKWlYdWqVXA6ncjLy1PZbiIiCmNBB6cDBw5gxowZvteFhYUAgPz8fGzatAkPPvggGhsbcc899+DcuXO45ZZbsGPHDsTExKhrNXWbs984qXKymR92fO9zqXKjtwUuE4rsCqqpzAwSDpkfZJ1q+zjUTbCkcM5KHnRwmj59+lUvxmaz4fHHH8fjjz9uqmFERHR14bxNu/X/V5WIiMIOE78SEVlUOM/WY3AiIrKocA5OHNYjIiLtsOdERGRRwjA/oUHTrefYcyIisqpQ5NZrb2/HqlWrkJaWhtjYWIwaNQpPPPGE8inp7DkREZG0Z555BsXFxXj11Vcxbtw4HDhwAIsXL4bD4cDPfvYzZecJ++AUG52qtD6Z7aQBoLrxj0rPK2P0NbcFLKO6XTKLawFgRuzdAcvsvviy3DklrhOQW9ipctEsAFyU3Eo8IiIuYJl/Nn1ktjndIvM3I3udspq8xwOWkf1blv0blV34K9O2UFGzCDe4n//ggw8wd+5c3HZbx9/hiBEj8MYbb+DDDz801Y5LcViPiMiiDGFTcgC4bF89r9fb5Tm//e1vo7S0FP/4xz8AAB999BHef//9K25C211h33MiIqLALt1Lb82aNXj00UcvK/fwww/D4/Fg7NixiIyMRHt7O5566iksWrRIaXsYnIiIrErFTrZf/XxtbS3i4+N9b19pK6O33noLr7/+OkpKSjBu3DhUVlZixYoVcDqdyM/PN9eWb2BwIiKyKJWLcOPj4/2C05X84he/wMMPP4yFCxcCACZMmIBPP/0UbrdbaXDiMyciIpLW1NSEiAj/0BEZGQnDUDu5iD0nIiKLCkX6ojlz5uCpp55Camoqxo0bh//93//Fr371KyxZssRUOy7F4EREZFGhCE4vvvgiVq1ahfvvvx9nzpyB0+nET3/6U6xevdpUOy7F4ERERNLi4uKwbt06rFu3rkfPw+BERGRRhoiAYXIRrtmf7ylhH5xUr2SvlqwvFNkaZOqTza5wsvWwVDnZrdVlsj9U502Rqmv0tt7PviEroX+GVDmZ7A+yGRFk74FsNgzVfzMyVGalkP0bDQdCKNgJl1tmEBERyQn7nhMRUbgK580GGZyIiCwqnIMTh/WIiEg77DkREVnUN7OKm6lDRwxOREQWxWE9IiKiXsSeExGRRYVzz4nBiYjIovjMSVMyq8plV883eY+bbI0/ldkaZDNJ9LePUFaXajLXKpv5YUbs3VLlaiNOBywjmwnD2/alVDmZzA+A2owIqqlsm2yWC12zUgDAtVETApYJ1d9VOLN0cCIi6suEMD8sJ4SixijG4EREZFHh/MyJs/WIiEg77DkREVmUUDAhQteeE4MTEZFFcViPiIioF7HnRERkUeHcc2JwIiKyKC7CtTDZxbUyC1iDqU+G7MI91Vurh8Kpto+V1SWzuBYAXEZKwDKftO2Vqsveb5BUuYst56XK6Uxm4Xo4LK6VbdspyYX8pFbQ3/revXsxZ84cOJ1O2Gw2bNu2ze/zO++8Ezabze+YPXu2qvYSEdFXOof1zB46Crrn1NjYiIyMDCxZsgTz5s3rsszs2bOxceNG32u73d79FhIRUZc4rPcNubm5yM3NvWoZu92O5OTkbjeKiIj6th4ZTN2zZw8SExMxZswY3HfffTh79uwVy3q9Xng8Hr+DiIgCE7ApOXSkPDjNnj0br732GkpLS/HMM8+grKwMubm5aG9v77K82+2Gw+HwHS6XS3WTiIjCEp85BWHhwoW+f58wYQLS09MxatQo7NmzBzNnzrysfFFREQoLC32vPR4PAxQRUR/X41PJR44ciSFDhqC6urrL4GS32zlhgoioGzghwoTPPvsMZ8+eRUpK4DUnREQkjxkivuHChQuorq72va6pqUFlZSUSEhKQkJCAxx57DPPnz0dycjKOHTuGBx98EKNHj0ZOTo7ShhMRUfgKOjgdOHAAM2bM8L3ufF6Un5+P4uJiHDp0CK+++irOnTsHp9OJWbNm4YknnuiRoTvZLdhlCGEoq0s12cwPKr8P1VR+v7Lfh0z2h+/aF0jVJZuVoloy64DV75XM1uWA/PehkurvVuf/NhhQMKyn6Wy9oIPT9OnTIa6yr+/OnTtNNYiIiCjsc+sREYUrPnMiIiLtGLCZHpbTdVhP34FvIiLqs9hzIiKyKhUZHjisR0REKoXzIlwO6xERkXbYcyIisijO1iMiIu0YXx1m69CRpYOTs9+4gGVOSq7uvhiCleyx0alS5WTbJluf1XnbvpQqZ+83KGAZ2cwPLkMuN2R14CIA5H53q73HJWtTSybDQnXjH6XqGn3NbVLlZOuT0ST5vfW3j5Aqp3OGiHBm6eBERNSXcViPiIi0Ywjzs+2MK2ejCynO1iMiIu2w50REZFECNgiT6YfM/nxPYXAiIrIoLsIlIiL6ysmTJ/GTn/wEgwcPRmxsLCZMmIADBw4oPQd7TkREFtUxIcJ8HcH48ssvMXXqVMyYMQPvvvsuhg4diqNHj2LQoMBLN4LB4EREZFGheOb0zDPPwOVyYePGjb730tLSTLWhK5YOTioX7qkmsyBW9cJfmfpkF+rKbnUtu0BRpm0J/TOk6vpn00eS5zwfsIzsNuKyi2ur86ZIlRu9LfDvrupFotJbqyv8u1K5WFf137vsYt2+wuPx+L222+2w2+2XlfvDH/6AnJwc/PCHP0RZWRmuvfZa3H///Vi6dKnS9vCZExGRRXVOiDB7AIDL5YLD4fAdbre7y3N+8sknKC4uxnXXXYedO3fivvvuw89+9jO8+uqrSq/N0j0nIqK+TIiOw2wdAFBbW4v4+Hjf+131mgDAMAzcdNNN+OUvfwkAuPHGG3HkyBFs2LAB+fn55hrzDew5ERER4uPj/Y4rBaeUlBTccMMNfu9df/31OHFC7WMK9pyIiCxKwAajlydETJ06FVVVVX7v/eMf/8Dw4cNNteNSDE5ERBYVisSvK1euxLe//W388pe/xI9+9CN8+OGH+O1vf4vf/va3ptpxKQ7rERGRtMmTJ2Pr1q144403MH78eDzxxBNYt24dFi1apPQ87DkREVlUqNIX/eAHP8APfvADU+cNhMGJiMiixFeH2Tp0xGE9IiLSTtj3nGRX2ctsmw0AJ1sPS5XTddv3ULQLACIi4gKWkc38oHI7etlMGLK/HzKZHwBgRuzdAcvsvviyVF2yZLNhhCJbg0x9slu+y/6NygrV34yMcM5KHvbBiYgoXBlfHWbr0BGH9YiISDvsORERWVQo1jn1FgYnIiKLCudnThzWIyIi7bDnRERkUeG8zonBiYjIojisR0RE1IvYcyIisqhwXucU9sGpyXtcqly1ZDlZMpkpZNsmS2Ylu8rsCgAQ22+QVDmZ7A+ybQvFin3Z3w/ZjCQy2R+q86ZI1TV711CpcrJUZ3+QIXPvQ9Eu3YXzVPKghvXcbjcmT56MuLg4JCYmIi8v77JNp5qbm1FQUIDBgwdjwIABmD9/Purr65U2moiIwltQwamsrAwFBQUoLy/Hrl270NrailmzZqGxsdFXZuXKlXjnnXewZcsWlJWV4dSpU5g3b57yhhMR9XUCXw/tdfcIi9l6O3bs8Hu9adMmJCYmoqKiAtOmTUNDQwNeeeUVlJSU4NZbbwUAbNy4Eddffz3Ky8tx8803q2s5EVEfJ6BgWM/kNu89xdRsvYaGBgBAQkICAKCiogKtra3Izs72lRk7dixSU1Oxb9++Luvwer3weDx+BxER9W3dDk6GYWDFihWYOnUqxo8fDwCoq6tDdHQ0Bg4c6Fc2KSkJdXV1XdbjdrvhcDh8h8vl6m6TiIj6FEOoOXTU7eBUUFCAI0eOYPPmzaYaUFRUhIaGBt9RW1trqj4ior5CKDp01K2p5MuWLcP27duxd+9eDBs2zPd+cnIyWlpacO7cOb/eU319PZKTk7usy263w263d6cZREQUpoLqOQkhsGzZMmzduhV/+ctfkJaW5vf5pEmTEBUVhdLSUt97VVVVOHHiBLKystS0mIiIAHydvsjsoaOgek4FBQUoKSnB22+/jbi4ON9zJIfDgdjYWDgcDtx1110oLCxEQkIC4uPjsXz5cmRlZfW5mXoy23qrXvirkuzi2ottXyo7p+yW6ToTQt16e9nFtTu+97lUufR3z5hpDmmIGSK+UlxcDACYPn263/sbN27EnXfeCQB47rnnEBERgfnz58Pr9SInJwe//vWvlTSWiIj6hqCCkxCBH53FxMRg/fr1WL9+fbcbRUREgYVz+qKwz61HRBSuwnlYz/qD/EREFHbYcyIisighOg6zdeiIwYmIyKIM2GCYzI1n9ud7Cof1iIhIO+w5ERFZlIrceLrm1mNwIiKyKgXPnHRNrsfg1ENOth4OdRO6FIrMD7JUZlcIlWujJkiVq1a41bxs5odDuYlS5UZvO26iNd0TDtlBSC0GJyIiiwrnCREMTkREFhXOU8nZlyYiIu2w50REZFHhnL6IwYmIyKLCeSo5h/WIiEg77DkREVmUgPllSpp2nBiciIisqmNYz+RUck2jE4f1iIhIO+w5BSk2OlWq3EWJDAD97SOk6nL2GydV7pOLewOW+WfTR1J1qSbzvcl8Z7J1AXJZB2SzUshmMKhu/KNUudHX3KasLlmymR9mxN4dsEx5+59NtsZfk/d4wDKyfy8ydYWLcF7nxOBERGRR4TyVnMN6RESkHfaciIgsisN6RESkHQ7rERER9SIGJyIiixLi6xRG3T3MDOs9/fTTsNlsWLFihbJr6sRhPSIiiwplhoi//vWv+M1vfoP09HSTLegae05ERBSUCxcuYNGiRfiv//ovDBokt7t2sCzdcwrFwk6VZBeAyiyuBYCRsdMCllG9sFOW7H1QWZfMPZXeVl3x9xaq+yBDZoHtzZGzpOqqjTgtVU7ltvUyC5wB+Xsgs/g3VAt/VWYl93g8fu/b7XbY7fYuf6agoAC33XYbsrOz8eSTT5prwBWw50REZFGdU8nNHgDgcrngcDh8h9vt7vKcmzdvxsGDB6/4uSqW7jkREZEatbW1iI+P973uqtdUW1uLBx54ALt27UJMTEyPtofBiYjIolSuc4qPj/cLTl2pqKjAmTNn8C//8i++99rb27F371689NJL8Hq9iIyMNNmiDgxOREQW1ds74c6cOROHDx/2e2/x4sUYO3YsHnroIWWBCWBwIiIiSXFxcRg/frzfe9dccw0GDx582ftmMTgREVkUd8IlIiLt9PawXlf27NljroIr4FRyIiLSDntOREQWxS0zNCWzdbbKbdWDqU+Gt+1LqXL2fnLpQU61fWymOZah8p7KZiZQnXXA6mQzP7iMFKly1RJlnP3GydUleQ9k7+nJ1sOBC4UIt8z4itvtxuTJkxEXF4fExETk5eWhqqrKr8z06dNhs9n8jnvvvVdpo4mIKLwFFZzKyspQUFCA8vJy7Nq1C62trZg1axYaGxv9yi1duhSnT5/2HWvXrlXaaCIi+qrnZHbbjFBfxBUENay3Y8cOv9ebNm1CYmIiKioqMG3a10lH+/fvj+TkZDUtJCKiLoXzVHJTs/UaGhoAAAkJCX7vv/766xgyZAjGjx+PoqIiNDU1XbEOr9cLj8fjdxARUd/W7QkRhmFgxYoVmDp1qt/K4B//+McYPnw4nE4nDh06hIceeghVVVX4/e9/32U9brcbjz32WHebQUTUZwkFw3JhN1uvoKAAR44cwfvvv+/3/j333OP79wkTJiAlJQUzZ87EsWPHMGrUqMvqKSoqQmFhoe+1x+OBy+XqbrOIiPoMIRQM64VTcFq2bBm2b9+OvXv3YtiwYVctm5mZCQCorq7uMjhdbUMrIiLqm4IKTkIILF++HFu3bsWePXuQlpYW8GcqKysBACkpcusdiIhITjivcwoqOBUUFKCkpARvv/024uLiUFdXBwBwOByIjY3FsWPHUFJSgu9///sYPHgwDh06hJUrV2LatGlIT0/vkQsgIuqrOqaCmxuXM5tbr6fYhJAfcbTZbF2+v3HjRtx5552ora3FT37yExw5cgSNjY1wuVy4/fbb8cgjjwTcxKqTx+OBw+FAx0TCrs9nBQn9MwKW+WfTR73QEn+y2RWujZogVU42K0WT93jAMqqzeYSCykwSKrORAHIZVQC5e6Vadd6UgGVGb/uwF1rSUwQAAw0NDdL/Lbyazv9O5sX/FFG2aFN1tYoWbPP8RlnbVAl6WO9qXC4XysrKTDWIiIjkhPM6J0vn1iMi6stUZHjQdViPW2YQEZF22HMiIrIo8dU/ZuvQEYMTEZFFcViPiIioF7HnRERkUVyES0RE2hFCwTMnTZPrcViPiIi0E/Y9J9lV9rKr55tbz0qVk8n+oDoDgAzZ7ArVirMwyFyrzpkfZMlkfgDkMknI1qVaf/sIZXU5+42TKjd6W+BrnRF7t1Rd5e1/liqnc8YMWRzWIyIi7XBYj4iIqBex50REZFEd6WTN16EjBiciIosyhFCwZYae4YnDekREpB32nIiILIq59YiISDvhPJWcw3pERKQdS/ecVC5ilV1cGxM1WKpck/d8wDKyi07DYftymW3fQ7HwN1QLMU+2HlZan0oy16pyO3pZsotrb46cJVWuNuK03IklFhKHasG0AQUTIjisR0REKnG2HhERUS9iz4mIyKI4W4+IiLQTzs+cOKxHRETaYc+JiMiiwrnnxOBERGRR4fzMicN6RESkHfaciIgsSigY1tO15xT2wcnb9qVUOXu/QVLlhFCXiSocMj/IOtX2sbK6QvG9yW5drvOW3iqp3I5etj7ZbB6ymR9cRopUuf3Ge1LlQsGwGbDZzP03ydA0ux6H9YiISDth33MiIgpXBgRsnK1HREQ6EV9NJjdbh444rEdERNphcCIisqiOzQaFySM4brcbkydPRlxcHBITE5GXl4eqqirl18bgRERkUYbNUHIEo6ysDAUFBSgvL8euXbvQ2tqKWbNmobGxUem18ZkTERFJ27Fjh9/rTZs2ITExERUVFZg2bZqy8zA4ERFZlAEDNpMTGjrXOXk8Hr/37XY77HZ7wJ9vaGgAACQkJJhqx6U4rEdEZFGGon8AwOVyweFw+A632x34/IaBFStWYOrUqRg/frzSawuq51RcXIzi4mIcP34cADBu3DisXr0aubm5AIDm5mb8x3/8BzZv3gyv14ucnBz8+te/RlJSktJGd5LJ/iCb+UGWyqwDsivewyGThMrMCddGTZAqd0ri+5XN+KEyMwig972SIZsx42TrYWXnlP4d6jdOqphs5ofMiOyAZXbjZam6dFZbW4v4+Hjfa5leU0FBAY4cOYL3339feXuC6jkNGzYMTz/9NCoqKnDgwAHceuutmDt3Lj7+uCM1zcqVK/HOO+9gy5YtKCsrw6lTpzBv3jzljSYiIpiep/fN+Xrx8fF+R6DgtGzZMmzfvh27d+/GsGHDlF9bUD2nOXPm+L1+6qmnUFxcjPLycgwbNgyvvPIKSkpKcOuttwIANm7ciOuvvx7l5eW4+eab1bWaiIhCkltPCIHly5dj69at2LNnD9LS0kyd/0q6PSGivb0dW7ZsQWNjI7KyslBRUYHW1lZkZ3/dBR47dixSU1Oxb9++KwYnr9cLr9fre33pQzkiItJHQUEBSkpK8PbbbyMuLg51dXUAAIfDgdjYWGXnCXpCxOHDhzFgwADY7Xbce++92Lp1K2644QbU1dUhOjoaAwcO9CuflJTka3xX3G6330M4l8sV9EUQEfVFQsFkiGCX4RYXF6OhoQHTp09HSkqK73jzzTeVXlvQPacxY8agsrISDQ0N+N3vfof8/HyUlZV1uwFFRUUoLCz0vfZ4PAxQREQSBNohTE66FmgPrrzonUSxQQen6OhojB49GgAwadIk/PWvf8Xzzz+PBQsWoKWlBefOnfPrPdXX1yM5OfmK9cnOpScior7D9DonwzDg9XoxadIkREVFobS01PdZVVUVTpw4gaysLLOnISKiS6hc56SboHpORUVFyM3NRWpqKs6fP4+SkhLs2bMHO3fuhMPhwF133YXCwkIkJCQgPj4ey5cvR1ZWFmfqERH1gI69mMzO1guD/ZzOnDmDf//3f8fp06fhcDiQnp6OnTt34nvf+x4A4LnnnkNERATmz5/vtwi3O8bGzkWkLeqqZT5u+p+A9VxsOd+t8/eGvrKlt2qyW4RTz9H5d1f174fMAts249Wrfu7xNCFh4D2qmtQnBBWcXnnllat+HhMTg/Xr12P9+vWmGkVERIF1TIiwma5DR0z8SkRkUR3Pi3p3EW5vYeJXIiLSDntOREQW1b29bC+vQ0cMTkREFmWgHTD5zMnQ9JkTh/WIiEg77DkREVkUh/WIiEg7hlAwrCf0HNbTLjh1JhVsF60ypXu2MUREEjyepgCfXwTQe0lTw4F2wen8+Y6MDkebt4e4JUREcmSzP5w/fx4Oh0PZeTms14ucTidqa2sRFxcHm62ju9q5jcale9xbidWvwertB6x/DWx/6HX3GoQQOH/+PJxOp9L2dAQnc8NyDE6SIiIirrgffefe9lZm9WuwevsB618D2x963bkGlT2mvkC74ERERHKEMGCYza0n2HMiIiKFOobkzCZ+1TM4WWIRrt1ux5o1ayy9Y67Vr8Hq7Qesfw1sf+iFwzVYhU1wbiMRkaV4PB44HA44Ym6AzRZpqi4h2tHQ/Dc0NDRo9SyQw3pERBbV8cSJw3pERES9gj0nIiKL6phpx9l6RESkERVbrOu6TbslhvXWr1+PESNGICYmBpmZmfjwww9D3SQpjz76KGw2m98xduzYUDfrqvbu3Ys5c+bA6XTCZrNh27Ztfp8LIbB69WqkpKQgNjYW2dnZOHr0aGga24VA7b/zzjsvuyezZ88OTWO74Ha7MXnyZMTFxSExMRF5eXmoqqryK9Pc3IyCggIMHjwYAwYMwPz581FfXx+iFl9O5hqmT59+2X249957Q9Rif8XFxUhPT/cttM3KysK7777r+1z37z9caB+c3nzzTRQWFmLNmjU4ePAgMjIykJOTgzNnzoS6aVLGjRuH06dP+473338/1E26qsbGRmRkZGD9+vVdfr527Vq88MIL2LBhA/bv349rrrkGOTk5aG5u7uWWdi1Q+wFg9uzZfvfkjTfe6MUWXl1ZWRkKCgpQXl6OXbt2obW1FbNmzUJjY6OvzMqVK/HOO+9gy5YtKCsrw6lTpzBv3rwQttqfzDUAwNKlS/3uw9q1a0PUYn/Dhg3D008/jYqKChw4cAC33nor5s6di48//hiAXt+/EAJCGCYPTSdsC81NmTJFFBQU+F63t7cLp9Mp3G53CFslZ82aNSIjIyPUzeg2AGLr1q2+14ZhiOTkZPHss8/63jt37pyw2+3ijTfeCEELr+7S9gshRH5+vpg7d25I2tMdZ86cEQBEWVmZEKLj+46KihJbtmzxlfm///s/AUDs27cvVM28qkuvQQghvvvd74oHHnggdI0K0qBBg8TLL7+szfff0NAgAIjY6BGiv32kqSM2eoQAIBoaGnqt/TK07jm1tLSgoqIC2dnZvvciIiKQnZ2Nffv2hbBl8o4ePQqn04mRI0di0aJFOHHiRKib1G01NTWoq6vzux8OhwOZmZmWuR8AsGfPHiQmJmLMmDG47777cPbs2VA36YoaGhoAAAkJCQCAiooKtLa2+t2DsWPHIjU1Vdt7cOk1dHr99dcxZMgQjB8/HkVFRWhquvq2E6HQ3t6OzZs3o7GxEVlZWZb8/q1K6wkRX3zxBdrb25GUlOT3flJSEv7+97+HqFXyMjMzsWnTJowZMwanT5/GY489hu985zs4cuQI4uLiQt28oNXV1QFAl/ej8zPdzZ49G/PmzUNaWhqOHTuG//zP/0Rubi727duHyEhzixlVMwwDK1aswNSpUzF+/HgAHfcgOjoaAwcO9Cur6z3o6hoA4Mc//jGGDx8Op9OJQ4cO4aGHHkJVVRV+//vfh7C1Xzt8+DCysrLQ3NyMAQMGYOvWrbjhhhtQWVmp1fcvRDvM7mvH2Xp9UG5uru/f09PTkZmZieHDh+Ott97CXXfdFcKW9V0LFy70/fuECROQnp6OUaNGYc+ePZg5c2YIW3a5goICHDlyRPvnlFdzpWu4556v9z+aMGECUlJSMHPmTBw7dgyjRo3q7WZeZsyYMaisrERDQwN+97vfIT8/H2VlZaFu1mVUBBZdg5PWw3pDhgxBZGTkZTNh6uvrkZycHKJWdd/AgQPxrW99C9XV1aFuSrd0fufhcj8AYOTIkRgyZIh292TZsmXYvn07du/e7beFTHJyMlpaWnDu3Dm/8jregytdQ1cyMzMBQJv7EB0djdGjR2PSpElwu93IyMjA888/b6nv3+q0Dk7R0dGYNGkSSktLfe8ZhoHS0lJkZWWFsGXdc+HCBRw7dgwpKSmhbkq3pKWlITk52e9+eDwe7N+/35L3AwA+++wznD17Vpt7IoTAsmXLsHXrVvzlL39BWlqa3+eTJk1CVFSU3z2oqqrCiRMntLkHga6hK5WVlQCgzX24lGEY8Hq92n3/nTvhmj10pP2wXmFhIfLz83HTTTdhypQpWLduHRobG7F48eJQNy2gn//855gzZw6GDx+OU6dOYc2aNYiMjMQdd9wR6qZd0YULF/z+77WmpgaVlZVISEhAamoqVqxYgSeffBLXXXcd0tLSsGrVKjidTuTl5YWu0d9wtfYnJCTgsccew/z585GcnIxjx47hwQcfxOjRo5GTkxPCVn+toKAAJSUlePvttxEXF+d7juFwOBAbGwuHw4G77roLhYWFSEhIQHx8PJYvX46srCzcfPPNIW59h0DXcOzYMZSUlOD73/8+Bg8ejEOHDmHlypWYNm0a0tPTQ9x6oKioCLm5uUhNTcX58+dRUlKCPXv2YOfOndp9/+E8rKf9VHIhhHjxxRdFamqqiI6OFlOmTBHl5eWhbpKUBQsWiJSUFBEdHS2uvfZasWDBAlFdXR3qZl3V7t27BTqesPod+fn5QoiO6eSrVq0SSUlJwm63i5kzZ4qqqqrQNvobrtb+pqYmMWvWLDF06FARFRUlhg8fLpYuXSrq6upC3WyfrtoOQGzcuNFX5uLFi+L+++8XgwYNEv379xe33367OH36dOgafYlA13DixAkxbdo0kZCQIOx2uxg9erT4xS9+oc1U5iVLlojhw4eL6OhoMXToUDFz5kzx5z//2fe5Dt9/51TyqMgkEd0vxdQRFZmk5VRybplBRGQxnVtm9IscCpvN3NMZIQy0tX/OLTOIiEiNcJ5KrvWECCIi6pvYcyIisiwBmJ5tp+eTHQYnIiKLUrOfk57BicN6RESkHfaciIgsqmMBrcmeE4f1iIhILfPBSddnThzWIyIi7bDnRERkVQomREDTCREMTkREFhXOz5w4rEdERNphcCIisixD0RG89evXY8SIEYiJiUFmZiY+/PBDc5dyCQYnIiLLEh3PjMwc3RjWe/PNN1FYWIg1a9bg4MGDyMjIQE5ODs6cOaPsypiVnIjIYjqzkgP9YFPyzKktqKzkmZmZmDx5Ml566SUAHZsxulwuLF++HA8//LCp9nRiz4mIyLKE6X+C7Tm1tLSgoqIC2dnZvvciIiKQnZ2Nffv2KbsyztYjIrI0NYNfHo/H77Xdbofdbr+s3BdffIH29nYkJSX5vZ+UlIS///3vStoCsOdERGQ50dHRSE5OBtCu5BgwYABcLhccDofvcLvdvX1ZfthzIiKymJiYGNTU1KClpUVJfUII2Gz+z6666jUBwJAhQxAZGYn6+nq/9+vr678KmGowOBERWVBMTAxiYmJ6/bzR0dGYNGkSSktLkZeXB6BjQkRpaSmWLVum7DwMTkREFJTCwkLk5+fjpptuwpQpU7Bu3To0NjZi8eLFys7B4EREREFZsGABPv/8c6xevRp1dXWYOHEiduzYcdkkCTO4zomIiLTD2XpERKQdBiciItIOgxMREWmHwYmIiLTD4ERERNphcCIiIu0wOBERkXYYnIiISDsMTkREpB0GJyIi0g6DExERaYfBiYiItPP/iN3BNtmcJVIAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "visualize_matrix(dbf_1.h.matrix)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 59, "id": "ac8ed320-04a8-42af-a980-48ab4f1fff7c", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "visualize_matrix(dbf_2.h.matrix)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "685ca784", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { From 3185901bb4441fccd75a85a5a8d89aae5ba9fdc1 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Tue, 28 Nov 2023 23:20:48 +0100 Subject: [PATCH 091/143] hyperopt as qibo dep --- poetry.lock | 23 +---------------------- pyproject.toml | 3 +-- 2 files changed, 2 insertions(+), 24 deletions(-) diff --git a/poetry.lock b/poetry.lock index 618664ceb6..8b42c368d6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -4114,27 +4114,6 @@ files = [ numpy = "*" scipy = "*" -[[package]] -name = "seaborn" -version = "0.13.0" -description = "Statistical data visualization" -optional = false -python-versions = ">=3.8" -files = [ - {file = "seaborn-0.13.0-py3-none-any.whl", hash = "sha256:70d740828c48de0f402bb17234e475eda687e3c65f4383ea25d0cc4728f7772e"}, - {file = "seaborn-0.13.0.tar.gz", hash = "sha256:0e76abd2ec291c655b516703c6a022f0fd5afed26c8e714e8baef48150f73598"}, -] - -[package.dependencies] -matplotlib = ">=3.3,<3.6.1 || >3.6.1" -numpy = ">=1.20,<1.24.0 || >1.24.0" -pandas = ">=1.2" - -[package.extras] -dev = ["flake8", "flit", "mypy", "pandas-stubs", "pre-commit", "pytest", "pytest-cov", "pytest-xdist"] -docs = ["ipykernel", "nbconvert", "numpydoc", "pydata_sphinx_theme (==0.10.0rc2)", "pyyaml", "sphinx (<6.0.0)", "sphinx-copybutton", "sphinx-design", "sphinx-issues"] -stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] - [[package]] name = "setuptools" version = "69.0.2" @@ -4942,4 +4921,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "f2a30ac62bad1f17dae11f3fd4c0e51c417cb225a92978ea6ffa8dac3ecc6922" +content-hash = "ff53a287bc359a3fef1c4471e8c6970a9e84f188e75c2b799a90c865571f42e1" diff --git a/pyproject.toml b/pyproject.toml index 3dd5d2061a..899c85cf2b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,6 +26,7 @@ scipy = "^1.10.1" sympy = "^1.11.1" cma = "^3.3.0" joblib = "^1.2.0" +hyperopt = "^0.2.7" matplotlib = "^3.7.0" psutil = "^5.9.4" tabulate = "^0.9.0" @@ -62,8 +63,6 @@ scikit-learn = "^1.2.1" dill = "^0.3.6" pytest-cov = "^4.0.0" pylint = "^2.16.2" -hyperopt = "^0.2.6" -seaborn = "^0.13.0" qibojit = { git = "https://github.com/qiboteam/qibojit.git" } tensorflow = { version = "^2.12.0", markers = "sys_platform == 'linux' or sys_platform == 'darwin'" } # TODO: the marker is a temporary solution due to the lack of the tensorflow-io 0.32.0's wheels for Windows, this package is one of From ddc7fb86f1fb4255acdb4d5f7a5478cd388f7210 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Tue, 28 Nov 2023 23:34:21 +0100 Subject: [PATCH 092/143] remove hyperopt try --- src/qibo/models/dbi/double_bracket.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/qibo/models/dbi/double_bracket.py b/src/qibo/models/dbi/double_bracket.py index 2291cb8d57..fb05fdad18 100644 --- a/src/qibo/models/dbi/double_bracket.py +++ b/src/qibo/models/dbi/double_bracket.py @@ -2,6 +2,7 @@ from enum import Enum, auto from functools import partial +import hyperopt import numpy as np from qibo.config import raise_error @@ -139,13 +140,6 @@ def hyperopt_step( Returns: (float): optimized best iteration step. """ - try: - import hyperopt - except: # pragma: no cover - raise_error( - ImportError, "hyperopt_step function requires hyperopt to be installed." - ) - if space is None: space = hyperopt.hp.uniform if optimizer is None: From 2d48cf322d8370bd180fe45e2ca89a3d5b714f81 Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Wed, 29 Nov 2023 10:53:42 +0400 Subject: [PATCH 093/143] change qibojit branch --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index eb8ec3c736..6cd29de6e9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,7 +62,7 @@ scikit-learn = "^1.2.1" dill = "^0.3.6" pytest-cov = "^4.0.0" pylint = "^2.16.2" -qibojit = { git = "https://github.com/qiboteam/qibojit.git" } +qibojit = { git = "https://github.com/qiboteam/qibojit.git@controlled_y" } tensorflow = { version = "^2.12.0", markers = "sys_platform == 'linux' or sys_platform == 'darwin'" } # TODO: the marker is a temporary solution due to the lack of the tensorflow-io 0.32.0's wheels for Windows, this package is one of # the tensorflow requirements From ea34649cdc150295569516c5b9937e4d31564b1d Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Wed, 29 Nov 2023 11:15:08 +0400 Subject: [PATCH 094/143] undo --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 6cd29de6e9..eb8ec3c736 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,7 +62,7 @@ scikit-learn = "^1.2.1" dill = "^0.3.6" pytest-cov = "^4.0.0" pylint = "^2.16.2" -qibojit = { git = "https://github.com/qiboteam/qibojit.git@controlled_y" } +qibojit = { git = "https://github.com/qiboteam/qibojit.git" } tensorflow = { version = "^2.12.0", markers = "sys_platform == 'linux' or sys_platform == 'darwin'" } # TODO: the marker is a temporary solution due to the lack of the tensorflow-io 0.32.0's wheels for Windows, this package is one of # the tensorflow requirements From feec472632f05bcba9fab82cb329e3b6018d8fe9 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Wed, 29 Nov 2023 09:48:26 +0100 Subject: [PATCH 095/143] add note on in-place updating --- doc/source/getting-started/backends.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/source/getting-started/backends.rst b/doc/source/getting-started/backends.rst index a4d5c73334..0b0fa5a3f9 100644 --- a/doc/source/getting-started/backends.rst +++ b/doc/source/getting-started/backends.rst @@ -50,6 +50,13 @@ be controlled using the ``QIBO_LOG_LEVEL`` environment variable. This can be set to 3 to hide info messages or 4 to hide both info and warning messages. The default value is 1 allowing all messages to appear. +.. note:: + The `qibojit` backend implements in-place updating of states and unitaries. This + implies a target initial state is modified at runtime, in order to save + memory. In the case of algorithms in which the initial state is used several times, or + it is necessary to be maintain it over time (such as in quantum machine learning applications) + it is advisable to save a copy of the states. + .. _hardware-backends: From aa305d502218032eef566f6d55f175d19d582562 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Wed, 29 Nov 2023 12:55:36 +0400 Subject: [PATCH 096/143] bugfix to measurementoutcomes --- src/qibo/result.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/qibo/result.py b/src/qibo/result.py index 2ae7fb498e..468a6c4adc 100644 --- a/src/qibo/result.py +++ b/src/qibo/result.py @@ -154,6 +154,9 @@ def __init__( self._measurement_gate = None self._probs = probabilities self._samples = samples + if samples is not None: + for m in measurements: + m.result.register_samples(samples[:, m.qubits]) self._frequencies = None self._repeated_execution_frequencies = None From 4cf4b00261c0b8b817f57f9dbc16b8522060d9db Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Wed, 29 Nov 2023 10:03:06 +0100 Subject: [PATCH 097/143] fix dbi docstrings example --- src/qibo/models/dbi/double_bracket.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibo/models/dbi/double_bracket.py b/src/qibo/models/dbi/double_bracket.py index fb05fdad18..7a336b1450 100644 --- a/src/qibo/models/dbi/double_bracket.py +++ b/src/qibo/models/dbi/double_bracket.py @@ -34,7 +34,7 @@ class DoubleBracketIteration: .. testcode:: import numpy as np - from qibo.models.double_bracket import DoubleBracketIteration, DoubleBracketGeneratorType + from qibo.models.dbi.double_bracket import DoubleBracketIteration, DoubleBracketGeneratorType from qibo.quantum_info import random_hermitian nqubits = 4 From 684c6bc2a3446f1cc27f32fe640caca52659e847 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Wed, 29 Nov 2023 13:13:55 +0400 Subject: [PATCH 098/143] fix m qubits --- src/qibo/result.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/qibo/result.py b/src/qibo/result.py index 468a6c4adc..f051698960 100644 --- a/src/qibo/result.py +++ b/src/qibo/result.py @@ -156,7 +156,8 @@ def __init__( self._samples = samples if samples is not None: for m in measurements: - m.result.register_samples(samples[:, m.qubits]) + indices = [self.measurement_gate.qubits.index(q) for q in m.qubits] + m.result.register_samples(samples[:, indices]) self._frequencies = None self._repeated_execution_frequencies = None From 5046e3b664f9fc4497363e97161e43cf1a0eff23 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Wed, 29 Nov 2023 11:06:26 +0100 Subject: [PATCH 099/143] add Hamiltonian import in docstrings --- src/qibo/models/dbi/double_bracket.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/qibo/models/dbi/double_bracket.py b/src/qibo/models/dbi/double_bracket.py index 7a336b1450..9b7beedbba 100644 --- a/src/qibo/models/dbi/double_bracket.py +++ b/src/qibo/models/dbi/double_bracket.py @@ -35,6 +35,7 @@ class DoubleBracketIteration: import numpy as np from qibo.models.dbi.double_bracket import DoubleBracketIteration, DoubleBracketGeneratorType + from qibo.hamiltonians import Hamiltonian from qibo.quantum_info import random_hermitian nqubits = 4 From 12751a6b2a4eec18aa1276ebf51d3eea1387aa03 Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Wed, 29 Nov 2023 10:13:40 +0000 Subject: [PATCH 100/143] Update tests/test_gates_abstract.py Co-authored-by: BrunoLiegiBastonLiegi <45011234+BrunoLiegiBastonLiegi@users.noreply.github.com> --- tests/test_gates_abstract.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_gates_abstract.py b/tests/test_gates_abstract.py index 708a9046da..05c4b9a92b 100644 --- a/tests/test_gates_abstract.py +++ b/tests/test_gates_abstract.py @@ -232,7 +232,7 @@ def test_cnot_and_cy_and_cz_init(): gate = gates.CNOT(0, 1) assert gate.target_qubits == (1,) assert gate.control_qubits == (0,) - gate = gates.CZ(4, 7) + gate = gates.CY(4, 7) assert gate.target_qubits == (7,) assert gate.control_qubits == (4,) gate = gates.CZ(3, 2) From 81e9df4fd84fbec18123eb91cdda20e3e3937211 Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Wed, 29 Nov 2023 14:32:39 +0400 Subject: [PATCH 101/143] error --- src/qibo/models/circuit.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/qibo/models/circuit.py b/src/qibo/models/circuit.py index 8a2a1aa6e5..b59951869e 100644 --- a/src/qibo/models/circuit.py +++ b/src/qibo/models/circuit.py @@ -944,7 +944,12 @@ def unitary(self, backend=None): fgate = gates.FusedGate(*range(self.nqubits)) for gate in self.queue: - if not isinstance(gate, (gates.SpecialGate, gates.M)): + if isinstance(gate, gates.Channel): + raise_error( + NotImplementedError, + "`unitary` method not implemented for circuits that contain noise channels." + ) + elif not isinstance(gate, (gates.SpecialGate, gates.M)): fgate.append(gate) return fgate.matrix(backend) From 1f6d28a07e594527280c9c27c1396b3fb75f961b Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Wed, 29 Nov 2023 14:32:45 +0400 Subject: [PATCH 102/143] test --- tests/test_models_circuit_features.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/test_models_circuit_features.py b/tests/test_models_circuit_features.py index 99b45b74c7..ee3030025c 100644 --- a/tests/test_models_circuit_features.py +++ b/tests/test_models_circuit_features.py @@ -45,6 +45,15 @@ def test_circuit_unitary_bigger(backend, with_measurement): backend.assert_allclose(final_matrix, target_matrix) +def test_circuit_unitary_with_noise_channel(backend): + circuit = Circuit(2) + circuit.add(gates.H(0)) + circuit.add(gates.CNOT(0, 1)) + circuit.add(gates.DepolarizingChannel([0, 1], 0.2)) + with pytest.raises(NotImplementedError): + circuit.unitary(backend) + + @pytest.mark.parametrize("compile", [False, True]) def test_circuit_vs_gate_execution(backend, compile): """Check consistency between executing circuit and stand alone gates.""" From 461c3ffc7ad9778d0f8267f95f534c9ba39edca7 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:34:55 +0000 Subject: [PATCH 103/143] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/qibo/models/circuit.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibo/models/circuit.py b/src/qibo/models/circuit.py index b59951869e..45809e0528 100644 --- a/src/qibo/models/circuit.py +++ b/src/qibo/models/circuit.py @@ -946,8 +946,8 @@ def unitary(self, backend=None): for gate in self.queue: if isinstance(gate, gates.Channel): raise_error( - NotImplementedError, - "`unitary` method not implemented for circuits that contain noise channels." + NotImplementedError, + "`unitary` method not implemented for circuits that contain noise channels.", ) elif not isinstance(gate, (gates.SpecialGate, gates.M)): fgate.append(gate) From ddc5fbe66eb81fb0f4b8654c8528ffeceb9e3090 Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Wed, 29 Nov 2023 14:49:49 +0400 Subject: [PATCH 104/143] invert --- src/qibo/models/circuit.py | 7 ++++++- tests/test_models_circuit_features.py | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/qibo/models/circuit.py b/src/qibo/models/circuit.py index 45809e0528..6d515cf715 100644 --- a/src/qibo/models/circuit.py +++ b/src/qibo/models/circuit.py @@ -405,7 +405,12 @@ def invert(self): measurements = [] new_circuit = self.__class__(**self.init_kwargs) for gate in self.queue[::-1]: - if isinstance(gate, gates.M) and skip_measurements: + if isinstance(gate, gates.Channel): + raise_error( + NotImplementedError, + "`invert` method not implemented for circuits that contain noise channels." + ) + elif isinstance(gate, gates.M) and skip_measurements: measurements.append(gate) else: new_gate = gate.dagger() diff --git a/tests/test_models_circuit_features.py b/tests/test_models_circuit_features.py index ee3030025c..8944b25b6a 100644 --- a/tests/test_models_circuit_features.py +++ b/tests/test_models_circuit_features.py @@ -45,13 +45,15 @@ def test_circuit_unitary_bigger(backend, with_measurement): backend.assert_allclose(final_matrix, target_matrix) -def test_circuit_unitary_with_noise_channel(backend): +def test_circuit_unitary_and_inverse_with_noise_channel(backend): circuit = Circuit(2) circuit.add(gates.H(0)) circuit.add(gates.CNOT(0, 1)) circuit.add(gates.DepolarizingChannel([0, 1], 0.2)) with pytest.raises(NotImplementedError): circuit.unitary(backend) + with pytest.raises(NotImplementedError): + circuit.invert() @pytest.mark.parametrize("compile", [False, True]) From efdf7cf3c8c4ea1a3244be98fd4e05fb6f3bd2cd Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:50:13 +0000 Subject: [PATCH 105/143] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/qibo/models/circuit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibo/models/circuit.py b/src/qibo/models/circuit.py index 6d515cf715..bd92eadfbb 100644 --- a/src/qibo/models/circuit.py +++ b/src/qibo/models/circuit.py @@ -408,7 +408,7 @@ def invert(self): if isinstance(gate, gates.Channel): raise_error( NotImplementedError, - "`invert` method not implemented for circuits that contain noise channels." + "`invert` method not implemented for circuits that contain noise channels.", ) elif isinstance(gate, gates.M) and skip_measurements: measurements.append(gate) From 3e6cfbe8fa5d62832921289709bb504cfeb521b9 Mon Sep 17 00:00:00 2001 From: Matteo Robbiati <62071516+MatteoRobbiati@users.noreply.github.com> Date: Wed, 29 Nov 2023 11:51:41 +0100 Subject: [PATCH 106/143] Update doc/source/getting-started/backends.rst Co-authored-by: Andrea Pasquale --- doc/source/getting-started/backends.rst | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/doc/source/getting-started/backends.rst b/doc/source/getting-started/backends.rst index 0b0fa5a3f9..1831945e29 100644 --- a/doc/source/getting-started/backends.rst +++ b/doc/source/getting-started/backends.rst @@ -51,11 +51,10 @@ to 3 to hide info messages or 4 to hide both info and warning messages. The default value is 1 allowing all messages to appear. .. note:: - The `qibojit` backend implements in-place updating of states and unitaries. This - implies a target initial state is modified at runtime, in order to save - memory. In the case of algorithms in which the initial state is used several times, or - it is necessary to be maintain it over time (such as in quantum machine learning applications) - it is advisable to save a copy of the states. + The `qibojit` backend implements in-place updates. This + implies that the initial state is modified at runtime without performing any copies to save memory. + For algorithms that require access to the initial state after its modification, such as quantum machine learning applications, + it is suggested to perform a copy of the state explicitly. .. _hardware-backends: From 8d5ac8636caa594ca80ac403119be99506a94997 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Wed, 29 Nov 2023 17:57:05 +0400 Subject: [PATCH 107/143] test fix --- doc/PARAMS_3_1_2_10_128_0.5 | 1 + doc/discriminator_3_1_2_10_128_0.5.h5 | Bin 0 -> 138320 bytes doc/dloss_3_1_2_10_128_0.5 | 1 + doc/final_result.npy | Bin 0 -> 867 bytes doc/gloss_3_1_2_10_128_0.5 | 1 + tests/test_models_circuit_noise.py | 3 ++- 6 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 doc/PARAMS_3_1_2_10_128_0.5 create mode 100644 doc/discriminator_3_1_2_10_128_0.5.h5 create mode 100644 doc/dloss_3_1_2_10_128_0.5 create mode 100644 doc/final_result.npy create mode 100644 doc/gloss_3_1_2_10_128_0.5 diff --git a/doc/PARAMS_3_1_2_10_128_0.5 b/doc/PARAMS_3_1_2_10_128_0.5 new file mode 100644 index 0000000000..e68c5bdfc9 --- /dev/null +++ b/doc/PARAMS_3_1_2_10_128_0.5 @@ -0,0 +1 @@ + (4.994912112732138171e-02+9.418121111638397584e-05j) (5.180142132279400013e-02+3.769011843110463126e-05j) (-8.686309694928717740e-02+1.941183532763723625e-04j) (-1.105944692500888393e-01+2.645326248329088744e-07j) (-5.542334970543079387e-02+3.274820913496483788e-05j) (-4.027862705976539143e-02+2.392865446812856490e-05j) (2.106825199442287008e-02+1.943378732435513553e-04j) (-1.769190303032677769e-02+1.734794147923133028e-07j) (1.471639701725659666e-01-2.976629519940117681e-06j) (-1.200668979036512846e-01-4.669680138270385729e-06j) (-8.734495032865612074e-02+1.943494698521335375e-04j) (-1.008795034944924562e-01+2.800673451340498426e-07j) (4.658285976862307221e-02+1.723439726488679768e-07j) (-7.469286147996040404e-02-2.596128048879650181e-06j) (-1.013250068038424462e-02+1.940249979094796839e-04j) (-7.594468430732603803e-02+4.008621917749859240e-07j) (-1.023521861883869566e-01+5.885601253640344434e-06j) (-1.168733138592530363e-01-1.533238638207218911e-05j) (4.689694652356364568e-02+1.943819508749733860e-04j) (-1.078174705602997080e-01+1.698247997671202053e-08j) (-9.106749560982799196e-02-2.354349356197422153e-06j) (-3.937038407850788901e-02-4.792718530305748191e-05j) (9.629752535724159235e-02+1.943838644096303127e-04j) (-1.201419732293144554e-01+1.875684109060295472e-08j) (1.013837169309824982e-01+3.617505627822942659e-07j) (-1.211698539337111163e-01+9.221081765446366172e-07j) (1.429374995885031585e-01-2.510820557233144643e-06j) (-9.406046664650112230e-03-1.039197067497288586e-05j) (1.430281367405899229e-01+2.587127678721943757e-07j) (3.145287078407894149e-02+1.070676035088050100e-06j) (7.204219279383526631e-02+2.972290802208485421e-05j) (-1.376355964641233776e-01+2.093247521324807445e-05j) (-6.842259033927226841e-02+6.825104918730110404e-05j) (-1.146686756098604099e-01+4.408431434619744047e-08j) (-6.089431250325724743e-02-7.930786232748562379e-06j) (-1.137755410371067560e-01-5.619196786647761153e-06j) (-5.133814077305263318e-02+6.426128262453594196e-06j) (-2.499345760043653053e-02+4.145837480945978812e-09j) (-1.312139830045656319e-01-1.916702293239434943e-08j) (5.706142532105148296e-02-3.660560909436972219e-09j) (2.306394192533901821e-02+5.912369791694162052e-04j) (-6.965551527113579555e-02+4.220181688087816687e-07j) (6.516732017530476977e-03+1.334756027348252005e-05j) (-1.224980498083073355e-01+2.553954446398025603e-06j) (2.604876666646196992e-02+6.610937812134409092e-05j) (1.295165032511322589e-01+4.269783775867569193e-08j) (-5.442669440352965182e-02-1.721676508581374999e-05j) (5.023411230151890450e-02-7.157001619507187540e-05j) (-1.071937516329138501e-01+8.603311406079036162e-06j) (6.562580528022762816e-02+5.550500541567079752e-09j) (-6.317533059052141131e-02-1.353328409729301570e-05j) (-9.503072843565812944e-02-5.615114456623808171e-05j) (2.921865688513183151e-02+6.675743505148365995e-05j) (-1.432400921668174343e-01+4.311734510059308591e-08j) (9.866347971933400740e-02+4.802329438822947581e-07j) (-1.486384992844333175e-01+1.217224799556047518e-06j) (5.334492217180443474e-02-1.840412446395094739e-06j) (-6.899776891914767563e-02-7.616919420848380162e-06j) (7.055902622598608787e-02+1.384298404260701238e-07j) (1.386599553524150430e-01+5.728702188826347121e-07j) (-7.510352837047860886e-02-2.163769782706200049e-05j) (2.345915160841707814e-02-1.445395426898316272e-05j) (2.715441459276853042e-02-7.575319668783595163e-06j) (2.099534280295703437e-02-1.446727165535793680e-06j) (-8.307063596867625410e-02-3.702441264451360062e-05j) (1.358462805061934620e-01-1.565316489237969771e-04j) diff --git a/doc/discriminator_3_1_2_10_128_0.5.h5 b/doc/discriminator_3_1_2_10_128_0.5.h5 new file mode 100644 index 0000000000000000000000000000000000000000..6bd4bc55c8513f18ad5c915b785cd7e74dc2779b GIT binary patch literal 138320 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 b^u75ry2E(<+j#v!To9gHJC6S!z0deRFq^vg literal 0 HcmV?d00001 diff --git a/doc/dloss_3_1_2_10_128_0.5 b/doc/dloss_3_1_2_10_128_0.5 new file mode 100644 index 0000000000..9714135bd9 --- /dev/null +++ b/doc/dloss_3_1_2_10_128_0.5 @@ -0,0 +1 @@ +6.923972368240356445e-01 diff --git a/doc/final_result.npy b/doc/final_result.npy new file mode 100644 index 0000000000000000000000000000000000000000..53a29fba2559fe528fee35056d37118719014175 GIT binary patch literal 867 zcmbtS%Wl&^6m^=k1=I3=KaF`ffnbs@P*ounDH02!rpOYKDT=HaXM(NT9^aX9qbQBU zCMsF;lPviIxVDo;RdvN(T>GALJi6zMfAzlXeg0a}jL*#8j%}X{X2)5iLLvki>z-gfPoxr=uXNB# zm7WYr7AjqB1}mKkh3W~^99XS)D~*L{pvEcFVa;99G;Mzy*5^M@;DQ4e>)onbLF^dx zUa$A*FILgIy9zGRc^@{WuvvFEP!cmDGr?k(C<&MQaK#-XIx!OxGjqo<7rfat%rFU+ zN5prD__tQmX!n=k;b;L*rU-coC#F2eXsAw!JwGBcN6fwaKuTm-@a9229+>?pTqW)% zE|3aN2@RuAg-pUVU$I1TF^u@gPRA Date: Wed, 29 Nov 2023 17:58:06 +0400 Subject: [PATCH 108/143] remove unwanted files --- doc/PARAMS_3_1_2_10_128_0.5 | 1 - doc/discriminator_3_1_2_10_128_0.5.h5 | Bin 138320 -> 0 bytes doc/dloss_3_1_2_10_128_0.5 | 1 - doc/final_result.npy | Bin 867 -> 0 bytes doc/gloss_3_1_2_10_128_0.5 | 1 - 5 files changed, 3 deletions(-) delete mode 100644 doc/PARAMS_3_1_2_10_128_0.5 delete mode 100644 doc/discriminator_3_1_2_10_128_0.5.h5 delete mode 100644 doc/dloss_3_1_2_10_128_0.5 delete mode 100644 doc/final_result.npy delete mode 100644 doc/gloss_3_1_2_10_128_0.5 diff --git a/doc/PARAMS_3_1_2_10_128_0.5 b/doc/PARAMS_3_1_2_10_128_0.5 deleted file mode 100644 index e68c5bdfc9..0000000000 --- a/doc/PARAMS_3_1_2_10_128_0.5 +++ /dev/null @@ -1 +0,0 @@ - (4.994912112732138171e-02+9.418121111638397584e-05j) (5.180142132279400013e-02+3.769011843110463126e-05j) (-8.686309694928717740e-02+1.941183532763723625e-04j) (-1.105944692500888393e-01+2.645326248329088744e-07j) (-5.542334970543079387e-02+3.274820913496483788e-05j) (-4.027862705976539143e-02+2.392865446812856490e-05j) (2.106825199442287008e-02+1.943378732435513553e-04j) (-1.769190303032677769e-02+1.734794147923133028e-07j) (1.471639701725659666e-01-2.976629519940117681e-06j) (-1.200668979036512846e-01-4.669680138270385729e-06j) (-8.734495032865612074e-02+1.943494698521335375e-04j) (-1.008795034944924562e-01+2.800673451340498426e-07j) (4.658285976862307221e-02+1.723439726488679768e-07j) (-7.469286147996040404e-02-2.596128048879650181e-06j) (-1.013250068038424462e-02+1.940249979094796839e-04j) (-7.594468430732603803e-02+4.008621917749859240e-07j) (-1.023521861883869566e-01+5.885601253640344434e-06j) (-1.168733138592530363e-01-1.533238638207218911e-05j) (4.689694652356364568e-02+1.943819508749733860e-04j) (-1.078174705602997080e-01+1.698247997671202053e-08j) (-9.106749560982799196e-02-2.354349356197422153e-06j) (-3.937038407850788901e-02-4.792718530305748191e-05j) (9.629752535724159235e-02+1.943838644096303127e-04j) (-1.201419732293144554e-01+1.875684109060295472e-08j) (1.013837169309824982e-01+3.617505627822942659e-07j) (-1.211698539337111163e-01+9.221081765446366172e-07j) (1.429374995885031585e-01-2.510820557233144643e-06j) (-9.406046664650112230e-03-1.039197067497288586e-05j) (1.430281367405899229e-01+2.587127678721943757e-07j) (3.145287078407894149e-02+1.070676035088050100e-06j) (7.204219279383526631e-02+2.972290802208485421e-05j) (-1.376355964641233776e-01+2.093247521324807445e-05j) (-6.842259033927226841e-02+6.825104918730110404e-05j) (-1.146686756098604099e-01+4.408431434619744047e-08j) (-6.089431250325724743e-02-7.930786232748562379e-06j) (-1.137755410371067560e-01-5.619196786647761153e-06j) (-5.133814077305263318e-02+6.426128262453594196e-06j) (-2.499345760043653053e-02+4.145837480945978812e-09j) (-1.312139830045656319e-01-1.916702293239434943e-08j) (5.706142532105148296e-02-3.660560909436972219e-09j) (2.306394192533901821e-02+5.912369791694162052e-04j) (-6.965551527113579555e-02+4.220181688087816687e-07j) (6.516732017530476977e-03+1.334756027348252005e-05j) (-1.224980498083073355e-01+2.553954446398025603e-06j) (2.604876666646196992e-02+6.610937812134409092e-05j) (1.295165032511322589e-01+4.269783775867569193e-08j) (-5.442669440352965182e-02-1.721676508581374999e-05j) (5.023411230151890450e-02-7.157001619507187540e-05j) (-1.071937516329138501e-01+8.603311406079036162e-06j) (6.562580528022762816e-02+5.550500541567079752e-09j) (-6.317533059052141131e-02-1.353328409729301570e-05j) (-9.503072843565812944e-02-5.615114456623808171e-05j) (2.921865688513183151e-02+6.675743505148365995e-05j) (-1.432400921668174343e-01+4.311734510059308591e-08j) (9.866347971933400740e-02+4.802329438822947581e-07j) (-1.486384992844333175e-01+1.217224799556047518e-06j) (5.334492217180443474e-02-1.840412446395094739e-06j) (-6.899776891914767563e-02-7.616919420848380162e-06j) (7.055902622598608787e-02+1.384298404260701238e-07j) (1.386599553524150430e-01+5.728702188826347121e-07j) (-7.510352837047860886e-02-2.163769782706200049e-05j) (2.345915160841707814e-02-1.445395426898316272e-05j) (2.715441459276853042e-02-7.575319668783595163e-06j) (2.099534280295703437e-02-1.446727165535793680e-06j) (-8.307063596867625410e-02-3.702441264451360062e-05j) (1.358462805061934620e-01-1.565316489237969771e-04j) diff --git a/doc/discriminator_3_1_2_10_128_0.5.h5 b/doc/discriminator_3_1_2_10_128_0.5.h5 deleted file mode 100644 index 6bd4bc55c8513f18ad5c915b785cd7e74dc2779b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138320 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 b^u75ry2E(<+j#v!To9gHJC6S!z0deRFq^vg diff --git a/doc/dloss_3_1_2_10_128_0.5 b/doc/dloss_3_1_2_10_128_0.5 deleted file mode 100644 index 9714135bd9..0000000000 --- a/doc/dloss_3_1_2_10_128_0.5 +++ /dev/null @@ -1 +0,0 @@ -6.923972368240356445e-01 diff --git a/doc/final_result.npy b/doc/final_result.npy deleted file mode 100644 index 53a29fba2559fe528fee35056d37118719014175..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 867 zcmbtS%Wl&^6m^=k1=I3=KaF`ffnbs@P*ounDH02!rpOYKDT=HaXM(NT9^aX9qbQBU zCMsF;lPviIxVDo;RdvN(T>GALJi6zMfAzlXeg0a}jL*#8j%}X{X2)5iLLvki>z-gfPoxr=uXNB# zm7WYr7AjqB1}mKkh3W~^99XS)D~*L{pvEcFVa;99G;Mzy*5^M@;DQ4e>)onbLF^dx zUa$A*FILgIy9zGRc^@{WuvvFEP!cmDGr?k(C<&MQaK#-XIx!OxGjqo<7rfat%rFU+ zN5prD__tQmX!n=k;b;L*rU-coC#F2eXsAw!JwGBcN6fwaKuTm-@a9229+>?pTqW)% zE|3aN2@RuAg-pUVU$I1TF^u@gPRA Date: Thu, 30 Nov 2023 11:52:46 +0400 Subject: [PATCH 109/143] fix test --- tests/test_quantum_info_metrics.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_quantum_info_metrics.py b/tests/test_quantum_info_metrics.py index 9398010463..27f61622c5 100644 --- a/tests/test_quantum_info_metrics.py +++ b/tests/test_quantum_info_metrics.py @@ -28,6 +28,7 @@ ) from qibo.quantum_info.random_ensembles import ( random_density_matrix, + random_hermitian, random_statevector, random_unitary, ) @@ -511,7 +512,7 @@ def test_process_fidelity_and_infidelity(backend): target = backend.cast(target, dtype=target.dtype) test = process_fidelity(channel, target, backend=backend) with pytest.raises(TypeError): - channel = np.random.rand(d**2, d**2) + channel = random_hermitian(d**2, backend=backend) channel = backend.cast(channel, dtype=channel.dtype) test = process_fidelity(channel, check_unitary=True, backend=backend) with pytest.raises(TypeError): From 10b0bc03841fd192ca60c050e71c2b80db3df018 Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Thu, 30 Nov 2023 11:57:10 +0400 Subject: [PATCH 110/143] test --- tests/test_quantum_info_metrics.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_quantum_info_metrics.py b/tests/test_quantum_info_metrics.py index 27f61622c5..7cb1a15909 100644 --- a/tests/test_quantum_info_metrics.py +++ b/tests/test_quantum_info_metrics.py @@ -513,7 +513,6 @@ def test_process_fidelity_and_infidelity(backend): test = process_fidelity(channel, target, backend=backend) with pytest.raises(TypeError): channel = random_hermitian(d**2, backend=backend) - channel = backend.cast(channel, dtype=channel.dtype) test = process_fidelity(channel, check_unitary=True, backend=backend) with pytest.raises(TypeError): channel = 10 * np.random.rand(d**2, d**2) From 526df17d4808376b0fa4b888030e36cedc721bf9 Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Thu, 30 Nov 2023 13:33:39 +0400 Subject: [PATCH 111/143] fix --- src/qibo/backends/numpy.py | 1 + src/qibo/result.py | 11 ++++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/qibo/backends/numpy.py b/src/qibo/backends/numpy.py index 1153eb0c01..52a7d53b67 100644 --- a/src/qibo/backends/numpy.py +++ b/src/qibo/backends/numpy.py @@ -530,6 +530,7 @@ def execute_circuit_repeated(self, circuit, nshots, initial_state=None): assert circuit.has_collapse final_state = np.mean(self.to_numpy(final_states), 0) if circuit.measurements: + print('Building CircuitResult') qubits = [q for m in circuit.measurements for q in m.target_qubits] final_result = CircuitResult( final_state, diff --git a/src/qibo/result.py b/src/qibo/result.py index 0f944728a2..007fb2ea36 100644 --- a/src/qibo/result.py +++ b/src/qibo/result.py @@ -180,15 +180,16 @@ def __init__( self._measurement_gate = None self._probs = probabilities self._samples = samples + self._frequencies = None + self._repeated_execution_frequencies = None + if samples is not None: for m in measurements: indices = [self.measurement_gate.qubits.index(q) for q in m.qubits] m.result.register_samples(samples[:, indices]) - self._frequencies = None - self._repeated_execution_frequencies = None - - for gate in self.measurements: - gate.result.reset() + else: + for gate in self.measurements: + gate.result.reset() def frequencies(self, binary: bool = True, registers: bool = False): """Returns the frequencies of measured samples. From f140cf7fe91fbbdfb4178104b5a102a525bd2334 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 30 Nov 2023 09:34:16 +0000 Subject: [PATCH 112/143] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/qibo/backends/numpy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibo/backends/numpy.py b/src/qibo/backends/numpy.py index 52a7d53b67..93614b174c 100644 --- a/src/qibo/backends/numpy.py +++ b/src/qibo/backends/numpy.py @@ -530,7 +530,7 @@ def execute_circuit_repeated(self, circuit, nshots, initial_state=None): assert circuit.has_collapse final_state = np.mean(self.to_numpy(final_states), 0) if circuit.measurements: - print('Building CircuitResult') + print("Building CircuitResult") qubits = [q for m in circuit.measurements for q in m.target_qubits] final_result = CircuitResult( final_state, From 4f2898ca24a27d8ea46a09d38c8a13f19c0eb11f Mon Sep 17 00:00:00 2001 From: Andrea Papaluca Date: Thu, 30 Nov 2023 13:39:28 +0400 Subject: [PATCH 113/143] added test --- src/qibo/backends/numpy.py | 1 - tests/test_measurements_collapse.py | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibo/backends/numpy.py b/src/qibo/backends/numpy.py index 93614b174c..1153eb0c01 100644 --- a/src/qibo/backends/numpy.py +++ b/src/qibo/backends/numpy.py @@ -530,7 +530,6 @@ def execute_circuit_repeated(self, circuit, nshots, initial_state=None): assert circuit.has_collapse final_state = np.mean(self.to_numpy(final_states), 0) if circuit.measurements: - print("Building CircuitResult") qubits = [q for m in circuit.measurements for q in m.target_qubits] final_result = CircuitResult( final_state, diff --git a/tests/test_measurements_collapse.py b/tests/test_measurements_collapse.py index b7aee161ff..7edb1348f3 100644 --- a/tests/test_measurements_collapse.py +++ b/tests/test_measurements_collapse.py @@ -13,9 +13,10 @@ def test_measurement_collapse(backend, nqubits, targets): initial_state = random_statevector(2**nqubits, backend=backend) c = models.Circuit(nqubits) + for q in np.random.randint(nqubits, size=np.random.randint(nqubits, size=1)): + c.add(gates.H(q)) r = c.add(gates.M(*targets, collapse=True)) c.add(gates.M(*targets)) - # final_state = backend.execute_circuit(c, np.copy(initial_state), nshots=1)[0] outcome = backend.execute_circuit(c, np.copy(initial_state), nshots=1) samples = r.samples()[0] backend.assert_allclose(samples, outcome.samples()[0]) From 879ffacce945a9b813abcb7177bff4e2d6218458 Mon Sep 17 00:00:00 2001 From: MatteoRobbiati Date: Thu, 30 Nov 2023 12:15:27 +0100 Subject: [PATCH 114/143] add args --- src/qibo/models/variational.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/qibo/models/variational.py b/src/qibo/models/variational.py index 95b247511b..d031e58ae0 100644 --- a/src/qibo/models/variational.py +++ b/src/qibo/models/variational.py @@ -128,6 +128,9 @@ def energy_fluctuation(self, state): \\Xi_{k}(\\mu) = \\sqrt{\\langle\\mu|\\hat{H}^2|\\mu\\rangle - \\langle\\mu|\\hat{H}|\\mu\\rangle^2} \\, for a given state :math:`|\\mu\\rangle`. + + Args: + state (np.ndarray): quantum state to be used to compute the energy fluctuation with H. """ energy = self.hamiltonian.expectation(state) h = self.hamiltonian.matrix From 5d7df1a9172a58baaad3e74aaedf806915662d4a Mon Sep 17 00:00:00 2001 From: Matteo Robbiati <62071516+MatteoRobbiati@users.noreply.github.com> Date: Thu, 30 Nov 2023 12:20:05 +0100 Subject: [PATCH 115/143] Update doc/source/getting-started/backends.rst Co-authored-by: Stefano Carrazza --- doc/source/getting-started/backends.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/getting-started/backends.rst b/doc/source/getting-started/backends.rst index 1831945e29..fd29c281ce 100644 --- a/doc/source/getting-started/backends.rst +++ b/doc/source/getting-started/backends.rst @@ -54,7 +54,7 @@ default value is 1 allowing all messages to appear. The `qibojit` backend implements in-place updates. This implies that the initial state is modified at runtime without performing any copies to save memory. For algorithms that require access to the initial state after its modification, such as quantum machine learning applications, - it is suggested to perform a copy of the state explicitly. + it is suggested to perform a copy of the state explicitly if really needed by the algorithm. .. _hardware-backends: From 522c7b9e0c82fe18b6f6514d974bc2a1f3a577a0 Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Fri, 1 Dec 2023 15:41:33 +0400 Subject: [PATCH 116/143] fix bug --- src/qibo/quantum_info/random_ensembles.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/qibo/quantum_info/random_ensembles.py b/src/qibo/quantum_info/random_ensembles.py index 8c9d4f8379..9ef63a653d 100644 --- a/src/qibo/quantum_info/random_ensembles.py +++ b/src/qibo/quantum_info/random_ensembles.py @@ -1159,11 +1159,13 @@ def _sample_from_quantum_mallows_distribution(nqubits: int, local_state): """ mute_index = list(range(nqubits)) - exponents = np.arange(nqubits, 0, -1, dtype=int) + exponents = np.arange(nqubits, 0, -1, dtype=np.int64) + powers = 4**exponents + powers[powers == 0] = np.iinfo(np.int64).max r = local_state.uniform(0, 1, size=nqubits) - indexes = -1 * (np.ceil(np.log2(r + (1 - r) / 4**exponents))) + indexes = -1 * (np.ceil(np.log2(r + (1 - r) / powers))) hadamards = 1 * (indexes < exponents) From 2635489c5509fd7d48f59087e8236a9bf23618d2 Mon Sep 17 00:00:00 2001 From: scarrazza Date: Fri, 1 Dec 2023 15:36:22 +0100 Subject: [PATCH 117/143] updating lock --- poetry.lock | 64 +++++++++++++++++++---------------------------------- 1 file changed, 23 insertions(+), 41 deletions(-) diff --git a/poetry.lock b/poetry.lock index 8b42c368d6..7bfe3157b1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "absl-py" @@ -852,6 +852,7 @@ 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]] @@ -863,6 +864,7 @@ 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]] @@ -1343,13 +1345,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-auth" -version = "2.23.4" +version = "2.24.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google-auth-2.23.4.tar.gz", hash = "sha256:79905d6b1652187def79d491d6e23d0cbb3a21d3c7ba0dbaa9c8a01906b13ff3"}, - {file = "google_auth-2.23.4-py2.py3-none-any.whl", hash = "sha256:d4bbc92fe4b8bfd2f3e8d88e5ba7085935da208ee38a134fc280e7ce682a05f2"}, + {file = "google-auth-2.24.0.tar.gz", hash = "sha256:2ec7b2a506989d7dbfdbe81cb8d0ead8876caaed14f86d29d34483cbe99c57af"}, + {file = "google_auth-2.24.0-py2.py3-none-any.whl", hash = "sha256:9b82d5c8d3479a5391ea0a46d81cca698d328459da31d4a459d4e901a5d927e0"}, ] [package.dependencies] @@ -2198,16 +2200,6 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -3546,7 +3538,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"}, @@ -3554,15 +3545,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_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"}, @@ -3579,7 +3563,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"}, @@ -3587,7 +3570,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"}, @@ -3771,7 +3753,7 @@ scipy = "^1.10.1" type = "git" url = "https://github.com/qiboteam/qibojit.git" reference = "HEAD" -resolved_reference = "6b7dd42b2af92c0788063172c668ba3b01b5e1a2" +resolved_reference = "6c574f84f5bbfbaf57773986f4063e2ddc926a02" [[package]] name = "recommonmark" @@ -4572,13 +4554,13 @@ tensorflow-rocm = ["tensorflow-rocm (>=2.13.0,<2.14.0)"] [[package]] name = "termcolor" -version = "2.3.0" +version = "2.4.0" description = "ANSI color formatting for output in terminal" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "termcolor-2.3.0-py3-none-any.whl", hash = "sha256:3afb05607b89aed0ffe25202399ee0867ad4d3cb4180d98aaf8eefa6a5f7d475"}, - {file = "termcolor-2.3.0.tar.gz", hash = "sha256:b5b08f68937f138fe92f6c089b99f1e2da0ae56c52b78bf7075fd95420fd9a5a"}, + {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, + {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, ] [package.extras] @@ -4648,22 +4630,22 @@ files = [ [[package]] name = "tornado" -version = "6.3.3" +version = "6.4" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">= 3.8" files = [ - {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, - {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, - {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, - {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, - {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, + {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, + {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, + {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, + {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, + {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, ] [[package]] From 17ea79de0a6530a69e4e27aa5a4e2126f81ccd60 Mon Sep 17 00:00:00 2001 From: Stefano Carrazza Date: Fri, 1 Dec 2023 22:58:47 +0100 Subject: [PATCH 118/143] updating version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 899c85cf2b..f2b5c16419 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry] name = "qibo" -version = "0.2.3" +version = "0.2.4" description = "A framework for quantum computing with hardware acceleration." authors = ["The Qibo team"] license = "Apache License 2.0" From 1dd73f7a637defd01a42023651f8499652115a7a Mon Sep 17 00:00:00 2001 From: Stefano Carrazza Date: Sat, 2 Dec 2023 11:17:58 +0100 Subject: [PATCH 119/143] updating lock with qibojit latest main --- poetry.lock | 228 +++++++++++++++++++++++++++++----------------------- 1 file changed, 128 insertions(+), 100 deletions(-) diff --git a/poetry.lock b/poetry.lock index 7bfe3157b1..dee141d25a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "absl-py" @@ -349,49 +349,49 @@ files = [ [[package]] name = "cirq" -version = "1.2.0" +version = "1.3.0" description = "A framework for creating, editing, and invoking Noisy Intermediate Scale Quantum (NISQ) circuits." optional = false python-versions = ">=3.9.0" files = [ - {file = "cirq-1.2.0-py3-none-any.whl", hash = "sha256:7717ecfc218024f8d25cbca9c0439edb2437226177754960b8f5ad15e5f5b814"}, + {file = "cirq-1.3.0-py3-none-any.whl", hash = "sha256:9e39f2c919864ee3f6a4b4b1dcfdaacb4d5e753e2c7fc7ebb0a93947d6cefcab"}, ] [package.dependencies] -cirq-aqt = "1.2.0" -cirq-core = "1.2.0" -cirq-ft = "1.2.0" -cirq-google = "1.2.0" -cirq-ionq = "1.2.0" -cirq-pasqal = "1.2.0" -cirq-rigetti = "1.2.0" -cirq-web = "1.2.0" +cirq-aqt = "1.3.0" +cirq-core = "1.3.0" +cirq-ft = "1.3.0" +cirq-google = "1.3.0" +cirq-ionq = "1.3.0" +cirq-pasqal = "1.3.0" +cirq-rigetti = "1.3.0" +cirq-web = "1.3.0" [package.extras] -dev-env = ["asv", "black (==23.3.0)", "codeowners", "coverage (<=6.2)", "filelock (>=3.0.12,<3.1.0)", "freezegun (>=0.3.15,<0.4.0)", "grpcio-tools (>=1.56.0,<1.57.0)", "importlib-metadata", "ipykernel (==5.3.4)", "ipython (>=7.34.0)", "mypy (==1.2.0)", "mypy-protobuf", "notebook (>=6.4.1,<=6.4.7)", "papermill (>=2.3.2,<2.4.0)", "pylint (>=2.13.0,<2.14.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-randomly", "pytest-xdist (>=2.2.0,<2.3.0)", "qiskit-aer (>=0.12.2,<0.13.0)", "rstcheck (>=3.3.1,<3.4.0)", "seaborn (>=0.11.1,<0.12.0)", "setuptools", "twine", "types-backports (==0.1.3)", "types-cachetools", "types-protobuf (==3.19.22)", "types-requests (==2.28.1)", "types-setuptools (==62.6.1)", "virtualenv", "virtualenv-clone", "wheel"] +dev-env = ["asv", "black (==23.3.0)", "codeowners", "coverage (<=6.2)", "filelock (>=3.0.12,<3.1.0)", "freezegun (>=0.3.15,<0.4.0)", "grpcio-tools (>=1.56.0,<1.57.0)", "importlib-metadata", "ipykernel (==5.3.4)", "ipython (>=7.34.0)", "mypy (==1.2.0)", "mypy-protobuf (==3.4)", "notebook (>=6.4.1,<=6.4.7)", "papermill (>=2.3.2,<2.4.0)", "pylint (>=2.13.0,<2.14.0)", "pytest", "pytest-asyncio", "pytest-cov (>=3.0,<4.0)", "pytest-randomly", "pytest-xdist (>=2.2.0,<2.3.0)", "qiskit-aer (>=0.12.2,<0.13.0)", "rstcheck (>=3.3.1,<3.4.0)", "seaborn (>=0.11.1,<0.12.0)", "setuptools", "twine", "types-backports (==0.1.3)", "types-cachetools", "types-protobuf (>=3.20,<4.0)", "types-requests (==2.28.1)", "types-setuptools (==62.6.1)", "virtualenv", "virtualenv-clone", "wheel"] [[package]] name = "cirq-aqt" -version = "1.2.0" +version = "1.3.0" description = "A Cirq package to simulate and connect to Alpine Quantum Technologies quantum computers" optional = false python-versions = ">=3.9.0" files = [ - {file = "cirq_aqt-1.2.0-py3-none-any.whl", hash = "sha256:9d441d07bdba62033116151c3302197ad0aa859d93111a3f0f81aae915bf25d3"}, + {file = "cirq_aqt-1.3.0-py3-none-any.whl", hash = "sha256:e70324b80ac0c752447c67ee49d84129fb21b8ce63737c15cdd155cb9fb1f405"}, ] [package.dependencies] -cirq-core = "1.2.0" +cirq-core = "1.3.0" requests = ">=2.18,<3.0" [[package]] name = "cirq-core" -version = "1.2.0" +version = "1.3.0" description = "A framework for creating, editing, and invoking Noisy Intermediate Scale Quantum (NISQ) circuits." optional = false python-versions = ">=3.9.0" files = [ - {file = "cirq_core-1.2.0-py3-none-any.whl", hash = "sha256:35b1179a6a9b3833174d4b5ae07369980d06d429d8003d69071082135f7d4ef3"}, + {file = "cirq_core-1.3.0-py3-none-any.whl", hash = "sha256:d46771ddf4adb0867d3fb6da8c4484b73bada5bfaa58c19e2444aa8838270fd9"}, ] [package.dependencies] @@ -411,92 +411,92 @@ contrib = ["autoray", "numba (>=0.53.0)", "opt-einsum", "ply (>=3.6)", "pylatex [[package]] name = "cirq-ft" -version = "1.2.0" +version = "1.3.0" description = "A Cirq package for fault-tolerant algorithms" optional = false python-versions = ">=3.9.0" files = [ - {file = "cirq_ft-1.2.0-py3-none-any.whl", hash = "sha256:76511fdd7fd8e15ec3e13ba42f4d149d56f7ca0a09797a7bf23f0fa8b76bc85c"}, + {file = "cirq_ft-1.3.0-py3-none-any.whl", hash = "sha256:ff45a911b74abece20e97856bad6ff388efdd79068f654a8cee7925d2fe54bf5"}, ] [package.dependencies] attrs = "*" cachetools = ">=5.3" -cirq-core = "1.2.0" +cirq-core = "1.3.0" ipywidgets = "*" nbconvert = "*" nbformat = "*" [[package]] name = "cirq-google" -version = "1.2.0" +version = "1.3.0" description = "The Cirq module that provides tools and access to the Google Quantum Computing Service" optional = false python-versions = ">=3.9.0" files = [ - {file = "cirq_google-1.2.0-py3-none-any.whl", hash = "sha256:5c432b32577802e638d14e3dbc1f098691e5dcc0549ab756a50d27eea1e3f3e3"}, + {file = "cirq_google-1.3.0-py3-none-any.whl", hash = "sha256:aa802887679f64ef8359f77d5bbd5bb98dc076c35c152c3b7f172c6e09d4e667"}, ] [package.dependencies] -cirq-core = "1.2.0" +cirq-core = "1.3.0" google-api-core = {version = ">=1.14.0", extras = ["grpc"]} proto-plus = ">=1.20.0" protobuf = ">=3.15.0" [[package]] name = "cirq-ionq" -version = "1.2.0" +version = "1.3.0" description = "A Cirq package to simulate and connect to IonQ quantum computers" optional = false python-versions = ">=3.9.0" files = [ - {file = "cirq_ionq-1.2.0-py3-none-any.whl", hash = "sha256:72d10cd57c9d194287d4b46e5c45c588bef607b4b5f6a35f2e0bd6ebf8f8297b"}, + {file = "cirq_ionq-1.3.0-py3-none-any.whl", hash = "sha256:7368da1012a5aafa6ae9125bfafc3beaf1ed799c0f9680947cf8709652f1f640"}, ] [package.dependencies] -cirq-core = "1.2.0" +cirq-core = "1.3.0" requests = ">=2.18,<3.0" [[package]] name = "cirq-pasqal" -version = "1.2.0" +version = "1.3.0" description = "A Cirq package to simulate and connect to Pasqal quantum computers" optional = false python-versions = ">=3.9.0" files = [ - {file = "cirq_pasqal-1.2.0-py3-none-any.whl", hash = "sha256:03aac24577e0c3970e932b80d2d122f3faf769d5e3d74b5a35c55bfc30673c9f"}, + {file = "cirq_pasqal-1.3.0-py3-none-any.whl", hash = "sha256:953c04f1ba5efa94a26cae88e0d2ceeabde3c664beef43800b4be728c7f6f6eb"}, ] [package.dependencies] -cirq-core = "1.2.0" +cirq-core = "1.3.0" requests = ">=2.18,<3.0" [[package]] name = "cirq-rigetti" -version = "1.2.0" +version = "1.3.0" description = "A Cirq package to simulate and connect to Rigetti quantum computers and Quil QVM" optional = false python-versions = ">=3.9.0" files = [ - {file = "cirq_rigetti-1.2.0-py3-none-any.whl", hash = "sha256:f20791bfea68cd3d838e1be259991aca5144eae9294f9d960461f3ef41563354"}, + {file = "cirq_rigetti-1.3.0-py3-none-any.whl", hash = "sha256:b771e523a8f2bd83ac3b22a79ae8ce03467c75c083ff44bcb04022c12c6dace3"}, ] [package.dependencies] -cirq-core = "1.2.0" -pyquil = ">=3.2.0,<3.3.0" +cirq-core = "1.3.0" +pyquil = ">=3.2.0,<4.0.0" [[package]] name = "cirq-web" -version = "1.2.0" +version = "1.3.0" description = "Web-based 3D visualization tools for Cirq." optional = false python-versions = ">=3.9.0" files = [ - {file = "cirq_web-1.2.0-py3-none-any.whl", hash = "sha256:45b5c91812f2a0e6e83b08b019276c04d643b418af430d992acce563efa458a4"}, + {file = "cirq_web-1.3.0-py3-none-any.whl", hash = "sha256:5206d96e378f8f6fe7e0067cb84db9f48eff372bbb565f0056e1e95d7952b458"}, ] [package.dependencies] -cirq-core = "1.2.0" +cirq-core = "1.3.0" [[package]] name = "clarabel" @@ -852,7 +852,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]] @@ -864,7 +863,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]] @@ -990,6 +988,23 @@ files = [ {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, ] +[[package]] +name = "deprecated" +version = "1.2.14" +description = "Python @deprecated decorator to deprecate old python classes, functions or methods." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, + {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, +] + +[package.dependencies] +wrapt = ">=1.10,<2" + +[package.extras] +dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] + [[package]] name = "dill" version = "0.3.7" @@ -1641,20 +1656,20 @@ files = [ [[package]] name = "importlib-metadata" -version = "6.8.0" +version = "6.9.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, - {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, + {file = "importlib_metadata-6.9.0-py3-none-any.whl", hash = "sha256:1c8dc6839ddc9771412596926f24cb5a553bbd40624ee2c7e55e531542bed3b8"}, + {file = "importlib_metadata-6.9.0.tar.gz", hash = "sha256:e8acb523c335a91822674e149b46c0399ec4d328c4d1f6e49c273da5ff0201b9"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] @@ -2109,8 +2124,6 @@ description = "Clang Python Bindings, mirrored from the official LLVM repo: http optional = false python-versions = "*" files = [ - {file = "libclang-16.0.6-1-py2.py3-none-manylinux2014_aarch64.whl", hash = "sha256:88bc7e7b393c32e41e03ba77ef02fdd647da1f764c2cd028e69e0837080b79f6"}, - {file = "libclang-16.0.6-1-py2.py3-none-manylinux2014_armv7l.whl", hash = "sha256:d80ed5827736ed5ec2bcedf536720476fd9d4fa4c79ef0cb24aea4c59332f361"}, {file = "libclang-16.0.6-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:da9e47ebc3f0a6d90fb169ef25f9fbcd29b4a4ef97a8b0e3e3a17800af1423f4"}, {file = "libclang-16.0.6-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:e1a5ad1e895e5443e205568c85c04b4608e4e973dae42f4dfd9cb46c81d1486b"}, {file = "libclang-16.0.6-py2.py3-none-manylinux2010_x86_64.whl", hash = "sha256:9dcdc730939788b8b69ffd6d5d75fe5366e3ee007f1e36a99799ec0b0c001492"}, @@ -2537,21 +2550,21 @@ traitlets = ">=5" [[package]] name = "networkx" -version = "2.8.8" +version = "3.2.1" description = "Python package for creating and manipulating graphs and networks" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "networkx-2.8.8-py3-none-any.whl", hash = "sha256:e435dfa75b1d7195c7b8378c3859f0445cd88c6b0375c181ed66823a9ceb7524"}, - {file = "networkx-2.8.8.tar.gz", hash = "sha256:230d388117af870fce5647a3c52401fcf753e94720e6ea6b4197a5355648885e"}, + {file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"}, + {file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"}, ] [package.extras] -default = ["matplotlib (>=3.4)", "numpy (>=1.19)", "pandas (>=1.3)", "scipy (>=1.8)"] -developer = ["mypy (>=0.982)", "pre-commit (>=2.20)"] -doc = ["nb2plots (>=0.6)", "numpydoc (>=1.5)", "pillow (>=9.2)", "pydata-sphinx-theme (>=0.11)", "sphinx (>=5.2)", "sphinx-gallery (>=0.11)", "texext (>=0.6.6)"] -extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.9)", "sympy (>=1.10)"] -test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] +default = ["matplotlib (>=3.5)", "numpy (>=1.22)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.4)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["nb2plots (>=0.7)", "nbconvert (<7.9)", "numpydoc (>=1.6)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.11)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] name = "numba" @@ -3055,17 +3068,6 @@ files = [ [package.extras] tests = ["pytest"] -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] - [[package]] name = "py4j" version = "0.10.9.7" @@ -3290,23 +3292,27 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pyquil" -version = "3.2.1" +version = "3.5.4" description = "A Python library for creating Quantum Instruction Language (Quil) programs." optional = false python-versions = ">=3.7,<4.0" files = [ - {file = "pyquil-3.2.1-py3-none-any.whl", hash = "sha256:619ebf13307e98d437f0a4e9a5c16ce97e254fa9d56379e0793f7a411502f938"}, - {file = "pyquil-3.2.1.tar.gz", hash = "sha256:6ae46a38bf6d7d4acee4c3f2a90c49b3b644d97754699548d3ab6a128055c6c4"}, + {file = "pyquil-3.5.4-py3-none-any.whl", hash = "sha256:ef36458b38b314f647f0e6cb067358e92033821f90fb7a533baa5ff59bfbaaf1"}, + {file = "pyquil-3.5.4.tar.gz", hash = "sha256:4fe65c83a4cf9164d3c7ddb314029d71b7388fb22fb56a1ba8f4dd3c1bb1d9a6"}, ] [package.dependencies] +deprecated = ">=1.2.13,<2.0.0" lark = ">=0.11.1,<0.12.0" -networkx = ">=2.5,<3.0" -numpy = ">=1.20,<2.0" -qcs-api-client = ">=0.20.13,<0.22.0" -retry = ">=0.9.2,<0.10.0" +networkx = ">=2.5" +numpy = ">=1.21,<2.0" +qcs-api-client = ">=0.21.0,<0.22.0" rpcq = ">=3.10.0,<4.0.0" scipy = ">=1.6.1,<2.0.0" +tenacity = ">=8.2.2,<9.0.0" +types-deprecated = ">=1.2.9.2,<2.0.0.0" +types-python-dateutil = ">=2.8.19,<3.0.0" +types-retry = ">=0.9.9,<0.10.0" [package.extras] docs = ["Sphinx (>=4.0.2,<5.0.0)", "nbsphinx (>=0.8.6,<0.9.0)", "recommonmark (>=0.7.1,<0.8.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)"] @@ -3736,24 +3742,24 @@ scipy = ">=0.13.2" [[package]] name = "qibojit" -version = "0.1.2" +version = "0.1.3" description = "Simulation tools based on numba and cupy." optional = false -python-versions = ">=3.8.0,<3.12" +python-versions = ">=3.9.0,<3.12" files = [] develop = false [package.dependencies] numba = ">=0.51.0" psutil = "^5.9.5" -qibo = ">=0.2.2" +qibo = ">=0.2.3" scipy = "^1.10.1" [package.source] type = "git" url = "https://github.com/qiboteam/qibojit.git" reference = "HEAD" -resolved_reference = "6c574f84f5bbfbaf57773986f4063e2ddc926a02" +resolved_reference = "c621acf3c8b8ffaaa67f76114b5ab9a086aea6d8" [[package]] name = "recommonmark" @@ -3810,21 +3816,6 @@ requests = ">=2.0.0" [package.extras] rsa = ["oauthlib[signedtoken] (>=3.0.0)"] -[[package]] -name = "retry" -version = "0.9.2" -description = "Easy to use retry decorator." -optional = false -python-versions = "*" -files = [ - {file = "retry-0.9.2-py2.py3-none-any.whl", hash = "sha256:ccddf89761fa2c726ab29391837d4327f819ea14d244c232a1d24c67a2f98606"}, - {file = "retry-0.9.2.tar.gz", hash = "sha256:f8bfa8b99b69c4506d6f5bd3b0aabf77f98cdb17f3c9fc3f5ca820033336fba4"}, -] - -[package.dependencies] -decorator = ">=3.4.2" -py = ">=1.4.26,<2.0.0" - [[package]] name = "retrying" version = "1.3.4" @@ -4420,6 +4411,20 @@ files = [ [package.extras] widechars = ["wcwidth"] +[[package]] +name = "tenacity" +version = "8.2.3" +description = "Retry code until it succeeds" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, + {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, +] + +[package.extras] +doc = ["reno", "sphinx", "tornado (>=4.5)"] + [[package]] name = "tensorboard" version = "2.14.1" @@ -4683,6 +4688,39 @@ files = [ docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] +[[package]] +name = "types-deprecated" +version = "1.2.9.3" +description = "Typing stubs for Deprecated" +optional = false +python-versions = "*" +files = [ + {file = "types-Deprecated-1.2.9.3.tar.gz", hash = "sha256:ef87327adf3e3c4a4c7d8e06e58f6476710d3466ecfb53c49efb080804a70ef3"}, + {file = "types_Deprecated-1.2.9.3-py3-none-any.whl", hash = "sha256:24da9210763e5e1b3d0d4f6f8bba9ad3bb6af3fe7f6815fc37e3ede4681704f5"}, +] + +[[package]] +name = "types-python-dateutil" +version = "2.8.19.14" +description = "Typing stubs for python-dateutil" +optional = false +python-versions = "*" +files = [ + {file = "types-python-dateutil-2.8.19.14.tar.gz", hash = "sha256:1f4f10ac98bb8b16ade9dbee3518d9ace017821d94b057a425b069f834737f4b"}, + {file = "types_python_dateutil-2.8.19.14-py3-none-any.whl", hash = "sha256:f977b8de27787639986b4e28963263fd0e5158942b3ecef91b9335c130cb1ce9"}, +] + +[[package]] +name = "types-retry" +version = "0.9.9.4" +description = "Typing stubs for retry" +optional = false +python-versions = "*" +files = [ + {file = "types-retry-0.9.9.4.tar.gz", hash = "sha256:e4731dc684b56b875d9746459ad665d3bc281a56b530acdf1c97730167799941"}, + {file = "types_retry-0.9.9.4-py3-none-any.whl", hash = "sha256:f29760a9fe8b1fefe253e5fe6be7e4c0eba243932c600e0eccffb42a21d17765"}, +] + [[package]] name = "typing-extensions" version = "4.8.0" @@ -4828,16 +4866,6 @@ files = [ {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, - {file = "wrapt-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecee4132c6cd2ce5308e21672015ddfed1ff975ad0ac8d27168ea82e71413f55"}, - {file = "wrapt-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2020f391008ef874c6d9e208b24f28e31bcb85ccff4f335f15a3251d222b92d9"}, - {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2feecf86e1f7a86517cab34ae6c2f081fd2d0dac860cb0c0ded96d799d20b335"}, - {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:240b1686f38ae665d1b15475966fe0472f78e71b1b4903c143a842659c8e4cb9"}, - {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9008dad07d71f68487c91e96579c8567c98ca4c3881b9b113bc7b33e9fd78b8"}, - {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6447e9f3ba72f8e2b985a1da758767698efa72723d5b59accefd716e9e8272bf"}, - {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:acae32e13a4153809db37405f5eba5bac5fbe2e2ba61ab227926a22901051c0a"}, - {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49ef582b7a1152ae2766557f0550a9fcbf7bbd76f43fbdc94dd3bf07cc7168be"}, - {file = "wrapt-1.14.1-cp311-cp311-win32.whl", hash = "sha256:358fe87cc899c6bb0ddc185bf3dbfa4ba646f05b1b0b9b5a27c2cb92c2cea204"}, - {file = "wrapt-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:26046cd03936ae745a502abf44dac702a5e6880b2b01c29aea8ddf3353b68224"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, From 6d5f875ff38f1675b914e25e74a02eeca4242c35 Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Mon, 4 Dec 2023 15:33:35 +0400 Subject: [PATCH 120/143] frame potential --- src/qibo/quantum_info/metrics.py | 90 ++++++++++++++++++++++++++++---- 1 file changed, 80 insertions(+), 10 deletions(-) diff --git a/src/qibo/quantum_info/metrics.py b/src/qibo/quantum_info/metrics.py index 6def701baa..cc1f8d7e12 100644 --- a/src/qibo/quantum_info/metrics.py +++ b/src/qibo/quantum_info/metrics.py @@ -1117,7 +1117,7 @@ def expressibility( Defaults to ``None``. Returns: - float: Entangling capability. + float: Expressibility of parametrized circuit. """ if isinstance(power_t, int) is False: @@ -1148,25 +1148,95 @@ def expressibility( def frame_potential( - nqubits: int, + circuit, power_t: int, - haar: bool = True, - circuit=None, samples: int = None, backend=None, ): - if backend is None: # pragma: no cover - backend = GlobalBackend() + """Returns the frame potential of a parametrized circuit under uniform sampling of the parameters. + + For :math:`n` qubits and moment :math:`t`, the frame potential + :math:`\\mathcal{F}_{\\mathcal{U}}^{(t)}` if given by + + ..math:: + \\mathcal{F}_{\\mathcal{U}}^{(t)} = \\int_{U,V \\in \\mathcal{U}} \\, + dU \\, dV \\, \\abs{\\tr(U^{\\dagger} \\, V)}^{2t} \\, , + + where :math:`\\mathcal{U}` is the group of unitaries defined by the parametrized circuit. + The frame potential is approximated by the average + + ..math:: + \\mathcal{F}_{\\mathcal{U}}^{(t)} \\approx \\frac{1}{N} \\, + \\sum_{k=1}^{N} \\, \\abs{\\tr(U_{k}^{\\dagger} \\, V_{k})}^{2t} \\, , + + where :math:`N` is the number of ``samples``. + + Args: + circuit (:class:`qibo.models.circuit.Circuit`): Parametrized circuit. + power_t (int): power that defines the :math:`t`-design. + samples (int): number of samples to estimate the integral. + 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``. - if circuit is not None and nqubits != circuit.nqubits: + Returns: + float: Frame potential of the parametrized circuit. + """ + if isinstance(power_t, int) is False: raise_error( - ValueError, f"nqubits ({nqubits}) != circuit.nqubits ({circuit.nqubits})" + TypeError, f"power_t must be type int, but it is type {type(power_t)}." + ) + + if isinstance(samples, int) is False: + raise_error( + TypeError, f"samples must be type int, but it is type {type(samples)}." ) + if backend is None: # pragma: no cover + backend = GlobalBackend() + + potential = 0 + for _ in range(samples): + unitary_1 = circuit.copy() + unitary_2 = circuit.copy() + + params_1 = np.random.uniform(-np.pi, np.pi, circuit.trainable_gates.nparams) + params_2 = np.random.uniform(-np.pi, np.pi, circuit.trainable_gates.nparams) + + unitary_1.set_parameters(params_1) + unitary_2.set_parameters(params_2) + + unitary_1 = unitary_1.unitary(backend) + unitary_2 = unitary_2.unitary(backend) + + potential += np.abs(np.trace(np.transpose(np.conj(unitary_1)) @ unitary_2))**(2*power_t) + + return potential / samples + + +def frame_potential_haar(nqubits: int, power_t: int): + """Returns the frame potential of the Haar distirbution. + + For :math:`n` qubits and moment :math:`t`, the frame potential + of the Haar distribution is given by + + .. math:: + \\frac{t! \\, (d - 1)!}{(t + d - 1)!} \\, , + + where :math:`d = 2^{n}`. + + Args: + nqubits (int): number of qubits. + power_t (int): power that defines the :math:`t`-design. + + Returns: + float: Frame potential of the Haar distribution. + """ dim = 2**nqubits - if haar: - return factorial(power_t) * factorial(dim - 1) / factorial(power_t + dim - 1) + return factorial(power_t) * factorial(dim - 1) / factorial(power_t + dim - 1) + + def _check_hermitian_or_not_gpu(matrix, backend=None): From 9cfa81a4cea576da167d318ef8feab32cbe20baf Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 4 Dec 2023 11:34:40 +0000 Subject: [PATCH 121/143] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/qibo/quantum_info/metrics.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/qibo/quantum_info/metrics.py b/src/qibo/quantum_info/metrics.py index cc1f8d7e12..b510461b45 100644 --- a/src/qibo/quantum_info/metrics.py +++ b/src/qibo/quantum_info/metrics.py @@ -1148,27 +1148,27 @@ def expressibility( def frame_potential( - circuit, + circuit, power_t: int, samples: int = None, backend=None, ): """Returns the frame potential of a parametrized circuit under uniform sampling of the parameters. - For :math:`n` qubits and moment :math:`t`, the frame potential + For :math:`n` qubits and moment :math:`t`, the frame potential :math:`\\mathcal{F}_{\\mathcal{U}}^{(t)}` if given by ..math:: - \\mathcal{F}_{\\mathcal{U}}^{(t)} = \\int_{U,V \\in \\mathcal{U}} \\, + \\mathcal{F}_{\\mathcal{U}}^{(t)} = \\int_{U,V \\in \\mathcal{U}} \\, dU \\, dV \\, \\abs{\\tr(U^{\\dagger} \\, V)}^{2t} \\, , - + where :math:`\\mathcal{U}` is the group of unitaries defined by the parametrized circuit. The frame potential is approximated by the average ..math:: - \\mathcal{F}_{\\mathcal{U}}^{(t)} \\approx \\frac{1}{N} \\, + \\mathcal{F}_{\\mathcal{U}}^{(t)} \\approx \\frac{1}{N} \\, \\sum_{k=1}^{N} \\, \\abs{\\tr(U_{k}^{\\dagger} \\, V_{k})}^{2t} \\, , - + where :math:`N` is the number of ``samples``. Args: @@ -1195,7 +1195,7 @@ def frame_potential( if backend is None: # pragma: no cover backend = GlobalBackend() - potential = 0 + potential = 0 for _ in range(samples): unitary_1 = circuit.copy() unitary_2 = circuit.copy() @@ -1209,7 +1209,9 @@ def frame_potential( unitary_1 = unitary_1.unitary(backend) unitary_2 = unitary_2.unitary(backend) - potential += np.abs(np.trace(np.transpose(np.conj(unitary_1)) @ unitary_2))**(2*power_t) + potential += np.abs(np.trace(np.transpose(np.conj(unitary_1)) @ unitary_2)) ** ( + 2 * power_t + ) return potential / samples @@ -1222,7 +1224,7 @@ def frame_potential_haar(nqubits: int, power_t: int): .. math:: \\frac{t! \\, (d - 1)!}{(t + d - 1)!} \\, , - + where :math:`d = 2^{n}`. Args: @@ -1237,8 +1239,6 @@ def frame_potential_haar(nqubits: int, power_t: int): return factorial(power_t) * factorial(dim - 1) / factorial(power_t + dim - 1) - - def _check_hermitian_or_not_gpu(matrix, backend=None): """Checks if a given matrix is Hermitian and whether the backend is neither :class:`qibojit.backends.CupyBackend` From c915609159501aa997d313a63c7fa3431e534020 Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Mon, 4 Dec 2023 15:41:39 +0400 Subject: [PATCH 122/143] add reference --- src/qibo/quantum_info/metrics.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/qibo/quantum_info/metrics.py b/src/qibo/quantum_info/metrics.py index b510461b45..9e2f86e25b 100644 --- a/src/qibo/quantum_info/metrics.py +++ b/src/qibo/quantum_info/metrics.py @@ -1181,6 +1181,11 @@ def frame_potential( Returns: float: Frame potential of the parametrized circuit. + + References: + 1. M. Liu *et al.*, *Estimating the randomness of quantum circuit ensembles up to 50 qubits*. + `arXiv:2205.09900 [quant-ph] `_. + """ if isinstance(power_t, int) is False: raise_error( From 620182be748e258705659442dc7614ce92f63f25 Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Mon, 4 Dec 2023 15:45:10 +0400 Subject: [PATCH 123/143] add reference --- src/qibo/quantum_info/metrics.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/qibo/quantum_info/metrics.py b/src/qibo/quantum_info/metrics.py index 9e2f86e25b..c204f3cc95 100644 --- a/src/qibo/quantum_info/metrics.py +++ b/src/qibo/quantum_info/metrics.py @@ -1156,7 +1156,7 @@ def frame_potential( """Returns the frame potential of a parametrized circuit under uniform sampling of the parameters. For :math:`n` qubits and moment :math:`t`, the frame potential - :math:`\\mathcal{F}_{\\mathcal{U}}^{(t)}` if given by + :math:`\\mathcal{F}_{\\mathcal{U}}^{(t)}` if given by [1] ..math:: \\mathcal{F}_{\\mathcal{U}}^{(t)} = \\int_{U,V \\in \\mathcal{U}} \\, @@ -1225,10 +1225,10 @@ def frame_potential_haar(nqubits: int, power_t: int): """Returns the frame potential of the Haar distirbution. For :math:`n` qubits and moment :math:`t`, the frame potential - of the Haar distribution is given by + of the Haar distribution is given by [1] .. math:: - \\frac{t! \\, (d - 1)!}{(t + d - 1)!} \\, , + \\mathcal{F}_{\\textup{Haar}}^{(t)} = \\frac{t! \\, (d - 1)!}{(t + d - 1)!} \\, , where :math:`d = 2^{n}`. @@ -1238,6 +1238,10 @@ def frame_potential_haar(nqubits: int, power_t: int): Returns: float: Frame potential of the Haar distribution. + + References: + 1. M. Kliesch and I. Roth, *Theory of quantum system certification*, + `PRX Quantum 2, 010201 (2021) `_. """ dim = 2**nqubits From 49825692e4f3867f7756fe68e93f51ef7bb7dc3a Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Mon, 4 Dec 2023 16:06:41 +0400 Subject: [PATCH 124/143] raise error --- src/qibo/gates/channels.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/qibo/gates/channels.py b/src/qibo/gates/channels.py index 07c4932e5d..aeaaf6f02e 100644 --- a/src/qibo/gates/channels.py +++ b/src/qibo/gates/channels.py @@ -179,6 +179,14 @@ def to_pauli_liouville( return super_op + def matrix(self, backend=None): + """""" + raise_error( + NotImplementedError, + "`matrix` method not defined for Channels. " + + "Please use one of the following methods: " + + "`to_choi` or `to_liouville` or `to_pauli_liouville`." + ) class KrausChannel(Channel): """General channel defined by arbitrary Kraus operators. From e62ef9a8a6693e9478a259893f9def7fde00bd46 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 4 Dec 2023 12:09:25 +0000 Subject: [PATCH 125/143] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/qibo/gates/channels.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/qibo/gates/channels.py b/src/qibo/gates/channels.py index aeaaf6f02e..d63ad9a354 100644 --- a/src/qibo/gates/channels.py +++ b/src/qibo/gates/channels.py @@ -185,9 +185,10 @@ def matrix(self, backend=None): NotImplementedError, "`matrix` method not defined for Channels. " + "Please use one of the following methods: " - + "`to_choi` or `to_liouville` or `to_pauli_liouville`." + + "`to_choi` or `to_liouville` or `to_pauli_liouville`.", ) + class KrausChannel(Channel): """General channel defined by arbitrary Kraus operators. From ca9d7a1dbbd2a65315443030067a137297d2f969 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 4 Dec 2023 19:52:37 +0400 Subject: [PATCH 126/143] Drop matplotlib dependency --- poetry.lock | 282 ++++++++++++++++++++++++++++++++++++++++++++++--- pyproject.toml | 3 +- 2 files changed, 270 insertions(+), 15 deletions(-) diff --git a/poetry.lock b/poetry.lock index dee141d25a..4142900c5f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,9 +1,10 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. [[package]] name = "absl-py" version = "2.0.0" description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -15,6 +16,7 @@ files = [ name = "alabaster" version = "0.7.13" description = "A configurable sidebar-enabled Sphinx theme" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -26,6 +28,7 @@ files = [ name = "anyio" version = "4.1.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -47,6 +50,7 @@ trio = ["trio (>=0.23)"] name = "astroid" version = "2.15.8" description = "An abstract syntax tree for Python with inference support." +category = "dev" optional = false python-versions = ">=3.7.2" files = [ @@ -66,6 +70,7 @@ wrapt = [ name = "asttokens" version = "2.4.1" description = "Annotate AST trees with source code positions" +category = "dev" optional = false python-versions = "*" files = [ @@ -84,6 +89,7 @@ test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] name = "astunparse" version = "1.6.3" description = "An AST unparser for Python" +category = "dev" optional = false python-versions = "*" files = [ @@ -99,6 +105,7 @@ wheel = ">=0.23.0,<1.0" name = "attrs" version = "21.4.0" description = "Classes Without Boilerplate" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -116,6 +123,7 @@ tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy" name = "babel" version = "2.13.1" description = "Internationalization utilities" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -130,6 +138,7 @@ dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] name = "beautifulsoup4" version = "4.12.2" description = "Screen-scraping library" +category = "dev" optional = false python-versions = ">=3.6.0" files = [ @@ -148,6 +157,7 @@ lxml = ["lxml"] name = "bleach" version = "6.1.0" description = "An easy safelist-based HTML-sanitizing tool." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -166,6 +176,7 @@ css = ["tinycss2 (>=1.1.0,<1.3)"] name = "cachetools" version = "5.3.2" description = "Extensible memoizing collections and decorators" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -177,6 +188,7 @@ files = [ name = "certifi" version = "2023.11.17" description = "Python package for providing Mozilla's CA Bundle." +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -188,6 +200,7 @@ files = [ name = "cffi" version = "1.16.0" description = "Foreign Function Interface for Python calling C code." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -252,6 +265,7 @@ pycparser = "*" name = "charset-normalizer" version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "dev" optional = false python-versions = ">=3.7.0" files = [ @@ -351,6 +365,7 @@ files = [ name = "cirq" version = "1.3.0" description = "A framework for creating, editing, and invoking Noisy Intermediate Scale Quantum (NISQ) circuits." +category = "dev" optional = false python-versions = ">=3.9.0" files = [ @@ -374,6 +389,7 @@ dev-env = ["asv", "black (==23.3.0)", "codeowners", "coverage (<=6.2)", "fileloc name = "cirq-aqt" version = "1.3.0" description = "A Cirq package to simulate and connect to Alpine Quantum Technologies quantum computers" +category = "dev" optional = false python-versions = ">=3.9.0" files = [ @@ -388,6 +404,7 @@ requests = ">=2.18,<3.0" name = "cirq-core" version = "1.3.0" description = "A framework for creating, editing, and invoking Noisy Intermediate Scale Quantum (NISQ) circuits." +category = "dev" optional = false python-versions = ">=3.9.0" files = [ @@ -413,6 +430,7 @@ contrib = ["autoray", "numba (>=0.53.0)", "opt-einsum", "ply (>=3.6)", "pylatex name = "cirq-ft" version = "1.3.0" description = "A Cirq package for fault-tolerant algorithms" +category = "dev" optional = false python-versions = ">=3.9.0" files = [ @@ -431,6 +449,7 @@ nbformat = "*" name = "cirq-google" version = "1.3.0" description = "The Cirq module that provides tools and access to the Google Quantum Computing Service" +category = "dev" optional = false python-versions = ">=3.9.0" files = [ @@ -447,6 +466,7 @@ protobuf = ">=3.15.0" name = "cirq-ionq" version = "1.3.0" description = "A Cirq package to simulate and connect to IonQ quantum computers" +category = "dev" optional = false python-versions = ">=3.9.0" files = [ @@ -461,6 +481,7 @@ requests = ">=2.18,<3.0" name = "cirq-pasqal" version = "1.3.0" description = "A Cirq package to simulate and connect to Pasqal quantum computers" +category = "dev" optional = false python-versions = ">=3.9.0" files = [ @@ -475,6 +496,7 @@ requests = ">=2.18,<3.0" name = "cirq-rigetti" version = "1.3.0" description = "A Cirq package to simulate and connect to Rigetti quantum computers and Quil QVM" +category = "dev" optional = false python-versions = ">=3.9.0" files = [ @@ -489,6 +511,7 @@ pyquil = ">=3.2.0,<4.0.0" name = "cirq-web" version = "1.3.0" description = "Web-based 3D visualization tools for Cirq." +category = "dev" optional = false python-versions = ">=3.9.0" files = [ @@ -502,6 +525,7 @@ cirq-core = "1.3.0" name = "clarabel" version = "0.6.0" description = "Clarabel Conic Interior Point Solver for Rust / Python" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -523,6 +547,7 @@ scipy = "*" name = "cloudpickle" version = "3.0.0" description = "Pickler class to extend the standard pickle.Pickler functionality" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -534,6 +559,7 @@ files = [ name = "cma" version = "3.3.0" description = "CMA-ES, Covariance Matrix Adaptation Evolution Strategy for non-linear numerical optimization in Python" +category = "main" optional = false python-versions = "*" files = [ @@ -552,6 +578,7 @@ plotting = ["matplotlib"] name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -563,6 +590,7 @@ files = [ name = "comm" version = "0.2.0" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -580,6 +608,7 @@ test = ["pytest"] name = "commonmark" version = "0.9.1" description = "Python parser for the CommonMark Markdown spec" +category = "dev" optional = false python-versions = "*" files = [ @@ -594,6 +623,7 @@ test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] name = "contourpy" version = "1.2.0" description = "Python library for calculating contours of 2D quadrilateral grids" +category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -657,6 +687,7 @@ test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] name = "coverage" version = "7.3.2" description = "Code coverage measurement for Python" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -724,6 +755,7 @@ toml = ["tomli"] name = "cupy-cuda11x" version = "12.2.0" description = "CuPy: NumPy & SciPy for GPU" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -754,6 +786,7 @@ test = ["hypothesis (>=6.37.2,<6.55.0)", "pytest (>=7.2)"] name = "cupy-cuda12x" version = "12.2.0" description = "CuPy: NumPy & SciPy for GPU" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -784,6 +817,7 @@ test = ["hypothesis (>=6.37.2,<6.55.0)", "pytest (>=7.2)"] name = "cuquantum-python-cu11" version = "23.10.0" description = "NVIDIA cuQuantum Python" +category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -804,6 +838,7 @@ numpy = ">=1.21,<2.0" name = "cuquantum-python-cu12" version = "23.10.0" description = "NVIDIA cuQuantum Python" +category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -825,6 +860,7 @@ numpy = ">=1.21,<2.0" name = "custatevec-cu11" version = "1.5.0" description = "cuStateVec - a component of NVIDIA cuQuantum SDK" +category = "dev" optional = false python-versions = "*" files = [ @@ -836,6 +872,7 @@ files = [ name = "custatevec-cu12" version = "1.5.0" description = "cuStateVec - a component of NVIDIA cuQuantum SDK" +category = "dev" optional = false python-versions = "*" files = [ @@ -847,28 +884,33 @@ files = [ name = "cutensor-cu11" version = "1.7.0" description = "NVIDIA cuTENSOR" +category = "dev" optional = false 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]] name = "cutensor-cu12" version = "1.7.0" description = "NVIDIA cuTENSOR" +category = "dev" optional = false 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]] name = "cutensornet-cu11" version = "2.3.0" description = "cuTensorNet - a component of NVIDIA cuQuantum SDK" +category = "dev" optional = false python-versions = "*" files = [ @@ -883,6 +925,7 @@ cutensor-cu11 = ">=1.6.1,<2" name = "cutensornet-cu12" version = "2.3.0" description = "cuTensorNet - a component of NVIDIA cuQuantum SDK" +category = "dev" optional = false python-versions = "*" files = [ @@ -897,6 +940,7 @@ cutensor-cu12 = ">=1.6.1,<2" name = "cvxpy" version = "1.4.1" description = "A domain-specific language for modeling convex optimization problems in Python." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -955,6 +999,7 @@ xpress = ["xpress"] name = "cycler" version = "0.12.1" description = "Composable style cycles" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -970,6 +1015,7 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] name = "decorator" version = "5.1.1" description = "Decorators for Humans" +category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -981,6 +1027,7 @@ files = [ name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -992,6 +1039,7 @@ files = [ name = "deprecated" version = "1.2.14" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1009,6 +1057,7 @@ dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] name = "dill" version = "0.3.7" description = "serialize all of Python" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1023,6 +1072,7 @@ graph = ["objgraph (>=1.7.2)"] name = "docutils" version = "0.19" description = "Docutils -- Python Documentation Utilities" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1034,6 +1084,7 @@ files = [ name = "duet" version = "0.2.9" description = "A simple future-based async library for python." +category = "dev" optional = false python-versions = ">=3.9.0" files = [ @@ -1042,12 +1093,13 @@ files = [ ] [package.extras] -dev-env = ["black (==22.3.0)", "isort (==5.7.*)", "mypy (==0.931.*)", "pylint (==2.10.*)", "pytest (==6.2.*)", "twine (==3.3.*)", "wheel"] +dev-env = ["black (==22.3.0)", "isort (>=5.7.0,<5.8.0)", "mypy (>=0.931.0,<0.932.0)", "pylint (>=2.10.0,<2.11.0)", "pytest (>=6.2.0,<6.3.0)", "twine (>=3.3.0,<3.4.0)", "wheel"] [[package]] name = "ecos" version = "2.0.12" description = "This is the Python package for ECOS: Embedded Cone Solver. See Github page for more information." +category = "dev" optional = false python-versions = "*" files = [ @@ -1077,6 +1129,7 @@ scipy = ">=0.9" name = "exceptiongroup" version = "1.2.0" description = "Backport of PEP 654 (exception groups)" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1091,6 +1144,7 @@ test = ["pytest (>=6)"] name = "executing" version = "2.0.1" description = "Get the currently executing AST node of a frame, and other information" +category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1105,6 +1159,7 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth name = "fancycompleter" version = "0.9.1" description = "colorful TAB completion for Python prompt" +category = "dev" optional = false python-versions = "*" files = [ @@ -1120,6 +1175,7 @@ pyrepl = ">=0.8.2" name = "fastjsonschema" version = "2.19.0" description = "Fastest Python implementation of JSON schema" +category = "dev" optional = false python-versions = "*" files = [ @@ -1134,6 +1190,7 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc name = "fastrlock" version = "0.8.2" description = "Fast, re-entrant optimistic lock implemented in Cython" +category = "dev" optional = false python-versions = "*" files = [ @@ -1218,6 +1275,7 @@ files = [ name = "flatbuffers" version = "23.5.26" description = "The FlatBuffers serialization format for Python" +category = "dev" optional = false python-versions = "*" files = [ @@ -1229,6 +1287,7 @@ files = [ name = "fonttools" version = "4.45.1" description = "Tools to manipulate font files" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1294,6 +1353,7 @@ woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] name = "furo" version = "2022.12.7" description = "A clean customisable Sphinx documentation theme." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1311,6 +1371,7 @@ sphinx-basic-ng = "*" name = "future" version = "0.18.3" description = "Clean single-source support for Python 3 and 2" +category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -1321,6 +1382,7 @@ files = [ name = "gast" version = "0.5.4" description = "Python AST that abstracts the underlying Python version" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1332,6 +1394,7 @@ files = [ name = "google-api-core" version = "2.14.0" description = "Google API client core library" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1343,11 +1406,11 @@ files = [ google-auth = ">=2.14.1,<3.0.dev0" googleapis-common-protos = ">=1.56.2,<2.0.dev0" grpcio = [ - {version = ">=1.33.2,<2.0dev", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""}, {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, ] grpcio-status = [ - {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""}, {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, ] protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" @@ -1362,6 +1425,7 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] name = "google-auth" version = "2.24.0" description = "Google Authentication Library" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1385,6 +1449,7 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] name = "google-auth-oauthlib" version = "1.0.0" description = "Google Authentication Library" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1403,6 +1468,7 @@ tool = ["click (>=6.0.0)"] name = "google-pasta" version = "0.2.0" description = "pasta is an AST-based Python refactoring library" +category = "dev" optional = false python-versions = "*" files = [ @@ -1418,6 +1484,7 @@ six = "*" name = "googleapis-common-protos" version = "1.61.0" description = "Common protobufs used in Google APIs" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1435,6 +1502,7 @@ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] name = "grpcio" version = "1.59.3" description = "HTTP/2-based RPC framework" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1501,6 +1569,7 @@ protobuf = ["grpcio-tools (>=1.59.3)"] name = "grpcio-status" version = "1.59.3" description = "Status proto mapping for gRPC" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1517,6 +1586,7 @@ protobuf = ">=4.21.6" name = "h11" version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1528,6 +1598,7 @@ files = [ name = "h5py" version = "3.10.0" description = "Read and write HDF5 files from Python" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1565,6 +1636,7 @@ numpy = ">=1.17.3" name = "httpcore" version = "0.16.3" description = "A minimal low-level HTTP client." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1576,16 +1648,17 @@ files = [ anyio = ">=3.0,<5.0" certifi = "*" h11 = ">=0.13,<0.15" -sniffio = "==1.*" +sniffio = ">=1.0.0,<2.0.0" [package.extras] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] [[package]] name = "httpx" version = "0.23.3" description = "The next generation HTTP client." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1601,14 +1674,15 @@ sniffio = "*" [package.extras] brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<13)"] +cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<13)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] [[package]] name = "hyperopt" version = "0.2.7" description = "Distributed Asynchronous Hyperparameter Optimization" +category = "main" optional = false python-versions = "*" files = [ @@ -1636,6 +1710,7 @@ sparktrials = ["pyspark"] name = "idna" version = "3.6" description = "Internationalized Domain Names in Applications (IDNA)" +category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1647,6 +1722,7 @@ files = [ name = "imagesize" version = "1.4.1" description = "Getting image size from png/jpeg/jpeg2000/gif file" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1658,6 +1734,7 @@ files = [ name = "importlib-metadata" version = "6.9.0" description = "Read metadata from Python packages" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1677,6 +1754,7 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs name = "importlib-resources" version = "6.1.1" description = "Read resources from Python packages" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1695,6 +1773,7 @@ testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1706,6 +1785,7 @@ files = [ name = "ipython" version = "8.18.1" description = "IPython: Productive Interactive Computing" +category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -1743,6 +1823,7 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pa name = "ipywidgets" version = "8.1.1" description = "Jupyter interactive widgets" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1764,6 +1845,7 @@ test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] name = "iso8601" version = "1.1.0" description = "Simple module to parse ISO 8601 dates" +category = "dev" optional = false python-versions = ">=3.6.2,<4.0" files = [ @@ -1775,6 +1857,7 @@ files = [ name = "isort" version = "5.12.0" description = "A Python utility / library to sort Python imports." +category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -1792,6 +1875,7 @@ requirements-deprecated-finder = ["pip-api", "pipreqs"] name = "jedi" version = "0.19.1" description = "An autocompletion tool for Python that can be used for text editors." +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1811,6 +1895,7 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1828,6 +1913,7 @@ i18n = ["Babel (>=2.7)"] name = "joblib" version = "1.3.2" description = "Lightweight pipelining with Python functions" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1839,6 +1925,7 @@ files = [ name = "jsonschema" version = "4.17.3" description = "An implementation of JSON Schema validation for Python" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1858,6 +1945,7 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- name = "jupyter-client" version = "8.6.0" description = "Jupyter protocol implementation and client libraries" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1867,7 +1955,7 @@ files = [ [package.dependencies] importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" python-dateutil = ">=2.8.2" pyzmq = ">=23.0" tornado = ">=6.2" @@ -1881,6 +1969,7 @@ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pyt name = "jupyter-core" version = "5.5.0" description = "Jupyter core package. A base package on which Jupyter projects rely." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1901,6 +1990,7 @@ test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] name = "jupyterlab-pygments" version = "0.3.0" description = "Pygments theme using JupyterLab CSS variables" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1912,6 +2002,7 @@ files = [ name = "jupyterlab-widgets" version = "3.0.9" description = "Jupyter interactive widgets for JupyterLab" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1923,6 +2014,7 @@ files = [ name = "keras" version = "2.14.0" description = "Deep learning for humans." +category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -1934,6 +2026,7 @@ files = [ name = "kiwisolver" version = "1.4.5" description = "A fast implementation of the Cassowary constraint solver" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2047,6 +2140,7 @@ files = [ name = "lark" version = "0.11.3" description = "a modern parsing library" +category = "dev" optional = false python-versions = "*" files = [ @@ -2062,6 +2156,7 @@ regex = ["regex"] name = "latexcodec" version = "2.0.1" description = "A lexer and codec to work with LaTeX code in Python." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2076,6 +2171,7 @@ six = ">=1.4.1" name = "lazy-object-proxy" version = "1.9.0" description = "A fast and thorough lazy object proxy." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2121,9 +2217,12 @@ files = [ name = "libclang" version = "16.0.6" description = "Clang Python Bindings, mirrored from the official LLVM repo: https://github.com/llvm/llvm-project/tree/main/clang/bindings/python, to make the installation process easier." +category = "dev" optional = false python-versions = "*" files = [ + {file = "libclang-16.0.6-1-py2.py3-none-manylinux2014_aarch64.whl", hash = "sha256:88bc7e7b393c32e41e03ba77ef02fdd647da1f764c2cd028e69e0837080b79f6"}, + {file = "libclang-16.0.6-1-py2.py3-none-manylinux2014_armv7l.whl", hash = "sha256:d80ed5827736ed5ec2bcedf536720476fd9d4fa4c79ef0cb24aea4c59332f361"}, {file = "libclang-16.0.6-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:da9e47ebc3f0a6d90fb169ef25f9fbcd29b4a4ef97a8b0e3e3a17800af1423f4"}, {file = "libclang-16.0.6-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:e1a5ad1e895e5443e205568c85c04b4608e4e973dae42f4dfd9cb46c81d1486b"}, {file = "libclang-16.0.6-py2.py3-none-manylinux2010_x86_64.whl", hash = "sha256:9dcdc730939788b8b69ffd6d5d75fe5366e3ee007f1e36a99799ec0b0c001492"}, @@ -2139,6 +2238,7 @@ files = [ name = "llvmlite" version = "0.41.1" description = "lightweight wrapper around basic LLVM functionality" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2172,6 +2272,7 @@ files = [ name = "markdown" version = "3.5.1" description = "Python implementation of John Gruber's Markdown." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2190,6 +2291,7 @@ testing = ["coverage", "pyyaml"] name = "markupsafe" version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2213,6 +2315,16 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -2249,6 +2361,7 @@ files = [ name = "matplotlib" version = "3.8.2" description = "Python plotting package" +category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -2298,6 +2411,7 @@ python-dateutil = ">=2.7" name = "matplotlib-inline" version = "0.1.6" description = "Inline Matplotlib backend for Jupyter" +category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -2312,6 +2426,7 @@ traitlets = "*" name = "mccabe" version = "0.7.0" description = "McCabe checker, plugin for flake8" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2323,6 +2438,7 @@ files = [ name = "mistune" version = "3.0.2" description = "A sane and fast Markdown parser with useful plugins and renderers" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2334,6 +2450,7 @@ files = [ name = "ml-dtypes" version = "0.2.0" description = "" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2358,9 +2475,9 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.23.3", markers = "python_version > \"3.10\""}, - {version = ">=1.21.2", markers = "python_version > \"3.9\" and python_version <= \"3.10\""}, {version = ">1.20", markers = "python_version <= \"3.9\""}, + {version = ">=1.23.3", markers = "python_version > \"3.10\""}, + {version = ">=1.21.2", markers = "python_version > \"3.9\""}, ] [package.extras] @@ -2370,6 +2487,7 @@ dev = ["absl-py", "pyink", "pylint (>=2.6.0)", "pytest", "pytest-xdist"] name = "mpmath" version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" +category = "main" optional = false python-versions = "*" files = [ @@ -2387,6 +2505,7 @@ tests = ["pytest (>=4.6)"] name = "msgpack" version = "1.0.7" description = "MessagePack serializer" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2452,6 +2571,7 @@ files = [ name = "nbclient" version = "0.9.0" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -2461,7 +2581,7 @@ files = [ [package.dependencies] jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" nbformat = ">=5.1" traitlets = ">=5.4" @@ -2474,6 +2594,7 @@ test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>= name = "nbconvert" version = "7.11.0" description = "Converting Jupyter Notebooks" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2512,6 +2633,7 @@ webpdf = ["playwright"] name = "nbformat" version = "5.9.2" description = "The Jupyter Notebook format" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2533,6 +2655,7 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] name = "nbsphinx" version = "0.8.12" description = "Jupyter Notebook Tools for Sphinx" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2552,6 +2675,7 @@ traitlets = ">=5" name = "networkx" version = "3.2.1" description = "Python package for creating and manipulating graphs and networks" +category = "main" optional = false python-versions = ">=3.9" files = [ @@ -2570,6 +2694,7 @@ test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] name = "numba" version = "0.58.1" description = "compiling Python code using LLVM" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2597,13 +2722,14 @@ files = [ ] [package.dependencies] -llvmlite = "==0.41.*" +llvmlite = ">=0.41.0dev0,<0.42" numpy = ">=1.22,<1.27" [[package]] name = "numpy" version = "1.26.2" description = "Fundamental package for array computing in Python" +category = "main" optional = false python-versions = ">=3.9" files = [ @@ -2649,6 +2775,7 @@ files = [ name = "oauthlib" version = "3.2.2" description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2665,6 +2792,7 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] name = "opt-einsum" version = "3.3.0" description = "Optimizing numpys einsum function" +category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -2683,6 +2811,7 @@ tests = ["pytest", "pytest-cov", "pytest-pep8"] name = "osqp" version = "0.6.3" description = "OSQP: The Operator Splitting QP Solver" +category = "dev" optional = false python-versions = "*" files = [ @@ -2722,6 +2851,7 @@ scipy = ">=0.13.2" name = "packaging" version = "23.2" description = "Core utilities for Python packages" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2733,6 +2863,7 @@ files = [ name = "pandas" version = "2.1.3" description = "Powerful data structures for data analysis, time series, and statistics" +category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -2800,6 +2931,7 @@ xml = ["lxml (>=4.8.0)"] name = "pandocfilters" version = "1.5.0" description = "Utilities for writing pandoc filters in python" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2811,6 +2943,7 @@ files = [ name = "parso" version = "0.8.3" description = "A Python Parser" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2826,6 +2959,7 @@ testing = ["docopt", "pytest (<6.0.0)"] name = "pdbpp" version = "0.10.3" description = "pdb++, a drop-in replacement for pdb" +category = "dev" optional = false python-versions = "*" files = [ @@ -2846,6 +2980,7 @@ testing = ["funcsigs", "pytest"] name = "pexpect" version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." +category = "dev" optional = false python-versions = "*" files = [ @@ -2860,6 +2995,7 @@ ptyprocess = ">=0.5" name = "pillow" version = "10.1.0" description = "Python Imaging Library (Fork)" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2927,6 +3063,7 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa name = "platformdirs" version = "4.0.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2942,6 +3079,7 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-co name = "pluggy" version = "1.3.0" description = "plugin and hook calling mechanisms for python" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2957,6 +3095,7 @@ testing = ["pytest", "pytest-benchmark"] name = "ply" version = "3.11" description = "Python Lex & Yacc" +category = "dev" optional = false python-versions = "*" files = [ @@ -2968,6 +3107,7 @@ files = [ name = "prompt-toolkit" version = "3.0.41" description = "Library for building powerful interactive command lines in Python" +category = "dev" optional = false python-versions = ">=3.7.0" files = [ @@ -2982,6 +3122,7 @@ wcwidth = "*" name = "proto-plus" version = "1.22.3" description = "Beautiful, Pythonic protocol buffers." +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2999,6 +3140,7 @@ testing = ["google-api-core[grpc] (>=1.31.5)"] name = "protobuf" version = "4.25.1" description = "" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3019,6 +3161,7 @@ files = [ name = "psutil" version = "5.9.6" description = "Cross-platform lib for process and system monitoring in Python." +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ @@ -3047,6 +3190,7 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" +category = "dev" optional = false python-versions = "*" files = [ @@ -3058,6 +3202,7 @@ files = [ name = "pure-eval" version = "0.2.2" description = "Safely evaluate AST nodes without side effects" +category = "dev" optional = false python-versions = "*" files = [ @@ -3072,6 +3217,7 @@ tests = ["pytest"] name = "py4j" version = "0.10.9.7" description = "Enables Python programs to dynamically access arbitrary Java objects" +category = "main" optional = false python-versions = "*" files = [ @@ -3083,6 +3229,7 @@ files = [ name = "pyasn1" version = "0.5.1" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -3094,6 +3241,7 @@ files = [ name = "pyasn1-modules" version = "0.3.0" description = "A collection of ASN.1-based protocols modules" +category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -3108,6 +3256,7 @@ pyasn1 = ">=0.4.6,<0.6.0" name = "pybind11" version = "2.11.1" description = "Seamless operability between C++11 and Python" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3122,6 +3271,7 @@ global = ["pybind11-global (==2.11.1)"] name = "pybtex" version = "0.24.0" description = "A BibTeX-compatible bibliography processor in Python" +category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" files = [ @@ -3141,6 +3291,7 @@ test = ["pytest"] name = "pybtex-docutils" version = "1.0.3" description = "A docutils backend for pybtex." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3156,6 +3307,7 @@ pybtex = ">=0.16" name = "pycparser" version = "2.21" description = "C parser in Python" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3167,6 +3319,7 @@ files = [ name = "pydantic" version = "1.10.13" description = "Data validation and settings management using python type hints" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3219,6 +3372,7 @@ email = ["email-validator (>=1.0.3)"] name = "pygments" version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3234,6 +3388,7 @@ windows-terminal = ["colorama (>=0.4.6)"] name = "pyjwt" version = "2.8.0" description = "JSON Web Token implementation in Python" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3251,6 +3406,7 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] name = "pylint" version = "2.17.7" description = "python code static checker" +category = "dev" optional = false python-versions = ">=3.7.2" files = [ @@ -3280,6 +3436,7 @@ testutils = ["gitpython (>3)"] name = "pyparsing" version = "3.1.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "dev" optional = false python-versions = ">=3.6.8" files = [ @@ -3294,6 +3451,7 @@ diagrams = ["jinja2", "railroad-diagrams"] name = "pyquil" version = "3.5.4" description = "A Python library for creating Quantum Instruction Language (Quil) programs." +category = "dev" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -3322,6 +3480,7 @@ latex = ["ipython (>=7.21.0,<8.0.0)"] name = "pyreadline" version = "2.1" description = "A python implmementation of GNU readline." +category = "dev" optional = false python-versions = "*" files = [ @@ -3332,6 +3491,7 @@ files = [ name = "pyrepl" version = "0.9.0" description = "A library for building flexible command line interfaces" +category = "dev" optional = false python-versions = "*" files = [ @@ -3342,6 +3502,7 @@ files = [ name = "pyrsistent" version = "0.20.0" description = "Persistent/Functional/Immutable data structures" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3383,6 +3544,7 @@ files = [ name = "pytest" version = "7.4.3" description = "pytest: simple powerful testing with Python" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3405,6 +3567,7 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no name = "pytest-cov" version = "4.1.0" description = "Pytest plugin for measuring coverage." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3423,6 +3586,7 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" +category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -3437,6 +3601,7 @@ six = ">=1.5" name = "python-rapidjson" version = "1.13" description = "Python wrapper around rapidjson" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3502,6 +3667,7 @@ files = [ name = "pytz" version = "2023.3.post1" description = "World timezone definitions, modern and historical" +category = "dev" optional = false python-versions = "*" files = [ @@ -3513,6 +3679,7 @@ files = [ name = "pywin32" version = "306" description = "Python for Window Extensions" +category = "dev" optional = false python-versions = "*" files = [ @@ -3536,6 +3703,7 @@ files = [ name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3544,6 +3712,7 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -3551,8 +3720,15 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -3569,6 +3745,7 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -3576,6 +3753,7 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -3585,6 +3763,7 @@ files = [ name = "pyzmq" version = "25.1.1" description = "Python bindings for 0MQ" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3690,6 +3869,7 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} name = "qcs-api-client" version = "0.21.6" description = "A client library for accessing the Rigetti QCS API" +category = "dev" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -3712,6 +3892,7 @@ toml = ">=0.10.2,<0.11.0" name = "qdldl" version = "0.1.7.post0" description = "QDLDL, a free LDL factorization routine." +category = "dev" optional = false python-versions = "*" files = [ @@ -3744,6 +3925,7 @@ scipy = ">=0.13.2" name = "qibojit" version = "0.1.3" description = "Simulation tools based on numba and cupy." +category = "dev" optional = false python-versions = ">=3.9.0,<3.12" files = [] @@ -3765,6 +3947,7 @@ resolved_reference = "c621acf3c8b8ffaaa67f76114b5ab9a086aea6d8" name = "recommonmark" version = "0.7.1" description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." +category = "dev" optional = false python-versions = "*" files = [ @@ -3781,6 +3964,7 @@ sphinx = ">=1.3.1" name = "requests" version = "2.31.0" description = "Python HTTP for Humans." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3802,6 +3986,7 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "requests-oauthlib" version = "1.3.1" description = "OAuthlib authentication support for Requests." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3820,6 +4005,7 @@ rsa = ["oauthlib[signedtoken] (>=3.0.0)"] name = "retrying" version = "1.3.4" description = "Retrying" +category = "dev" optional = false python-versions = "*" files = [ @@ -3834,6 +4020,7 @@ six = ">=1.7.0" name = "rfc3339" version = "6.2" description = "Format dates according to the RFC 3339." +category = "dev" optional = false python-versions = "*" files = [ @@ -3845,6 +4032,7 @@ files = [ name = "rfc3986" version = "1.5.0" description = "Validating URI References per RFC 3986" +category = "dev" optional = false python-versions = "*" files = [ @@ -3862,6 +4050,7 @@ idna2008 = ["idna"] name = "rpcq" version = "3.11.0" description = "The RPC framework and message specification for Rigetti QCS." +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3878,6 +4067,7 @@ pyzmq = ">=17" name = "rsa" version = "4.9" description = "Pure-Python RSA implementation" +category = "dev" optional = false python-versions = ">=3.6,<4" files = [ @@ -3892,6 +4082,7 @@ pyasn1 = ">=0.1.3" name = "ruamel-yaml" version = "0.18.5" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3910,6 +4101,7 @@ jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] name = "ruamel-yaml-clib" version = "0.2.8" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3969,6 +4161,7 @@ files = [ name = "scikit-learn" version = "1.3.2" description = "A set of python modules for machine learning and data mining" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4016,6 +4209,7 @@ tests = ["black (>=23.3.0)", "matplotlib (>=3.1.3)", "mypy (>=1.3)", "numpydoc ( name = "scipy" version = "1.11.4" description = "Fundamental algorithms for scientific computing in Python" +category = "main" optional = false python-versions = ">=3.9" files = [ @@ -4058,6 +4252,7 @@ test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeo name = "scs" version = "3.2.4.post1" description = "Splitting conic solver" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4091,6 +4286,7 @@ scipy = "*" name = "setuptools" version = "69.0.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4107,6 +4303,7 @@ testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jar name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -4118,6 +4315,7 @@ files = [ name = "sniffio" version = "1.3.0" description = "Sniff out which async library your code is running under" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4129,6 +4327,7 @@ files = [ name = "snowballstemmer" version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +category = "dev" optional = false python-versions = "*" files = [ @@ -4140,6 +4339,7 @@ files = [ name = "sortedcontainers" version = "2.4.0" description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +category = "dev" optional = false python-versions = "*" files = [ @@ -4151,6 +4351,7 @@ files = [ name = "soupsieve" version = "2.5" description = "A modern CSS selector implementation for Beautiful Soup." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4162,6 +4363,7 @@ files = [ name = "sphinx" version = "6.2.1" description = "Python documentation generator" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4197,6 +4399,7 @@ test = ["cython", "filelock", "html5lib", "pytest (>=4.6)"] name = "sphinx-basic-ng" version = "1.0.0b2" description = "A modern skeleton for Sphinx themes." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4214,6 +4417,7 @@ docs = ["furo", "ipython", "myst-parser", "sphinx-copybutton", "sphinx-inline-ta name = "sphinx-copybutton" version = "0.5.2" description = "Add a copy button to each of your code cells." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4232,6 +4436,7 @@ rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"] name = "sphinx-markdown-tables" version = "0.0.17" description = "A Sphinx extension for rendering tables written in markdown" +category = "dev" optional = false python-versions = "*" files = [ @@ -4246,6 +4451,7 @@ markdown = ">=3.4" name = "sphinxcontrib-applehelp" version = "1.0.7" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" +category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -4264,6 +4470,7 @@ test = ["pytest"] name = "sphinxcontrib-bibtex" version = "2.5.0" description = "Sphinx extension for BibTeX style citations." +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -4282,6 +4489,7 @@ Sphinx = ">=2.1" name = "sphinxcontrib-devhelp" version = "1.0.5" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" +category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -4300,6 +4508,7 @@ test = ["pytest"] name = "sphinxcontrib-htmlhelp" version = "2.0.4" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -4318,6 +4527,7 @@ test = ["html5lib", "pytest"] name = "sphinxcontrib-jsmath" version = "1.0.1" description = "A sphinx extension which renders display math in HTML via JavaScript" +category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -4332,6 +4542,7 @@ test = ["flake8", "mypy", "pytest"] name = "sphinxcontrib-qthelp" version = "1.0.6" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" +category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -4350,6 +4561,7 @@ test = ["pytest"] name = "sphinxcontrib-serializinghtml" version = "1.1.9" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" +category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -4368,6 +4580,7 @@ test = ["pytest"] name = "stack-data" version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" +category = "dev" optional = false python-versions = "*" files = [ @@ -4387,6 +4600,7 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] name = "sympy" version = "1.12" description = "Computer algebra system (CAS) in Python" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4401,6 +4615,7 @@ mpmath = ">=0.19" name = "tabulate" version = "0.9.0" description = "Pretty-print tabular data" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4415,6 +4630,7 @@ widechars = ["wcwidth"] name = "tenacity" version = "8.2.3" description = "Retry code until it succeeds" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4429,6 +4645,7 @@ doc = ["reno", "sphinx", "tornado (>=4.5)"] name = "tensorboard" version = "2.14.1" description = "TensorBoard lets you watch Tensors Flow" +category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -4453,6 +4670,7 @@ werkzeug = ">=1.0.1" name = "tensorboard-data-server" version = "0.7.2" description = "Fast data loading for TensorBoard" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4465,6 +4683,7 @@ files = [ name = "tensorflow" version = "2.14.1" description = "TensorFlow is an open source machine learning framework for everyone." +category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -4516,6 +4735,7 @@ and-cuda = ["nvidia-cublas-cu11 (==11.11.3.6)", "nvidia-cuda-cupti-cu11 (==11.8. name = "tensorflow-estimator" version = "2.14.0" description = "TensorFlow Estimator." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4526,6 +4746,7 @@ files = [ name = "tensorflow-io-gcs-filesystem" version = "0.34.0" description = "TensorFlow IO" +category = "dev" optional = false python-versions = ">=3.7, <3.12" files = [ @@ -4561,6 +4782,7 @@ tensorflow-rocm = ["tensorflow-rocm (>=2.13.0,<2.14.0)"] name = "termcolor" version = "2.4.0" description = "ANSI color formatting for output in terminal" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4575,6 +4797,7 @@ tests = ["pytest", "pytest-cov"] name = "threadpoolctl" version = "3.2.0" description = "threadpoolctl" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4586,6 +4809,7 @@ files = [ name = "tinycss2" version = "1.2.1" description = "A tiny CSS parser" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4604,6 +4828,7 @@ test = ["flake8", "isort", "pytest"] name = "toml" version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -4615,6 +4840,7 @@ files = [ name = "tomli" version = "2.0.1" description = "A lil' TOML parser" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4626,6 +4852,7 @@ files = [ name = "tomlkit" version = "0.12.3" description = "Style preserving TOML library" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4637,6 +4864,7 @@ files = [ name = "tornado" version = "6.4" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +category = "dev" optional = false python-versions = ">= 3.8" files = [ @@ -4657,6 +4885,7 @@ files = [ name = "tqdm" version = "4.66.1" description = "Fast, Extensible Progress Meter" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4677,6 +4906,7 @@ telegram = ["requests"] name = "traitlets" version = "5.14.0" description = "Traitlets Python configuration system" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4692,6 +4922,7 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, name = "types-deprecated" version = "1.2.9.3" description = "Typing stubs for Deprecated" +category = "dev" optional = false python-versions = "*" files = [ @@ -4703,6 +4934,7 @@ files = [ name = "types-python-dateutil" version = "2.8.19.14" description = "Typing stubs for python-dateutil" +category = "dev" optional = false python-versions = "*" files = [ @@ -4714,6 +4946,7 @@ files = [ name = "types-retry" version = "0.9.9.4" description = "Typing stubs for retry" +category = "dev" optional = false python-versions = "*" files = [ @@ -4725,6 +4958,7 @@ files = [ name = "typing-extensions" version = "4.8.0" description = "Backported and Experimental Type Hints for Python 3.8+" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4736,6 +4970,7 @@ files = [ name = "tzdata" version = "2023.3" description = "Provider of IANA time zone data" +category = "dev" optional = false python-versions = ">=2" files = [ @@ -4747,6 +4982,7 @@ files = [ name = "urllib3" version = "2.1.0" description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4763,6 +4999,7 @@ zstd = ["zstandard (>=0.18.0)"] name = "wcwidth" version = "0.2.12" description = "Measures the displayed width of unicode strings in a terminal" +category = "dev" optional = false python-versions = "*" files = [ @@ -4774,6 +5011,7 @@ files = [ name = "webencodings" version = "0.5.1" description = "Character encoding aliases for legacy web content" +category = "dev" optional = false python-versions = "*" files = [ @@ -4785,6 +5023,7 @@ files = [ name = "werkzeug" version = "3.0.1" description = "The comprehensive WSGI web application library." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4802,6 +5041,7 @@ watchdog = ["watchdog (>=2.3)"] name = "wheel" version = "0.42.0" description = "A built-package format for Python" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4816,6 +5056,7 @@ test = ["pytest (>=6.0.0)", "setuptools (>=65)"] name = "widgetsnbextension" version = "4.0.9" description = "Jupyter interactive widgets for Jupyter Notebook" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4827,6 +5068,7 @@ files = [ name = "wmctrl" version = "0.5" description = "A tool to programmatically control windows inside X" +category = "dev" optional = false python-versions = ">=2.7" files = [ @@ -4844,6 +5086,7 @@ test = ["pytest"] name = "wrapt" version = "1.14.1" description = "Module for decorators, wrappers and monkey patching." +category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" files = [ @@ -4866,6 +5109,16 @@ files = [ {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, + {file = "wrapt-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecee4132c6cd2ce5308e21672015ddfed1ff975ad0ac8d27168ea82e71413f55"}, + {file = "wrapt-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2020f391008ef874c6d9e208b24f28e31bcb85ccff4f335f15a3251d222b92d9"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2feecf86e1f7a86517cab34ae6c2f081fd2d0dac860cb0c0ded96d799d20b335"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:240b1686f38ae665d1b15475966fe0472f78e71b1b4903c143a842659c8e4cb9"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9008dad07d71f68487c91e96579c8567c98ca4c3881b9b113bc7b33e9fd78b8"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6447e9f3ba72f8e2b985a1da758767698efa72723d5b59accefd716e9e8272bf"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:acae32e13a4153809db37405f5eba5bac5fbe2e2ba61ab227926a22901051c0a"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49ef582b7a1152ae2766557f0550a9fcbf7bbd76f43fbdc94dd3bf07cc7168be"}, + {file = "wrapt-1.14.1-cp311-cp311-win32.whl", hash = "sha256:358fe87cc899c6bb0ddc185bf3dbfa4ba646f05b1b0b9b5a27c2cb92c2cea204"}, + {file = "wrapt-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:26046cd03936ae745a502abf44dac702a5e6880b2b01c29aea8ddf3353b68224"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, @@ -4917,6 +5170,7 @@ files = [ name = "zipp" version = "3.17.0" description = "Backport of pathlib-compatible object wrapper for zip files" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4931,4 +5185,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "ff53a287bc359a3fef1c4471e8c6970a9e84f188e75c2b799a90c865571f42e1" +content-hash = "2ffeb38e9ad89b2a85ff19bd21c5098713e60cf2a8eea11c8dfb9d063443f751" diff --git a/pyproject.toml b/pyproject.toml index f2b5c16419..75654c0eee 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,6 @@ sympy = "^1.11.1" cma = "^3.3.0" joblib = "^1.2.0" hyperopt = "^0.2.7" -matplotlib = "^3.7.0" psutil = "^5.9.4" tabulate = "^0.9.0" @@ -76,6 +75,7 @@ docs-clean = "make -C doc clean" test-docs = "make -C doc doctest" + [tool.poetry.group.cuda11] optional = true @@ -85,6 +85,7 @@ cuquantum-python-cu11 = "^23.3.0" qibojit = { git = "https://github.com/qiboteam/qibojit.git" } + [tool.poetry.group.cuda12] optional = true From 84bc7e3c6a0359f9f0d9dd3fba5905ff98395177 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 5 Dec 2023 07:18:42 +0400 Subject: [PATCH 127/143] Add matplotlib to the tests group It is actually a dependency of the examples, but they are usually run together with the tests. For the time being it is not worth a separate group --- poetry.lock | 108 ++++++++++++++++++++++++------------------------- pyproject.toml | 3 +- 2 files changed, 55 insertions(+), 56 deletions(-) diff --git a/poetry.lock b/poetry.lock index 4142900c5f..9315646957 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1285,54 +1285,54 @@ files = [ [[package]] name = "fonttools" -version = "4.45.1" +version = "4.46.0" description = "Tools to manipulate font files" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.45.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:45fa321c458ea29224067700954ec44493ae869b47e7c5485a350a149a19fb53"}, - {file = "fonttools-4.45.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0dc7617d96b1e668eea9250e1c1fe62d0c78c3f69573ce7e3332cc40e6d84356"}, - {file = "fonttools-4.45.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ed3bda541e86725f6b4e1b94213f13ed1ae51a5a1f167028534cedea38c010"}, - {file = "fonttools-4.45.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f4a5870e3b56788fb196da8cf30d0dfd51a76dc3b907861d018165f76ae4c2"}, - {file = "fonttools-4.45.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a3c11d9687479f01eddef729aa737abcdea0a44fdaffb62a930a18892f186c9b"}, - {file = "fonttools-4.45.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:316cec50581e844c3ab69d7c82455b54c7cf18236b2f09e722faf665fbfcac58"}, - {file = "fonttools-4.45.1-cp310-cp310-win32.whl", hash = "sha256:e2277cba9f0b525e30de2a9ad3cb4219aa4bc697230c1645666b0deee9f914f0"}, - {file = "fonttools-4.45.1-cp310-cp310-win_amd64.whl", hash = "sha256:1b9e9ad2bcded9a1431afaa57c8d3c39143ac1f050862d66bddd863c515464a2"}, - {file = "fonttools-4.45.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff6a698bdd435d24c379f6e8a54908cd9bb7dda23719084d56bf8c87709bf3bd"}, - {file = "fonttools-4.45.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c980d60cd6ec1376206fe55013d166e5627ad0b149b5c81e74eaa913ab6134f"}, - {file = "fonttools-4.45.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a12dee6523c02ca78aeedd0a5e12bfa9b7b29896350edd5241542897b072ae23"}, - {file = "fonttools-4.45.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37cd1ced6efb3dd6fe82e9f9bf92fd74ac58a5aefc284045f59ecd517a5fb9ab"}, - {file = "fonttools-4.45.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e3d24248221bd7151dfff0d88b1b5da02dccd7134bd576ce8888199827bbaa19"}, - {file = "fonttools-4.45.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ba6c23591427844dfb0a13658f1718489de75de6a46b64234584c0d17573162d"}, - {file = "fonttools-4.45.1-cp311-cp311-win32.whl", hash = "sha256:cebcddbe9351b67166292b4f71ffdbfcce01ba4b07d4267824eb46b277aeb19a"}, - {file = "fonttools-4.45.1-cp311-cp311-win_amd64.whl", hash = "sha256:f22eb69996a0bd49f76bdefb30be54ce8dbb89a0d1246874d610f05c2aa2e69e"}, - {file = "fonttools-4.45.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:794de93e83297db7b4943f2431e206d8b1ea69cb3ae14638a49cc50332bf0db8"}, - {file = "fonttools-4.45.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4ba17822a6681d06849078daaf6e03eccc9f467efe7c4c60280e28a78e8e5df9"}, - {file = "fonttools-4.45.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e50f794d09df0675da8d9dbd7c66bfcab2f74a708343aabcad41936d26556891"}, - {file = "fonttools-4.45.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b07b857d4f9de3199a8c3d1b1bf2078c0f37447891ca1a8d9234106b9a27aff"}, - {file = "fonttools-4.45.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:777ba42b94a27bb7fb2b4082522fccfd345667c32a56011e1c3e105979af5b79"}, - {file = "fonttools-4.45.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:21e96b99878348c74aa58059b8578d7586f9519cbcdadacf56486737038aa043"}, - {file = "fonttools-4.45.1-cp312-cp312-win32.whl", hash = "sha256:5cbf02cda8465b69769d07385f5d11e7bba19954e7787792f46fe679ec755ebb"}, - {file = "fonttools-4.45.1-cp312-cp312-win_amd64.whl", hash = "sha256:800e354e0c3afaeb8d9552769773d02f228e98c37b8cb03041157c3d0687cffc"}, - {file = "fonttools-4.45.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6eb2c54f7a07c92108daabcf02caf31df97825738db02a28270633946bcda4d0"}, - {file = "fonttools-4.45.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:43a3d267334109ff849c37cf3629476b5feb392ef1d2e464a167b83de8cd599c"}, - {file = "fonttools-4.45.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e1aefc2bf3c43e0f33f995f828a7bbeff4adc9393a7760b11456dbcf14388f6"}, - {file = "fonttools-4.45.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f53a19dcdd5737440839b8394eeebb35da9ec8109f7926cb6456639b5b58e47"}, - {file = "fonttools-4.45.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a17706b9cc24b27721613fe5773d93331ab7f0ecaca9955aead89c6b843d3a7"}, - {file = "fonttools-4.45.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fb36e5f40191274a95938b40c0a1fa7f895e36935aea8709e1d6deff0b2d0d4f"}, - {file = "fonttools-4.45.1-cp38-cp38-win32.whl", hash = "sha256:46eabddec12066829b8a1efe45ae552ba2f1796981ecf538d5f68284c354c589"}, - {file = "fonttools-4.45.1-cp38-cp38-win_amd64.whl", hash = "sha256:b6de2f0fcd3302fb82f94801002cb473959e998c14c24ec28234adb674aed345"}, - {file = "fonttools-4.45.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:392d0e3cc23daee910193625f7cf1b387aff9dd5b6f1a5f4a925680acb6dcbc2"}, - {file = "fonttools-4.45.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4b9544b1346d99848ac0e9b05b5d45ee703d7562fc4c9c48cf4b781de9632e57"}, - {file = "fonttools-4.45.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8717db3e4895e4820ade64ea379187738827ee60748223cb0438ef044ee208c6"}, - {file = "fonttools-4.45.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e29d5f298d616a93a4c5963682dc6cc8cc09f6d89cad2c29019fc5fb3b4d9472"}, - {file = "fonttools-4.45.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cb472905da3049960e80fc1cf808231880d79727a8410e156bf3e5063a1c574f"}, - {file = "fonttools-4.45.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ba299f1fbaa2a1e33210aaaf6fa816d4059e4d3cfe2ae9871368d4ab548c1c6a"}, - {file = "fonttools-4.45.1-cp39-cp39-win32.whl", hash = "sha256:105099968b58a5b4cef6f3eb409db8ea8578b302a9d05e23fecba1b8b0177b5f"}, - {file = "fonttools-4.45.1-cp39-cp39-win_amd64.whl", hash = "sha256:847f3f49dd3423e5a678c098e2ba92c7f4955d4aab3044f6a507b0bb0ecb07e0"}, - {file = "fonttools-4.45.1-py3-none-any.whl", hash = "sha256:3bdd7dfca8f6c9f4779384064027e8477ad6a037d6a327b09381f43e0247c6f3"}, - {file = "fonttools-4.45.1.tar.gz", hash = "sha256:6e441286d55fe7ec7c4fb36812bf914924813776ff514b744b510680fc2733f2"}, + {file = "fonttools-4.46.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d4e69e2c7f93b695d2e6f18f709d501d945f65c1d237dafaabdd23cd935a5276"}, + {file = "fonttools-4.46.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:25852f0c63df0af022f698464a4a80f7d1d5bd974bcd22f995f6b4ad198e32dd"}, + {file = "fonttools-4.46.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:adab73618d0a328b203a0e242b3eba60a2b5662d9cb2bd16ed9c52af8a7d86af"}, + {file = "fonttools-4.46.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cf923a4a556ab4cc4c52f69a4a2db624cf5a2cf360394368b40c5152fe3321e"}, + {file = "fonttools-4.46.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:87c214197712cc14fd2a4621efce2a9c501a77041232b789568149a8a3161517"}, + {file = "fonttools-4.46.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:156ae342a1ed1fe38e180de471e98fbf5b2b6ae280fa3323138569c4ca215844"}, + {file = "fonttools-4.46.0-cp310-cp310-win32.whl", hash = "sha256:c506e3d3a9e898caee4dc094f34b49c5566870d5a2d1ca2125f0a9f35ecc2205"}, + {file = "fonttools-4.46.0-cp310-cp310-win_amd64.whl", hash = "sha256:f8bc3973ed58893c4107993e0a7ae34901cb572b5e798249cbef35d30801ffd4"}, + {file = "fonttools-4.46.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:982f69855ac258260f51048d9e0c53c5f19881138cc7ca06deb38dc4b97404b6"}, + {file = "fonttools-4.46.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c23c59d321d62588620f2255cf951270bf637d88070f38ed8b5e5558775b86c"}, + {file = "fonttools-4.46.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0e94244ec24a940ecfbe5b31c975c8a575d5ed2d80f9a280ce3b21fa5dc9c34"}, + {file = "fonttools-4.46.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a9f9cdd7ef63d1b8ac90db335762451452426b3207abd79f60da510cea62da5"}, + {file = "fonttools-4.46.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ca9eceebe70035b057ce549e2054cad73e95cac3fe91a9d827253d1c14618204"}, + {file = "fonttools-4.46.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8be6adfa4e15977075278dd0a0bae74dec59be7b969b5ceed93fb86af52aa5be"}, + {file = "fonttools-4.46.0-cp311-cp311-win32.whl", hash = "sha256:7b5636f5706d49f13b6d610fe54ee662336cdf56b5a6f6683c0b803e23d826d2"}, + {file = "fonttools-4.46.0-cp311-cp311-win_amd64.whl", hash = "sha256:49ea0983e55fd7586a809787cd4644a7ae471e53ab8ddc016f9093b400e32646"}, + {file = "fonttools-4.46.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7b460720ce81773da1a3e7cc964c48e1e11942b280619582a897fa0117b56a62"}, + {file = "fonttools-4.46.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8bee9f4fc8c99824a424ae45c789ee8c67cb84f8e747afa7f83b7d3cef439c3b"}, + {file = "fonttools-4.46.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3d7b96aba96e05e8c911ce2dfc5acc6a178b8f44f6aa69371ab91aa587563da"}, + {file = "fonttools-4.46.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e6aeb5c340416d11a3209d75c48d13e72deea9e1517837dd1522c1fd1f17c11"}, + {file = "fonttools-4.46.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c779f8701deedf41908f287aeb775b8a6f59875ad1002b98ac6034ae4ddc1b7b"}, + {file = "fonttools-4.46.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce199227ce7921eaafdd4f96536f16b232d6b580ce74ce337de544bf06cb2752"}, + {file = "fonttools-4.46.0-cp312-cp312-win32.whl", hash = "sha256:1c9937c4dd1061afd22643389445fabda858af5e805860ec3082a4bc07c7a720"}, + {file = "fonttools-4.46.0-cp312-cp312-win_amd64.whl", hash = "sha256:a9fa52ef8fd14d7eb3d813e1451e7ace3e1eebfa9b7237d3f81fee8f3de6a114"}, + {file = "fonttools-4.46.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c94564b1f3b5dd87e73577610d85115b1936edcc596deaf84a31bbe70e17456b"}, + {file = "fonttools-4.46.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4a50a1dfad7f7ba5ca3f99cc73bf5cdac67ceade8e4b355a877521f20ad1b63"}, + {file = "fonttools-4.46.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89c2c520f9492844ecd6316d20c6c7a157b5c0cb73a1411b3db28ee304f30122"}, + {file = "fonttools-4.46.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5b7905fd68eacb7cc56a13139da5c312c45baae6950dd00b02563c54508a041"}, + {file = "fonttools-4.46.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8485cc468288e213f31afdaf1fdda3c79010f542559fbba936a54f4644df2570"}, + {file = "fonttools-4.46.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:87c3299da7da55394fb324349db0ede38114a46aafd0e7dfcabfecd28cdd94c3"}, + {file = "fonttools-4.46.0-cp38-cp38-win32.whl", hash = "sha256:f5f1423a504ccc329efb5aa79738de83d38c072be5308788dde6bd419969d7f5"}, + {file = "fonttools-4.46.0-cp38-cp38-win_amd64.whl", hash = "sha256:6d4a4ebcc76e30898ff3296ea786491c70e183f738319ae2629e0d44f17ece42"}, + {file = "fonttools-4.46.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9a0e422ab79e5cb2b47913be6a4b5fd20c4c7ac34a24f3691a4e099e965e0b8"}, + {file = "fonttools-4.46.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:13ac0cba2fc63fa4b232f2a7971f35f35c6eaf10bd1271fa96d4ce6253a8acfd"}, + {file = "fonttools-4.46.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:795150d5edc595e1a2cfb3d65e8f4f3d027704fc2579f8990d381bef6b188eb6"}, + {file = "fonttools-4.46.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d00fc63131dcac6b25f50a5a129758438317e54e3ce5587163f7058de4b0e933"}, + {file = "fonttools-4.46.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3033b55f401a622de2630b3982234d97219d89b058607b87927eccb0f922313c"}, + {file = "fonttools-4.46.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e26e7fb908ae4f622813e7cb32cd2db6c24e3122bb3b98f25e832a2fe0e7e228"}, + {file = "fonttools-4.46.0-cp39-cp39-win32.whl", hash = "sha256:2d0eba685938c603f2f648dfc0aadbf8c6a4fe1c7ca608c2970a6ef39e00f254"}, + {file = "fonttools-4.46.0-cp39-cp39-win_amd64.whl", hash = "sha256:5200b01f463d97cc2b7ff8a1e3584151f4413e98cb8419da5f17d1dbb84cc214"}, + {file = "fonttools-4.46.0-py3-none-any.whl", hash = "sha256:5b627ed142398ea9202bd752c04311592558964d1a765fb2f78dc441a05633f4"}, + {file = "fonttools-4.46.0.tar.gz", hash = "sha256:2ae45716c27a41807d58a9f3f59983bdc8c0a46cb259e4450ab7e196253a9853"}, ] [package.extras] @@ -1732,14 +1732,14 @@ files = [ [[package]] name = "importlib-metadata" -version = "6.9.0" +version = "7.0.0" description = "Read metadata from Python packages" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.9.0-py3-none-any.whl", hash = "sha256:1c8dc6839ddc9771412596926f24cb5a553bbd40624ee2c7e55e531542bed3b8"}, - {file = "importlib_metadata-6.9.0.tar.gz", hash = "sha256:e8acb523c335a91822674e149b46c0399ec4d328c4d1f6e49c273da5ff0201b9"}, + {file = "importlib_metadata-7.0.0-py3-none-any.whl", hash = "sha256:d97503976bb81f40a193d41ee6570868479c69d5068651eb039c40d850c59d67"}, + {file = "importlib_metadata-7.0.0.tar.gz", hash = "sha256:7fc841f8b8332803464e5dc1c63a2e59121f46ca186c0e2e182e80bf8c1319f7"}, ] [package.dependencies] @@ -2592,14 +2592,14 @@ test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>= [[package]] name = "nbconvert" -version = "7.11.0" +version = "7.12.0" description = "Converting Jupyter Notebooks" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "nbconvert-7.11.0-py3-none-any.whl", hash = "sha256:d1d417b7f34a4e38887f8da5bdfd12372adf3b80f995d57556cb0972c68909fe"}, - {file = "nbconvert-7.11.0.tar.gz", hash = "sha256:abedc01cf543177ffde0bfc2a69726d5a478f6af10a332fc1bf29fcb4f0cf000"}, + {file = "nbconvert-7.12.0-py3-none-any.whl", hash = "sha256:5b6c848194d270cc55fb691169202620d7b52a12fec259508d142ecbe4219310"}, + {file = "nbconvert-7.12.0.tar.gz", hash = "sha256:b1564bd89f69a74cd6398b0362da94db07aafb991b7857216a766204a71612c0"}, ] [package.dependencies] @@ -3061,14 +3061,14 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa [[package]] name = "platformdirs" -version = "4.0.0" +version = "4.1.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b"}, - {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, + {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, + {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, ] [package.extras] @@ -5185,4 +5185,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "2ffeb38e9ad89b2a85ff19bd21c5098713e60cf2a8eea11c8dfb9d063443f751" +content-hash = "b419c57d415ac98437b77d6fe46058cfecb66a74d15369d6904b3cee67d7c8a3" diff --git a/pyproject.toml b/pyproject.toml index 75654c0eee..8432f3510f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,6 +62,7 @@ scikit-learn = "^1.2.1" dill = "^0.3.6" pytest-cov = "^4.0.0" pylint = "^2.16.2" +matplotlib = "^3.7.0" qibojit = { git = "https://github.com/qiboteam/qibojit.git" } tensorflow = { version = "^2.12.0", markers = "sys_platform == 'linux' or sys_platform == 'darwin'" } # TODO: the marker is a temporary solution due to the lack of the tensorflow-io 0.32.0's wheels for Windows, this package is one of @@ -75,7 +76,6 @@ docs-clean = "make -C doc clean" test-docs = "make -C doc doctest" - [tool.poetry.group.cuda11] optional = true @@ -85,7 +85,6 @@ cuquantum-python-cu11 = "^23.3.0" qibojit = { git = "https://github.com/qiboteam/qibojit.git" } - [tool.poetry.group.cuda12] optional = true From 0cd78efa2d647ecd47b4343d2f1bfde1710b83ee Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Tue, 5 Dec 2023 08:58:23 +0400 Subject: [PATCH 128/143] test --- tests/test_gates_channels.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_gates_channels.py b/tests/test_gates_channels.py index d6511f83a5..12e5a99e59 100644 --- a/tests/test_gates_channels.py +++ b/tests/test_gates_channels.py @@ -45,7 +45,8 @@ def test_general_channel(backend): with pytest.raises(NotImplementedError): state = random_statevector(2**2, backend=backend) channel1.apply(backend, state, 2) - + with pytest.raises(NotImplementedError): + channel1.matrix(backend) def test_controlled_by_channel_error(): """""" From 3750ef1886d40b92f7f8adaf75163a68c38d5bac Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 5 Dec 2023 04:58:44 +0000 Subject: [PATCH 129/143] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/test_gates_channels.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_gates_channels.py b/tests/test_gates_channels.py index 12e5a99e59..fb3aa0deb5 100644 --- a/tests/test_gates_channels.py +++ b/tests/test_gates_channels.py @@ -48,6 +48,7 @@ def test_general_channel(backend): with pytest.raises(NotImplementedError): channel1.matrix(backend) + def test_controlled_by_channel_error(): """""" with pytest.raises(ValueError): From 5e05e95d40d741ee1724ecf28935be94f8d2d258 Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Tue, 5 Dec 2023 09:56:00 +0400 Subject: [PATCH 130/143] remove `frame_potential_haar` --- src/qibo/quantum_info/metrics.py | 51 ++++++++------------------------ 1 file changed, 13 insertions(+), 38 deletions(-) diff --git a/src/qibo/quantum_info/metrics.py b/src/qibo/quantum_info/metrics.py index c204f3cc95..76d50e6bec 100644 --- a/src/qibo/quantum_info/metrics.py +++ b/src/qibo/quantum_info/metrics.py @@ -1200,52 +1200,27 @@ def frame_potential( if backend is None: # pragma: no cover backend = GlobalBackend() + nqubits = circuit.nqubits + dim = 2**nqubits + potential = 0 for _ in range(samples): unitary_1 = circuit.copy() - unitary_2 = circuit.copy() - params_1 = np.random.uniform(-np.pi, np.pi, circuit.trainable_gates.nparams) - params_2 = np.random.uniform(-np.pi, np.pi, circuit.trainable_gates.nparams) - unitary_1.set_parameters(params_1) - unitary_2.set_parameters(params_2) - - unitary_1 = unitary_1.unitary(backend) - unitary_2 = unitary_2.unitary(backend) - - potential += np.abs(np.trace(np.transpose(np.conj(unitary_1)) @ unitary_2)) ** ( - 2 * power_t - ) - - return potential / samples - - -def frame_potential_haar(nqubits: int, power_t: int): - """Returns the frame potential of the Haar distirbution. - - For :math:`n` qubits and moment :math:`t`, the frame potential - of the Haar distribution is given by [1] - - .. math:: - \\mathcal{F}_{\\textup{Haar}}^{(t)} = \\frac{t! \\, (d - 1)!}{(t + d - 1)!} \\, , - - where :math:`d = 2^{n}`. - - Args: - nqubits (int): number of qubits. - power_t (int): power that defines the :math:`t`-design. + unitary_1 = unitary_1.unitary(backend) / np.sqrt(dim) - Returns: - float: Frame potential of the Haar distribution. + for _ in range(samples): + unitary_2 = circuit.copy() + params_2 = np.random.uniform(-np.pi, np.pi, circuit.trainable_gates.nparams) + unitary_2.set_parameters(params_2) + unitary_2 = unitary_2.unitary(backend) / np.sqrt(dim) - References: - 1. M. Kliesch and I. Roth, *Theory of quantum system certification*, - `PRX Quantum 2, 010201 (2021) `_. - """ - dim = 2**nqubits + potential += np.abs(np.trace(np.transpose(np.conj(unitary_1)) @ unitary_2)) ** ( + 2 * power_t + ) - return factorial(power_t) * factorial(dim - 1) / factorial(power_t + dim - 1) + return potential / samples**2 def _check_hermitian_or_not_gpu(matrix, backend=None): From 59e6e59abfe808952691196179a2ab1a3b09cab2 Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Tue, 5 Dec 2023 09:56:05 +0400 Subject: [PATCH 131/143] test --- tests/test_quantum_info_metrics.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/test_quantum_info_metrics.py b/tests/test_quantum_info_metrics.py index 7cb1a15909..207171dcb2 100644 --- a/tests/test_quantum_info_metrics.py +++ b/tests/test_quantum_info_metrics.py @@ -16,6 +16,7 @@ entropy, expressibility, fidelity, + frame_potential, gate_error, hilbert_schmidt_distance, impurity, @@ -649,3 +650,29 @@ def test_expressibility(backend): expr_3 = expressibility(c3, t, samples, backend=backend) backend.assert_allclose(expr_1 < expr_2 < expr_3, True) + + +@pytest.mark.parametrize("samples", [int(1e2)]) +@pytest.mark.parametrize("power_t", [2]) +@pytest.mark.parametrize("nqubits", [2, 3, 4]) +def test_frame_potential(backend, nqubits, power_t, samples): + + depth = int(np.ceil(nqubits * power_t)) + + circuit = Circuit(nqubits) + circuit.add((gates.U3(q, 0.0, 0.0, 0.0) for q in range(nqubits))) + for _ in range(depth): + circuit.add((gates.CNOT(q, q + 1) for q in range(nqubits - 1))) + circuit.add((gates.U3(q, 0.0, 0.0, 0.0) for q in range(nqubits))) + + with pytest.raises(TypeError): + frame_potential(circuit, power_t="2", backend=backend) + with pytest.raises(TypeError): + frame_potential(circuit, 2, samples="1000", backend=backend) + + dim = 2**nqubits + potential_haar = 2 / dim**4 + + potential = frame_potential(circuit, power_t=power_t, samples=samples, backend=backend) + + backend.assert_allclose(potential, potential_haar, rtol=1e-2, atol=1e-2) From 805e11f905c862c76914d187d980933aa6d850af Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 5 Dec 2023 05:56:27 +0000 Subject: [PATCH 132/143] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/qibo/quantum_info/metrics.py | 7 +++---- tests/test_quantum_info_metrics.py | 11 ++++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/qibo/quantum_info/metrics.py b/src/qibo/quantum_info/metrics.py index 76d50e6bec..3afb872b27 100644 --- a/src/qibo/quantum_info/metrics.py +++ b/src/qibo/quantum_info/metrics.py @@ -1,6 +1,5 @@ """Submodule with distances, metrics, and measures for quantum states and channels.""" -from math import factorial from typing import Optional, Union import numpy as np @@ -1216,9 +1215,9 @@ def frame_potential( unitary_2.set_parameters(params_2) unitary_2 = unitary_2.unitary(backend) / np.sqrt(dim) - potential += np.abs(np.trace(np.transpose(np.conj(unitary_1)) @ unitary_2)) ** ( - 2 * power_t - ) + potential += np.abs( + np.trace(np.transpose(np.conj(unitary_1)) @ unitary_2) + ) ** (2 * power_t) return potential / samples**2 diff --git a/tests/test_quantum_info_metrics.py b/tests/test_quantum_info_metrics.py index 207171dcb2..06efa6c61f 100644 --- a/tests/test_quantum_info_metrics.py +++ b/tests/test_quantum_info_metrics.py @@ -656,14 +656,13 @@ def test_expressibility(backend): @pytest.mark.parametrize("power_t", [2]) @pytest.mark.parametrize("nqubits", [2, 3, 4]) def test_frame_potential(backend, nqubits, power_t, samples): - depth = int(np.ceil(nqubits * power_t)) circuit = Circuit(nqubits) - circuit.add((gates.U3(q, 0.0, 0.0, 0.0) for q in range(nqubits))) + circuit.add(gates.U3(q, 0.0, 0.0, 0.0) for q in range(nqubits)) for _ in range(depth): - circuit.add((gates.CNOT(q, q + 1) for q in range(nqubits - 1))) - circuit.add((gates.U3(q, 0.0, 0.0, 0.0) for q in range(nqubits))) + circuit.add(gates.CNOT(q, q + 1) for q in range(nqubits - 1)) + circuit.add(gates.U3(q, 0.0, 0.0, 0.0) for q in range(nqubits)) with pytest.raises(TypeError): frame_potential(circuit, power_t="2", backend=backend) @@ -673,6 +672,8 @@ def test_frame_potential(backend, nqubits, power_t, samples): dim = 2**nqubits potential_haar = 2 / dim**4 - potential = frame_potential(circuit, power_t=power_t, samples=samples, backend=backend) + potential = frame_potential( + circuit, power_t=power_t, samples=samples, backend=backend + ) backend.assert_allclose(potential, potential_haar, rtol=1e-2, atol=1e-2) From 77f43b5d79deb4d1b5a5955dbce79c5d2d05890f Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Tue, 5 Dec 2023 10:31:25 +0400 Subject: [PATCH 133/143] api reference --- doc/source/api-reference/qibo.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/source/api-reference/qibo.rst b/doc/source/api-reference/qibo.rst index 1f4c99fe95..87d985c5cc 100644 --- a/doc/source/api-reference/qibo.rst +++ b/doc/source/api-reference/qibo.rst @@ -1524,6 +1524,12 @@ Expressibility of parameterized quantum circuits .. autofunction:: qibo.quantum_info.expressibility +Frame Potential +""""""""""""""" + +.. autofunction:: qibo.quantum_info.frame_potential + + Random Ensembles ^^^^^^^^^^^^^^^^ From 44f8346b886a3d51cfd73bdcd1f6c96b65a63818 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 4 Dec 2023 19:40:23 +0400 Subject: [PATCH 134/143] Replace psutil with multiprocessing --- src/qibo/backends/tensorflow.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/qibo/backends/tensorflow.py b/src/qibo/backends/tensorflow.py index e5c99d3672..c11e7c9126 100644 --- a/src/qibo/backends/tensorflow.py +++ b/src/qibo/backends/tensorflow.py @@ -1,4 +1,5 @@ import collections +import multiprocessing import os import numpy as np @@ -195,9 +196,7 @@ def __init__(self): elif cpu_devices: self.device = cpu_devices[0].name - import psutil - - self.nthreads = psutil.cpu_count(logical=True) + self.nthreads = multiprocessing.cpu_count() self.tensor_types = (np.ndarray, tf.Tensor, tf.Variable) From 60d3a246e8c074633c523d0e3793d0ad0a9445d6 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Mon, 4 Dec 2023 19:42:29 +0400 Subject: [PATCH 135/143] Drop psutil dependency --- poetry.lock | 5188 ------------------------------------------------ pyproject.toml | 1 - 2 files changed, 5189 deletions(-) delete mode 100644 poetry.lock diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index 9315646957..0000000000 --- a/poetry.lock +++ /dev/null @@ -1,5188 +0,0 @@ -# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. - -[[package]] -name = "absl-py" -version = "2.0.0" -description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." -category = "dev" -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"}, -] - -[[package]] -name = "alabaster" -version = "0.7.13" -description = "A configurable sidebar-enabled Sphinx theme" -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, - {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, -] - -[[package]] -name = "anyio" -version = "4.1.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "anyio-4.1.0-py3-none-any.whl", hash = "sha256:56a415fbc462291813a94528a779597226619c8e78af7de0507333f700011e5f"}, - {file = "anyio-4.1.0.tar.gz", hash = "sha256:5a0bec7085176715be77df87fc66d6c9d70626bd752fcc85f57cdbee5b3760da"}, -] - -[package.dependencies] -exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} -idna = ">=2.8" -sniffio = ">=1.1" - -[package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] - -[[package]] -name = "astroid" -version = "2.15.8" -description = "An abstract syntax tree for Python with inference support." -category = "dev" -optional = false -python-versions = ">=3.7.2" -files = [ - {file = "astroid-2.15.8-py3-none-any.whl", hash = "sha256:1aa149fc5c6589e3d0ece885b4491acd80af4f087baafa3fb5203b113e68cd3c"}, - {file = "astroid-2.15.8.tar.gz", hash = "sha256:6c107453dffee9055899705de3c9ead36e74119cee151e5a9aaf7f0b0e020a6a"}, -] - -[package.dependencies] -lazy-object-proxy = ">=1.4.0" -typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} -wrapt = [ - {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, - {version = ">=1.14,<2", markers = "python_version >= \"3.11\""}, -] - -[[package]] -name = "asttokens" -version = "2.4.1" -description = "Annotate AST trees with source code positions" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, - {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, -] - -[package.dependencies] -six = ">=1.12.0" - -[package.extras] -astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] -test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] - -[[package]] -name = "astunparse" -version = "1.6.3" -description = "An AST unparser for Python" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, - {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, -] - -[package.dependencies] -six = ">=1.6.1,<2.0" -wheel = ">=0.23.0,<1.0" - -[[package]] -name = "attrs" -version = "21.4.0" -description = "Classes Without Boilerplate" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, - {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, -] - -[package.extras] -dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "sphinx", "sphinx-notfound-page", "zope.interface"] -docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] -tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "zope.interface"] -tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six"] - -[[package]] -name = "babel" -version = "2.13.1" -description = "Internationalization utilities" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "Babel-2.13.1-py3-none-any.whl", hash = "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed"}, - {file = "Babel-2.13.1.tar.gz", hash = "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900"}, -] - -[package.extras] -dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] - -[[package]] -name = "beautifulsoup4" -version = "4.12.2" -description = "Screen-scraping library" -category = "dev" -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"}, -] - -[package.dependencies] -soupsieve = ">1.2" - -[package.extras] -html5lib = ["html5lib"] -lxml = ["lxml"] - -[[package]] -name = "bleach" -version = "6.1.0" -description = "An easy safelist-based HTML-sanitizing tool." -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"}, - {file = "bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe"}, -] - -[package.dependencies] -six = ">=1.9.0" -webencodings = "*" - -[package.extras] -css = ["tinycss2 (>=1.1.0,<1.3)"] - -[[package]] -name = "cachetools" -version = "5.3.2" -description = "Extensible memoizing collections and decorators" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "cachetools-5.3.2-py3-none-any.whl", hash = "sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1"}, - {file = "cachetools-5.3.2.tar.gz", hash = "sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2"}, -] - -[[package]] -name = "certifi" -version = "2023.11.17" -description = "Python package for providing Mozilla's CA Bundle." -category = "dev" -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"}, -] - -[[package]] -name = "cffi" -version = "1.16.0" -description = "Foreign Function Interface for Python calling C code." -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, -] - -[package.dependencies] -pycparser = "*" - -[[package]] -name = "charset-normalizer" -version = "3.3.2" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "dev" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, -] - -[[package]] -name = "cirq" -version = "1.3.0" -description = "A framework for creating, editing, and invoking Noisy Intermediate Scale Quantum (NISQ) circuits." -category = "dev" -optional = false -python-versions = ">=3.9.0" -files = [ - {file = "cirq-1.3.0-py3-none-any.whl", hash = "sha256:9e39f2c919864ee3f6a4b4b1dcfdaacb4d5e753e2c7fc7ebb0a93947d6cefcab"}, -] - -[package.dependencies] -cirq-aqt = "1.3.0" -cirq-core = "1.3.0" -cirq-ft = "1.3.0" -cirq-google = "1.3.0" -cirq-ionq = "1.3.0" -cirq-pasqal = "1.3.0" -cirq-rigetti = "1.3.0" -cirq-web = "1.3.0" - -[package.extras] -dev-env = ["asv", "black (==23.3.0)", "codeowners", "coverage (<=6.2)", "filelock (>=3.0.12,<3.1.0)", "freezegun (>=0.3.15,<0.4.0)", "grpcio-tools (>=1.56.0,<1.57.0)", "importlib-metadata", "ipykernel (==5.3.4)", "ipython (>=7.34.0)", "mypy (==1.2.0)", "mypy-protobuf (==3.4)", "notebook (>=6.4.1,<=6.4.7)", "papermill (>=2.3.2,<2.4.0)", "pylint (>=2.13.0,<2.14.0)", "pytest", "pytest-asyncio", "pytest-cov (>=3.0,<4.0)", "pytest-randomly", "pytest-xdist (>=2.2.0,<2.3.0)", "qiskit-aer (>=0.12.2,<0.13.0)", "rstcheck (>=3.3.1,<3.4.0)", "seaborn (>=0.11.1,<0.12.0)", "setuptools", "twine", "types-backports (==0.1.3)", "types-cachetools", "types-protobuf (>=3.20,<4.0)", "types-requests (==2.28.1)", "types-setuptools (==62.6.1)", "virtualenv", "virtualenv-clone", "wheel"] - -[[package]] -name = "cirq-aqt" -version = "1.3.0" -description = "A Cirq package to simulate and connect to Alpine Quantum Technologies quantum computers" -category = "dev" -optional = false -python-versions = ">=3.9.0" -files = [ - {file = "cirq_aqt-1.3.0-py3-none-any.whl", hash = "sha256:e70324b80ac0c752447c67ee49d84129fb21b8ce63737c15cdd155cb9fb1f405"}, -] - -[package.dependencies] -cirq-core = "1.3.0" -requests = ">=2.18,<3.0" - -[[package]] -name = "cirq-core" -version = "1.3.0" -description = "A framework for creating, editing, and invoking Noisy Intermediate Scale Quantum (NISQ) circuits." -category = "dev" -optional = false -python-versions = ">=3.9.0" -files = [ - {file = "cirq_core-1.3.0-py3-none-any.whl", hash = "sha256:d46771ddf4adb0867d3fb6da8c4484b73bada5bfaa58c19e2444aa8838270fd9"}, -] - -[package.dependencies] -duet = ">=0.2.8,<0.3.0" -matplotlib = ">=3.0,<4.0" -networkx = ">=2.4" -numpy = ">=1.16,<2.0" -pandas = "*" -scipy = "*" -sortedcontainers = ">=2.0,<3.0" -sympy = "*" -tqdm = "*" -typing-extensions = ">=4.2" - -[package.extras] -contrib = ["autoray", "numba (>=0.53.0)", "opt-einsum", "ply (>=3.6)", "pylatex (>=1.3.0,<1.4.0)", "quimb"] - -[[package]] -name = "cirq-ft" -version = "1.3.0" -description = "A Cirq package for fault-tolerant algorithms" -category = "dev" -optional = false -python-versions = ">=3.9.0" -files = [ - {file = "cirq_ft-1.3.0-py3-none-any.whl", hash = "sha256:ff45a911b74abece20e97856bad6ff388efdd79068f654a8cee7925d2fe54bf5"}, -] - -[package.dependencies] -attrs = "*" -cachetools = ">=5.3" -cirq-core = "1.3.0" -ipywidgets = "*" -nbconvert = "*" -nbformat = "*" - -[[package]] -name = "cirq-google" -version = "1.3.0" -description = "The Cirq module that provides tools and access to the Google Quantum Computing Service" -category = "dev" -optional = false -python-versions = ">=3.9.0" -files = [ - {file = "cirq_google-1.3.0-py3-none-any.whl", hash = "sha256:aa802887679f64ef8359f77d5bbd5bb98dc076c35c152c3b7f172c6e09d4e667"}, -] - -[package.dependencies] -cirq-core = "1.3.0" -google-api-core = {version = ">=1.14.0", extras = ["grpc"]} -proto-plus = ">=1.20.0" -protobuf = ">=3.15.0" - -[[package]] -name = "cirq-ionq" -version = "1.3.0" -description = "A Cirq package to simulate and connect to IonQ quantum computers" -category = "dev" -optional = false -python-versions = ">=3.9.0" -files = [ - {file = "cirq_ionq-1.3.0-py3-none-any.whl", hash = "sha256:7368da1012a5aafa6ae9125bfafc3beaf1ed799c0f9680947cf8709652f1f640"}, -] - -[package.dependencies] -cirq-core = "1.3.0" -requests = ">=2.18,<3.0" - -[[package]] -name = "cirq-pasqal" -version = "1.3.0" -description = "A Cirq package to simulate and connect to Pasqal quantum computers" -category = "dev" -optional = false -python-versions = ">=3.9.0" -files = [ - {file = "cirq_pasqal-1.3.0-py3-none-any.whl", hash = "sha256:953c04f1ba5efa94a26cae88e0d2ceeabde3c664beef43800b4be728c7f6f6eb"}, -] - -[package.dependencies] -cirq-core = "1.3.0" -requests = ">=2.18,<3.0" - -[[package]] -name = "cirq-rigetti" -version = "1.3.0" -description = "A Cirq package to simulate and connect to Rigetti quantum computers and Quil QVM" -category = "dev" -optional = false -python-versions = ">=3.9.0" -files = [ - {file = "cirq_rigetti-1.3.0-py3-none-any.whl", hash = "sha256:b771e523a8f2bd83ac3b22a79ae8ce03467c75c083ff44bcb04022c12c6dace3"}, -] - -[package.dependencies] -cirq-core = "1.3.0" -pyquil = ">=3.2.0,<4.0.0" - -[[package]] -name = "cirq-web" -version = "1.3.0" -description = "Web-based 3D visualization tools for Cirq." -category = "dev" -optional = false -python-versions = ">=3.9.0" -files = [ - {file = "cirq_web-1.3.0-py3-none-any.whl", hash = "sha256:5206d96e378f8f6fe7e0067cb84db9f48eff372bbb565f0056e1e95d7952b458"}, -] - -[package.dependencies] -cirq-core = "1.3.0" - -[[package]] -name = "clarabel" -version = "0.6.0" -description = "Clarabel Conic Interior Point Solver for Rust / Python" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "clarabel-0.6.0-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:4f366de79b8bc66bef8dc170987840b672ccab9222e710c09536d78ef47f606d"}, - {file = "clarabel-0.6.0-cp37-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:edcebbfc14073cd32bfb664317fd2555716c96be8b2a54efdb2b728453582bea"}, - {file = "clarabel-0.6.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e737d2818b9ca10e92ccd3fa9ad1a805b039976016415a0c45adef3427d70792"}, - {file = "clarabel-0.6.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e0b1891d8e507eb0bfc7e0b981584c388b2ab28658056e600997dbbc23f1ab4"}, - {file = "clarabel-0.6.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9946d3b5db346421b6d839d868e7b1151b590f871344fe95113bfd55b5be2433"}, - {file = "clarabel-0.6.0-cp37-abi3-win32.whl", hash = "sha256:73ed408c975a8ea021c3d8262d5d023a18e1ac3f6bb59a37cd69a11dba8f86ed"}, - {file = "clarabel-0.6.0-cp37-abi3-win_amd64.whl", hash = "sha256:5a6be4df9fed98b6f73f034836def913a1ecd52e8b79ca230ddf7cd66ebcdee7"}, - {file = "clarabel-0.6.0.tar.gz", hash = "sha256:ef909a393e72981ca10b1d866d9cc7fb6295ece20ae035def764338894961184"}, -] - -[package.dependencies] -numpy = "*" -scipy = "*" - -[[package]] -name = "cloudpickle" -version = "3.0.0" -description = "Pickler class to extend the standard pickle.Pickler functionality" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "cloudpickle-3.0.0-py3-none-any.whl", hash = "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7"}, - {file = "cloudpickle-3.0.0.tar.gz", hash = "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882"}, -] - -[[package]] -name = "cma" -version = "3.3.0" -description = "CMA-ES, Covariance Matrix Adaptation Evolution Strategy for non-linear numerical optimization in Python" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "cma-3.3.0-py3-none-any.whl", hash = "sha256:5cc571b1e2068fcf1c538be36f8f3a870107456fed22ce81c1345a96329e61db"}, - {file = "cma-3.3.0.tar.gz", hash = "sha256:b748b8e03f4e7ae816157d7b9bb2fc6b1fb2fee1d5fd3399329b646bb75861ec"}, -] - -[package.dependencies] -numpy = "*" - -[package.extras] -constrained-solution-tracking = ["moarchiving"] -plotting = ["matplotlib"] - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "comm" -version = "0.2.0" -description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "comm-0.2.0-py3-none-any.whl", hash = "sha256:2da8d9ebb8dd7bfc247adaff99f24dce705638a8042b85cb995066793e391001"}, - {file = "comm-0.2.0.tar.gz", hash = "sha256:a517ea2ca28931c7007a7a99c562a0fa5883cfb48963140cf642c41c948498be"}, -] - -[package.dependencies] -traitlets = ">=4" - -[package.extras] -test = ["pytest"] - -[[package]] -name = "commonmark" -version = "0.9.1" -description = "Python parser for the CommonMark Markdown spec" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, - {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, -] - -[package.extras] -test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] - -[[package]] -name = "contourpy" -version = "1.2.0" -description = "Python library for calculating contours of 2D quadrilateral grids" -category = "dev" -optional = false -python-versions = ">=3.9" -files = [ - {file = "contourpy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8"}, - {file = "contourpy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa"}, - {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9"}, - {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab"}, - {file = "contourpy-1.2.0-cp310-cp310-win32.whl", hash = "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488"}, - {file = "contourpy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41"}, - {file = "contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727"}, - {file = "contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686"}, - {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286"}, - {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95"}, - {file = "contourpy-1.2.0-cp311-cp311-win32.whl", hash = "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6"}, - {file = "contourpy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de"}, - {file = "contourpy-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0"}, - {file = "contourpy-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0"}, - {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0"}, - {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431"}, - {file = "contourpy-1.2.0-cp312-cp312-win32.whl", hash = "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f"}, - {file = "contourpy-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9"}, - {file = "contourpy-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc"}, - {file = "contourpy-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5"}, - {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e"}, - {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808"}, - {file = "contourpy-1.2.0-cp39-cp39-win32.whl", hash = "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4"}, - {file = "contourpy-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843"}, - {file = "contourpy-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108"}, - {file = "contourpy-1.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776"}, - {file = "contourpy-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956"}, - {file = "contourpy-1.2.0.tar.gz", hash = "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a"}, -] - -[package.dependencies] -numpy = ">=1.20,<2.0" - -[package.extras] -bokeh = ["bokeh", "selenium"] -docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] -mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.6.1)", "types-Pillow"] -test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] -test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] - -[[package]] -name = "coverage" -version = "7.3.2" -description = "Code coverage measurement for Python" -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"}, - {file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"}, - {file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"}, - {file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"}, - {file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"}, - {file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"}, - {file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"}, - {file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"}, - {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"}, - {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"}, - {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"}, - {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"}, - {file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"}, - {file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"}, - {file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"}, - {file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"}, - {file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"}, - {file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"}, - {file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"}, - {file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"}, - {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"}, - {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, -] - -[package.dependencies] -tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} - -[package.extras] -toml = ["tomli"] - -[[package]] -name = "cupy-cuda11x" -version = "12.2.0" -description = "CuPy: NumPy & SciPy for GPU" -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "cupy_cuda11x-12.2.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f3b1991e4e25f52581f79b88c8d19c3e31fa739260b7080c813d7fb287ae8e7f"}, - {file = "cupy_cuda11x-12.2.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:ac52fd24ca5769d903bd531826d0525dbeaba66c49911ae021b9702386c8b96b"}, - {file = "cupy_cuda11x-12.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:8ed1fbf14230691df3f58f841e9ca5717b4175c4276fbf88948a5bc3c6392f58"}, - {file = "cupy_cuda11x-12.2.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:28eace420c9f58fa5739294d604f8aab9118b1c764f64a3ce0691f00193b11ff"}, - {file = "cupy_cuda11x-12.2.0-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:fb3294a694ee40b6e22ba3345b04b2a35db8a19fac74f59dc7757ea87ab5b289"}, - {file = "cupy_cuda11x-12.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:2e502cea9d21fefd1d8fd3747c6b46d1f916550e54d859f9083b6327a8f7ff5b"}, - {file = "cupy_cuda11x-12.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2fd425be7ae8f82ff68d2e8eeb37132fc9b9dfea6d3f0708419d6b9843983e42"}, - {file = "cupy_cuda11x-12.2.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:fcdfe993f87c5499898692d35d3c1f30cdd249778d6102132b5bc4a6f8a867fd"}, - {file = "cupy_cuda11x-12.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:66491d9c1ed93d4ee5b390ece92ed76a885c61859b403e3a6fd6f5b3a9ded116"}, - {file = "cupy_cuda11x-12.2.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:ededad28104d9e0c2cb02876fd2fc5c0dfec4cc66e600b7120bb4e655857c5e3"}, - {file = "cupy_cuda11x-12.2.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:ba4403d94e9eb2578f8f2667d37ef3ec8be4fbc2c7fd1ba498004d6399d0f3b6"}, - {file = "cupy_cuda11x-12.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:d01138eb7cf51583b6d67281bd39f3f241d664f2d1c65af2399ed304a609dadb"}, -] - -[package.dependencies] -fastrlock = ">=0.5" -numpy = ">=1.20,<1.27" - -[package.extras] -all = ["Cython (>=0.29.22,<3)", "optuna (>=2.0)", "scipy (>=1.6,<1.13)"] -stylecheck = ["autopep8 (==1.5.5)", "flake8 (==3.8.4)", "mypy (==1.4.1)", "pbr (==5.5.1)", "pycodestyle (==2.6.0)", "types-setuptools (==57.4.14)"] -test = ["hypothesis (>=6.37.2,<6.55.0)", "pytest (>=7.2)"] - -[[package]] -name = "cupy-cuda12x" -version = "12.2.0" -description = "CuPy: NumPy & SciPy for GPU" -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "cupy_cuda12x-12.2.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:350cc1591d5af25aaf147974547a68f25eb9104b0fcd5fa3c89f32f4d42b88c7"}, - {file = "cupy_cuda12x-12.2.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:bfcea96e5506193ea8672a8c8a3e164d023c4860e58f1165cdd4a946b136aa20"}, - {file = "cupy_cuda12x-12.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:9a41ed8bece4dc2344e2afb1976690adf7ad3f9ef0a169653b5c9466e4768450"}, - {file = "cupy_cuda12x-12.2.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:3e86fe1d41009418d3f2878e6f4f713a28d29a7faaa47c089f8ac05851087e9e"}, - {file = "cupy_cuda12x-12.2.0-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:ddf743881d85e98e1ac46328f78100a5abe842793aa1fd575301c81df591e9a2"}, - {file = "cupy_cuda12x-12.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:77386c53ddb5040f5cd9daa6764e3e3edc76f71b074b9a9bebec76f5da75cfa8"}, - {file = "cupy_cuda12x-12.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:98277c47425cb59cb623fcd94fec4dfc77292ff1377f2fc4bd0d0e55c7dcf447"}, - {file = "cupy_cuda12x-12.2.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:c581705d444cdeeffa016055ba449322bb2a99b5416ab5b85f140ea7333a1e7c"}, - {file = "cupy_cuda12x-12.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:12d88bba2e6cae18ba48eabbb7ff23a21d073ce83047ef27a87b99414db86795"}, - {file = "cupy_cuda12x-12.2.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:7d4e2b2ad37afd163d006a96b31b417142d95768846227513af7b596d731ba29"}, - {file = "cupy_cuda12x-12.2.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:0406b98fb2f1780238de8fed0da5f14e689b016c5c1f0ddaecd41ee987cd7965"}, - {file = "cupy_cuda12x-12.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:2ee5cb963bab52cc421ba09824e0ffdb7c6a394f35884094f73d2d1af927f0e4"}, -] - -[package.dependencies] -fastrlock = ">=0.5" -numpy = ">=1.20,<1.27" - -[package.extras] -all = ["Cython (>=0.29.22,<3)", "optuna (>=2.0)", "scipy (>=1.6,<1.13)"] -stylecheck = ["autopep8 (==1.5.5)", "flake8 (==3.8.4)", "mypy (==1.4.1)", "pbr (==5.5.1)", "pycodestyle (==2.6.0)", "types-setuptools (==57.4.14)"] -test = ["hypothesis (>=6.37.2,<6.55.0)", "pytest (>=7.2)"] - -[[package]] -name = "cuquantum-python-cu11" -version = "23.10.0" -description = "NVIDIA cuQuantum Python" -category = "dev" -optional = false -python-versions = ">=3.9" -files = [ - {file = "cuquantum_python_cu11-23.10.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a0f0dfcb6239ec5fce836fa2f641820d3235ac7d83f391eac90952cf481da03f"}, - {file = "cuquantum_python_cu11-23.10.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:ad5e38501cb53d50ba19fc48790f2c79fbc14c22e101d51a0b338f6c6971e6a0"}, - {file = "cuquantum_python_cu11-23.10.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:f5bd44f0a50b38fa778836577e11515fb820c98217d2958fdedfc861a701f604"}, - {file = "cuquantum_python_cu11-23.10.0-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:01e6b210ed66a1fda172884f1eca68b4763f676f81949af8f0d6b16d798f1881"}, - {file = "cuquantum_python_cu11-23.10.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:0f658d3c83a8f05b81749a1fecc232ca23650147f53d82fe61dae987e544fb9c"}, - {file = "cuquantum_python_cu11-23.10.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:997e47861bab2c5e183a3b7439ba7fe4dd777cbf4d24f2234ac4ad7936cbc699"}, -] - -[package.dependencies] -custatevec-cu11 = ">=1.5,<2.0" -cutensornet-cu11 = ">=2.3,<3.0" -numpy = ">=1.21,<2.0" - -[[package]] -name = "cuquantum-python-cu12" -version = "23.10.0" -description = "NVIDIA cuQuantum Python" -category = "dev" -optional = false -python-versions = ">=3.9" -files = [ - {file = "cuquantum_python_cu12-23.10.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:56a043951348a868957405103d8a0fb24da496c330876480958d371c040c371a"}, - {file = "cuquantum_python_cu12-23.10.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:171f5cb136c9db0e3520c99a9c4a55c8f8c84440b725e3e5511e7d9b6373ba1e"}, - {file = "cuquantum_python_cu12-23.10.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:a5a747885a164b4ccc41d3a5d225e4a8cc3076595b1b6169a82c8bf63ff1a801"}, - {file = "cuquantum_python_cu12-23.10.0-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:719cfa4c53ec40465c425ae8482cc8272686a29026c0bcbff23248c0418f8c95"}, - {file = "cuquantum_python_cu12-23.10.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f97601858323f85caedbf4192fafc406512a56c07ebfcf122503012978a21929"}, - {file = "cuquantum_python_cu12-23.10.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:24a48bd0763362d709afadbc7f09e4977d0f2dff6a7200c42415f7fc39216652"}, -] - -[package.dependencies] -cupy-cuda12x = ">=10.0" -custatevec-cu12 = ">=1.5,<2.0" -cutensornet-cu12 = ">=2.3,<3.0" -numpy = ">=1.21,<2.0" - -[[package]] -name = "custatevec-cu11" -version = "1.5.0" -description = "cuStateVec - a component of NVIDIA cuQuantum SDK" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "custatevec_cu11-1.5.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:3e0cbbc487a0590d9f889ad70b9ac21d88c1f555f6fe01b18ba687a0d98d902f"}, - {file = "custatevec_cu11-1.5.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:be289f600e7361cac4acdeb8d12d443117d43ce745c9322f6b828292341b9f30"}, -] - -[[package]] -name = "custatevec-cu12" -version = "1.5.0" -description = "cuStateVec - a component of NVIDIA cuQuantum SDK" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "custatevec_cu12-1.5.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:e040c92e7ff8dacca74c7f122a1641f15e15a59f2b44c861517cd3515fa32986"}, - {file = "custatevec_cu12-1.5.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:b6202cf0ed3538956f15cffbbe5ec12e75ff5708846cba27c6ad5eb0323df8e6"}, -] - -[[package]] -name = "cutensor-cu11" -version = "1.7.0" -description = "NVIDIA cuTENSOR" -category = "dev" -optional = false -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]] -name = "cutensor-cu12" -version = "1.7.0" -description = "NVIDIA cuTENSOR" -category = "dev" -optional = false -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]] -name = "cutensornet-cu11" -version = "2.3.0" -description = "cuTensorNet - a component of NVIDIA cuQuantum SDK" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "cutensornet_cu11-2.3.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:fd15b199b189f0501b3fdaa576ee70eedbdfec37b557f7fd56b97aaa5e618667"}, - {file = "cutensornet_cu11-2.3.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:dcb9ab26c3d6b51dfd1146c9ec28fe6768bfe539dca931d4ef462eea15205bf7"}, -] - -[package.dependencies] -cutensor-cu11 = ">=1.6.1,<2" - -[[package]] -name = "cutensornet-cu12" -version = "2.3.0" -description = "cuTensorNet - a component of NVIDIA cuQuantum SDK" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "cutensornet_cu12-2.3.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:3c9d5938ab42d96de9ddf2585a0f2348172e8ef12efd082f515a2298bd35ba7a"}, - {file = "cutensornet_cu12-2.3.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:70c45762e9b5aa79be5e106ed8c2912d4fceb573eca9c918e9f7abae91eaa895"}, -] - -[package.dependencies] -cutensor-cu12 = ">=1.6.1,<2" - -[[package]] -name = "cvxpy" -version = "1.4.1" -description = "A domain-specific language for modeling convex optimization problems in Python." -category = "dev" -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"}, -] - -[package.dependencies] -clarabel = ">=0.5.0" -ecos = ">=2" -numpy = ">=1.15" -osqp = ">=0.6.2" -pybind11 = "*" -scipy = ">=1.1.0" -scs = ">=3.0" - -[package.extras] -cbc = ["cylp (>=0.91.5)"] -clarabel = ["clarabel"] -cvxopt = ["cvxopt"] -diffcp = ["diffcp"] -glop = ["ortools (>=9.5,<9.8)"] -glpk = ["cvxopt"] -glpk-mi = ["cvxopt"] -gurobi = ["gurobipy"] -highs = ["scipy (>=1.6.1)"] -mosek = ["Mosek"] -pdlp = ["ortools (>=9.5,<9.8)"] -piqp = ["piqp"] -proxqp = ["proxsuite"] -scip = ["PySCIPOpt"] -scipy = ["scipy"] -scs = ["setuptools (>65.5.1)"] -xpress = ["xpress"] - -[[package]] -name = "cycler" -version = "0.12.1" -description = "Composable style cycles" -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, - {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, -] - -[package.extras] -docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] -tests = ["pytest", "pytest-cov", "pytest-xdist"] - -[[package]] -name = "decorator" -version = "5.1.1" -description = "Decorators for Humans" -category = "dev" -optional = false -python-versions = ">=3.5" -files = [ - {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, - {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, -] - -[[package]] -name = "defusedxml" -version = "0.7.1" -description = "XML bomb protection for Python stdlib modules" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, - {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, -] - -[[package]] -name = "deprecated" -version = "1.2.14" -description = "Python @deprecated decorator to deprecate old python classes, functions or methods." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, - {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, -] - -[package.dependencies] -wrapt = ">=1.10,<2" - -[package.extras] -dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] - -[[package]] -name = "dill" -version = "0.3.7" -description = "serialize all of Python" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, - {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, -] - -[package.extras] -graph = ["objgraph (>=1.7.2)"] - -[[package]] -name = "docutils" -version = "0.19" -description = "Docutils -- Python Documentation Utilities" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, - {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, -] - -[[package]] -name = "duet" -version = "0.2.9" -description = "A simple future-based async library for python." -category = "dev" -optional = false -python-versions = ">=3.9.0" -files = [ - {file = "duet-0.2.9-py3-none-any.whl", hash = "sha256:a16088b68b0faee8aee12cdf4d0a8af060ed958badb44f3e32f123f13f64119a"}, - {file = "duet-0.2.9.tar.gz", hash = "sha256:d6fa39582e6a3dce1096c47e5fbcbda648a633eed94a38943e68662afa2587f3"}, -] - -[package.extras] -dev-env = ["black (==22.3.0)", "isort (>=5.7.0,<5.8.0)", "mypy (>=0.931.0,<0.932.0)", "pylint (>=2.10.0,<2.11.0)", "pytest (>=6.2.0,<6.3.0)", "twine (>=3.3.0,<3.4.0)", "wheel"] - -[[package]] -name = "ecos" -version = "2.0.12" -description = "This is the Python package for ECOS: Embedded Cone Solver. See Github page for more information." -category = "dev" -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"}, -] - -[package.dependencies] -numpy = ">=1.6" -scipy = ">=0.9" - -[[package]] -name = "exceptiongroup" -version = "1.2.0" -description = "Backport of PEP 654 (exception groups)" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, - {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, -] - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "executing" -version = "2.0.1" -description = "Get the currently executing AST node of a frame, and other information" -category = "dev" -optional = false -python-versions = ">=3.5" -files = [ - {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, - {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, -] - -[package.extras] -tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] - -[[package]] -name = "fancycompleter" -version = "0.9.1" -description = "colorful TAB completion for Python prompt" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "fancycompleter-0.9.1-py3-none-any.whl", hash = "sha256:dd076bca7d9d524cc7f25ec8f35ef95388ffef9ef46def4d3d25e9b044ad7080"}, - {file = "fancycompleter-0.9.1.tar.gz", hash = "sha256:09e0feb8ae242abdfd7ef2ba55069a46f011814a80fe5476be48f51b00247272"}, -] - -[package.dependencies] -pyreadline = {version = "*", markers = "platform_system == \"Windows\""} -pyrepl = ">=0.8.2" - -[[package]] -name = "fastjsonschema" -version = "2.19.0" -description = "Fastest Python implementation of JSON schema" -category = "dev" -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"}, -] - -[package.extras] -devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] - -[[package]] -name = "fastrlock" -version = "0.8.2" -description = "Fast, re-entrant optimistic lock implemented in Cython" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "fastrlock-0.8.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:94e348c72a1fd1f8191f25ea056448e4f5a87b8fbf005b39d290dcb0581a48cd"}, - {file = "fastrlock-0.8.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d5595903444c854b99c42122b87edfe8a37cd698a4eae32f4fd1d2a7b6c115d"}, - {file = "fastrlock-0.8.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e4bbde174a0aff5f6eeba75cf8c4c5d2a316316bc21f03a0bddca0fc3659a6f3"}, - {file = "fastrlock-0.8.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7a2ccaf88ac0db153e84305d1ef0aa138cea82c6a88309066f6eaa3bc98636cd"}, - {file = "fastrlock-0.8.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:31a27a2edf482df72b91fe6c6438314d2c65290aa7becc55589d156c9b91f0da"}, - {file = "fastrlock-0.8.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:e9904b5b37c3e5bb4a245c56bc4b7e497da57ffb8528f4fc39af9dcb168ee2e1"}, - {file = "fastrlock-0.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:43a241655e83e4603a152192cf022d5ca348c2f4e56dfb02e5c9c4c1a32f9cdb"}, - {file = "fastrlock-0.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9121a894d74e65557e47e777060a495ab85f4b903e80dd73a3c940ba042920d7"}, - {file = "fastrlock-0.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:11bbbbc526363955aeddb9eec4cee2a0012322b7b2f15b54f44454fcf4fd398a"}, - {file = "fastrlock-0.8.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:27786c62a400e282756ae1b090bcd7cfa35f28270cff65a9e7b27a5327a32561"}, - {file = "fastrlock-0.8.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:08315bde19d0c2e6b06593d5a418be3dc8f9b1ee721afa96867b9853fceb45cf"}, - {file = "fastrlock-0.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e8b49b5743ede51e0bcf6805741f39f5e0e0fd6a172ba460cb39e3097ba803bb"}, - {file = "fastrlock-0.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b443e73a4dfc7b6e0800ea4c13567b9694358e86f53bb2612a51c9e727cac67b"}, - {file = "fastrlock-0.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:b3853ed4ce522598dc886160a7bab432a093051af85891fa2f5577c1dcac8ed6"}, - {file = "fastrlock-0.8.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:790fc19bccbd39426060047e53629f171a44745613bf360a045e9f9c8c4a2cea"}, - {file = "fastrlock-0.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:dbdce852e6bb66e1b8c36679d482971d69d93acf1785657522e51b7de30c3356"}, - {file = "fastrlock-0.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d47713ffe6d4a627fbf078be9836a95ac106b4a0543e3841572c91e292a5d885"}, - {file = "fastrlock-0.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:ea96503b918fceaf40443182742b8964d47b65c5ebdea532893cb9479620000c"}, - {file = "fastrlock-0.8.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c6bffa978793bea5e1b00e677062e53a62255439339591b70e209fa1552d5ee0"}, - {file = "fastrlock-0.8.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:75c07726c8b1a52147fd7987d6baaa318c5dced1416c3f25593e40f56e10755b"}, - {file = "fastrlock-0.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:88f079335e9da631efa64486c8207564a7bcd0c00526bb9e842e9d5b7e50a6cc"}, - {file = "fastrlock-0.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4fb2e77ff04bc4beb71d63c8e064f052ce5a6ea1e001d528d4d7f4b37d736f2e"}, - {file = "fastrlock-0.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:b4c9083ea89ab236b06e9ef2263971db3b4b507195fc7d5eecab95828dcae325"}, - {file = "fastrlock-0.8.2-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:98195866d3a9949915935d40a88e4f1c166e82e378f622c88025f2938624a90a"}, - {file = "fastrlock-0.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b22ea9bf5f9fad2b0077e944a7813f91593a4f61adf8faf734a70aed3f2b3a40"}, - {file = "fastrlock-0.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc1bf0ac8a194313cf6e645e300a8a379674ceed8e0b1e910a2de3e3c28989e"}, - {file = "fastrlock-0.8.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a3dcc876050b8f5cbc0ee84ef1e7f0c1dfe7c148f10098828bc4403683c33f10"}, - {file = "fastrlock-0.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:685e656048b59d8dfde8c601f188ad53a4d719eb97080cafc8696cda6d75865e"}, - {file = "fastrlock-0.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:fb5363cf0fddd9b50525ddbf64a1e1b28ec4c6dfb28670a940cb1cf988a6786b"}, - {file = "fastrlock-0.8.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:a74f5a92fa6e51c4f3c69b29c4662088b97be12f40652a21109605a175c81824"}, - {file = "fastrlock-0.8.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ccf39ad5702e33e4d335b48ef9d56e21619b529b7f7471b5211419f380329b62"}, - {file = "fastrlock-0.8.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:66f2662c640bb71a1016a031eea6eef9d25c2bcdf7ffd1d1ddc5a58f9a1ced04"}, - {file = "fastrlock-0.8.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:17734e2e5af4c07ddb0fb10bd484e062c22de3be6b67940b9cc6ec2f18fa61ba"}, - {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:ab91b0c36e95d42e1041a4907e3eefd06c482d53af3c7a77be7e214cc7cd4a63"}, - {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b32fdf874868326351a75b1e4c02f97e802147119ae44c52d3d9da193ec34f5b"}, - {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:2074548a335fcf7d19ebb18d9208da9e33b06f745754466a7e001d2b1c58dd19"}, - {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4fb04442b6d1e2b36c774919c6bcbe3339c61b337261d4bd57e27932589095af"}, - {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1fed2f4797ad68e9982038423018cf08bec5f4ce9fed63a94a790773ed6a795c"}, - {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e380ec4e6d8b26e389713995a43cb7fe56baea2d25fe073d4998c4821a026211"}, - {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:25945f962c7bd808415cfde3da624d4399d4ea71ed8918538375f16bceb79e1c"}, - {file = "fastrlock-0.8.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2c1719ddc8218b01e82fb2e82e8451bd65076cb96d7bef4477194bbb4305a968"}, - {file = "fastrlock-0.8.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:5460c5ee6ced6d61ec8cd2324ebbe793a4960c4ffa2131ffff480e3b61c99ec5"}, - {file = "fastrlock-0.8.2-cp36-cp36m-win_amd64.whl", hash = "sha256:33145acbad8317584cd64588131c7e1e286beef6280c0009b4544c91fce171d2"}, - {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:59344c1d46b7dec97d3f22f1cc930fafe8980b3c5bc9c9765c56738a5f1559e4"}, - {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2a1c354f13f22b737621d914f3b4a8434ae69d3027a775e94b3e671756112f9"}, - {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:cf81e0278b645004388873e0a1f9e3bc4c9ab8c18e377b14ed1a544be4b18c9a"}, - {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1b15430b93d7eb3d56f6ff690d2ebecb79ed0e58248427717eba150a508d1cd7"}, - {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:067edb0a0805bf61e17a251d5046af59f6e9d2b8ad01222e0ef7a0b7937d5548"}, - {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eb31fe390f03f7ae886dcc374f1099ec88526631a4cb891d399b68181f154ff0"}, - {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:643e1e65b4f5b284427e61a894d876d10459820e93aa1e724dfb415117be24e0"}, - {file = "fastrlock-0.8.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5dfb78dd600a12f23fc0c3ec58f81336229fdc74501ecf378d1ce5b3f2f313ea"}, - {file = "fastrlock-0.8.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8ca0fe21458457077e4cb2d81e1ebdb146a00b3e9e2db6180a773f7ea905032"}, - {file = "fastrlock-0.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d918dfe473291e8bfd8e13223ea5cb9b317bd9f50c280923776c377f7c64b428"}, - {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:c393af77c659a38bffbca215c0bcc8629ba4299568308dd7e4ff65d62cabed39"}, - {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:73426f5eb2ecc10626c67cf86bd0af9e00d53e80e5c67d5ce8e18376d6abfa09"}, - {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:320fd55bafee3eb069cfb5d6491f811a912758387ef2193840e2663e80e16f48"}, - {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8c1c91a68926421f5ccbc82c85f83bd3ba593b121a46a1b9a554b3f0dd67a4bf"}, - {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ad1bc61c7f6b0e58106aaab034916b6cb041757f708b07fbcdd9d6e1ac629225"}, - {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:87f4e01b042c84e6090dbc4fbe3415ddd69f6bc0130382323f9d3f1b8dd71b46"}, - {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d34546ad2e4a480b94b6797bcc5a322b3c705c4c74c3e4e545c4a3841c1b2d59"}, - {file = "fastrlock-0.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ebb32d776b61acd49f859a1d16b9e3d84e7b46d0d92aebd58acd54dc38e96664"}, - {file = "fastrlock-0.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:30bdbe4662992348132d03996700e1cf910d141d629179b967b146a22942264e"}, - {file = "fastrlock-0.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:07ed3c7b3867c05a3d6be4ced200c7767000f3431b9be6da66972822dd86e8be"}, - {file = "fastrlock-0.8.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:ddf5d247f686aec853ddcc9a1234bfcc6f57b0a0670d2ad82fc25d8ae7e6a15f"}, - {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7269bb3fc15587b0c191eecd95831d771a7d80f0c48929e560806b038ff3066c"}, - {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:adcb9e77aa132cc6c9de2ffe7cf880a20aa8cdba21d367d1da1a412f57bddd5d"}, - {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:a3b8b5d2935403f1b4b25ae324560e94b59593a38c0d2e7b6c9872126a9622ed"}, - {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2587cedbb36c7988e707d83f0f1175c1f882f362b5ebbee25d70218ea33d220d"}, - {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9af691a9861027181d4de07ed74f0aee12a9650ac60d0a07f4320bff84b5d95f"}, - {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99dd6652bd6f730beadf74ef769d38c6bbd8ee6d1c15c8d138ea680b0594387f"}, - {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4d63b6596368dab9e0cc66bf047e7182a56f33b34db141816a4f21f5bf958228"}, - {file = "fastrlock-0.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ff75c90663d6e8996610d435e71487daa853871ad1770dd83dc0f2fc4997241e"}, - {file = "fastrlock-0.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e27c3cd27fbd25e5223c5c992b300cd4ee8f0a75c6f222ce65838138d853712c"}, - {file = "fastrlock-0.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:dd961a32a7182c3891cdebca417fda67496d5d5de6ae636962254d22723bdf52"}, - {file = "fastrlock-0.8.2.tar.gz", hash = "sha256:644ec9215cf9c4df8028d8511379a15d9c1af3e16d80e47f1b6fdc6ba118356a"}, -] - -[[package]] -name = "flatbuffers" -version = "23.5.26" -description = "The FlatBuffers serialization format for Python" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "flatbuffers-23.5.26-py2.py3-none-any.whl", hash = "sha256:c0ff356da363087b915fde4b8b45bdda73432fc17cddb3c8157472eab1422ad1"}, - {file = "flatbuffers-23.5.26.tar.gz", hash = "sha256:9ea1144cac05ce5d86e2859f431c6cd5e66cd9c78c558317c7955fb8d4c78d89"}, -] - -[[package]] -name = "fonttools" -version = "4.46.0" -description = "Tools to manipulate font files" -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "fonttools-4.46.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d4e69e2c7f93b695d2e6f18f709d501d945f65c1d237dafaabdd23cd935a5276"}, - {file = "fonttools-4.46.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:25852f0c63df0af022f698464a4a80f7d1d5bd974bcd22f995f6b4ad198e32dd"}, - {file = "fonttools-4.46.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:adab73618d0a328b203a0e242b3eba60a2b5662d9cb2bd16ed9c52af8a7d86af"}, - {file = "fonttools-4.46.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cf923a4a556ab4cc4c52f69a4a2db624cf5a2cf360394368b40c5152fe3321e"}, - {file = "fonttools-4.46.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:87c214197712cc14fd2a4621efce2a9c501a77041232b789568149a8a3161517"}, - {file = "fonttools-4.46.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:156ae342a1ed1fe38e180de471e98fbf5b2b6ae280fa3323138569c4ca215844"}, - {file = "fonttools-4.46.0-cp310-cp310-win32.whl", hash = "sha256:c506e3d3a9e898caee4dc094f34b49c5566870d5a2d1ca2125f0a9f35ecc2205"}, - {file = "fonttools-4.46.0-cp310-cp310-win_amd64.whl", hash = "sha256:f8bc3973ed58893c4107993e0a7ae34901cb572b5e798249cbef35d30801ffd4"}, - {file = "fonttools-4.46.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:982f69855ac258260f51048d9e0c53c5f19881138cc7ca06deb38dc4b97404b6"}, - {file = "fonttools-4.46.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c23c59d321d62588620f2255cf951270bf637d88070f38ed8b5e5558775b86c"}, - {file = "fonttools-4.46.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0e94244ec24a940ecfbe5b31c975c8a575d5ed2d80f9a280ce3b21fa5dc9c34"}, - {file = "fonttools-4.46.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a9f9cdd7ef63d1b8ac90db335762451452426b3207abd79f60da510cea62da5"}, - {file = "fonttools-4.46.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ca9eceebe70035b057ce549e2054cad73e95cac3fe91a9d827253d1c14618204"}, - {file = "fonttools-4.46.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8be6adfa4e15977075278dd0a0bae74dec59be7b969b5ceed93fb86af52aa5be"}, - {file = "fonttools-4.46.0-cp311-cp311-win32.whl", hash = "sha256:7b5636f5706d49f13b6d610fe54ee662336cdf56b5a6f6683c0b803e23d826d2"}, - {file = "fonttools-4.46.0-cp311-cp311-win_amd64.whl", hash = "sha256:49ea0983e55fd7586a809787cd4644a7ae471e53ab8ddc016f9093b400e32646"}, - {file = "fonttools-4.46.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7b460720ce81773da1a3e7cc964c48e1e11942b280619582a897fa0117b56a62"}, - {file = "fonttools-4.46.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8bee9f4fc8c99824a424ae45c789ee8c67cb84f8e747afa7f83b7d3cef439c3b"}, - {file = "fonttools-4.46.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3d7b96aba96e05e8c911ce2dfc5acc6a178b8f44f6aa69371ab91aa587563da"}, - {file = "fonttools-4.46.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e6aeb5c340416d11a3209d75c48d13e72deea9e1517837dd1522c1fd1f17c11"}, - {file = "fonttools-4.46.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c779f8701deedf41908f287aeb775b8a6f59875ad1002b98ac6034ae4ddc1b7b"}, - {file = "fonttools-4.46.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce199227ce7921eaafdd4f96536f16b232d6b580ce74ce337de544bf06cb2752"}, - {file = "fonttools-4.46.0-cp312-cp312-win32.whl", hash = "sha256:1c9937c4dd1061afd22643389445fabda858af5e805860ec3082a4bc07c7a720"}, - {file = "fonttools-4.46.0-cp312-cp312-win_amd64.whl", hash = "sha256:a9fa52ef8fd14d7eb3d813e1451e7ace3e1eebfa9b7237d3f81fee8f3de6a114"}, - {file = "fonttools-4.46.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c94564b1f3b5dd87e73577610d85115b1936edcc596deaf84a31bbe70e17456b"}, - {file = "fonttools-4.46.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4a50a1dfad7f7ba5ca3f99cc73bf5cdac67ceade8e4b355a877521f20ad1b63"}, - {file = "fonttools-4.46.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89c2c520f9492844ecd6316d20c6c7a157b5c0cb73a1411b3db28ee304f30122"}, - {file = "fonttools-4.46.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5b7905fd68eacb7cc56a13139da5c312c45baae6950dd00b02563c54508a041"}, - {file = "fonttools-4.46.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8485cc468288e213f31afdaf1fdda3c79010f542559fbba936a54f4644df2570"}, - {file = "fonttools-4.46.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:87c3299da7da55394fb324349db0ede38114a46aafd0e7dfcabfecd28cdd94c3"}, - {file = "fonttools-4.46.0-cp38-cp38-win32.whl", hash = "sha256:f5f1423a504ccc329efb5aa79738de83d38c072be5308788dde6bd419969d7f5"}, - {file = "fonttools-4.46.0-cp38-cp38-win_amd64.whl", hash = "sha256:6d4a4ebcc76e30898ff3296ea786491c70e183f738319ae2629e0d44f17ece42"}, - {file = "fonttools-4.46.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9a0e422ab79e5cb2b47913be6a4b5fd20c4c7ac34a24f3691a4e099e965e0b8"}, - {file = "fonttools-4.46.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:13ac0cba2fc63fa4b232f2a7971f35f35c6eaf10bd1271fa96d4ce6253a8acfd"}, - {file = "fonttools-4.46.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:795150d5edc595e1a2cfb3d65e8f4f3d027704fc2579f8990d381bef6b188eb6"}, - {file = "fonttools-4.46.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d00fc63131dcac6b25f50a5a129758438317e54e3ce5587163f7058de4b0e933"}, - {file = "fonttools-4.46.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3033b55f401a622de2630b3982234d97219d89b058607b87927eccb0f922313c"}, - {file = "fonttools-4.46.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e26e7fb908ae4f622813e7cb32cd2db6c24e3122bb3b98f25e832a2fe0e7e228"}, - {file = "fonttools-4.46.0-cp39-cp39-win32.whl", hash = "sha256:2d0eba685938c603f2f648dfc0aadbf8c6a4fe1c7ca608c2970a6ef39e00f254"}, - {file = "fonttools-4.46.0-cp39-cp39-win_amd64.whl", hash = "sha256:5200b01f463d97cc2b7ff8a1e3584151f4413e98cb8419da5f17d1dbb84cc214"}, - {file = "fonttools-4.46.0-py3-none-any.whl", hash = "sha256:5b627ed142398ea9202bd752c04311592558964d1a765fb2f78dc441a05633f4"}, - {file = "fonttools-4.46.0.tar.gz", hash = "sha256:2ae45716c27a41807d58a9f3f59983bdc8c0a46cb259e4450ab7e196253a9853"}, -] - -[package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] -graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "scipy"] -lxml = ["lxml (>=4.0,<5)"] -pathops = ["skia-pathops (>=0.5.0)"] -plot = ["matplotlib"] -repacker = ["uharfbuzz (>=0.23.0)"] -symfont = ["sympy"] -type1 = ["xattr"] -ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.1.0)"] -woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] - -[[package]] -name = "furo" -version = "2022.12.7" -description = "A clean customisable Sphinx documentation theme." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "furo-2022.12.7-py3-none-any.whl", hash = "sha256:7cb76c12a25ef65db85ab0743df907573d03027a33631f17d267e598ebb191f7"}, - {file = "furo-2022.12.7.tar.gz", hash = "sha256:d8008f8efbe7587a97ba533c8b2df1f9c21ee9b3e5cad0d27f61193d38b1a986"}, -] - -[package.dependencies] -beautifulsoup4 = "*" -pygments = ">=2.7" -sphinx = ">=5.0,<7.0" -sphinx-basic-ng = "*" - -[[package]] -name = "future" -version = "0.18.3" -description = "Clean single-source support for Python 3 and 2" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "future-0.18.3.tar.gz", hash = "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"}, -] - -[[package]] -name = "gast" -version = "0.5.4" -description = "Python AST that abstracts the underlying Python version" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "gast-0.5.4-py3-none-any.whl", hash = "sha256:6fc4fa5fa10b72fb8aab4ae58bcb023058386e67b6fa2e3e34cec5c769360316"}, - {file = "gast-0.5.4.tar.gz", hash = "sha256:9c270fe5f4b130969b54174de7db4e764b09b4f7f67ccfc32480e29f78348d97"}, -] - -[[package]] -name = "google-api-core" -version = "2.14.0" -description = "Google API client core library" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-api-core-2.14.0.tar.gz", hash = "sha256:5368a4502b793d9bbf812a5912e13e4e69f9bd87f6efb508460c43f5bbd1ce41"}, - {file = "google_api_core-2.14.0-py3-none-any.whl", hash = "sha256:de2fb50ed34d47ddbb2bd2dcf680ee8fead46279f4ed6b16de362aca23a18952"}, -] - -[package.dependencies] -google-auth = ">=2.14.1,<3.0.dev0" -googleapis-common-protos = ">=1.56.2,<2.0.dev0" -grpcio = [ - {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""}, - {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, -] -grpcio-status = [ - {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""}, - {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, -] -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" -requests = ">=2.18.0,<3.0.0.dev0" - -[package.extras] -grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] -grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] -grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] - -[[package]] -name = "google-auth" -version = "2.24.0" -description = "Google Authentication Library" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-auth-2.24.0.tar.gz", hash = "sha256:2ec7b2a506989d7dbfdbe81cb8d0ead8876caaed14f86d29d34483cbe99c57af"}, - {file = "google_auth-2.24.0-py2.py3-none-any.whl", hash = "sha256:9b82d5c8d3479a5391ea0a46d81cca698d328459da31d4a459d4e901a5d927e0"}, -] - -[package.dependencies] -cachetools = ">=2.0.0,<6.0" -pyasn1-modules = ">=0.2.1" -rsa = ">=3.1.4,<5" - -[package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] -enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] -pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] -reauth = ["pyu2f (>=0.1.5)"] -requests = ["requests (>=2.20.0,<3.0.0.dev0)"] - -[[package]] -name = "google-auth-oauthlib" -version = "1.0.0" -description = "Google Authentication Library" -category = "dev" -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"}, -] - -[package.dependencies] -google-auth = ">=2.15.0" -requests-oauthlib = ">=0.7.0" - -[package.extras] -tool = ["click (>=6.0.0)"] - -[[package]] -name = "google-pasta" -version = "0.2.0" -description = "pasta is an AST-based Python refactoring library" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "google-pasta-0.2.0.tar.gz", hash = "sha256:c9f2c8dfc8f96d0d5808299920721be30c9eec37f2389f28904f454565c8a16e"}, - {file = "google_pasta-0.2.0-py2-none-any.whl", hash = "sha256:4612951da876b1a10fe3960d7226f0c7682cf901e16ac06e473b267a5afa8954"}, - {file = "google_pasta-0.2.0-py3-none-any.whl", hash = "sha256:b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed"}, -] - -[package.dependencies] -six = "*" - -[[package]] -name = "googleapis-common-protos" -version = "1.61.0" -description = "Common protobufs used in Google APIs" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "googleapis-common-protos-1.61.0.tar.gz", hash = "sha256:8a64866a97f6304a7179873a465d6eee97b7a24ec6cfd78e0f575e96b821240b"}, - {file = "googleapis_common_protos-1.61.0-py2.py3-none-any.whl", hash = "sha256:22f1915393bb3245343f6efe87f6fe868532efc12aa26b391b15132e1279f1c0"}, -] - -[package.dependencies] -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" - -[package.extras] -grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] - -[[package]] -name = "grpcio" -version = "1.59.3" -description = "HTTP/2-based RPC framework" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "grpcio-1.59.3-cp310-cp310-linux_armv7l.whl", hash = "sha256:aca028a6c7806e5b61e5f9f4232432c52856f7fcb98e330b20b6bc95d657bdcc"}, - {file = "grpcio-1.59.3-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:19ad26a7967f7999c8960d2b9fe382dae74c55b0c508c613a6c2ba21cddf2354"}, - {file = "grpcio-1.59.3-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:72b71dad2a3d1650e69ad42a5c4edbc59ee017f08c32c95694172bc501def23c"}, - {file = "grpcio-1.59.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c0f0a11d82d0253656cc42e04b6a149521e02e755fe2e4edd21123de610fd1d4"}, - {file = "grpcio-1.59.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60cddafb70f9a2c81ba251b53b4007e07cca7389e704f86266e22c4bffd8bf1d"}, - {file = "grpcio-1.59.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6c75a1fa0e677c1d2b6d4196ad395a5c381dfb8385f07ed034ef667cdcdbcc25"}, - {file = "grpcio-1.59.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e1d8e01438d5964a11167eec1edb5f85ed8e475648f36c834ed5db4ffba24ac8"}, - {file = "grpcio-1.59.3-cp310-cp310-win32.whl", hash = "sha256:c4b0076f0bf29ee62335b055a9599f52000b7941f577daa001c7ef961a1fbeab"}, - {file = "grpcio-1.59.3-cp310-cp310-win_amd64.whl", hash = "sha256:b1f00a3e6e0c3dccccffb5579fc76ebfe4eb40405ba308505b41ef92f747746a"}, - {file = "grpcio-1.59.3-cp311-cp311-linux_armv7l.whl", hash = "sha256:3996aaa21231451161dc29df6a43fcaa8b332042b6150482c119a678d007dd86"}, - {file = "grpcio-1.59.3-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:cb4e9cbd9b7388fcb06412da9f188c7803742d06d6f626304eb838d1707ec7e3"}, - {file = "grpcio-1.59.3-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:8022ca303d6c694a0d7acfb2b472add920217618d3a99eb4b14edc7c6a7e8fcf"}, - {file = "grpcio-1.59.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b36683fad5664283755a7f4e2e804e243633634e93cd798a46247b8e54e3cb0d"}, - {file = "grpcio-1.59.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8239b853226e4824e769517e1b5232e7c4dda3815b200534500338960fcc6118"}, - {file = "grpcio-1.59.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0511af8653fbda489ff11d542a08505d56023e63cafbda60e6e00d4e0bae86ea"}, - {file = "grpcio-1.59.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e78dc982bda74cef2ddfce1c91d29b96864c4c680c634e279ed204d51e227473"}, - {file = "grpcio-1.59.3-cp311-cp311-win32.whl", hash = "sha256:6a5c3a96405966c023e139c3bcccb2c7c776a6f256ac6d70f8558c9041bdccc3"}, - {file = "grpcio-1.59.3-cp311-cp311-win_amd64.whl", hash = "sha256:ed26826ee423b11477297b187371cdf4fa1eca874eb1156422ef3c9a60590dd9"}, - {file = "grpcio-1.59.3-cp312-cp312-linux_armv7l.whl", hash = "sha256:45dddc5cb5227d30fa43652d8872dc87f086d81ab4b500be99413bad0ae198d7"}, - {file = "grpcio-1.59.3-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:1736496d74682e53dd0907fd515f2694d8e6a96c9a359b4080b2504bf2b2d91b"}, - {file = "grpcio-1.59.3-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:ddbd1a16138e52e66229047624de364f88a948a4d92ba20e4e25ad7d22eef025"}, - {file = "grpcio-1.59.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fcfa56f8d031ffda902c258c84c4b88707f3a4be4827b4e3ab8ec7c24676320d"}, - {file = "grpcio-1.59.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2eb8f0c7c0c62f7a547ad7a91ba627a5aa32a5ae8d930783f7ee61680d7eb8d"}, - {file = "grpcio-1.59.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8d993399cc65e3a34f8fd48dd9ad7a376734564b822e0160dd18b3d00c1a33f9"}, - {file = "grpcio-1.59.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c0bd141f4f41907eb90bda74d969c3cb21c1c62779419782a5b3f5e4b5835718"}, - {file = "grpcio-1.59.3-cp312-cp312-win32.whl", hash = "sha256:33b8fd65d4e97efa62baec6171ce51f9cf68f3a8ba9f866f4abc9d62b5c97b79"}, - {file = "grpcio-1.59.3-cp312-cp312-win_amd64.whl", hash = "sha256:0e735ed002f50d4f3cb9ecfe8ac82403f5d842d274c92d99db64cfc998515e07"}, - {file = "grpcio-1.59.3-cp37-cp37m-linux_armv7l.whl", hash = "sha256:ea40ce4404e7cca0724c91a7404da410f0144148fdd58402a5942971e3469b94"}, - {file = "grpcio-1.59.3-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:83113bcc393477b6f7342b9f48e8a054330c895205517edc66789ceea0796b53"}, - {file = "grpcio-1.59.3-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:73afbac602b8f1212a50088193601f869b5073efa9855b3e51aaaec97848fc8a"}, - {file = "grpcio-1.59.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:575d61de1950b0b0699917b686b1ca108690702fcc2df127b8c9c9320f93e069"}, - {file = "grpcio-1.59.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cd76057b5c9a4d68814610ef9226925f94c1231bbe533fdf96f6181f7d2ff9e"}, - {file = "grpcio-1.59.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:95d6fd804c81efe4879e38bfd84d2b26e339a0a9b797e7615e884ef4686eb47b"}, - {file = "grpcio-1.59.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0d42048b8a3286ea4134faddf1f9a59cf98192b94aaa10d910a25613c5eb5bfb"}, - {file = "grpcio-1.59.3-cp37-cp37m-win_amd64.whl", hash = "sha256:4619fea15c64bcdd9d447cdbdde40e3d5f1da3a2e8ae84103d94a9c1df210d7e"}, - {file = "grpcio-1.59.3-cp38-cp38-linux_armv7l.whl", hash = "sha256:95b5506e70284ac03b2005dd9ffcb6708c9ae660669376f0192a710687a22556"}, - {file = "grpcio-1.59.3-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:9e17660947660ccfce56c7869032910c179a5328a77b73b37305cd1ee9301c2e"}, - {file = "grpcio-1.59.3-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:00912ce19914d038851be5cd380d94a03f9d195643c28e3ad03d355cc02ce7e8"}, - {file = "grpcio-1.59.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e58b3cadaa3c90f1efca26ba33e0d408b35b497307027d3d707e4bcd8de862a6"}, - {file = "grpcio-1.59.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d787ecadea865bdf78f6679f6f5bf4b984f18f659257ba612979df97a298b3c3"}, - {file = "grpcio-1.59.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0814942ba1bba269db4e760a34388640c601dece525c6a01f3b4ff030cc0db69"}, - {file = "grpcio-1.59.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fb111aa99d3180c361a35b5ae1e2c63750220c584a1344229abc139d5c891881"}, - {file = "grpcio-1.59.3-cp38-cp38-win32.whl", hash = "sha256:eb8ba504c726befe40a356ecbe63c6c3c64c9a439b3164f5a718ec53c9874da0"}, - {file = "grpcio-1.59.3-cp38-cp38-win_amd64.whl", hash = "sha256:cdbc6b32fadab9bebc6f49d3e7ec4c70983c71e965497adab7f87de218e84391"}, - {file = "grpcio-1.59.3-cp39-cp39-linux_armv7l.whl", hash = "sha256:c82ca1e4be24a98a253d6dbaa216542e4163f33f38163fc77964b0f0d255b552"}, - {file = "grpcio-1.59.3-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:36636babfda14f9e9687f28d5b66d349cf88c1301154dc71c6513de2b6c88c59"}, - {file = "grpcio-1.59.3-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5f9b2e591da751ac7fdd316cc25afafb7a626dededa9b414f90faad7f3ccebdb"}, - {file = "grpcio-1.59.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a93a82876a4926bf451db82ceb725bd87f42292bacc94586045261f501a86994"}, - {file = "grpcio-1.59.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce31fa0bfdd1f2bb15b657c16105c8652186eab304eb512e6ae3b99b2fdd7d13"}, - {file = "grpcio-1.59.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:16da0e40573962dab6cba16bec31f25a4f468e6d05b658e589090fe103b03e3d"}, - {file = "grpcio-1.59.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1d1a17372fd425addd5812049fa7374008ffe689585f27f802d0935522cf4b7"}, - {file = "grpcio-1.59.3-cp39-cp39-win32.whl", hash = "sha256:52cc38a7241b5f7b4a91aaf9000fdd38e26bb00d5e8a71665ce40cfcee716281"}, - {file = "grpcio-1.59.3-cp39-cp39-win_amd64.whl", hash = "sha256:b491e5bbcad3020a96842040421e508780cade35baba30f402df9d321d1c423e"}, - {file = "grpcio-1.59.3.tar.gz", hash = "sha256:7800f99568a74a06ebdccd419dd1b6e639b477dcaf6da77ea702f8fb14ce5f80"}, -] - -[package.extras] -protobuf = ["grpcio-tools (>=1.59.3)"] - -[[package]] -name = "grpcio-status" -version = "1.59.3" -description = "Status proto mapping for gRPC" -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "grpcio-status-1.59.3.tar.gz", hash = "sha256:65c394ba43380d6bdf8c04c61efc493104b5535552aed35817a1b4dc66598a1f"}, - {file = "grpcio_status-1.59.3-py3-none-any.whl", hash = "sha256:2fd2eb39ca4e9afb3c874c0878ff75b258db0b7dcc25570fc521f16ae0ab942a"}, -] - -[package.dependencies] -googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.59.3" -protobuf = ">=4.21.6" - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "h5py" -version = "3.10.0" -description = "Read and write HDF5 files from Python" -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "h5py-3.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b963fb772964fc1d1563c57e4e2e874022ce11f75ddc6df1a626f42bd49ab99f"}, - {file = "h5py-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:012ab448590e3c4f5a8dd0f3533255bc57f80629bf7c5054cf4c87b30085063c"}, - {file = "h5py-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:781a24263c1270a62cd67be59f293e62b76acfcc207afa6384961762bb88ea03"}, - {file = "h5py-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f42e6c30698b520f0295d70157c4e202a9e402406f50dc08f5a7bc416b24e52d"}, - {file = "h5py-3.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:93dd840bd675787fc0b016f7a05fc6efe37312a08849d9dd4053fd0377b1357f"}, - {file = "h5py-3.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2381e98af081b6df7f6db300cd88f88e740649d77736e4b53db522d8874bf2dc"}, - {file = "h5py-3.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:667fe23ab33d5a8a6b77970b229e14ae3bb84e4ea3382cc08567a02e1499eedd"}, - {file = "h5py-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90286b79abd085e4e65e07c1bd7ee65a0f15818ea107f44b175d2dfe1a4674b7"}, - {file = "h5py-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c013d2e79c00f28ffd0cc24e68665ea03ae9069e167087b2adb5727d2736a52"}, - {file = "h5py-3.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:92273ce69ae4983dadb898fd4d3bea5eb90820df953b401282ee69ad648df684"}, - {file = "h5py-3.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c97d03f87f215e7759a354460fb4b0d0f27001450b18b23e556e7856a0b21c3"}, - {file = "h5py-3.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86df4c2de68257b8539a18646ceccdcf2c1ce6b1768ada16c8dcfb489eafae20"}, - {file = "h5py-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba9ab36be991119a3ff32d0c7cbe5faf9b8d2375b5278b2aea64effbeba66039"}, - {file = "h5py-3.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:2c8e4fda19eb769e9a678592e67eaec3a2f069f7570c82d2da909c077aa94339"}, - {file = "h5py-3.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:492305a074327e8d2513011fa9fffeb54ecb28a04ca4c4227d7e1e9616d35641"}, - {file = "h5py-3.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9450464b458cca2c86252b624279115dcaa7260a40d3cb1594bf2b410a2bd1a3"}, - {file = "h5py-3.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd6f6d1384a9f491732cee233b99cd4bfd6e838a8815cc86722f9d2ee64032af"}, - {file = "h5py-3.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3074ec45d3dc6e178c6f96834cf8108bf4a60ccb5ab044e16909580352010a97"}, - {file = "h5py-3.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:212bb997a91e6a895ce5e2f365ba764debeaef5d2dca5c6fb7098d66607adf99"}, - {file = "h5py-3.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5dfc65ac21fa2f630323c92453cadbe8d4f504726ec42f6a56cf80c2f90d6c52"}, - {file = "h5py-3.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d4682b94fd36ab217352be438abd44c8f357c5449b8995e63886b431d260f3d3"}, - {file = "h5py-3.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aece0e2e1ed2aab076c41802e50a0c3e5ef8816d60ece39107d68717d4559824"}, - {file = "h5py-3.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43a61b2c2ad65b1fabc28802d133eed34debcc2c8b420cb213d3d4ef4d3e2229"}, - {file = "h5py-3.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:ae2f0201c950059676455daf92700eeb57dcf5caaf71b9e1328e6e6593601770"}, - {file = "h5py-3.10.0.tar.gz", hash = "sha256:d93adc48ceeb33347eb24a634fb787efc7ae4644e6ea4ba733d099605045c049"}, -] - -[package.dependencies] -numpy = ">=1.17.3" - -[[package]] -name = "httpcore" -version = "0.16.3" -description = "A minimal low-level HTTP client." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "httpcore-0.16.3-py3-none-any.whl", hash = "sha256:da1fb708784a938aa084bde4feb8317056c55037247c787bd7e19eb2c2949dc0"}, - {file = "httpcore-0.16.3.tar.gz", hash = "sha256:c5d6f04e2fc530f39e0c077e6a30caa53f1451096120f1f38b954afd0b17c0cb"}, -] - -[package.dependencies] -anyio = ">=3.0,<5.0" -certifi = "*" -h11 = ">=0.13,<0.15" -sniffio = ">=1.0.0,<2.0.0" - -[package.extras] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] - -[[package]] -name = "httpx" -version = "0.23.3" -description = "The next generation HTTP client." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "httpx-0.23.3-py3-none-any.whl", hash = "sha256:a211fcce9b1254ea24f0cd6af9869b3d29aba40154e947d2a07bb499b3e310d6"}, - {file = "httpx-0.23.3.tar.gz", hash = "sha256:9818458eb565bb54898ccb9b8b251a28785dd4a55afbc23d0eb410754fe7d0f9"}, -] - -[package.dependencies] -certifi = "*" -httpcore = ">=0.15.0,<0.17.0" -rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} -sniffio = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<13)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] - -[[package]] -name = "hyperopt" -version = "0.2.7" -description = "Distributed Asynchronous Hyperparameter Optimization" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "hyperopt-0.2.7-py2.py3-none-any.whl", hash = "sha256:f3046d91fe4167dbf104365016596856b2524a609d22f047a066fc1ac796427c"}, - {file = "hyperopt-0.2.7.tar.gz", hash = "sha256:1bf89ae58050bbd32c7307199046117feee245c2fd9ab6255c7308522b7ca149"}, -] - -[package.dependencies] -cloudpickle = "*" -future = "*" -networkx = ">=2.2" -numpy = "*" -py4j = "*" -scipy = "*" -six = "*" -tqdm = "*" - -[package.extras] -atpe = ["lightgbm", "scikit-learn"] -dev = ["black", "nose", "pre-commit", "pytest"] -mongotrials = ["pymongo"] -sparktrials = ["pyspark"] - -[[package]] -name = "idna" -version = "3.6" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "dev" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, -] - -[[package]] -name = "imagesize" -version = "1.4.1" -description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, - {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, -] - -[[package]] -name = "importlib-metadata" -version = "7.0.0" -description = "Read metadata from Python packages" -category = "dev" -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"}, -] - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] - -[[package]] -name = "importlib-resources" -version = "6.1.1" -description = "Read resources from Python packages" -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, - {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, -] - -[package.dependencies] -zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] - -[[package]] -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - -[[package]] -name = "ipython" -version = "8.18.1" -description = "IPython: Productive Interactive Computing" -category = "dev" -optional = false -python-versions = ">=3.9" -files = [ - {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, - {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -decorator = "*" -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} -jedi = ">=0.16" -matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -prompt-toolkit = ">=3.0.41,<3.1.0" -pygments = ">=2.4.0" -stack-data = "*" -traitlets = ">=5" -typing-extensions = {version = "*", markers = "python_version < \"3.10\""} - -[package.extras] -all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] -black = ["black"] -doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] -kernel = ["ipykernel"] -nbconvert = ["nbconvert"] -nbformat = ["nbformat"] -notebook = ["ipywidgets", "notebook"] -parallel = ["ipyparallel"] -qtconsole = ["qtconsole"] -test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] - -[[package]] -name = "ipywidgets" -version = "8.1.1" -description = "Jupyter interactive widgets" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "ipywidgets-8.1.1-py3-none-any.whl", hash = "sha256:2b88d728656aea3bbfd05d32c747cfd0078f9d7e159cf982433b58ad717eed7f"}, - {file = "ipywidgets-8.1.1.tar.gz", hash = "sha256:40211efb556adec6fa450ccc2a77d59ca44a060f4f9f136833df59c9f538e6e8"}, -] - -[package.dependencies] -comm = ">=0.1.3" -ipython = ">=6.1.0" -jupyterlab-widgets = ">=3.0.9,<3.1.0" -traitlets = ">=4.3.1" -widgetsnbextension = ">=4.0.9,<4.1.0" - -[package.extras] -test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] - -[[package]] -name = "iso8601" -version = "1.1.0" -description = "Simple module to parse ISO 8601 dates" -category = "dev" -optional = false -python-versions = ">=3.6.2,<4.0" -files = [ - {file = "iso8601-1.1.0-py3-none-any.whl", hash = "sha256:8400e90141bf792bce2634df533dc57e3bee19ea120a87bebcd3da89a58ad73f"}, - {file = "iso8601-1.1.0.tar.gz", hash = "sha256:32811e7b81deee2063ea6d2e94f8819a86d1f3811e49d23623a41fa832bef03f"}, -] - -[[package]] -name = "isort" -version = "5.12.0" -description = "A Python utility / library to sort Python imports." -category = "dev" -optional = false -python-versions = ">=3.8.0" -files = [ - {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, - {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, -] - -[package.extras] -colors = ["colorama (>=0.4.3)"] -pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] -plugins = ["setuptools"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] - -[[package]] -name = "jedi" -version = "0.19.1" -description = "An autocompletion tool for Python that can be used for text editors." -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, - {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, -] - -[package.dependencies] -parso = ">=0.8.3,<0.9.0" - -[package.extras] -docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] - -[[package]] -name = "jinja2" -version = "3.1.2" -description = "A very fast and expressive template engine." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, -] - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "joblib" -version = "1.3.2" -description = "Lightweight pipelining with Python functions" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "joblib-1.3.2-py3-none-any.whl", hash = "sha256:ef4331c65f239985f3f2220ecc87db222f08fd22097a3dd5698f693875f8cbb9"}, - {file = "joblib-1.3.2.tar.gz", hash = "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1"}, -] - -[[package]] -name = "jsonschema" -version = "4.17.3" -description = "An implementation of JSON Schema validation for Python" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, - {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, -] - -[package.dependencies] -attrs = ">=17.4.0" -pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" - -[package.extras] -format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] - -[[package]] -name = "jupyter-client" -version = "8.6.0" -description = "Jupyter protocol implementation and client libraries" -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_client-8.6.0-py3-none-any.whl", hash = "sha256:909c474dbe62582ae62b758bca86d6518c85234bdee2d908c778db6d72f39d99"}, - {file = "jupyter_client-8.6.0.tar.gz", hash = "sha256:0642244bb83b4764ae60d07e010e15f0e2d275ec4e918a8f7b80fbbef3ca60c7"}, -] - -[package.dependencies] -importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" -python-dateutil = ">=2.8.2" -pyzmq = ">=23.0" -tornado = ">=6.2" -traitlets = ">=5.3" - -[package.extras] -docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] - -[[package]] -name = "jupyter-core" -version = "5.5.0" -description = "Jupyter core package. A base package on which Jupyter projects rely." -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyter_core-5.5.0-py3-none-any.whl", hash = "sha256:e11e02cd8ae0a9de5c6c44abf5727df9f2581055afe00b22183f621ba3585805"}, - {file = "jupyter_core-5.5.0.tar.gz", hash = "sha256:880b86053bf298a8724994f95e99b99130659022a4f7f45f563084b6223861d3"}, -] - -[package.dependencies] -platformdirs = ">=2.5" -pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} -traitlets = ">=5.3" - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] -test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "jupyterlab-pygments" -version = "0.3.0" -description = "Pygments theme using JupyterLab CSS variables" -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, - {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, -] - -[[package]] -name = "jupyterlab-widgets" -version = "3.0.9" -description = "Jupyter interactive widgets for JupyterLab" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jupyterlab_widgets-3.0.9-py3-none-any.whl", hash = "sha256:3cf5bdf5b897bf3bccf1c11873aa4afd776d7430200f765e0686bd352487b58d"}, - {file = "jupyterlab_widgets-3.0.9.tar.gz", hash = "sha256:6005a4e974c7beee84060fdfba341a3218495046de8ae3ec64888e5fe19fdb4c"}, -] - -[[package]] -name = "keras" -version = "2.14.0" -description = "Deep learning for humans." -category = "dev" -optional = false -python-versions = ">=3.9" -files = [ - {file = "keras-2.14.0-py3-none-any.whl", hash = "sha256:d7429d1d2131cc7eb1f2ea2ec330227c7d9d38dab3dfdf2e78defee4ecc43fcd"}, - {file = "keras-2.14.0.tar.gz", hash = "sha256:22788bdbc86d9988794fe9703bb5205141da797c4faeeb59497c58c3d94d34ed"}, -] - -[[package]] -name = "kiwisolver" -version = "1.4.5" -description = "A fast implementation of the Cassowary constraint solver" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, - {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, - {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, - {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, - {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, - {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, - {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, - {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, - {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, - {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, - {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, - {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, -] - -[[package]] -name = "lark" -version = "0.11.3" -description = "a modern parsing library" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "lark-0.11.3.tar.gz", hash = "sha256:3100d9749b5a85735ec428b83100876a5da664804579e729c23a36341f961e7e"}, -] - -[package.extras] -atomic-cache = ["atomicwrites"] -nearley = ["js2py"] -regex = ["regex"] - -[[package]] -name = "latexcodec" -version = "2.0.1" -description = "A lexer and codec to work with LaTeX code in Python." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "latexcodec-2.0.1-py2.py3-none-any.whl", hash = "sha256:c277a193638dc7683c4c30f6684e3db728a06efb0dc9cf346db8bd0aa6c5d271"}, - {file = "latexcodec-2.0.1.tar.gz", hash = "sha256:2aa2551c373261cefe2ad3a8953a6d6533e68238d180eb4bb91d7964adb3fe9a"}, -] - -[package.dependencies] -six = ">=1.4.1" - -[[package]] -name = "lazy-object-proxy" -version = "1.9.0" -description = "A fast and thorough lazy object proxy." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, -] - -[[package]] -name = "libclang" -version = "16.0.6" -description = "Clang Python Bindings, mirrored from the official LLVM repo: https://github.com/llvm/llvm-project/tree/main/clang/bindings/python, to make the installation process easier." -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "libclang-16.0.6-1-py2.py3-none-manylinux2014_aarch64.whl", hash = "sha256:88bc7e7b393c32e41e03ba77ef02fdd647da1f764c2cd028e69e0837080b79f6"}, - {file = "libclang-16.0.6-1-py2.py3-none-manylinux2014_armv7l.whl", hash = "sha256:d80ed5827736ed5ec2bcedf536720476fd9d4fa4c79ef0cb24aea4c59332f361"}, - {file = "libclang-16.0.6-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:da9e47ebc3f0a6d90fb169ef25f9fbcd29b4a4ef97a8b0e3e3a17800af1423f4"}, - {file = "libclang-16.0.6-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:e1a5ad1e895e5443e205568c85c04b4608e4e973dae42f4dfd9cb46c81d1486b"}, - {file = "libclang-16.0.6-py2.py3-none-manylinux2010_x86_64.whl", hash = "sha256:9dcdc730939788b8b69ffd6d5d75fe5366e3ee007f1e36a99799ec0b0c001492"}, - {file = "libclang-16.0.6-py2.py3-none-manylinux2014_aarch64.whl", hash = "sha256:8130482120500476a027171f8f3c8dfc2536b591716eea71fc5da22cae13131b"}, - {file = "libclang-16.0.6-py2.py3-none-manylinux2014_armv7l.whl", hash = "sha256:1e940048f51d0b0999099a9b78629ab8a64b62af5e9ff1b2b062439c21ee244d"}, - {file = "libclang-16.0.6-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f04e3060ae1f207f234d0608900c99c50edcb743e5e18276d78da2ddd727d39f"}, - {file = "libclang-16.0.6-py2.py3-none-win_amd64.whl", hash = "sha256:daab4a11dae228f1efa9efa3fe638b493b14d8d52c71fb3c7019e2f1df4514c2"}, - {file = "libclang-16.0.6-py2.py3-none-win_arm64.whl", hash = "sha256:4a9acbfd9c135a72f80d5dbff7588dfb0c81458244a89b9e83526e8595880e0a"}, - {file = "libclang-16.0.6.tar.gz", hash = "sha256:4acdde39dfe410c877b4ccc0d4b57eb952100e4ee26bbdf6cfdb88e2033a7d31"}, -] - -[[package]] -name = "llvmlite" -version = "0.41.1" -description = "lightweight wrapper around basic LLVM functionality" -category = "dev" -optional = false -python-versions = ">=3.8" -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"}, -] - -[[package]] -name = "markdown" -version = "3.5.1" -description = "Python implementation of John Gruber's Markdown." -category = "dev" -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"}, -] - -[package.dependencies] -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} - -[package.extras] -docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] -testing = ["coverage", "pyyaml"] - -[[package]] -name = "markupsafe" -version = "2.1.3" -description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" -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"}, -] - -[[package]] -name = "matplotlib" -version = "3.8.2" -description = "Python plotting package" -category = "dev" -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"}, -] - -[package.dependencies] -contourpy = ">=1.0.1" -cycler = ">=0.10" -fonttools = ">=4.22.0" -importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} -kiwisolver = ">=1.3.1" -numpy = ">=1.21,<2" -packaging = ">=20.0" -pillow = ">=8" -pyparsing = ">=2.3.1" -python-dateutil = ">=2.7" - -[[package]] -name = "matplotlib-inline" -version = "0.1.6" -description = "Inline Matplotlib backend for Jupyter" -category = "dev" -optional = false -python-versions = ">=3.5" -files = [ - {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, - {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, -] - -[package.dependencies] -traitlets = "*" - -[[package]] -name = "mccabe" -version = "0.7.0" -description = "McCabe checker, plugin for flake8" -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] - -[[package]] -name = "mistune" -version = "3.0.2" -description = "A sane and fast Markdown parser with useful plugins and renderers" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, - {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, -] - -[[package]] -name = "ml-dtypes" -version = "0.2.0" -description = "" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "ml_dtypes-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:df6a76e1c8adf484feb138ed323f9f40a7b6c21788f120f7c78bec20ac37ee81"}, - {file = "ml_dtypes-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc29a0524ef5e23a7fbb8d881bdecabeb3fc1d19d9db61785d077a86cb94fab2"}, - {file = "ml_dtypes-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f08c391c2794f2aad358e6f4c70785a9a7b1df980ef4c232b3ccd4f6fe39f719"}, - {file = "ml_dtypes-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:75015818a7fccf99a5e8ed18720cb430f3e71a8838388840f4cdf225c036c983"}, - {file = "ml_dtypes-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e70047ec2c83eaee01afdfdabee2c5b0c133804d90d0f7db4dd903360fcc537c"}, - {file = "ml_dtypes-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36d28b8861a8931695e5a31176cad5ae85f6504906650dea5598fbec06c94606"}, - {file = "ml_dtypes-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e85ba8e24cf48d456e564688e981cf379d4c8e644db0a2f719b78de281bac2ca"}, - {file = "ml_dtypes-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:832a019a1b6db5c4422032ca9940a990fa104eee420f643713241b3a518977fa"}, - {file = "ml_dtypes-0.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8faaf0897942c8253dd126662776ba45f0a5861968cf0f06d6d465f8a7bc298a"}, - {file = "ml_dtypes-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b984cddbe8173b545a0e3334fe56ea1a5c3eb67c507f60d0cfde1d3fa8f8c2"}, - {file = "ml_dtypes-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:022d5a4ee6be14569c2a9d1549e16f1ec87ca949681d0dca59995445d5fcdd5b"}, - {file = "ml_dtypes-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:50845af3e9a601810751b55091dee6c2562403fa1cb4e0123675cf3a4fc2c17a"}, - {file = "ml_dtypes-0.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f00c71c8c63e03aff313bc6a7aeaac9a4f1483a921a6ffefa6d4404efd1af3d0"}, - {file = "ml_dtypes-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80d304c836d73f10605c58ccf7789c171cc229bfb678748adfb7cea2510dfd0e"}, - {file = "ml_dtypes-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32107e7fa9f62db9a5281de923861325211dfff87bd23faefb27b303314635ab"}, - {file = "ml_dtypes-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:1749b60348da71fd3c2ab303fdbc1965958dc50775ead41f5669c932a341cafd"}, - {file = "ml_dtypes-0.2.0.tar.gz", hash = "sha256:6488eb642acaaf08d8020f6de0a38acee7ac324c1e6e92ee0c0fea42422cb797"}, -] - -[package.dependencies] -numpy = [ - {version = ">1.20", markers = "python_version <= \"3.9\""}, - {version = ">=1.23.3", markers = "python_version > \"3.10\""}, - {version = ">=1.21.2", markers = "python_version > \"3.9\""}, -] - -[package.extras] -dev = ["absl-py", "pyink", "pylint (>=2.6.0)", "pytest", "pytest-xdist"] - -[[package]] -name = "mpmath" -version = "1.3.0" -description = "Python library for arbitrary-precision floating-point arithmetic" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, - {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, -] - -[package.extras] -develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] -docs = ["sphinx"] -gmpy = ["gmpy2 (>=2.1.0a4)"] -tests = ["pytest (>=4.6)"] - -[[package]] -name = "msgpack" -version = "1.0.7" -description = "MessagePack serializer" -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "msgpack-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:04ad6069c86e531682f9e1e71b71c1c3937d6014a7c3e9edd2aa81ad58842862"}, - {file = "msgpack-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cca1b62fe70d761a282496b96a5e51c44c213e410a964bdffe0928e611368329"}, - {file = "msgpack-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e50ebce52f41370707f1e21a59514e3375e3edd6e1832f5e5235237db933c98b"}, - {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7b4f35de6a304b5533c238bee86b670b75b03d31b7797929caa7a624b5dda6"}, - {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28efb066cde83c479dfe5a48141a53bc7e5f13f785b92ddde336c716663039ee"}, - {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cb14ce54d9b857be9591ac364cb08dc2d6a5c4318c1182cb1d02274029d590d"}, - {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b573a43ef7c368ba4ea06050a957c2a7550f729c31f11dd616d2ac4aba99888d"}, - {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ccf9a39706b604d884d2cb1e27fe973bc55f2890c52f38df742bc1d79ab9f5e1"}, - {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cb70766519500281815dfd7a87d3a178acf7ce95390544b8c90587d76b227681"}, - {file = "msgpack-1.0.7-cp310-cp310-win32.whl", hash = "sha256:b610ff0f24e9f11c9ae653c67ff8cc03c075131401b3e5ef4b82570d1728f8a9"}, - {file = "msgpack-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:a40821a89dc373d6427e2b44b572efc36a2778d3f543299e2f24eb1a5de65415"}, - {file = "msgpack-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:576eb384292b139821c41995523654ad82d1916da6a60cff129c715a6223ea84"}, - {file = "msgpack-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:730076207cb816138cf1af7f7237b208340a2c5e749707457d70705715c93b93"}, - {file = "msgpack-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:85765fdf4b27eb5086f05ac0491090fc76f4f2b28e09d9350c31aac25a5aaff8"}, - {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3476fae43db72bd11f29a5147ae2f3cb22e2f1a91d575ef130d2bf49afd21c46"}, - {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d4c80667de2e36970ebf74f42d1088cc9ee7ef5f4e8c35eee1b40eafd33ca5b"}, - {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b0bf0effb196ed76b7ad883848143427a73c355ae8e569fa538365064188b8e"}, - {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f9a7c509542db4eceed3dcf21ee5267ab565a83555c9b88a8109dcecc4709002"}, - {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:84b0daf226913133f899ea9b30618722d45feffa67e4fe867b0b5ae83a34060c"}, - {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ec79ff6159dffcc30853b2ad612ed572af86c92b5168aa3fc01a67b0fa40665e"}, - {file = "msgpack-1.0.7-cp311-cp311-win32.whl", hash = "sha256:3e7bf4442b310ff154b7bb9d81eb2c016b7d597e364f97d72b1acc3817a0fdc1"}, - {file = "msgpack-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:3f0c8c6dfa6605ab8ff0611995ee30d4f9fcff89966cf562733b4008a3d60d82"}, - {file = "msgpack-1.0.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f0936e08e0003f66bfd97e74ee530427707297b0d0361247e9b4f59ab78ddc8b"}, - {file = "msgpack-1.0.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98bbd754a422a0b123c66a4c341de0474cad4a5c10c164ceed6ea090f3563db4"}, - {file = "msgpack-1.0.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b291f0ee7961a597cbbcc77709374087fa2a9afe7bdb6a40dbbd9b127e79afee"}, - {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebbbba226f0a108a7366bf4b59bf0f30a12fd5e75100c630267d94d7f0ad20e5"}, - {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e2d69948e4132813b8d1131f29f9101bc2c915f26089a6d632001a5c1349672"}, - {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdf38ba2d393c7911ae989c3bbba510ebbcdf4ecbdbfec36272abe350c454075"}, - {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:993584fc821c58d5993521bfdcd31a4adf025c7d745bbd4d12ccfecf695af5ba"}, - {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:52700dc63a4676669b341ba33520f4d6e43d3ca58d422e22ba66d1736b0a6e4c"}, - {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e45ae4927759289c30ccba8d9fdce62bb414977ba158286b5ddaf8df2cddb5c5"}, - {file = "msgpack-1.0.7-cp312-cp312-win32.whl", hash = "sha256:27dcd6f46a21c18fa5e5deed92a43d4554e3df8d8ca5a47bf0615d6a5f39dbc9"}, - {file = "msgpack-1.0.7-cp312-cp312-win_amd64.whl", hash = "sha256:7687e22a31e976a0e7fc99c2f4d11ca45eff652a81eb8c8085e9609298916dcf"}, - {file = "msgpack-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5b6ccc0c85916998d788b295765ea0e9cb9aac7e4a8ed71d12e7d8ac31c23c95"}, - {file = "msgpack-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:235a31ec7db685f5c82233bddf9858748b89b8119bf4538d514536c485c15fe0"}, - {file = "msgpack-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cab3db8bab4b7e635c1c97270d7a4b2a90c070b33cbc00c99ef3f9be03d3e1f7"}, - {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bfdd914e55e0d2c9e1526de210f6fe8ffe9705f2b1dfcc4aecc92a4cb4b533d"}, - {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36e17c4592231a7dbd2ed09027823ab295d2791b3b1efb2aee874b10548b7524"}, - {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38949d30b11ae5f95c3c91917ee7a6b239f5ec276f271f28638dec9156f82cfc"}, - {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ff1d0899f104f3921d94579a5638847f783c9b04f2d5f229392ca77fba5b82fc"}, - {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dc43f1ec66eb8440567186ae2f8c447d91e0372d793dfe8c222aec857b81a8cf"}, - {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dd632777ff3beaaf629f1ab4396caf7ba0bdd075d948a69460d13d44357aca4c"}, - {file = "msgpack-1.0.7-cp38-cp38-win32.whl", hash = "sha256:4e71bc4416de195d6e9b4ee93ad3f2f6b2ce11d042b4d7a7ee00bbe0358bd0c2"}, - {file = "msgpack-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:8f5b234f567cf76ee489502ceb7165c2a5cecec081db2b37e35332b537f8157c"}, - {file = "msgpack-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfef2bb6ef068827bbd021017a107194956918ab43ce4d6dc945ffa13efbc25f"}, - {file = "msgpack-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:484ae3240666ad34cfa31eea7b8c6cd2f1fdaae21d73ce2974211df099a95d81"}, - {file = "msgpack-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3967e4ad1aa9da62fd53e346ed17d7b2e922cba5ab93bdd46febcac39be636fc"}, - {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dd178c4c80706546702c59529ffc005681bd6dc2ea234c450661b205445a34d"}, - {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6ffbc252eb0d229aeb2f9ad051200668fc3a9aaa8994e49f0cb2ffe2b7867e7"}, - {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:822ea70dc4018c7e6223f13affd1c5c30c0f5c12ac1f96cd8e9949acddb48a61"}, - {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:384d779f0d6f1b110eae74cb0659d9aa6ff35aaf547b3955abf2ab4c901c4819"}, - {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f64e376cd20d3f030190e8c32e1c64582eba56ac6dc7d5b0b49a9d44021b52fd"}, - {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5ed82f5a7af3697b1c4786053736f24a0efd0a1b8a130d4c7bfee4b9ded0f08f"}, - {file = "msgpack-1.0.7-cp39-cp39-win32.whl", hash = "sha256:f26a07a6e877c76a88e3cecac8531908d980d3d5067ff69213653649ec0f60ad"}, - {file = "msgpack-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:1dc93e8e4653bdb5910aed79f11e165c85732067614f180f70534f056da97db3"}, - {file = "msgpack-1.0.7.tar.gz", hash = "sha256:572efc93db7a4d27e404501975ca6d2d9775705c2d922390d878fcf768d92c87"}, -] - -[[package]] -name = "nbclient" -version = "0.9.0" -description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." -category = "dev" -optional = false -python-versions = ">=3.8.0" -files = [ - {file = "nbclient-0.9.0-py3-none-any.whl", hash = "sha256:a3a1ddfb34d4a9d17fc744d655962714a866639acd30130e9be84191cd97cd15"}, - {file = "nbclient-0.9.0.tar.gz", hash = "sha256:4b28c207877cf33ef3a9838cdc7a54c5ceff981194a82eac59d558f05487295e"}, -] - -[package.dependencies] -jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" -nbformat = ">=5.1" -traitlets = ">=5.4" - -[package.extras] -dev = ["pre-commit"] -docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] -test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] - -[[package]] -name = "nbconvert" -version = "7.12.0" -description = "Converting Jupyter Notebooks" -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "nbconvert-7.12.0-py3-none-any.whl", hash = "sha256:5b6c848194d270cc55fb691169202620d7b52a12fec259508d142ecbe4219310"}, - {file = "nbconvert-7.12.0.tar.gz", hash = "sha256:b1564bd89f69a74cd6398b0362da94db07aafb991b7857216a766204a71612c0"}, -] - -[package.dependencies] -beautifulsoup4 = "*" -bleach = "!=5.0.0" -defusedxml = "*" -importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} -jinja2 = ">=3.0" -jupyter-core = ">=4.7" -jupyterlab-pygments = "*" -markupsafe = ">=2.0" -mistune = ">=2.0.3,<4" -nbclient = ">=0.5.0" -nbformat = ">=5.7" -packaging = "*" -pandocfilters = ">=1.4.1" -pygments = ">=2.4.1" -tinycss2 = "*" -traitlets = ">=5.1" - -[package.extras] -all = ["nbconvert[docs,qtpdf,serve,test,webpdf]"] -docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)", "sphinxcontrib-spelling"] -qtpdf = ["nbconvert[qtpng]"] -qtpng = ["pyqtwebengine (>=5.15)"] -serve = ["tornado (>=6.1)"] -test = ["flaky", "ipykernel", "ipywidgets (>=7)", "pytest"] -webpdf = ["playwright"] - -[[package]] -name = "nbformat" -version = "5.9.2" -description = "The Jupyter Notebook format" -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "nbformat-5.9.2-py3-none-any.whl", hash = "sha256:1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9"}, - {file = "nbformat-5.9.2.tar.gz", hash = "sha256:5f98b5ba1997dff175e77e0c17d5c10a96eaed2cbd1de3533d1fc35d5e111192"}, -] - -[package.dependencies] -fastjsonschema = "*" -jsonschema = ">=2.6" -jupyter-core = "*" -traitlets = ">=5.1" - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["pep440", "pre-commit", "pytest", "testpath"] - -[[package]] -name = "nbsphinx" -version = "0.8.12" -description = "Jupyter Notebook Tools for Sphinx" -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "nbsphinx-0.8.12-py3-none-any.whl", hash = "sha256:c15b681c7fce287000856f91fe1edac50d29f7b0c15bbc746fbe55c8eb84750b"}, - {file = "nbsphinx-0.8.12.tar.gz", hash = "sha256:76570416cdecbeb21dbf5c3d6aa204ced6c1dd7ebef4077b5c21b8c6ece9533f"}, -] - -[package.dependencies] -docutils = "*" -jinja2 = "*" -nbconvert = "!=5.4" -nbformat = "*" -sphinx = ">=1.8" -traitlets = ">=5" - -[[package]] -name = "networkx" -version = "3.2.1" -description = "Python package for creating and manipulating graphs and networks" -category = "main" -optional = false -python-versions = ">=3.9" -files = [ - {file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"}, - {file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"}, -] - -[package.extras] -default = ["matplotlib (>=3.5)", "numpy (>=1.22)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] -developer = ["changelist (==0.4)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] -doc = ["nb2plots (>=0.7)", "nbconvert (<7.9)", "numpydoc (>=1.6)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] -extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.11)", "sympy (>=1.10)"] -test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] - -[[package]] -name = "numba" -version = "0.58.1" -description = "compiling Python code using LLVM" -category = "dev" -optional = false -python-versions = ">=3.8" -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"}, -] - -[package.dependencies] -llvmlite = ">=0.41.0dev0,<0.42" -numpy = ">=1.22,<1.27" - -[[package]] -name = "numpy" -version = "1.26.2" -description = "Fundamental package for array computing in Python" -category = "main" -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"}, -] - -[[package]] -name = "oauthlib" -version = "3.2.2" -description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, - {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, -] - -[package.extras] -rsa = ["cryptography (>=3.0.0)"] -signals = ["blinker (>=1.4.0)"] -signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] - -[[package]] -name = "opt-einsum" -version = "3.3.0" -description = "Optimizing numpys einsum function" -category = "dev" -optional = false -python-versions = ">=3.5" -files = [ - {file = "opt_einsum-3.3.0-py3-none-any.whl", hash = "sha256:2455e59e3947d3c275477df7f5205b30635e266fe6dc300e3d9f9646bfcea147"}, - {file = "opt_einsum-3.3.0.tar.gz", hash = "sha256:59f6475f77bbc37dcf7cd748519c0ec60722e91e63ca114e68821c0c54a46549"}, -] - -[package.dependencies] -numpy = ">=1.7" - -[package.extras] -docs = ["numpydoc", "sphinx (==1.2.3)", "sphinx-rtd-theme", "sphinxcontrib-napoleon"] -tests = ["pytest", "pytest-cov", "pytest-pep8"] - -[[package]] -name = "osqp" -version = "0.6.3" -description = "OSQP: The Operator Splitting QP Solver" -category = "dev" -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"}, -] - -[package.dependencies] -numpy = ">=1.7" -qdldl = "*" -scipy = ">=0.13.2" - -[[package]] -name = "packaging" -version = "23.2" -description = "Core utilities for Python packages" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, -] - -[[package]] -name = "pandas" -version = "2.1.3" -description = "Powerful data structures for data analysis, time series, and statistics" -category = "dev" -optional = false -python-versions = ">=3.9" -files = [ - {file = "pandas-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:acf08a73b5022b479c1be155d4988b72f3020f308f7a87c527702c5f8966d34f"}, - {file = "pandas-2.1.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3cc4469ff0cf9aa3a005870cb49ab8969942b7156e0a46cc3f5abd6b11051dfb"}, - {file = "pandas-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35172bff95f598cc5866c047f43c7f4df2c893acd8e10e6653a4b792ed7f19bb"}, - {file = "pandas-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59dfe0e65a2f3988e940224e2a70932edc964df79f3356e5f2997c7d63e758b4"}, - {file = "pandas-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0296a66200dee556850d99b24c54c7dfa53a3264b1ca6f440e42bad424caea03"}, - {file = "pandas-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:465571472267a2d6e00657900afadbe6097c8e1dc43746917db4dfc862e8863e"}, - {file = "pandas-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:04d4c58e1f112a74689da707be31cf689db086949c71828ef5da86727cfe3f82"}, - {file = "pandas-2.1.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7fa2ad4ff196768ae63a33f8062e6838efed3a319cf938fdf8b95e956c813042"}, - {file = "pandas-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4441ac94a2a2613e3982e502ccec3bdedefe871e8cea54b8775992485c5660ef"}, - {file = "pandas-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5ded6ff28abbf0ea7689f251754d3789e1edb0c4d0d91028f0b980598418a58"}, - {file = "pandas-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fca5680368a5139d4920ae3dc993eb5106d49f814ff24018b64d8850a52c6ed2"}, - {file = "pandas-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:de21e12bf1511190fc1e9ebc067f14ca09fccfb189a813b38d63211d54832f5f"}, - {file = "pandas-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a5d53c725832e5f1645e7674989f4c106e4b7249c1d57549023ed5462d73b140"}, - {file = "pandas-2.1.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7cf4cf26042476e39394f1f86868d25b265ff787c9b2f0d367280f11afbdee6d"}, - {file = "pandas-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72c84ec1b1d8e5efcbff5312abe92bfb9d5b558f11e0cf077f5496c4f4a3c99e"}, - {file = "pandas-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f539e113739a3e0cc15176bf1231a553db0239bfa47a2c870283fd93ba4f683"}, - {file = "pandas-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fc77309da3b55732059e484a1efc0897f6149183c522390772d3561f9bf96c00"}, - {file = "pandas-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:08637041279b8981a062899da0ef47828df52a1838204d2b3761fbd3e9fcb549"}, - {file = "pandas-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b99c4e51ef2ed98f69099c72c75ec904dd610eb41a32847c4fcbc1a975f2d2b8"}, - {file = "pandas-2.1.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f7ea8ae8004de0381a2376662c0505bb0a4f679f4c61fbfd122aa3d1b0e5f09d"}, - {file = "pandas-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcd76d67ca2d48f56e2db45833cf9d58f548f97f61eecd3fdc74268417632b8a"}, - {file = "pandas-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1329dbe93a880a3d7893149979caa82d6ba64a25e471682637f846d9dbc10dd2"}, - {file = "pandas-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:321ecdb117bf0f16c339cc6d5c9a06063854f12d4d9bc422a84bb2ed3207380a"}, - {file = "pandas-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:11a771450f36cebf2a4c9dbd3a19dfa8c46c4b905a3ea09dc8e556626060fe71"}, - {file = "pandas-2.1.3.tar.gz", hash = "sha256:22929f84bca106921917eb73c1521317ddd0a4c71b395bcf767a106e3494209f"}, -] - -[package.dependencies] -numpy = [ - {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""}, - {version = ">=1.23.2,<2", markers = "python_version == \"3.11\""}, -] -python-dateutil = ">=2.8.2" -pytz = ">=2020.1" -tzdata = ">=2022.1" - -[package.extras] -all = ["PyQt5 (>=5.15.6)", "SQLAlchemy (>=1.4.36)", "beautifulsoup4 (>=4.11.1)", "bottleneck (>=1.3.4)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=0.8.1)", "fsspec (>=2022.05.0)", "gcsfs (>=2022.05.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.8.0)", "matplotlib (>=3.6.1)", "numba (>=0.55.2)", "numexpr (>=2.8.0)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pandas-gbq (>=0.17.5)", "psycopg2 (>=2.9.3)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.5)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "pyxlsb (>=1.0.9)", "qtpy (>=2.2.0)", "s3fs (>=2022.05.0)", "scipy (>=1.8.1)", "tables (>=3.7.0)", "tabulate (>=0.8.10)", "xarray (>=2022.03.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)", "zstandard (>=0.17.0)"] -aws = ["s3fs (>=2022.05.0)"] -clipboard = ["PyQt5 (>=5.15.6)", "qtpy (>=2.2.0)"] -compression = ["zstandard (>=0.17.0)"] -computation = ["scipy (>=1.8.1)", "xarray (>=2022.03.0)"] -consortium-standard = ["dataframe-api-compat (>=0.1.7)"] -excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pyxlsb (>=1.0.9)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)"] -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)"] -test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] -xml = ["lxml (>=4.8.0)"] - -[[package]] -name = "pandocfilters" -version = "1.5.0" -description = "Utilities for writing pandoc filters in python" -category = "dev" -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"}, -] - -[[package]] -name = "parso" -version = "0.8.3" -description = "A Python Parser" -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, - {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, -] - -[package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["docopt", "pytest (<6.0.0)"] - -[[package]] -name = "pdbpp" -version = "0.10.3" -description = "pdb++, a drop-in replacement for pdb" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "pdbpp-0.10.3-py2.py3-none-any.whl", hash = "sha256:79580568e33eb3d6f6b462b1187f53e10cd8e4538f7d31495c9181e2cf9665d1"}, - {file = "pdbpp-0.10.3.tar.gz", hash = "sha256:d9e43f4fda388eeb365f2887f4e7b66ac09dce9b6236b76f63616530e2f669f5"}, -] - -[package.dependencies] -fancycompleter = ">=0.8" -pygments = "*" -wmctrl = "*" - -[package.extras] -funcsigs = ["funcsigs"] -testing = ["funcsigs", "pytest"] - -[[package]] -name = "pexpect" -version = "4.9.0" -description = "Pexpect allows easy control of interactive console applications." -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, - {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, -] - -[package.dependencies] -ptyprocess = ">=0.5" - -[[package]] -name = "pillow" -version = "10.1.0" -description = "Python Imaging Library (Fork)" -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "Pillow-10.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106"}, - {file = "Pillow-10.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db"}, - {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f"}, - {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818"}, - {file = "Pillow-10.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57"}, - {file = "Pillow-10.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7"}, - {file = "Pillow-10.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061"}, - {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262"}, - {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992"}, - {file = "Pillow-10.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a"}, - {file = "Pillow-10.1.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b"}, - {file = "Pillow-10.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651"}, - {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b"}, - {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f"}, - {file = "Pillow-10.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996"}, - {file = "Pillow-10.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793"}, - {file = "Pillow-10.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d"}, - {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80"}, - {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212"}, - {file = "Pillow-10.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14"}, - {file = "Pillow-10.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099"}, - {file = "Pillow-10.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd"}, - {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28"}, - {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2"}, - {file = "Pillow-10.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f"}, - {file = "Pillow-10.1.0.tar.gz", hash = "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38"}, -] - -[package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] -tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "platformdirs" -version = "4.1.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" -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"}, -] - -[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)"] - -[[package]] -name = "pluggy" -version = "1.3.0" -description = "plugin and hook calling mechanisms for python" -category = "dev" -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"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "ply" -version = "3.11" -description = "Python Lex & Yacc" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, - {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, -] - -[[package]] -name = "prompt-toolkit" -version = "3.0.41" -description = "Library for building powerful interactive command lines in Python" -category = "dev" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "prompt_toolkit-3.0.41-py3-none-any.whl", hash = "sha256:f36fe301fafb7470e86aaf90f036eef600a3210be4decf461a5b1ca8403d3cb2"}, - {file = "prompt_toolkit-3.0.41.tar.gz", hash = "sha256:941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0"}, -] - -[package.dependencies] -wcwidth = "*" - -[[package]] -name = "proto-plus" -version = "1.22.3" -description = "Beautiful, Pythonic protocol buffers." -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "proto-plus-1.22.3.tar.gz", hash = "sha256:fdcd09713cbd42480740d2fe29c990f7fbd885a67efc328aa8be6ee3e9f76a6b"}, - {file = "proto_plus-1.22.3-py3-none-any.whl", hash = "sha256:a49cd903bc0b6ab41f76bf65510439d56ca76f868adf0274e738bfdd096894df"}, -] - -[package.dependencies] -protobuf = ">=3.19.0,<5.0.0dev" - -[package.extras] -testing = ["google-api-core[grpc] (>=1.31.5)"] - -[[package]] -name = "protobuf" -version = "4.25.1" -description = "" -category = "dev" -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"}, -] - -[[package]] -name = "psutil" -version = "5.9.6" -description = "Cross-platform lib for process and system monitoring in Python." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "psutil-5.9.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:fb8a697f11b0f5994550555fcfe3e69799e5b060c8ecf9e2f75c69302cc35c0d"}, - {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:91ecd2d9c00db9817a4b4192107cf6954addb5d9d67a969a4f436dbc9200f88c"}, - {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:10e8c17b4f898d64b121149afb136c53ea8b68c7531155147867b7b1ac9e7e28"}, - {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:18cd22c5db486f33998f37e2bb054cc62fd06646995285e02a51b1e08da97017"}, - {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ca2780f5e038379e520281e4c032dddd086906ddff9ef0d1b9dcf00710e5071c"}, - {file = "psutil-5.9.6-cp27-none-win32.whl", hash = "sha256:70cb3beb98bc3fd5ac9ac617a327af7e7f826373ee64c80efd4eb2856e5051e9"}, - {file = "psutil-5.9.6-cp27-none-win_amd64.whl", hash = "sha256:51dc3d54607c73148f63732c727856f5febec1c7c336f8f41fcbd6315cce76ac"}, - {file = "psutil-5.9.6-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c69596f9fc2f8acd574a12d5f8b7b1ba3765a641ea5d60fb4736bf3c08a8214a"}, - {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92e0cc43c524834af53e9d3369245e6cc3b130e78e26100d1f63cdb0abeb3d3c"}, - {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4"}, - {file = "psutil-5.9.6-cp36-cp36m-win32.whl", hash = "sha256:3ebf2158c16cc69db777e3c7decb3c0f43a7af94a60d72e87b2823aebac3d602"}, - {file = "psutil-5.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:ff18b8d1a784b810df0b0fff3bcb50ab941c3b8e2c8de5726f9c71c601c611aa"}, - {file = "psutil-5.9.6-cp37-abi3-win32.whl", hash = "sha256:a6f01f03bf1843280f4ad16f4bde26b817847b4c1a0db59bf6419807bc5ce05c"}, - {file = "psutil-5.9.6-cp37-abi3-win_amd64.whl", hash = "sha256:6e5fb8dc711a514da83098bc5234264e551ad980cec5f85dabf4d38ed6f15e9a"}, - {file = "psutil-5.9.6-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:daecbcbd29b289aac14ece28eca6a3e60aa361754cf6da3dfb20d4d32b6c7f57"}, - {file = "psutil-5.9.6.tar.gz", hash = "sha256:e4b92ddcd7dd4cdd3f900180ea1e104932c7bce234fb88976e2a3b296441225a"}, -] - -[package.extras] -test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] - -[[package]] -name = "ptyprocess" -version = "0.7.0" -description = "Run a subprocess in a pseudo terminal" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, - {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, -] - -[[package]] -name = "pure-eval" -version = "0.2.2" -description = "Safely evaluate AST nodes without side effects" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, - {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, -] - -[package.extras] -tests = ["pytest"] - -[[package]] -name = "py4j" -version = "0.10.9.7" -description = "Enables Python programs to dynamically access arbitrary Java objects" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "py4j-0.10.9.7-py2.py3-none-any.whl", hash = "sha256:85defdfd2b2376eb3abf5ca6474b51ab7e0de341c75a02f46dc9b5976f5a5c1b"}, - {file = "py4j-0.10.9.7.tar.gz", hash = "sha256:0b6e5315bb3ada5cf62ac651d107bb2ebc02def3dee9d9548e3baac644ea8dbb"}, -] - -[[package]] -name = "pyasn1" -version = "0.5.1" -description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -files = [ - {file = "pyasn1-0.5.1-py2.py3-none-any.whl", hash = "sha256:4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58"}, - {file = "pyasn1-0.5.1.tar.gz", hash = "sha256:6d391a96e59b23130a5cfa74d6fd7f388dbbe26cc8f1edf39fdddf08d9d6676c"}, -] - -[[package]] -name = "pyasn1-modules" -version = "0.3.0" -description = "A collection of ASN.1-based protocols modules" -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -files = [ - {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, - {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, -] - -[package.dependencies] -pyasn1 = ">=0.4.6,<0.6.0" - -[[package]] -name = "pybind11" -version = "2.11.1" -description = "Seamless operability between C++11 and Python" -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pybind11-2.11.1-py3-none-any.whl", hash = "sha256:33cdd02a6453380dd71cc70357ce388ad1ee8d32bd0e38fc22b273d050aa29b3"}, - {file = "pybind11-2.11.1.tar.gz", hash = "sha256:00cd59116a6e8155aecd9174f37ba299d1d397ed4a6b86ac1dfe01b3e40f2cc4"}, -] - -[package.extras] -global = ["pybind11-global (==2.11.1)"] - -[[package]] -name = "pybtex" -version = "0.24.0" -description = "A BibTeX-compatible bibliography processor in Python" -category = "dev" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" -files = [ - {file = "pybtex-0.24.0-py2.py3-none-any.whl", hash = "sha256:e1e0c8c69998452fea90e9179aa2a98ab103f3eed894405b7264e517cc2fcc0f"}, - {file = "pybtex-0.24.0.tar.gz", hash = "sha256:818eae35b61733e5c007c3fcd2cfb75ed1bc8b4173c1f70b56cc4c0802d34755"}, -] - -[package.dependencies] -latexcodec = ">=1.0.4" -PyYAML = ">=3.01" -six = "*" - -[package.extras] -test = ["pytest"] - -[[package]] -name = "pybtex-docutils" -version = "1.0.3" -description = "A docutils backend for pybtex." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pybtex-docutils-1.0.3.tar.gz", hash = "sha256:3a7ebdf92b593e00e8c1c538aa9a20bca5d92d84231124715acc964d51d93c6b"}, - {file = "pybtex_docutils-1.0.3-py3-none-any.whl", hash = "sha256:8fd290d2ae48e32fcb54d86b0efb8d573198653c7e2447d5bec5847095f430b9"}, -] - -[package.dependencies] -docutils = ">=0.14" -pybtex = ">=0.16" - -[[package]] -name = "pycparser" -version = "2.21" -description = "C parser in Python" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] - -[[package]] -name = "pydantic" -version = "1.10.13" -description = "Data validation and settings management using python type hints" -category = "dev" -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"}, -] - -[package.dependencies] -typing-extensions = ">=4.2.0" - -[package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] - -[[package]] -name = "pygments" -version = "2.17.2" -description = "Pygments is a syntax highlighting package written in Python." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, - {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, -] - -[package.extras] -plugins = ["importlib-metadata"] -windows-terminal = ["colorama (>=0.4.6)"] - -[[package]] -name = "pyjwt" -version = "2.8.0" -description = "JSON Web Token implementation in Python" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, - {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, -] - -[package.extras] -crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] - -[[package]] -name = "pylint" -version = "2.17.7" -description = "python code static checker" -category = "dev" -optional = false -python-versions = ">=3.7.2" -files = [ - {file = "pylint-2.17.7-py3-none-any.whl", hash = "sha256:27a8d4c7ddc8c2f8c18aa0050148f89ffc09838142193fdbe98f172781a3ff87"}, - {file = "pylint-2.17.7.tar.gz", hash = "sha256:f4fcac7ae74cfe36bc8451e931d8438e4a476c20314b1101c458ad0f05191fad"}, -] - -[package.dependencies] -astroid = ">=2.15.8,<=2.17.0-dev0" -colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -dill = [ - {version = ">=0.2", markers = "python_version < \"3.11\""}, - {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, -] -isort = ">=4.2.5,<6" -mccabe = ">=0.6,<0.8" -platformdirs = ">=2.2.0" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -tomlkit = ">=0.10.1" -typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} - -[package.extras] -spelling = ["pyenchant (>=3.2,<4.0)"] -testutils = ["gitpython (>3)"] - -[[package]] -name = "pyparsing" -version = "3.1.1" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "dev" -optional = false -python-versions = ">=3.6.8" -files = [ - {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, - {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, -] - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - -[[package]] -name = "pyquil" -version = "3.5.4" -description = "A Python library for creating Quantum Instruction Language (Quil) programs." -category = "dev" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "pyquil-3.5.4-py3-none-any.whl", hash = "sha256:ef36458b38b314f647f0e6cb067358e92033821f90fb7a533baa5ff59bfbaaf1"}, - {file = "pyquil-3.5.4.tar.gz", hash = "sha256:4fe65c83a4cf9164d3c7ddb314029d71b7388fb22fb56a1ba8f4dd3c1bb1d9a6"}, -] - -[package.dependencies] -deprecated = ">=1.2.13,<2.0.0" -lark = ">=0.11.1,<0.12.0" -networkx = ">=2.5" -numpy = ">=1.21,<2.0" -qcs-api-client = ">=0.21.0,<0.22.0" -rpcq = ">=3.10.0,<4.0.0" -scipy = ">=1.6.1,<2.0.0" -tenacity = ">=8.2.2,<9.0.0" -types-deprecated = ">=1.2.9.2,<2.0.0.0" -types-python-dateutil = ">=2.8.19,<3.0.0" -types-retry = ">=0.9.9,<0.10.0" - -[package.extras] -docs = ["Sphinx (>=4.0.2,<5.0.0)", "nbsphinx (>=0.8.6,<0.9.0)", "recommonmark (>=0.7.1,<0.8.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)"] -latex = ["ipython (>=7.21.0,<8.0.0)"] - -[[package]] -name = "pyreadline" -version = "2.1" -description = "A python implmementation of GNU readline." -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "pyreadline-2.1.zip", hash = "sha256:4530592fc2e85b25b1a9f79664433da09237c1a270e4d78ea5aa3a2c7229e2d1"}, -] - -[[package]] -name = "pyrepl" -version = "0.9.0" -description = "A library for building flexible command line interfaces" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "pyrepl-0.9.0.tar.gz", hash = "sha256:292570f34b5502e871bbb966d639474f2b57fbfcd3373c2d6a2f3d56e681a775"}, -] - -[[package]] -name = "pyrsistent" -version = "0.20.0" -description = "Persistent/Functional/Immutable data structures" -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyrsistent-0.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce"}, - {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f"}, - {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34"}, - {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b"}, - {file = "pyrsistent-0.20.0-cp310-cp310-win32.whl", hash = "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f"}, - {file = "pyrsistent-0.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7"}, - {file = "pyrsistent-0.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958"}, - {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8"}, - {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a"}, - {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224"}, - {file = "pyrsistent-0.20.0-cp311-cp311-win32.whl", hash = "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656"}, - {file = "pyrsistent-0.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee"}, - {file = "pyrsistent-0.20.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e"}, - {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e"}, - {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3"}, - {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d"}, - {file = "pyrsistent-0.20.0-cp312-cp312-win32.whl", hash = "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174"}, - {file = "pyrsistent-0.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d"}, - {file = "pyrsistent-0.20.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054"}, - {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98"}, - {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714"}, - {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86"}, - {file = "pyrsistent-0.20.0-cp38-cp38-win32.whl", hash = "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423"}, - {file = "pyrsistent-0.20.0-cp38-cp38-win_amd64.whl", hash = "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d"}, - {file = "pyrsistent-0.20.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce"}, - {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0"}, - {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022"}, - {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca"}, - {file = "pyrsistent-0.20.0-cp39-cp39-win32.whl", hash = "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f"}, - {file = "pyrsistent-0.20.0-cp39-cp39-win_amd64.whl", hash = "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf"}, - {file = "pyrsistent-0.20.0-py3-none-any.whl", hash = "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b"}, - {file = "pyrsistent-0.20.0.tar.gz", hash = "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4"}, -] - -[[package]] -name = "pytest" -version = "7.4.3" -description = "pytest: simple powerful testing with Python" -category = "dev" -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"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} - -[package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] - -[[package]] -name = "pytest-cov" -version = "4.1.0" -description = "Pytest plugin for measuring coverage." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, - {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, -] - -[package.dependencies] -coverage = {version = ">=5.2.1", extras = ["toml"]} -pytest = ">=4.6" - -[package.extras] -testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] - -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "python-rapidjson" -version = "1.13" -description = "Python wrapper around rapidjson" -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "python-rapidjson-1.13.tar.gz", hash = "sha256:ffe9d382be84ddcf197c188d2f49baa8b47270cec95a1dcb62496e2af3eb71d4"}, - {file = "python_rapidjson-1.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12b0dad7a605d6482fecae18046d91ec772cef1db5d506256b5f399bf0de9b79"}, - {file = "python_rapidjson-1.13-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87ffa883e20bbb320695b68393b120d916e4bc9125da3ece1f5c32c65f3d2022"}, - {file = "python_rapidjson-1.13-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f6ea7c0d41a5daf1fbc91f749084bf41afcd48d9883a1fa00ec806fc04f2af2"}, - {file = "python_rapidjson-1.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:016c0143832f9679eaef35683c606086cea937a98c264cf830adfd0887cb1f68"}, - {file = "python_rapidjson-1.13-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e065e68dcada7df47c74fa974a5293601c97e8d38c1b4acea1700eb1f7ce1b18"}, - {file = "python_rapidjson-1.13-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7a700730b5109207799025aeade538ab830a7bbefc8612cfe565e660bdae706d"}, - {file = "python_rapidjson-1.13-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ee8bf49beccaa5acd458bc83e45d49892c906830580ecc17a744f15cfe752366"}, - {file = "python_rapidjson-1.13-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a6d910663a1f6c5c1658b176824e46dcf30370c3939a21575c78906e06e06ab3"}, - {file = "python_rapidjson-1.13-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ede37e4640cb9aaeb812963d2098f8bbff9a86b95a5638e9222bb619ba3a68c0"}, - {file = "python_rapidjson-1.13-cp310-cp310-win32.whl", hash = "sha256:2c86448740a4085197e8e3708c68bd21d3dfaa6d1b9821824a59dc22e90c1fc7"}, - {file = "python_rapidjson-1.13-cp310-cp310-win_amd64.whl", hash = "sha256:4873a3e2ee676f26c4cfdd0026f2a09220868e3df79d6981fab87f4bb5689588"}, - {file = "python_rapidjson-1.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ceca087be345f383999faf388298300f9a40a4e9d5cac142c0e1ce3f9ee3249"}, - {file = "python_rapidjson-1.13-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa60bf1bc77e8db0d4edafc92130dc70cb1b06c3ef47abaa83bef43198212b9b"}, - {file = "python_rapidjson-1.13-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dcc302a70a7addcced0901873bce03319b75035ed5bfda144be9b1c8ef4c724e"}, - {file = "python_rapidjson-1.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b951a1bece7ad6224c00634f0e2b52311830b10dead62713d2822979013a0eb"}, - {file = "python_rapidjson-1.13-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:677f7e3173aff366fb673abca99aa9e477b3607d86ecf83b21e8f5b2144db4c9"}, - {file = "python_rapidjson-1.13-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3d9c071acb3c9c6dc4a4a3cd2c776a09d5605e92610ff462df40803c7135f734"}, - {file = "python_rapidjson-1.13-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:438bed3cf5c0aebbbbdf5b545fa641051f3c34f5f3d991adbe0d57cf0dba4735"}, - {file = "python_rapidjson-1.13-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:ccdb9cf48a451bf69a862285f45ee69ce96109400c8823d85d385af13a977168"}, - {file = "python_rapidjson-1.13-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:69d15112ee3ed1ed7e8edc54a2fbbc3c21bca642faf64c0a3951ae8dfdfc53dc"}, - {file = "python_rapidjson-1.13-cp311-cp311-win32.whl", hash = "sha256:10d236ab4c04d98b427282f87a5c600d482ad001653f07d72d94319e043a029e"}, - {file = "python_rapidjson-1.13-cp311-cp311-win_amd64.whl", hash = "sha256:263828991e0335685feb283e8fd576de7520b0c7b61000bdb5d9f55d3b509c51"}, - {file = "python_rapidjson-1.13-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df351d0aa2f2b70a911964233938c1a0907b5df4f92a0ff7fa5724f9b05eadfd"}, - {file = "python_rapidjson-1.13-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c651217b33886b826b1e1d0506e2e7072f03c8e98b3e23edd5fb52d717a3d7cc"}, - {file = "python_rapidjson-1.13-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4557aebbdd93fa54e51cb9a66aca29096253803dfcfad9210378c1230e24d1dc"}, - {file = "python_rapidjson-1.13-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f682fa579de6ef4b0fb8308d3810e54acece8075864f061be380efab1363545"}, - {file = "python_rapidjson-1.13-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09cb57befa52eb6d229540bc268e9db0336428025773a282140b6d6a8c0b0cfc"}, - {file = "python_rapidjson-1.13-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bffb9953ac4adfddbb186f26a23b668697a1a18c9e6242238f911215fc4c19df"}, - {file = "python_rapidjson-1.13-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:c726c8ee15332b4257e11fc2f2f6d8c3b893abbc4529f7d0fe4db245d5d48958"}, - {file = "python_rapidjson-1.13-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:127c1511f5b6e792257a384b1d5adf9f510a0b9d7a9125e136efcf97c7f12d59"}, - {file = "python_rapidjson-1.13-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:674e924dcafb34568f1e9e86487a3a3cd608408b0656f593ead59f71550a8153"}, - {file = "python_rapidjson-1.13-cp312-cp312-win32.whl", hash = "sha256:d626ac73df1214ee69c75eadc407107715f38f895e52645c529d3cd0a98f06b8"}, - {file = "python_rapidjson-1.13-cp312-cp312-win_amd64.whl", hash = "sha256:896e5a748a9a153f03d47197f8e324948fb7815ae911c4da58f9d4b259541a83"}, - {file = "python_rapidjson-1.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fbd3fc5cd5a9c29064c3df8ad24c8f8f8e2b41244fb041c7889ed23b09224898"}, - {file = "python_rapidjson-1.13-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67aa202d5c6d957c8f2d95ee5e381de71215e9e31276763abd07ac0697f1850b"}, - {file = "python_rapidjson-1.13-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bdd559c991bee7c745834ecfd31db7286612cd72bdbe17706b225ad09063341"}, - {file = "python_rapidjson-1.13-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7fd4d54d9ced3a35a263e34daac36ff190d4927f80bd1d5b180e9114e172227"}, - {file = "python_rapidjson-1.13-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fca75f4e671eb83b7342c735a605ca85b0c9a3107bdba8f78e9c620b4f020f0c"}, - {file = "python_rapidjson-1.13-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3677a1534f43302736a87299ada097dd96b5644bfcd9997be5e1b15f535acdd7"}, - {file = "python_rapidjson-1.13-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3fd925c62c8c2a16e185c5e9bc3d3bc43c10c6ac0f8c50f99b6339dfc35d5234"}, - {file = "python_rapidjson-1.13-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:e5f44d35677b9dbb0dec8223cc7a0824c7d1947e2fcc207453ccd2dafc3786a9"}, - {file = "python_rapidjson-1.13-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c1f56d2546c2f2235595b14535e17037bf2a7956542c3eb65032b6282fdd9bf7"}, - {file = "python_rapidjson-1.13-cp38-cp38-win32.whl", hash = "sha256:93eebbbfd1cffffdfac0f02d11757f4a8017465ea88be24f8fbb0f22bf97f21e"}, - {file = "python_rapidjson-1.13-cp38-cp38-win_amd64.whl", hash = "sha256:7884325958745ec047a15eaa2c5b6b95b94bf22812e1d8c991729de39ae59b48"}, - {file = "python_rapidjson-1.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7789994fa71df0da256f5b8afe3949be293840c31d31de89ced058d5bce08ef"}, - {file = "python_rapidjson-1.13-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93db30e414770452119ff4bfa5234aebd36476663ea3542685a388b78a98e0e7"}, - {file = "python_rapidjson-1.13-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29fb34ee79c3e4646845edb7ddf857cdaeb3a30fbcd55b91bf9e79a04b9fde60"}, - {file = "python_rapidjson-1.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ffbe8b4bd475af1571bfc61679685a624740a19441fdd72fb360db2dc96a7a"}, - {file = "python_rapidjson-1.13-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d66f4196b35ce962bfce185d9860bbe23e5a075b48db7b8318650be3aefa307"}, - {file = "python_rapidjson-1.13-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1b9c8b7c0b99ad0bf5b1493883ce4a8a447ac30c0c6d8f26232c0ed6e8ed578f"}, - {file = "python_rapidjson-1.13-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf42f367c7950cc7169cfcd78e54d8ed607207e9d078fe13b1f5ffc992910960"}, - {file = "python_rapidjson-1.13-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:74b7ff43aecac7c83e1f3d2cce363c0b01c68923d6dd6874c5607b1eb2f61504"}, - {file = "python_rapidjson-1.13-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6ad430a03e180619b1f1e3d9e2a129bbfa2e7aed3e49bf2ef4db274286e8379a"}, - {file = "python_rapidjson-1.13-cp39-cp39-win32.whl", hash = "sha256:de295c31400a52f2d8b04f6358093fc574eef53e2a49faf7a334cc4adfc43aea"}, - {file = "python_rapidjson-1.13-cp39-cp39-win_amd64.whl", hash = "sha256:599fcf313db14b762204fbc325c5630516a2a1953e32015e37d06d4cd631800e"}, -] - -[[package]] -name = "pytz" -version = "2023.3.post1" -description = "World timezone definitions, modern and historical" -category = "dev" -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"}, -] - -[[package]] -name = "pywin32" -version = "306" -description = "Python for Window Extensions" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, - {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, - {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, - {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, - {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, - {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, - {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, - {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, - {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, - {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, - {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, - {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, - {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, - {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, -] - -[[package]] -name = "pyyaml" -version = "6.0.1" -description = "YAML parser and emitter for Python" -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {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"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {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"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {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"}, -] - -[[package]] -name = "pyzmq" -version = "25.1.1" -description = "Python bindings for 0MQ" -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:381469297409c5adf9a0e884c5eb5186ed33137badcbbb0560b86e910a2f1e76"}, - {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:955215ed0604dac5b01907424dfa28b40f2b2292d6493445dd34d0dfa72586a8"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:985bbb1316192b98f32e25e7b9958088431d853ac63aca1d2c236f40afb17c83"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afea96f64efa98df4da6958bae37f1cbea7932c35878b185e5982821bc883369"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76705c9325d72a81155bb6ab48d4312e0032bf045fb0754889133200f7a0d849"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77a41c26205d2353a4c94d02be51d6cbdf63c06fbc1295ea57dad7e2d3381b71"}, - {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:12720a53e61c3b99d87262294e2b375c915fea93c31fc2336898c26d7aed34cd"}, - {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:57459b68e5cd85b0be8184382cefd91959cafe79ae019e6b1ae6e2ba8a12cda7"}, - {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:292fe3fc5ad4a75bc8df0dfaee7d0babe8b1f4ceb596437213821f761b4589f9"}, - {file = "pyzmq-25.1.1-cp310-cp310-win32.whl", hash = "sha256:35b5ab8c28978fbbb86ea54958cd89f5176ce747c1fb3d87356cf698048a7790"}, - {file = "pyzmq-25.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:11baebdd5fc5b475d484195e49bae2dc64b94a5208f7c89954e9e354fc609d8f"}, - {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:d20a0ddb3e989e8807d83225a27e5c2eb2260eaa851532086e9e0fa0d5287d83"}, - {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e1c1be77bc5fb77d923850f82e55a928f8638f64a61f00ff18a67c7404faf008"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d89528b4943d27029a2818f847c10c2cecc79fa9590f3cb1860459a5be7933eb"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90f26dc6d5f241ba358bef79be9ce06de58d477ca8485e3291675436d3827cf8"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2b92812bd214018e50b6380ea3ac0c8bb01ac07fcc14c5f86a5bb25e74026e9"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f957ce63d13c28730f7fd6b72333814221c84ca2421298f66e5143f81c9f91f"}, - {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:047a640f5c9c6ade7b1cc6680a0e28c9dd5a0825135acbd3569cc96ea00b2505"}, - {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7f7e58effd14b641c5e4dec8c7dab02fb67a13df90329e61c869b9cc607ef752"}, - {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c2910967e6ab16bf6fbeb1f771c89a7050947221ae12a5b0b60f3bca2ee19bca"}, - {file = "pyzmq-25.1.1-cp311-cp311-win32.whl", hash = "sha256:76c1c8efb3ca3a1818b837aea423ff8a07bbf7aafe9f2f6582b61a0458b1a329"}, - {file = "pyzmq-25.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:44e58a0554b21fc662f2712814a746635ed668d0fbc98b7cb9d74cb798d202e6"}, - {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:e1ffa1c924e8c72778b9ccd386a7067cddf626884fd8277f503c48bb5f51c762"}, - {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1af379b33ef33757224da93e9da62e6471cf4a66d10078cf32bae8127d3d0d4a"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cff084c6933680d1f8b2f3b4ff5bbb88538a4aac00d199ac13f49d0698727ecb"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2400a94f7dd9cb20cd012951a0cbf8249e3d554c63a9c0cdfd5cbb6c01d2dec"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d81f1ddae3858b8299d1da72dd7d19dd36aab654c19671aa8a7e7fb02f6638a"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:255ca2b219f9e5a3a9ef3081512e1358bd4760ce77828e1028b818ff5610b87b"}, - {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a882ac0a351288dd18ecae3326b8a49d10c61a68b01419f3a0b9a306190baf69"}, - {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:724c292bb26365659fc434e9567b3f1adbdb5e8d640c936ed901f49e03e5d32e"}, - {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ca1ed0bb2d850aa8471387882247c68f1e62a4af0ce9c8a1dbe0d2bf69e41fb"}, - {file = "pyzmq-25.1.1-cp312-cp312-win32.whl", hash = "sha256:b3451108ab861040754fa5208bca4a5496c65875710f76789a9ad27c801a0075"}, - {file = "pyzmq-25.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:eadbefd5e92ef8a345f0525b5cfd01cf4e4cc651a2cffb8f23c0dd184975d787"}, - {file = "pyzmq-25.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:db0b2af416ba735c6304c47f75d348f498b92952f5e3e8bff449336d2728795d"}, - {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c133e93b405eb0d36fa430c94185bdd13c36204a8635470cccc200723c13bb"}, - {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:273bc3959bcbff3f48606b28229b4721716598d76b5aaea2b4a9d0ab454ec062"}, - {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cbc8df5c6a88ba5ae385d8930da02201165408dde8d8322072e3e5ddd4f68e22"}, - {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:18d43df3f2302d836f2a56f17e5663e398416e9dd74b205b179065e61f1a6edf"}, - {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:73461eed88a88c866656e08f89299720a38cb4e9d34ae6bf5df6f71102570f2e"}, - {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:34c850ce7976d19ebe7b9d4b9bb8c9dfc7aac336c0958e2651b88cbd46682123"}, - {file = "pyzmq-25.1.1-cp36-cp36m-win32.whl", hash = "sha256:d2045d6d9439a0078f2a34b57c7b18c4a6aef0bee37f22e4ec9f32456c852c71"}, - {file = "pyzmq-25.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:458dea649f2f02a0b244ae6aef8dc29325a2810aa26b07af8374dc2a9faf57e3"}, - {file = "pyzmq-25.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7cff25c5b315e63b07a36f0c2bab32c58eafbe57d0dce61b614ef4c76058c115"}, - {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1579413ae492b05de5a6174574f8c44c2b9b122a42015c5292afa4be2507f28"}, - {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3d0a409d3b28607cc427aa5c30a6f1e4452cc44e311f843e05edb28ab5e36da0"}, - {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21eb4e609a154a57c520e3d5bfa0d97e49b6872ea057b7c85257b11e78068222"}, - {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:034239843541ef7a1aee0c7b2cb7f6aafffb005ede965ae9cbd49d5ff4ff73cf"}, - {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f8115e303280ba09f3898194791a153862cbf9eef722ad8f7f741987ee2a97c7"}, - {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1a5d26fe8f32f137e784f768143728438877d69a586ddeaad898558dc971a5ae"}, - {file = "pyzmq-25.1.1-cp37-cp37m-win32.whl", hash = "sha256:f32260e556a983bc5c7ed588d04c942c9a8f9c2e99213fec11a031e316874c7e"}, - {file = "pyzmq-25.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:abf34e43c531bbb510ae7e8f5b2b1f2a8ab93219510e2b287a944432fad135f3"}, - {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:87e34f31ca8f168c56d6fbf99692cc8d3b445abb5bfd08c229ae992d7547a92a"}, - {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c9c6c9b2c2f80747a98f34ef491c4d7b1a8d4853937bb1492774992a120f475d"}, - {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5619f3f5a4db5dbb572b095ea3cb5cc035335159d9da950830c9c4db2fbb6995"}, - {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a34d2395073ef862b4032343cf0c32a712f3ab49d7ec4f42c9661e0294d106f"}, - {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0e6b78220aba09815cd1f3a32b9c7cb3e02cb846d1cfc526b6595f6046618"}, - {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3669cf8ee3520c2f13b2e0351c41fea919852b220988d2049249db10046a7afb"}, - {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2d163a18819277e49911f7461567bda923461c50b19d169a062536fffe7cd9d2"}, - {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:df27ffddff4190667d40de7beba4a950b5ce78fe28a7dcc41d6f8a700a80a3c0"}, - {file = "pyzmq-25.1.1-cp38-cp38-win32.whl", hash = "sha256:a382372898a07479bd34bda781008e4a954ed8750f17891e794521c3e21c2e1c"}, - {file = "pyzmq-25.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:52533489f28d62eb1258a965f2aba28a82aa747202c8fa5a1c7a43b5db0e85c1"}, - {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:03b3f49b57264909aacd0741892f2aecf2f51fb053e7d8ac6767f6c700832f45"}, - {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:330f9e188d0d89080cde66dc7470f57d1926ff2fb5576227f14d5be7ab30b9fa"}, - {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2ca57a5be0389f2a65e6d3bb2962a971688cbdd30b4c0bd188c99e39c234f414"}, - {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d457aed310f2670f59cc5b57dcfced452aeeed77f9da2b9763616bd57e4dbaae"}, - {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c56d748ea50215abef7030c72b60dd723ed5b5c7e65e7bc2504e77843631c1a6"}, - {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f03d3f0d01cb5a018debeb412441996a517b11c5c17ab2001aa0597c6d6882c"}, - {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:820c4a08195a681252f46926de10e29b6bbf3e17b30037bd4250d72dd3ddaab8"}, - {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17ef5f01d25b67ca8f98120d5fa1d21efe9611604e8eb03a5147360f517dd1e2"}, - {file = "pyzmq-25.1.1-cp39-cp39-win32.whl", hash = "sha256:04ccbed567171579ec2cebb9c8a3e30801723c575601f9a990ab25bcac6b51e2"}, - {file = "pyzmq-25.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:e61f091c3ba0c3578411ef505992d356a812fb200643eab27f4f70eed34a29ef"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ade6d25bb29c4555d718ac6d1443a7386595528c33d6b133b258f65f963bb0f6"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c95ddd4f6e9fca4e9e3afaa4f9df8552f0ba5d1004e89ef0a68e1f1f9807c7"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48e466162a24daf86f6b5ca72444d2bf39a5e58da5f96370078be67c67adc978"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abc719161780932c4e11aaebb203be3d6acc6b38d2f26c0f523b5b59d2fc1996"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ccf825981640b8c34ae54231b7ed00271822ea1c6d8ba1090ebd4943759abf5"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c2f20ce161ebdb0091a10c9ca0372e023ce24980d0e1f810f519da6f79c60800"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:deee9ca4727f53464daf089536e68b13e6104e84a37820a88b0a057b97bba2d2"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa8d6cdc8b8aa19ceb319aaa2b660cdaccc533ec477eeb1309e2a291eaacc43a"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:019e59ef5c5256a2c7378f2fb8560fc2a9ff1d315755204295b2eab96b254d0a"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b9af3757495c1ee3b5c4e945c1df7be95562277c6e5bccc20a39aec50f826cd0"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:548d6482dc8aadbe7e79d1b5806585c8120bafa1ef841167bc9090522b610fa6"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:057e824b2aae50accc0f9a0570998adc021b372478a921506fddd6c02e60308e"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2243700cc5548cff20963f0ca92d3e5e436394375ab8a354bbea2b12911b20b0"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79986f3b4af059777111409ee517da24a529bdbd46da578b33f25580adcff728"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:11d58723d44d6ed4dd677c5615b2ffb19d5c426636345567d6af82be4dff8a55"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:49d238cf4b69652257db66d0c623cd3e09b5d2e9576b56bc067a396133a00d4a"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fedbdc753827cf014c01dbbee9c3be17e5a208dcd1bf8641ce2cd29580d1f0d4"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc16ac425cc927d0a57d242589f87ee093884ea4804c05a13834d07c20db203c"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11c1d2aed9079c6b0c9550a7257a836b4a637feb334904610f06d70eb44c56d2"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e8a701123029cc240cea61dd2d16ad57cab4691804143ce80ecd9286b464d180"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61706a6b6c24bdece85ff177fec393545a3191eeda35b07aaa1458a027ad1304"}, - {file = "pyzmq-25.1.1.tar.gz", hash = "sha256:259c22485b71abacdfa8bf79720cd7bcf4b9d128b30ea554f01ae71fdbfdaa23"}, -] - -[package.dependencies] -cffi = {version = "*", markers = "implementation_name == \"pypy\""} - -[[package]] -name = "qcs-api-client" -version = "0.21.6" -description = "A client library for accessing the Rigetti QCS API" -category = "dev" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "qcs_api_client-0.21.6-py3-none-any.whl", hash = "sha256:0231c9a741c137adc78539068b7fe1d4e1854bee4e3e868017abc4eb3876c3a0"}, - {file = "qcs_api_client-0.21.6.tar.gz", hash = "sha256:1da391ff03715c9d50e14aa6006b5f0c3cffde9018fb968ff27545cc90c87a9c"}, -] - -[package.dependencies] -attrs = ">=21.3.0,<22.0.0" -httpx = ">=0.23.0,<0.24.0" -iso8601 = ">=1.0.2,<2.0.0" -pydantic = ">=1.7.2,<2.0.0" -PyJWT = ">=2.4.0,<3.0.0" -python-dateutil = ">=2.8.1,<3.0.0" -retrying = ">=1.3.3,<2.0.0" -rfc3339 = ">=6.2,<7.0" -toml = ">=0.10.2,<0.11.0" - -[[package]] -name = "qdldl" -version = "0.1.7.post0" -description = "QDLDL, a free LDL factorization routine." -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "qdldl-0.1.7.post0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8ab02e8b9ff86bd644a1935718387c82fbe04c31e3309cf9f7a121d02b1deda8"}, - {file = "qdldl-0.1.7.post0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e5d6753310377451ed4dc09b1ef28faf40108b713e7f55c8a8ae94d679a672"}, - {file = "qdldl-0.1.7.post0-cp310-cp310-win_amd64.whl", hash = "sha256:718d8e141832e96ba71ca1807a74813836c6403110faaa3d33a67de1af3b29c4"}, - {file = "qdldl-0.1.7.post0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0e3f06e8a49ddd834b24fc3d7afbba4fec0923101045aa2666e18d2a9980e329"}, - {file = "qdldl-0.1.7.post0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a81c46522dd6b3042e2348fa98128bb5c0e466f42bce214e80cfb766ff40930"}, - {file = "qdldl-0.1.7.post0-cp311-cp311-win_amd64.whl", hash = "sha256:4a86155f3de66c5db0e21544b7a2421c671028fa20da407686d2a8d0e9b57e51"}, - {file = "qdldl-0.1.7.post0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:717cb1892b033c01a0aae84ededcfa1f05bcb97013095d779c497e6c32f90dac"}, - {file = "qdldl-0.1.7.post0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fc35432913085d94b2327242cf51388467ef7a37ac0d71eb31b594b575dd498"}, - {file = "qdldl-0.1.7.post0-cp36-cp36m-win_amd64.whl", hash = "sha256:fd5cfd8c50f33ddacb830594a63b8c1093a24aea45312b9d2ed826cea5ece08a"}, - {file = "qdldl-0.1.7.post0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:981ca8672e9506976c663552c1eb6f6daf9726d62650b3bf5900260946156166"}, - {file = "qdldl-0.1.7.post0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8ec670d97cf756f9159dc0a11de5cf054e88aefe84bea1c7282f00334642843"}, - {file = "qdldl-0.1.7.post0-cp37-cp37m-win_amd64.whl", hash = "sha256:aa208703b44337a7e77f6f2663f7a452144becb4421970d534ff8297b92e1e10"}, - {file = "qdldl-0.1.7.post0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b42649484f7c0d8ee659224ecaac0a3e97f12531018207f4d7323e4071320eb1"}, - {file = "qdldl-0.1.7.post0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26aa3d6f0da7779265d72e8f418094003e75fa53c515a53bc03fd8b9bcfbf7de"}, - {file = "qdldl-0.1.7.post0-cp38-cp38-win_amd64.whl", hash = "sha256:e55bcd6962178029faf543addd49db145302dd51e19855fefa71b5fd55840eea"}, - {file = "qdldl-0.1.7.post0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c1dd0e570e65aaf35e10b7fb345f7ac763fd05a2227b9c06ce65e07993fc4984"}, - {file = "qdldl-0.1.7.post0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae161342529852b6248ace4642bc4ee371a7c1e0707b7bc43a43ef7e73c06ca3"}, - {file = "qdldl-0.1.7.post0-cp39-cp39-win_amd64.whl", hash = "sha256:092f6606690a2b9bd3c939f3147887e02de13bb068fbed5ffdc7459034def623"}, - {file = "qdldl-0.1.7.post0.tar.gz", hash = "sha256:f346a114c8342ee6d4dbd6471eef314199fb268d3bf7b95885ca351fde2b023f"}, -] - -[package.dependencies] -numpy = ">=1.7" -scipy = ">=0.13.2" - -[[package]] -name = "qibojit" -version = "0.1.3" -description = "Simulation tools based on numba and cupy." -category = "dev" -optional = false -python-versions = ">=3.9.0,<3.12" -files = [] -develop = false - -[package.dependencies] -numba = ">=0.51.0" -psutil = "^5.9.5" -qibo = ">=0.2.3" -scipy = "^1.10.1" - -[package.source] -type = "git" -url = "https://github.com/qiboteam/qibojit.git" -reference = "HEAD" -resolved_reference = "c621acf3c8b8ffaaa67f76114b5ab9a086aea6d8" - -[[package]] -name = "recommonmark" -version = "0.7.1" -description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "recommonmark-0.7.1-py2.py3-none-any.whl", hash = "sha256:1b1db69af0231efce3fa21b94ff627ea33dee7079a01dd0a7f8482c3da148b3f"}, - {file = "recommonmark-0.7.1.tar.gz", hash = "sha256:bdb4db649f2222dcd8d2d844f0006b958d627f732415d399791ee436a3686d67"}, -] - -[package.dependencies] -commonmark = ">=0.8.1" -docutils = ">=0.11" -sphinx = ">=1.3.1" - -[[package]] -name = "requests" -version = "2.31.0" -description = "Python HTTP for Humans." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "requests-oauthlib" -version = "1.3.1" -description = "OAuthlib authentication support for Requests." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, - {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, -] - -[package.dependencies] -oauthlib = ">=3.0.0" -requests = ">=2.0.0" - -[package.extras] -rsa = ["oauthlib[signedtoken] (>=3.0.0)"] - -[[package]] -name = "retrying" -version = "1.3.4" -description = "Retrying" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "retrying-1.3.4-py3-none-any.whl", hash = "sha256:8cc4d43cb8e1125e0ff3344e9de678fefd85db3b750b81b2240dc0183af37b35"}, - {file = "retrying-1.3.4.tar.gz", hash = "sha256:345da8c5765bd982b1d1915deb9102fd3d1f7ad16bd84a9700b85f64d24e8f3e"}, -] - -[package.dependencies] -six = ">=1.7.0" - -[[package]] -name = "rfc3339" -version = "6.2" -description = "Format dates according to the RFC 3339." -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "rfc3339-6.2-py3-none-any.whl", hash = "sha256:f44316b21b21db90a625cde04ebb0d46268f153e6093021fa5893e92a96f58a3"}, - {file = "rfc3339-6.2.tar.gz", hash = "sha256:d53c3b5eefaef892b7240ba2a91fef012e86faa4d0a0ca782359c490e00ad4d0"}, -] - -[[package]] -name = "rfc3986" -version = "1.5.0" -description = "Validating URI References per RFC 3986" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, - {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, -] - -[package.dependencies] -idna = {version = "*", optional = true, markers = "extra == \"idna2008\""} - -[package.extras] -idna2008 = ["idna"] - -[[package]] -name = "rpcq" -version = "3.11.0" -description = "The RPC framework and message specification for Rigetti QCS." -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "rpcq-3.11.0.tar.gz", hash = "sha256:4361e759782f58dd0b8aa3a6d901e3ea5709f91c6a060bd444081fbb007b05a9"}, -] - -[package.dependencies] -msgpack = ">=0.6,<2.0" -python-rapidjson = "*" -pyzmq = ">=17" -"ruamel.yaml" = "*" - -[[package]] -name = "rsa" -version = "4.9" -description = "Pure-Python RSA implementation" -category = "dev" -optional = false -python-versions = ">=3.6,<4" -files = [ - {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, - {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, -] - -[package.dependencies] -pyasn1 = ">=0.1.3" - -[[package]] -name = "ruamel-yaml" -version = "0.18.5" -description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" -category = "dev" -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"}, -] - -[package.dependencies] -"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} - -[package.extras] -docs = ["mercurial (>5.7)", "ryd"] -jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] - -[[package]] -name = "ruamel-yaml-clib" -version = "0.2.8" -description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, - {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-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-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-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"}, - {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b"}, - {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win32.whl", hash = "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b"}, - {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win32.whl", hash = "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe"}, - {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win32.whl", hash = "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5"}, - {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15"}, - {file = "ruamel.yaml.clib-0.2.8.tar.gz", hash = "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512"}, -] - -[[package]] -name = "scikit-learn" -version = "1.3.2" -description = "A set of python modules for machine learning and data mining" -category = "dev" -optional = false -python-versions = ">=3.8" -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"}, -] - -[package.dependencies] -joblib = ">=1.1.1" -numpy = ">=1.17.3,<2.0" -scipy = ">=1.5.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)"] - -[[package]] -name = "scipy" -version = "1.11.4" -description = "Fundamental algorithms for scientific computing in Python" -category = "main" -optional = false -python-versions = ">=3.9" -files = [ - {file = "scipy-1.11.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc9a714581f561af0848e6b69947fda0614915f072dfd14142ed1bfe1b806710"}, - {file = "scipy-1.11.4-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:cf00bd2b1b0211888d4dc75656c0412213a8b25e80d73898083f402b50f47e41"}, - {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9999c008ccf00e8fbcce1236f85ade5c569d13144f77a1946bef8863e8f6eb4"}, - {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:933baf588daa8dc9a92c20a0be32f56d43faf3d1a60ab11b3f08c356430f6e56"}, - {file = "scipy-1.11.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8fce70f39076a5aa62e92e69a7f62349f9574d8405c0a5de6ed3ef72de07f446"}, - {file = "scipy-1.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:6550466fbeec7453d7465e74d4f4b19f905642c89a7525571ee91dd7adabb5a3"}, - {file = "scipy-1.11.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f313b39a7e94f296025e3cffc2c567618174c0b1dde173960cf23808f9fae4be"}, - {file = "scipy-1.11.4-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1b7c3dca977f30a739e0409fb001056484661cb2541a01aba0bb0029f7b68db8"}, - {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00150c5eae7b610c32589dda259eacc7c4f1665aedf25d921907f4d08a951b1c"}, - {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530f9ad26440e85766509dbf78edcfe13ffd0ab7fec2560ee5c36ff74d6269ff"}, - {file = "scipy-1.11.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5e347b14fe01003d3b78e196e84bd3f48ffe4c8a7b8a1afbcb8f5505cb710993"}, - {file = "scipy-1.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:acf8ed278cc03f5aff035e69cb511741e0418681d25fbbb86ca65429c4f4d9cd"}, - {file = "scipy-1.11.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:028eccd22e654b3ea01ee63705681ee79933652b2d8f873e7949898dda6d11b6"}, - {file = "scipy-1.11.4-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c6ff6ef9cc27f9b3db93a6f8b38f97387e6e0591600369a297a50a8e96e835d"}, - {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b030c6674b9230d37c5c60ab456e2cf12f6784596d15ce8da9365e70896effc4"}, - {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad669df80528aeca5f557712102538f4f37e503f0c5b9541655016dd0932ca79"}, - {file = "scipy-1.11.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce7fff2e23ab2cc81ff452a9444c215c28e6305f396b2ba88343a567feec9660"}, - {file = "scipy-1.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:36750b7733d960d7994888f0d148d31ea3017ac15eef664194b4ef68d36a4a97"}, - {file = "scipy-1.11.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e619aba2df228a9b34718efb023966da781e89dd3d21637b27f2e54db0410d7"}, - {file = "scipy-1.11.4-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:f3cd9e7b3c2c1ec26364856f9fbe78695fe631150f94cd1c22228456404cf1ec"}, - {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d10e45a6c50211fe256da61a11c34927c68f277e03138777bdebedd933712fea"}, - {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91af76a68eeae0064887a48e25c4e616fa519fa0d38602eda7e0f97d65d57937"}, - {file = "scipy-1.11.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6df1468153a31cf55ed5ed39647279beb9cfb5d3f84369453b49e4b8502394fd"}, - {file = "scipy-1.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:ee410e6de8f88fd5cf6eadd73c135020bfbbbdfcd0f6162c36a7638a1ea8cc65"}, - {file = "scipy-1.11.4.tar.gz", hash = "sha256:90a2b78e7f5733b9de748f589f09225013685f9b218275257f8a8168ededaeaa"}, -] - -[package.dependencies] -numpy = ">=1.21.6,<1.28.0" - -[package.extras] -dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] -doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] - -[[package]] -name = "scs" -version = "3.2.4.post1" -description = "Splitting conic solver" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "scs-3.2.4.post1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51fed30d2a4a1e6fbfc1e52b4cb3adeecbe89d7c47f3539b49afbb852415fe19"}, - {file = "scs-3.2.4.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb0524c0b9c3ed0d65dae161475accf3efa8e170938eb93251a60e9709b156ee"}, - {file = "scs-3.2.4.post1-cp310-cp310-win_amd64.whl", hash = "sha256:534519819eea96f18902a9fce15c4ec562b99d23b38dc843a48cb137b5641613"}, - {file = "scs-3.2.4.post1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d04ee4d19ac6d0f5053663bc48fcd5c5faed534272f13b10a4e173c814eea69"}, - {file = "scs-3.2.4.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c23b4299ab77ff5f654573d5667dc982292a8ef2b979053b38c40663919f13"}, - {file = "scs-3.2.4.post1-cp311-cp311-win_amd64.whl", hash = "sha256:ae4624938d3e3a8b7e508029275c6ad7a978fd48c158d0818f69f4ae764bf945"}, - {file = "scs-3.2.4.post1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:40294e22bfe509bdf7fd65a6b77c38cec22dcb3567ff5a75f3c41a1faf2ef1d5"}, - {file = "scs-3.2.4.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a2337acb0604770b6df1473254065a51c210ff9c82fc7c4490595510287a337"}, - {file = "scs-3.2.4.post1-cp312-cp312-win_amd64.whl", hash = "sha256:8689e75a57e59846e65d1c4b9d57e9964b00fcbb8e67fc77f98cf6e0a0530abd"}, - {file = "scs-3.2.4.post1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ad991b00d0a87c85db57bf2f1863c21bdc4e2f13837f6c35e809f5936bc6f165"}, - {file = "scs-3.2.4.post1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a28af160a44268e726a59d6cf340629b82940c1a643c4c87fe777e9cbe550d75"}, - {file = "scs-3.2.4.post1-cp37-cp37m-win_amd64.whl", hash = "sha256:f6283f725f3fee63d4631c2532d01a5b2ea65883b04d3da3be06084b1c60171b"}, - {file = "scs-3.2.4.post1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b3a622cf2120ae765f0f3ad5c6f4f86796d317e29132bab2ad4af3c14d9bf4d"}, - {file = "scs-3.2.4.post1-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:4b5259137c263304effa2b28d0125437ac23569e6e7753c115ae1206ec5033fd"}, - {file = "scs-3.2.4.post1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424710bc19b0506feee7e05e6d2b7af98acf09af5bd5353126164cbd46ac923f"}, - {file = "scs-3.2.4.post1-cp38-cp38-win_amd64.whl", hash = "sha256:e21bdc8046648846e2c204a6c5cf24eaaedd2b8f5e0a2ab41a647b0247b8d592"}, - {file = "scs-3.2.4.post1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cea0f7e9473f43f7edf1641d020ead7e39653a81c540fbdba8f3b7b8480038c9"}, - {file = "scs-3.2.4.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6126f1d7ed5ff368cb8c1836715b17a50074314579eefc6d511995a3ab93d70"}, - {file = "scs-3.2.4.post1-cp39-cp39-win_amd64.whl", hash = "sha256:18788befa5284bb1f49149bac7f813703de60ef5b6bf7698a9f1c3a5a49b78e4"}, - {file = "scs-3.2.4.post1.tar.gz", hash = "sha256:7015d7a56d1d5b53264fd277289ea169949309e26101677ff88cd0e5030d032f"}, -] - -[package.dependencies] -numpy = "*" -scipy = "*" - -[[package]] -name = "setuptools" -version = "69.0.2" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "dev" -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"}, -] - -[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-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "sniffio" -version = "1.3.0" -description = "Sniff out which async library your code is running under" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, -] - -[[package]] -name = "snowballstemmer" -version = "2.2.0" -description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, -] - -[[package]] -name = "sortedcontainers" -version = "2.4.0" -description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, - {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, -] - -[[package]] -name = "soupsieve" -version = "2.5" -description = "A modern CSS selector implementation for Beautiful Soup." -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, - {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, -] - -[[package]] -name = "sphinx" -version = "6.2.1" -description = "Python documentation generator" -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "Sphinx-6.2.1.tar.gz", hash = "sha256:6d56a34697bb749ffa0152feafc4b19836c755d90a7c59b72bc7dfd371b9cc6b"}, - {file = "sphinx-6.2.1-py3-none-any.whl", hash = "sha256:97787ff1fa3256a3eef9eda523a63dbf299f7b47e053cfcf684a1c2a8380c912"}, -] - -[package.dependencies] -alabaster = ">=0.7,<0.8" -babel = ">=2.9" -colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.18.1,<0.20" -imagesize = ">=1.3" -importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} -Jinja2 = ">=3.0" -packaging = ">=21.0" -Pygments = ">=2.13" -requests = ">=2.25.0" -snowballstemmer = ">=2.0" -sphinxcontrib-applehelp = "*" -sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = ">=2.0.0" -sphinxcontrib-jsmath = "*" -sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" - -[package.extras] -docs = ["sphinxcontrib-websupport"] -lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"] -test = ["cython", "filelock", "html5lib", "pytest (>=4.6)"] - -[[package]] -name = "sphinx-basic-ng" -version = "1.0.0b2" -description = "A modern skeleton for Sphinx themes." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b"}, - {file = "sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9"}, -] - -[package.dependencies] -sphinx = ">=4.0" - -[package.extras] -docs = ["furo", "ipython", "myst-parser", "sphinx-copybutton", "sphinx-inline-tabs"] - -[[package]] -name = "sphinx-copybutton" -version = "0.5.2" -description = "Add a copy button to each of your code cells." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd"}, - {file = "sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e"}, -] - -[package.dependencies] -sphinx = ">=1.8" - -[package.extras] -code-style = ["pre-commit (==2.12.1)"] -rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"] - -[[package]] -name = "sphinx-markdown-tables" -version = "0.0.17" -description = "A Sphinx extension for rendering tables written in markdown" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "sphinx-markdown-tables-0.0.17.tar.gz", hash = "sha256:6bc6d3d400eaccfeebd288446bc08dd83083367c58b85d40fe6c12d77ef592f1"}, - {file = "sphinx_markdown_tables-0.0.17-py3-none-any.whl", hash = "sha256:2bd0c30779653e4dd120300cbd9ca412c480738cc2241f6dea477a883f299e04"}, -] - -[package.dependencies] -markdown = ">=3.4" - -[[package]] -name = "sphinxcontrib-applehelp" -version = "1.0.7" -description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" -category = "dev" -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"}, -] - -[package.dependencies] -Sphinx = ">=5" - -[package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-bibtex" -version = "2.5.0" -description = "Sphinx extension for BibTeX style citations." -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "sphinxcontrib-bibtex-2.5.0.tar.gz", hash = "sha256:71b42e5db0e2e284f243875326bf9936aa9a763282277d75048826fef5b00eaa"}, - {file = "sphinxcontrib_bibtex-2.5.0-py3-none-any.whl", hash = "sha256:748f726eaca6efff7731012103417ef130ecdcc09501b4d0c54283bf5f059f76"}, -] - -[package.dependencies] -docutils = ">=0.8" -importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} -pybtex = ">=0.24" -pybtex-docutils = ">=1.0.0" -Sphinx = ">=2.1" - -[[package]] -name = "sphinxcontrib-devhelp" -version = "1.0.5" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" -category = "dev" -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"}, -] - -[package.dependencies] -Sphinx = ">=5" - -[package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-htmlhelp" -version = "2.0.4" -description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" -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"}, -] - -[package.dependencies] -Sphinx = ">=5" - -[package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] -test = ["html5lib", "pytest"] - -[[package]] -name = "sphinxcontrib-jsmath" -version = "1.0.1" -description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "dev" -optional = false -python-versions = ">=3.5" -files = [ - {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, - {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, -] - -[package.extras] -test = ["flake8", "mypy", "pytest"] - -[[package]] -name = "sphinxcontrib-qthelp" -version = "1.0.6" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" -category = "dev" -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"}, -] - -[package.dependencies] -Sphinx = ">=5" - -[package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-serializinghtml" -version = "1.1.9" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" -category = "dev" -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"}, -] - -[package.dependencies] -Sphinx = ">=5" - -[package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] -test = ["pytest"] - -[[package]] -name = "stack-data" -version = "0.6.3" -description = "Extract data from python stack frames and tracebacks for informative displays" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, - {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, -] - -[package.dependencies] -asttokens = ">=2.1.0" -executing = ">=1.2.0" -pure-eval = "*" - -[package.extras] -tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] - -[[package]] -name = "sympy" -version = "1.12" -description = "Computer algebra system (CAS) in Python" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, - {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"}, -] - -[package.dependencies] -mpmath = ">=0.19" - -[[package]] -name = "tabulate" -version = "0.9.0" -description = "Pretty-print tabular data" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, - {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, -] - -[package.extras] -widechars = ["wcwidth"] - -[[package]] -name = "tenacity" -version = "8.2.3" -description = "Retry code until it succeeds" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, - {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, -] - -[package.extras] -doc = ["reno", "sphinx", "tornado (>=4.5)"] - -[[package]] -name = "tensorboard" -version = "2.14.1" -description = "TensorBoard lets you watch Tensors Flow" -category = "dev" -optional = false -python-versions = ">=3.9" -files = [ - {file = "tensorboard-2.14.1-py3-none-any.whl", hash = "sha256:3db108fb58f023b6439880e177743c5f1e703e9eeb5fb7d597871f949f85fd58"}, -] - -[package.dependencies] -absl-py = ">=0.4" -google-auth = ">=1.6.3,<3" -google-auth-oauthlib = ">=0.5,<1.1" -grpcio = ">=1.48.2" -markdown = ">=2.6.8" -numpy = ">=1.12.0" -protobuf = ">=3.19.6" -requests = ">=2.21.0,<3" -setuptools = ">=41.0.0" -six = ">1.9" -tensorboard-data-server = ">=0.7.0,<0.8.0" -werkzeug = ">=1.0.1" - -[[package]] -name = "tensorboard-data-server" -version = "0.7.2" -description = "Fast data loading for TensorBoard" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tensorboard_data_server-0.7.2-py3-none-any.whl", hash = "sha256:7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb"}, - {file = "tensorboard_data_server-0.7.2-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60"}, - {file = "tensorboard_data_server-0.7.2-py3-none-manylinux_2_31_x86_64.whl", hash = "sha256:ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530"}, -] - -[[package]] -name = "tensorflow" -version = "2.14.1" -description = "TensorFlow is an open source machine learning framework for everyone." -category = "dev" -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"}, -] - -[package.dependencies] -absl-py = ">=1.0.0" -astunparse = ">=1.6.0" -flatbuffers = ">=23.5.26" -gast = ">=0.2.1,<0.5.0 || >0.5.0,<0.5.1 || >0.5.1,<0.5.2 || >0.5.2" -google-pasta = ">=0.1.1" -grpcio = ">=1.24.3,<2.0" -h5py = ">=2.9.0" -keras = ">=2.14.0,<2.15" -libclang = ">=13.0.0" -ml-dtypes = "0.2.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" -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)"] - -[[package]] -name = "tensorflow-estimator" -version = "2.14.0" -description = "TensorFlow Estimator." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tensorflow_estimator-2.14.0-py2.py3-none-any.whl", hash = "sha256:820bf57c24aa631abb1bbe4371739ed77edb11361d61381fd8e790115ac0fd57"}, -] - -[[package]] -name = "tensorflow-io-gcs-filesystem" -version = "0.34.0" -description = "TensorFlow IO" -category = "dev" -optional = false -python-versions = ">=3.7, <3.12" -files = [ - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:d831702fbb270996b27cda7fde06e0825b2ea81fd8dd3ead35242f4f8b3889b8"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:b9a93fcb01db269bc845a1ced431f3c61201755ce5f9ec4885760f30122276ef"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5813c336b4f7cb0a01ff4cc6cbd3edf11ef67305baf0e3cf634911b702f493f8"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b035f4c92639657b6d376929d550ac3dee9e6c0523eb434eefe0a27bae3d05b"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:a17a616d2c7fae83de4424404815843507d40d4eb0d507c636a5493a20c3d958"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:ec4604c99cbb5b708f4516dee27aa655abae222b876c98b740f4c2f89dd5c001"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp311-cp311-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cbe26c4a3332589c7b724f147df453b5c226993aa8d346a15536358d77b364c4"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e6353123a5b51397950138a118876af833a7db66b531123bb86f82e80ab0e72"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f211d2b3db8f9931765992b607b71cbfb98c8cd6169079d004a67a94ab10ecb4"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:d3feba2dd76f7c188137c34642d68d378f0eed81636cb95090ecb1496722707c"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:44ad387a812a78e7424bb8bee3820521ae1c044bddf72b1e163e8df95c124a74"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:7f60183473f0ca966451bb1d1bb5dc29b3cf9c74d1d0e7f2ed46760ed56bd4af"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:3f346b287ed2400e09b13cfd8524222fd70a66aadb9164c645286c2087007e9f"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:027a07553367187f918a99661f63ae0506b91b77a70bee9c7ccaf3920bf7cfe7"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d8664bddbe4e7b56ce94db8b93ea9077a158fb5e15364e11e29f93015ceea24"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:182b0fbde7e9a537fda0b354c28b0b6c035736728de8fe2db7ef49cf90352014"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:0dafed144673e1173528768fe208a7c5a6e8edae40208381cac420ee7c918ec9"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:396bfff61b49f80b86ddebe0c76ae0f2731689cee49ad7d782625180b50b13af"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b20622f8572fcb6c93e8f7d626327472f263e47ebd63d2153ef09162ef5ef7b5"}, -] - -[package.extras] -tensorflow = ["tensorflow (>=2.13.0,<2.14.0)"] -tensorflow-aarch64 = ["tensorflow-aarch64 (>=2.13.0,<2.14.0)"] -tensorflow-cpu = ["tensorflow-cpu (>=2.13.0,<2.14.0)"] -tensorflow-gpu = ["tensorflow-gpu (>=2.13.0,<2.14.0)"] -tensorflow-rocm = ["tensorflow-rocm (>=2.13.0,<2.14.0)"] - -[[package]] -name = "termcolor" -version = "2.4.0" -description = "ANSI color formatting for output in terminal" -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, - {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, -] - -[package.extras] -tests = ["pytest", "pytest-cov"] - -[[package]] -name = "threadpoolctl" -version = "3.2.0" -description = "threadpoolctl" -category = "dev" -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"}, -] - -[[package]] -name = "tinycss2" -version = "1.2.1" -description = "A tiny CSS parser" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tinycss2-1.2.1-py3-none-any.whl", hash = "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847"}, - {file = "tinycss2-1.2.1.tar.gz", hash = "sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627"}, -] - -[package.dependencies] -webencodings = ">=0.4" - -[package.extras] -doc = ["sphinx", "sphinx_rtd_theme"] -test = ["flake8", "isort", "pytest"] - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] - -[[package]] -name = "tomlkit" -version = "0.12.3" -description = "Style preserving TOML library" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomlkit-0.12.3-py3-none-any.whl", hash = "sha256:b0a645a9156dc7cb5d3a1f0d4bab66db287fcb8e0430bdd4664a095ea16414ba"}, - {file = "tomlkit-0.12.3.tar.gz", hash = "sha256:75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4"}, -] - -[[package]] -name = "tornado" -version = "6.4" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "dev" -optional = false -python-versions = ">= 3.8" -files = [ - {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, - {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, - {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, - {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, - {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, - {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, - {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, -] - -[[package]] -name = "tqdm" -version = "4.66.1" -description = "Fast, Extensible Progress Meter" -category = "main" -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"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] -notebook = ["ipywidgets (>=6)"] -slack = ["slack-sdk"] -telegram = ["requests"] - -[[package]] -name = "traitlets" -version = "5.14.0" -description = "Traitlets Python configuration system" -category = "dev" -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"}, -] - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] - -[[package]] -name = "types-deprecated" -version = "1.2.9.3" -description = "Typing stubs for Deprecated" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "types-Deprecated-1.2.9.3.tar.gz", hash = "sha256:ef87327adf3e3c4a4c7d8e06e58f6476710d3466ecfb53c49efb080804a70ef3"}, - {file = "types_Deprecated-1.2.9.3-py3-none-any.whl", hash = "sha256:24da9210763e5e1b3d0d4f6f8bba9ad3bb6af3fe7f6815fc37e3ede4681704f5"}, -] - -[[package]] -name = "types-python-dateutil" -version = "2.8.19.14" -description = "Typing stubs for python-dateutil" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "types-python-dateutil-2.8.19.14.tar.gz", hash = "sha256:1f4f10ac98bb8b16ade9dbee3518d9ace017821d94b057a425b069f834737f4b"}, - {file = "types_python_dateutil-2.8.19.14-py3-none-any.whl", hash = "sha256:f977b8de27787639986b4e28963263fd0e5158942b3ecef91b9335c130cb1ce9"}, -] - -[[package]] -name = "types-retry" -version = "0.9.9.4" -description = "Typing stubs for retry" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "types-retry-0.9.9.4.tar.gz", hash = "sha256:e4731dc684b56b875d9746459ad665d3bc281a56b530acdf1c97730167799941"}, - {file = "types_retry-0.9.9.4-py3-none-any.whl", hash = "sha256:f29760a9fe8b1fefe253e5fe6be7e4c0eba243932c600e0eccffb42a21d17765"}, -] - -[[package]] -name = "typing-extensions" -version = "4.8.0" -description = "Backported and Experimental Type Hints for Python 3.8+" -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, - {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, -] - -[[package]] -name = "tzdata" -version = "2023.3" -description = "Provider of IANA time zone data" -category = "dev" -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"}, -] - -[[package]] -name = "urllib3" -version = "2.1.0" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" -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"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "wcwidth" -version = "0.2.12" -description = "Measures the displayed width of unicode strings in a terminal" -category = "dev" -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"}, -] - -[[package]] -name = "webencodings" -version = "0.5.1" -description = "Character encoding aliases for legacy web content" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, - {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, -] - -[[package]] -name = "werkzeug" -version = "3.0.1" -description = "The comprehensive WSGI web application library." -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "werkzeug-3.0.1-py3-none-any.whl", hash = "sha256:90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10"}, - {file = "werkzeug-3.0.1.tar.gz", hash = "sha256:507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc"}, -] - -[package.dependencies] -MarkupSafe = ">=2.1.1" - -[package.extras] -watchdog = ["watchdog (>=2.3)"] - -[[package]] -name = "wheel" -version = "0.42.0" -description = "A built-package format for Python" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "wheel-0.42.0-py3-none-any.whl", hash = "sha256:177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d"}, - {file = "wheel-0.42.0.tar.gz", hash = "sha256:c45be39f7882c9d34243236f2d63cbd58039e360f85d0913425fbd7ceea617a8"}, -] - -[package.extras] -test = ["pytest (>=6.0.0)", "setuptools (>=65)"] - -[[package]] -name = "widgetsnbextension" -version = "4.0.9" -description = "Jupyter interactive widgets for Jupyter Notebook" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "widgetsnbextension-4.0.9-py3-none-any.whl", hash = "sha256:91452ca8445beb805792f206e560c1769284267a30ceb1cec9f5bcc887d15175"}, - {file = "widgetsnbextension-4.0.9.tar.gz", hash = "sha256:3c1f5e46dc1166dfd40a42d685e6a51396fd34ff878742a3e47c6f0cc4a2a385"}, -] - -[[package]] -name = "wmctrl" -version = "0.5" -description = "A tool to programmatically control windows inside X" -category = "dev" -optional = false -python-versions = ">=2.7" -files = [ - {file = "wmctrl-0.5-py2.py3-none-any.whl", hash = "sha256:ae695c1863a314c899e7cf113f07c0da02a394b968c4772e1936219d9234ddd7"}, - {file = "wmctrl-0.5.tar.gz", hash = "sha256:7839a36b6fe9e2d6fd22304e5dc372dbced2116ba41283ea938b2da57f53e962"}, -] - -[package.dependencies] -attrs = "*" - -[package.extras] -test = ["pytest"] - -[[package]] -name = "wrapt" -version = "1.14.1" -description = "Module for decorators, wrappers and monkey patching." -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -files = [ - {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, - {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, - {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, - {file = "wrapt-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecee4132c6cd2ce5308e21672015ddfed1ff975ad0ac8d27168ea82e71413f55"}, - {file = "wrapt-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2020f391008ef874c6d9e208b24f28e31bcb85ccff4f335f15a3251d222b92d9"}, - {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2feecf86e1f7a86517cab34ae6c2f081fd2d0dac860cb0c0ded96d799d20b335"}, - {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:240b1686f38ae665d1b15475966fe0472f78e71b1b4903c143a842659c8e4cb9"}, - {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9008dad07d71f68487c91e96579c8567c98ca4c3881b9b113bc7b33e9fd78b8"}, - {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6447e9f3ba72f8e2b985a1da758767698efa72723d5b59accefd716e9e8272bf"}, - {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:acae32e13a4153809db37405f5eba5bac5fbe2e2ba61ab227926a22901051c0a"}, - {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49ef582b7a1152ae2766557f0550a9fcbf7bbd76f43fbdc94dd3bf07cc7168be"}, - {file = "wrapt-1.14.1-cp311-cp311-win32.whl", hash = "sha256:358fe87cc899c6bb0ddc185bf3dbfa4ba646f05b1b0b9b5a27c2cb92c2cea204"}, - {file = "wrapt-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:26046cd03936ae745a502abf44dac702a5e6880b2b01c29aea8ddf3353b68224"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, - {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, - {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, - {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, - {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, - {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, - {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, - {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, - {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, - {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, - {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, - {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, - {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, - {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, -] - -[[package]] -name = "zipp" -version = "3.17.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] - -[metadata] -lock-version = "2.0" -python-versions = ">=3.9,<3.12" -content-hash = "b419c57d415ac98437b77d6fe46058cfecb66a74d15369d6904b3cee67d7c8a3" diff --git a/pyproject.toml b/pyproject.toml index 8432f3510f..b4d5365ab5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,6 @@ sympy = "^1.11.1" cma = "^3.3.0" joblib = "^1.2.0" hyperopt = "^0.2.7" -psutil = "^5.9.4" tabulate = "^0.9.0" [tool.poetry.group.dev] From 67795531fbaef932768e4e5444f2dd9a1c44c0a3 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 5 Dec 2023 16:57:14 +0400 Subject: [PATCH 136/143] Poetry lock --- poetry.lock | 5188 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 5188 insertions(+) create mode 100644 poetry.lock diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000000..907eefc11c --- /dev/null +++ b/poetry.lock @@ -0,0 +1,5188 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + +[[package]] +name = "absl-py" +version = "2.0.0" +description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." +category = "dev" +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"}, +] + +[[package]] +name = "alabaster" +version = "0.7.13" +description = "A configurable sidebar-enabled Sphinx theme" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, + {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, +] + +[[package]] +name = "anyio" +version = "4.1.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.1.0-py3-none-any.whl", hash = "sha256:56a415fbc462291813a94528a779597226619c8e78af7de0507333f700011e5f"}, + {file = "anyio-4.1.0.tar.gz", hash = "sha256:5a0bec7085176715be77df87fc66d6c9d70626bd752fcc85f57cdbee5b3760da"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] + +[[package]] +name = "astroid" +version = "2.15.8" +description = "An abstract syntax tree for Python with inference support." +category = "dev" +optional = false +python-versions = ">=3.7.2" +files = [ + {file = "astroid-2.15.8-py3-none-any.whl", hash = "sha256:1aa149fc5c6589e3d0ece885b4491acd80af4f087baafa3fb5203b113e68cd3c"}, + {file = "astroid-2.15.8.tar.gz", hash = "sha256:6c107453dffee9055899705de3c9ead36e74119cee151e5a9aaf7f0b0e020a6a"}, +] + +[package.dependencies] +lazy-object-proxy = ">=1.4.0" +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} +wrapt = [ + {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.14,<2", markers = "python_version >= \"3.11\""}, +] + +[[package]] +name = "asttokens" +version = "2.4.1" +description = "Annotate AST trees with source code positions" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, +] + +[package.dependencies] +six = ">=1.12.0" + +[package.extras] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] + +[[package]] +name = "astunparse" +version = "1.6.3" +description = "An AST unparser for Python" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, + {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, +] + +[package.dependencies] +six = ">=1.6.1,<2.0" +wheel = ">=0.23.0,<1.0" + +[[package]] +name = "attrs" +version = "21.4.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, + {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, +] + +[package.extras] +dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "sphinx", "sphinx-notfound-page", "zope.interface"] +docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] +tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "zope.interface"] +tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six"] + +[[package]] +name = "babel" +version = "2.13.1" +description = "Internationalization utilities" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Babel-2.13.1-py3-none-any.whl", hash = "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed"}, + {file = "Babel-2.13.1.tar.gz", hash = "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900"}, +] + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + +[[package]] +name = "beautifulsoup4" +version = "4.12.2" +description = "Screen-scraping library" +category = "dev" +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"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "bleach" +version = "6.1.0" +description = "An easy safelist-based HTML-sanitizing tool." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"}, + {file = "bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe"}, +] + +[package.dependencies] +six = ">=1.9.0" +webencodings = "*" + +[package.extras] +css = ["tinycss2 (>=1.1.0,<1.3)"] + +[[package]] +name = "cachetools" +version = "5.3.2" +description = "Extensible memoizing collections and decorators" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cachetools-5.3.2-py3-none-any.whl", hash = "sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1"}, + {file = "cachetools-5.3.2.tar.gz", hash = "sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2"}, +] + +[[package]] +name = "certifi" +version = "2023.11.17" +description = "Python package for providing Mozilla's CA Bundle." +category = "dev" +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"}, +] + +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "dev" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "cirq" +version = "1.3.0" +description = "A framework for creating, editing, and invoking Noisy Intermediate Scale Quantum (NISQ) circuits." +category = "dev" +optional = false +python-versions = ">=3.9.0" +files = [ + {file = "cirq-1.3.0-py3-none-any.whl", hash = "sha256:9e39f2c919864ee3f6a4b4b1dcfdaacb4d5e753e2c7fc7ebb0a93947d6cefcab"}, +] + +[package.dependencies] +cirq-aqt = "1.3.0" +cirq-core = "1.3.0" +cirq-ft = "1.3.0" +cirq-google = "1.3.0" +cirq-ionq = "1.3.0" +cirq-pasqal = "1.3.0" +cirq-rigetti = "1.3.0" +cirq-web = "1.3.0" + +[package.extras] +dev-env = ["asv", "black (==23.3.0)", "codeowners", "coverage (<=6.2)", "filelock (>=3.0.12,<3.1.0)", "freezegun (>=0.3.15,<0.4.0)", "grpcio-tools (>=1.56.0,<1.57.0)", "importlib-metadata", "ipykernel (==5.3.4)", "ipython (>=7.34.0)", "mypy (==1.2.0)", "mypy-protobuf (==3.4)", "notebook (>=6.4.1,<=6.4.7)", "papermill (>=2.3.2,<2.4.0)", "pylint (>=2.13.0,<2.14.0)", "pytest", "pytest-asyncio", "pytest-cov (>=3.0,<4.0)", "pytest-randomly", "pytest-xdist (>=2.2.0,<2.3.0)", "qiskit-aer (>=0.12.2,<0.13.0)", "rstcheck (>=3.3.1,<3.4.0)", "seaborn (>=0.11.1,<0.12.0)", "setuptools", "twine", "types-backports (==0.1.3)", "types-cachetools", "types-protobuf (>=3.20,<4.0)", "types-requests (==2.28.1)", "types-setuptools (==62.6.1)", "virtualenv", "virtualenv-clone", "wheel"] + +[[package]] +name = "cirq-aqt" +version = "1.3.0" +description = "A Cirq package to simulate and connect to Alpine Quantum Technologies quantum computers" +category = "dev" +optional = false +python-versions = ">=3.9.0" +files = [ + {file = "cirq_aqt-1.3.0-py3-none-any.whl", hash = "sha256:e70324b80ac0c752447c67ee49d84129fb21b8ce63737c15cdd155cb9fb1f405"}, +] + +[package.dependencies] +cirq-core = "1.3.0" +requests = ">=2.18,<3.0" + +[[package]] +name = "cirq-core" +version = "1.3.0" +description = "A framework for creating, editing, and invoking Noisy Intermediate Scale Quantum (NISQ) circuits." +category = "dev" +optional = false +python-versions = ">=3.9.0" +files = [ + {file = "cirq_core-1.3.0-py3-none-any.whl", hash = "sha256:d46771ddf4adb0867d3fb6da8c4484b73bada5bfaa58c19e2444aa8838270fd9"}, +] + +[package.dependencies] +duet = ">=0.2.8,<0.3.0" +matplotlib = ">=3.0,<4.0" +networkx = ">=2.4" +numpy = ">=1.16,<2.0" +pandas = "*" +scipy = "*" +sortedcontainers = ">=2.0,<3.0" +sympy = "*" +tqdm = "*" +typing-extensions = ">=4.2" + +[package.extras] +contrib = ["autoray", "numba (>=0.53.0)", "opt-einsum", "ply (>=3.6)", "pylatex (>=1.3.0,<1.4.0)", "quimb"] + +[[package]] +name = "cirq-ft" +version = "1.3.0" +description = "A Cirq package for fault-tolerant algorithms" +category = "dev" +optional = false +python-versions = ">=3.9.0" +files = [ + {file = "cirq_ft-1.3.0-py3-none-any.whl", hash = "sha256:ff45a911b74abece20e97856bad6ff388efdd79068f654a8cee7925d2fe54bf5"}, +] + +[package.dependencies] +attrs = "*" +cachetools = ">=5.3" +cirq-core = "1.3.0" +ipywidgets = "*" +nbconvert = "*" +nbformat = "*" + +[[package]] +name = "cirq-google" +version = "1.3.0" +description = "The Cirq module that provides tools and access to the Google Quantum Computing Service" +category = "dev" +optional = false +python-versions = ">=3.9.0" +files = [ + {file = "cirq_google-1.3.0-py3-none-any.whl", hash = "sha256:aa802887679f64ef8359f77d5bbd5bb98dc076c35c152c3b7f172c6e09d4e667"}, +] + +[package.dependencies] +cirq-core = "1.3.0" +google-api-core = {version = ">=1.14.0", extras = ["grpc"]} +proto-plus = ">=1.20.0" +protobuf = ">=3.15.0" + +[[package]] +name = "cirq-ionq" +version = "1.3.0" +description = "A Cirq package to simulate and connect to IonQ quantum computers" +category = "dev" +optional = false +python-versions = ">=3.9.0" +files = [ + {file = "cirq_ionq-1.3.0-py3-none-any.whl", hash = "sha256:7368da1012a5aafa6ae9125bfafc3beaf1ed799c0f9680947cf8709652f1f640"}, +] + +[package.dependencies] +cirq-core = "1.3.0" +requests = ">=2.18,<3.0" + +[[package]] +name = "cirq-pasqal" +version = "1.3.0" +description = "A Cirq package to simulate and connect to Pasqal quantum computers" +category = "dev" +optional = false +python-versions = ">=3.9.0" +files = [ + {file = "cirq_pasqal-1.3.0-py3-none-any.whl", hash = "sha256:953c04f1ba5efa94a26cae88e0d2ceeabde3c664beef43800b4be728c7f6f6eb"}, +] + +[package.dependencies] +cirq-core = "1.3.0" +requests = ">=2.18,<3.0" + +[[package]] +name = "cirq-rigetti" +version = "1.3.0" +description = "A Cirq package to simulate and connect to Rigetti quantum computers and Quil QVM" +category = "dev" +optional = false +python-versions = ">=3.9.0" +files = [ + {file = "cirq_rigetti-1.3.0-py3-none-any.whl", hash = "sha256:b771e523a8f2bd83ac3b22a79ae8ce03467c75c083ff44bcb04022c12c6dace3"}, +] + +[package.dependencies] +cirq-core = "1.3.0" +pyquil = ">=3.2.0,<4.0.0" + +[[package]] +name = "cirq-web" +version = "1.3.0" +description = "Web-based 3D visualization tools for Cirq." +category = "dev" +optional = false +python-versions = ">=3.9.0" +files = [ + {file = "cirq_web-1.3.0-py3-none-any.whl", hash = "sha256:5206d96e378f8f6fe7e0067cb84db9f48eff372bbb565f0056e1e95d7952b458"}, +] + +[package.dependencies] +cirq-core = "1.3.0" + +[[package]] +name = "clarabel" +version = "0.6.0" +description = "Clarabel Conic Interior Point Solver for Rust / Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "clarabel-0.6.0-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:4f366de79b8bc66bef8dc170987840b672ccab9222e710c09536d78ef47f606d"}, + {file = "clarabel-0.6.0-cp37-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:edcebbfc14073cd32bfb664317fd2555716c96be8b2a54efdb2b728453582bea"}, + {file = "clarabel-0.6.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e737d2818b9ca10e92ccd3fa9ad1a805b039976016415a0c45adef3427d70792"}, + {file = "clarabel-0.6.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e0b1891d8e507eb0bfc7e0b981584c388b2ab28658056e600997dbbc23f1ab4"}, + {file = "clarabel-0.6.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9946d3b5db346421b6d839d868e7b1151b590f871344fe95113bfd55b5be2433"}, + {file = "clarabel-0.6.0-cp37-abi3-win32.whl", hash = "sha256:73ed408c975a8ea021c3d8262d5d023a18e1ac3f6bb59a37cd69a11dba8f86ed"}, + {file = "clarabel-0.6.0-cp37-abi3-win_amd64.whl", hash = "sha256:5a6be4df9fed98b6f73f034836def913a1ecd52e8b79ca230ddf7cd66ebcdee7"}, + {file = "clarabel-0.6.0.tar.gz", hash = "sha256:ef909a393e72981ca10b1d866d9cc7fb6295ece20ae035def764338894961184"}, +] + +[package.dependencies] +numpy = "*" +scipy = "*" + +[[package]] +name = "cloudpickle" +version = "3.0.0" +description = "Pickler class to extend the standard pickle.Pickler functionality" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cloudpickle-3.0.0-py3-none-any.whl", hash = "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7"}, + {file = "cloudpickle-3.0.0.tar.gz", hash = "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882"}, +] + +[[package]] +name = "cma" +version = "3.3.0" +description = "CMA-ES, Covariance Matrix Adaptation Evolution Strategy for non-linear numerical optimization in Python" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "cma-3.3.0-py3-none-any.whl", hash = "sha256:5cc571b1e2068fcf1c538be36f8f3a870107456fed22ce81c1345a96329e61db"}, + {file = "cma-3.3.0.tar.gz", hash = "sha256:b748b8e03f4e7ae816157d7b9bb2fc6b1fb2fee1d5fd3399329b646bb75861ec"}, +] + +[package.dependencies] +numpy = "*" + +[package.extras] +constrained-solution-tracking = ["moarchiving"] +plotting = ["matplotlib"] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "comm" +version = "0.2.0" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "comm-0.2.0-py3-none-any.whl", hash = "sha256:2da8d9ebb8dd7bfc247adaff99f24dce705638a8042b85cb995066793e391001"}, + {file = "comm-0.2.0.tar.gz", hash = "sha256:a517ea2ca28931c7007a7a99c562a0fa5883cfb48963140cf642c41c948498be"}, +] + +[package.dependencies] +traitlets = ">=4" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "commonmark" +version = "0.9.1" +description = "Python parser for the CommonMark Markdown spec" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, + {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, +] + +[package.extras] +test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] + +[[package]] +name = "contourpy" +version = "1.2.0" +description = "Python library for calculating contours of 2D quadrilateral grids" +category = "dev" +optional = false +python-versions = ">=3.9" +files = [ + {file = "contourpy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8"}, + {file = "contourpy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa"}, + {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9"}, + {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab"}, + {file = "contourpy-1.2.0-cp310-cp310-win32.whl", hash = "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488"}, + {file = "contourpy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41"}, + {file = "contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727"}, + {file = "contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686"}, + {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286"}, + {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95"}, + {file = "contourpy-1.2.0-cp311-cp311-win32.whl", hash = "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6"}, + {file = "contourpy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de"}, + {file = "contourpy-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0"}, + {file = "contourpy-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0"}, + {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0"}, + {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431"}, + {file = "contourpy-1.2.0-cp312-cp312-win32.whl", hash = "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f"}, + {file = "contourpy-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9"}, + {file = "contourpy-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc"}, + {file = "contourpy-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5"}, + {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e"}, + {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808"}, + {file = "contourpy-1.2.0-cp39-cp39-win32.whl", hash = "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4"}, + {file = "contourpy-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956"}, + {file = "contourpy-1.2.0.tar.gz", hash = "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a"}, +] + +[package.dependencies] +numpy = ">=1.20,<2.0" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.6.1)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] + +[[package]] +name = "coverage" +version = "7.3.2" +description = "Code coverage measurement for Python" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"}, + {file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"}, + {file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"}, + {file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"}, + {file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"}, + {file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"}, + {file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"}, + {file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"}, + {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"}, + {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"}, + {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"}, + {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"}, + {file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"}, + {file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"}, + {file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"}, + {file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"}, + {file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"}, + {file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"}, + {file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"}, + {file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"}, + {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"}, + {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, +] + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "cupy-cuda11x" +version = "12.2.0" +description = "CuPy: NumPy & SciPy for GPU" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cupy_cuda11x-12.2.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f3b1991e4e25f52581f79b88c8d19c3e31fa739260b7080c813d7fb287ae8e7f"}, + {file = "cupy_cuda11x-12.2.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:ac52fd24ca5769d903bd531826d0525dbeaba66c49911ae021b9702386c8b96b"}, + {file = "cupy_cuda11x-12.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:8ed1fbf14230691df3f58f841e9ca5717b4175c4276fbf88948a5bc3c6392f58"}, + {file = "cupy_cuda11x-12.2.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:28eace420c9f58fa5739294d604f8aab9118b1c764f64a3ce0691f00193b11ff"}, + {file = "cupy_cuda11x-12.2.0-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:fb3294a694ee40b6e22ba3345b04b2a35db8a19fac74f59dc7757ea87ab5b289"}, + {file = "cupy_cuda11x-12.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:2e502cea9d21fefd1d8fd3747c6b46d1f916550e54d859f9083b6327a8f7ff5b"}, + {file = "cupy_cuda11x-12.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2fd425be7ae8f82ff68d2e8eeb37132fc9b9dfea6d3f0708419d6b9843983e42"}, + {file = "cupy_cuda11x-12.2.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:fcdfe993f87c5499898692d35d3c1f30cdd249778d6102132b5bc4a6f8a867fd"}, + {file = "cupy_cuda11x-12.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:66491d9c1ed93d4ee5b390ece92ed76a885c61859b403e3a6fd6f5b3a9ded116"}, + {file = "cupy_cuda11x-12.2.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:ededad28104d9e0c2cb02876fd2fc5c0dfec4cc66e600b7120bb4e655857c5e3"}, + {file = "cupy_cuda11x-12.2.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:ba4403d94e9eb2578f8f2667d37ef3ec8be4fbc2c7fd1ba498004d6399d0f3b6"}, + {file = "cupy_cuda11x-12.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:d01138eb7cf51583b6d67281bd39f3f241d664f2d1c65af2399ed304a609dadb"}, +] + +[package.dependencies] +fastrlock = ">=0.5" +numpy = ">=1.20,<1.27" + +[package.extras] +all = ["Cython (>=0.29.22,<3)", "optuna (>=2.0)", "scipy (>=1.6,<1.13)"] +stylecheck = ["autopep8 (==1.5.5)", "flake8 (==3.8.4)", "mypy (==1.4.1)", "pbr (==5.5.1)", "pycodestyle (==2.6.0)", "types-setuptools (==57.4.14)"] +test = ["hypothesis (>=6.37.2,<6.55.0)", "pytest (>=7.2)"] + +[[package]] +name = "cupy-cuda12x" +version = "12.2.0" +description = "CuPy: NumPy & SciPy for GPU" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cupy_cuda12x-12.2.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:350cc1591d5af25aaf147974547a68f25eb9104b0fcd5fa3c89f32f4d42b88c7"}, + {file = "cupy_cuda12x-12.2.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:bfcea96e5506193ea8672a8c8a3e164d023c4860e58f1165cdd4a946b136aa20"}, + {file = "cupy_cuda12x-12.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:9a41ed8bece4dc2344e2afb1976690adf7ad3f9ef0a169653b5c9466e4768450"}, + {file = "cupy_cuda12x-12.2.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:3e86fe1d41009418d3f2878e6f4f713a28d29a7faaa47c089f8ac05851087e9e"}, + {file = "cupy_cuda12x-12.2.0-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:ddf743881d85e98e1ac46328f78100a5abe842793aa1fd575301c81df591e9a2"}, + {file = "cupy_cuda12x-12.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:77386c53ddb5040f5cd9daa6764e3e3edc76f71b074b9a9bebec76f5da75cfa8"}, + {file = "cupy_cuda12x-12.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:98277c47425cb59cb623fcd94fec4dfc77292ff1377f2fc4bd0d0e55c7dcf447"}, + {file = "cupy_cuda12x-12.2.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:c581705d444cdeeffa016055ba449322bb2a99b5416ab5b85f140ea7333a1e7c"}, + {file = "cupy_cuda12x-12.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:12d88bba2e6cae18ba48eabbb7ff23a21d073ce83047ef27a87b99414db86795"}, + {file = "cupy_cuda12x-12.2.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:7d4e2b2ad37afd163d006a96b31b417142d95768846227513af7b596d731ba29"}, + {file = "cupy_cuda12x-12.2.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:0406b98fb2f1780238de8fed0da5f14e689b016c5c1f0ddaecd41ee987cd7965"}, + {file = "cupy_cuda12x-12.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:2ee5cb963bab52cc421ba09824e0ffdb7c6a394f35884094f73d2d1af927f0e4"}, +] + +[package.dependencies] +fastrlock = ">=0.5" +numpy = ">=1.20,<1.27" + +[package.extras] +all = ["Cython (>=0.29.22,<3)", "optuna (>=2.0)", "scipy (>=1.6,<1.13)"] +stylecheck = ["autopep8 (==1.5.5)", "flake8 (==3.8.4)", "mypy (==1.4.1)", "pbr (==5.5.1)", "pycodestyle (==2.6.0)", "types-setuptools (==57.4.14)"] +test = ["hypothesis (>=6.37.2,<6.55.0)", "pytest (>=7.2)"] + +[[package]] +name = "cuquantum-python-cu11" +version = "23.10.0" +description = "NVIDIA cuQuantum Python" +category = "dev" +optional = false +python-versions = ">=3.9" +files = [ + {file = "cuquantum_python_cu11-23.10.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a0f0dfcb6239ec5fce836fa2f641820d3235ac7d83f391eac90952cf481da03f"}, + {file = "cuquantum_python_cu11-23.10.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:ad5e38501cb53d50ba19fc48790f2c79fbc14c22e101d51a0b338f6c6971e6a0"}, + {file = "cuquantum_python_cu11-23.10.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:f5bd44f0a50b38fa778836577e11515fb820c98217d2958fdedfc861a701f604"}, + {file = "cuquantum_python_cu11-23.10.0-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:01e6b210ed66a1fda172884f1eca68b4763f676f81949af8f0d6b16d798f1881"}, + {file = "cuquantum_python_cu11-23.10.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:0f658d3c83a8f05b81749a1fecc232ca23650147f53d82fe61dae987e544fb9c"}, + {file = "cuquantum_python_cu11-23.10.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:997e47861bab2c5e183a3b7439ba7fe4dd777cbf4d24f2234ac4ad7936cbc699"}, +] + +[package.dependencies] +custatevec-cu11 = ">=1.5,<2.0" +cutensornet-cu11 = ">=2.3,<3.0" +numpy = ">=1.21,<2.0" + +[[package]] +name = "cuquantum-python-cu12" +version = "23.10.0" +description = "NVIDIA cuQuantum Python" +category = "dev" +optional = false +python-versions = ">=3.9" +files = [ + {file = "cuquantum_python_cu12-23.10.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:56a043951348a868957405103d8a0fb24da496c330876480958d371c040c371a"}, + {file = "cuquantum_python_cu12-23.10.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:171f5cb136c9db0e3520c99a9c4a55c8f8c84440b725e3e5511e7d9b6373ba1e"}, + {file = "cuquantum_python_cu12-23.10.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:a5a747885a164b4ccc41d3a5d225e4a8cc3076595b1b6169a82c8bf63ff1a801"}, + {file = "cuquantum_python_cu12-23.10.0-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:719cfa4c53ec40465c425ae8482cc8272686a29026c0bcbff23248c0418f8c95"}, + {file = "cuquantum_python_cu12-23.10.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f97601858323f85caedbf4192fafc406512a56c07ebfcf122503012978a21929"}, + {file = "cuquantum_python_cu12-23.10.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:24a48bd0763362d709afadbc7f09e4977d0f2dff6a7200c42415f7fc39216652"}, +] + +[package.dependencies] +cupy-cuda12x = ">=10.0" +custatevec-cu12 = ">=1.5,<2.0" +cutensornet-cu12 = ">=2.3,<3.0" +numpy = ">=1.21,<2.0" + +[[package]] +name = "custatevec-cu11" +version = "1.5.0" +description = "cuStateVec - a component of NVIDIA cuQuantum SDK" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "custatevec_cu11-1.5.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:3e0cbbc487a0590d9f889ad70b9ac21d88c1f555f6fe01b18ba687a0d98d902f"}, + {file = "custatevec_cu11-1.5.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:be289f600e7361cac4acdeb8d12d443117d43ce745c9322f6b828292341b9f30"}, +] + +[[package]] +name = "custatevec-cu12" +version = "1.5.0" +description = "cuStateVec - a component of NVIDIA cuQuantum SDK" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "custatevec_cu12-1.5.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:e040c92e7ff8dacca74c7f122a1641f15e15a59f2b44c861517cd3515fa32986"}, + {file = "custatevec_cu12-1.5.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:b6202cf0ed3538956f15cffbbe5ec12e75ff5708846cba27c6ad5eb0323df8e6"}, +] + +[[package]] +name = "cutensor-cu11" +version = "1.7.0" +description = "NVIDIA cuTENSOR" +category = "dev" +optional = false +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]] +name = "cutensor-cu12" +version = "1.7.0" +description = "NVIDIA cuTENSOR" +category = "dev" +optional = false +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]] +name = "cutensornet-cu11" +version = "2.3.0" +description = "cuTensorNet - a component of NVIDIA cuQuantum SDK" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "cutensornet_cu11-2.3.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:fd15b199b189f0501b3fdaa576ee70eedbdfec37b557f7fd56b97aaa5e618667"}, + {file = "cutensornet_cu11-2.3.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:dcb9ab26c3d6b51dfd1146c9ec28fe6768bfe539dca931d4ef462eea15205bf7"}, +] + +[package.dependencies] +cutensor-cu11 = ">=1.6.1,<2" + +[[package]] +name = "cutensornet-cu12" +version = "2.3.0" +description = "cuTensorNet - a component of NVIDIA cuQuantum SDK" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "cutensornet_cu12-2.3.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:3c9d5938ab42d96de9ddf2585a0f2348172e8ef12efd082f515a2298bd35ba7a"}, + {file = "cutensornet_cu12-2.3.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:70c45762e9b5aa79be5e106ed8c2912d4fceb573eca9c918e9f7abae91eaa895"}, +] + +[package.dependencies] +cutensor-cu12 = ">=1.6.1,<2" + +[[package]] +name = "cvxpy" +version = "1.4.1" +description = "A domain-specific language for modeling convex optimization problems in Python." +category = "dev" +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"}, +] + +[package.dependencies] +clarabel = ">=0.5.0" +ecos = ">=2" +numpy = ">=1.15" +osqp = ">=0.6.2" +pybind11 = "*" +scipy = ">=1.1.0" +scs = ">=3.0" + +[package.extras] +cbc = ["cylp (>=0.91.5)"] +clarabel = ["clarabel"] +cvxopt = ["cvxopt"] +diffcp = ["diffcp"] +glop = ["ortools (>=9.5,<9.8)"] +glpk = ["cvxopt"] +glpk-mi = ["cvxopt"] +gurobi = ["gurobipy"] +highs = ["scipy (>=1.6.1)"] +mosek = ["Mosek"] +pdlp = ["ortools (>=9.5,<9.8)"] +piqp = ["piqp"] +proxqp = ["proxsuite"] +scip = ["PySCIPOpt"] +scipy = ["scipy"] +scs = ["setuptools (>65.5.1)"] +xpress = ["xpress"] + +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] + +[[package]] +name = "deprecated" +version = "1.2.14" +description = "Python @deprecated decorator to deprecate old python classes, functions or methods." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, + {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, +] + +[package.dependencies] +wrapt = ">=1.10,<2" + +[package.extras] +dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] + +[[package]] +name = "dill" +version = "0.3.7" +description = "serialize all of Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, + {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] + +[[package]] +name = "docutils" +version = "0.19" +description = "Docutils -- Python Documentation Utilities" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, + {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, +] + +[[package]] +name = "duet" +version = "0.2.9" +description = "A simple future-based async library for python." +category = "dev" +optional = false +python-versions = ">=3.9.0" +files = [ + {file = "duet-0.2.9-py3-none-any.whl", hash = "sha256:a16088b68b0faee8aee12cdf4d0a8af060ed958badb44f3e32f123f13f64119a"}, + {file = "duet-0.2.9.tar.gz", hash = "sha256:d6fa39582e6a3dce1096c47e5fbcbda648a633eed94a38943e68662afa2587f3"}, +] + +[package.extras] +dev-env = ["black (==22.3.0)", "isort (>=5.7.0,<5.8.0)", "mypy (>=0.931.0,<0.932.0)", "pylint (>=2.10.0,<2.11.0)", "pytest (>=6.2.0,<6.3.0)", "twine (>=3.3.0,<3.4.0)", "wheel"] + +[[package]] +name = "ecos" +version = "2.0.12" +description = "This is the Python package for ECOS: Embedded Cone Solver. See Github page for more information." +category = "dev" +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"}, +] + +[package.dependencies] +numpy = ">=1.6" +scipy = ">=0.9" + +[[package]] +name = "exceptiongroup" +version = "1.2.0" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "executing" +version = "2.0.1" +description = "Get the currently executing AST node of a frame, and other information" +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + +[[package]] +name = "fancycompleter" +version = "0.9.1" +description = "colorful TAB completion for Python prompt" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "fancycompleter-0.9.1-py3-none-any.whl", hash = "sha256:dd076bca7d9d524cc7f25ec8f35ef95388ffef9ef46def4d3d25e9b044ad7080"}, + {file = "fancycompleter-0.9.1.tar.gz", hash = "sha256:09e0feb8ae242abdfd7ef2ba55069a46f011814a80fe5476be48f51b00247272"}, +] + +[package.dependencies] +pyreadline = {version = "*", markers = "platform_system == \"Windows\""} +pyrepl = ">=0.8.2" + +[[package]] +name = "fastjsonschema" +version = "2.19.0" +description = "Fastest Python implementation of JSON schema" +category = "dev" +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"}, +] + +[package.extras] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + +[[package]] +name = "fastrlock" +version = "0.8.2" +description = "Fast, re-entrant optimistic lock implemented in Cython" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "fastrlock-0.8.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:94e348c72a1fd1f8191f25ea056448e4f5a87b8fbf005b39d290dcb0581a48cd"}, + {file = "fastrlock-0.8.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d5595903444c854b99c42122b87edfe8a37cd698a4eae32f4fd1d2a7b6c115d"}, + {file = "fastrlock-0.8.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e4bbde174a0aff5f6eeba75cf8c4c5d2a316316bc21f03a0bddca0fc3659a6f3"}, + {file = "fastrlock-0.8.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7a2ccaf88ac0db153e84305d1ef0aa138cea82c6a88309066f6eaa3bc98636cd"}, + {file = "fastrlock-0.8.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:31a27a2edf482df72b91fe6c6438314d2c65290aa7becc55589d156c9b91f0da"}, + {file = "fastrlock-0.8.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:e9904b5b37c3e5bb4a245c56bc4b7e497da57ffb8528f4fc39af9dcb168ee2e1"}, + {file = "fastrlock-0.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:43a241655e83e4603a152192cf022d5ca348c2f4e56dfb02e5c9c4c1a32f9cdb"}, + {file = "fastrlock-0.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9121a894d74e65557e47e777060a495ab85f4b903e80dd73a3c940ba042920d7"}, + {file = "fastrlock-0.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:11bbbbc526363955aeddb9eec4cee2a0012322b7b2f15b54f44454fcf4fd398a"}, + {file = "fastrlock-0.8.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:27786c62a400e282756ae1b090bcd7cfa35f28270cff65a9e7b27a5327a32561"}, + {file = "fastrlock-0.8.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:08315bde19d0c2e6b06593d5a418be3dc8f9b1ee721afa96867b9853fceb45cf"}, + {file = "fastrlock-0.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e8b49b5743ede51e0bcf6805741f39f5e0e0fd6a172ba460cb39e3097ba803bb"}, + {file = "fastrlock-0.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b443e73a4dfc7b6e0800ea4c13567b9694358e86f53bb2612a51c9e727cac67b"}, + {file = "fastrlock-0.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:b3853ed4ce522598dc886160a7bab432a093051af85891fa2f5577c1dcac8ed6"}, + {file = "fastrlock-0.8.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:790fc19bccbd39426060047e53629f171a44745613bf360a045e9f9c8c4a2cea"}, + {file = "fastrlock-0.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:dbdce852e6bb66e1b8c36679d482971d69d93acf1785657522e51b7de30c3356"}, + {file = "fastrlock-0.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d47713ffe6d4a627fbf078be9836a95ac106b4a0543e3841572c91e292a5d885"}, + {file = "fastrlock-0.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:ea96503b918fceaf40443182742b8964d47b65c5ebdea532893cb9479620000c"}, + {file = "fastrlock-0.8.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c6bffa978793bea5e1b00e677062e53a62255439339591b70e209fa1552d5ee0"}, + {file = "fastrlock-0.8.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:75c07726c8b1a52147fd7987d6baaa318c5dced1416c3f25593e40f56e10755b"}, + {file = "fastrlock-0.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:88f079335e9da631efa64486c8207564a7bcd0c00526bb9e842e9d5b7e50a6cc"}, + {file = "fastrlock-0.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4fb2e77ff04bc4beb71d63c8e064f052ce5a6ea1e001d528d4d7f4b37d736f2e"}, + {file = "fastrlock-0.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:b4c9083ea89ab236b06e9ef2263971db3b4b507195fc7d5eecab95828dcae325"}, + {file = "fastrlock-0.8.2-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:98195866d3a9949915935d40a88e4f1c166e82e378f622c88025f2938624a90a"}, + {file = "fastrlock-0.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b22ea9bf5f9fad2b0077e944a7813f91593a4f61adf8faf734a70aed3f2b3a40"}, + {file = "fastrlock-0.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc1bf0ac8a194313cf6e645e300a8a379674ceed8e0b1e910a2de3e3c28989e"}, + {file = "fastrlock-0.8.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a3dcc876050b8f5cbc0ee84ef1e7f0c1dfe7c148f10098828bc4403683c33f10"}, + {file = "fastrlock-0.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:685e656048b59d8dfde8c601f188ad53a4d719eb97080cafc8696cda6d75865e"}, + {file = "fastrlock-0.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:fb5363cf0fddd9b50525ddbf64a1e1b28ec4c6dfb28670a940cb1cf988a6786b"}, + {file = "fastrlock-0.8.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:a74f5a92fa6e51c4f3c69b29c4662088b97be12f40652a21109605a175c81824"}, + {file = "fastrlock-0.8.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ccf39ad5702e33e4d335b48ef9d56e21619b529b7f7471b5211419f380329b62"}, + {file = "fastrlock-0.8.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:66f2662c640bb71a1016a031eea6eef9d25c2bcdf7ffd1d1ddc5a58f9a1ced04"}, + {file = "fastrlock-0.8.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:17734e2e5af4c07ddb0fb10bd484e062c22de3be6b67940b9cc6ec2f18fa61ba"}, + {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:ab91b0c36e95d42e1041a4907e3eefd06c482d53af3c7a77be7e214cc7cd4a63"}, + {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b32fdf874868326351a75b1e4c02f97e802147119ae44c52d3d9da193ec34f5b"}, + {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:2074548a335fcf7d19ebb18d9208da9e33b06f745754466a7e001d2b1c58dd19"}, + {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4fb04442b6d1e2b36c774919c6bcbe3339c61b337261d4bd57e27932589095af"}, + {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1fed2f4797ad68e9982038423018cf08bec5f4ce9fed63a94a790773ed6a795c"}, + {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e380ec4e6d8b26e389713995a43cb7fe56baea2d25fe073d4998c4821a026211"}, + {file = "fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:25945f962c7bd808415cfde3da624d4399d4ea71ed8918538375f16bceb79e1c"}, + {file = "fastrlock-0.8.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2c1719ddc8218b01e82fb2e82e8451bd65076cb96d7bef4477194bbb4305a968"}, + {file = "fastrlock-0.8.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:5460c5ee6ced6d61ec8cd2324ebbe793a4960c4ffa2131ffff480e3b61c99ec5"}, + {file = "fastrlock-0.8.2-cp36-cp36m-win_amd64.whl", hash = "sha256:33145acbad8317584cd64588131c7e1e286beef6280c0009b4544c91fce171d2"}, + {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:59344c1d46b7dec97d3f22f1cc930fafe8980b3c5bc9c9765c56738a5f1559e4"}, + {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2a1c354f13f22b737621d914f3b4a8434ae69d3027a775e94b3e671756112f9"}, + {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:cf81e0278b645004388873e0a1f9e3bc4c9ab8c18e377b14ed1a544be4b18c9a"}, + {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1b15430b93d7eb3d56f6ff690d2ebecb79ed0e58248427717eba150a508d1cd7"}, + {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:067edb0a0805bf61e17a251d5046af59f6e9d2b8ad01222e0ef7a0b7937d5548"}, + {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eb31fe390f03f7ae886dcc374f1099ec88526631a4cb891d399b68181f154ff0"}, + {file = "fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:643e1e65b4f5b284427e61a894d876d10459820e93aa1e724dfb415117be24e0"}, + {file = "fastrlock-0.8.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5dfb78dd600a12f23fc0c3ec58f81336229fdc74501ecf378d1ce5b3f2f313ea"}, + {file = "fastrlock-0.8.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8ca0fe21458457077e4cb2d81e1ebdb146a00b3e9e2db6180a773f7ea905032"}, + {file = "fastrlock-0.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d918dfe473291e8bfd8e13223ea5cb9b317bd9f50c280923776c377f7c64b428"}, + {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:c393af77c659a38bffbca215c0bcc8629ba4299568308dd7e4ff65d62cabed39"}, + {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:73426f5eb2ecc10626c67cf86bd0af9e00d53e80e5c67d5ce8e18376d6abfa09"}, + {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:320fd55bafee3eb069cfb5d6491f811a912758387ef2193840e2663e80e16f48"}, + {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8c1c91a68926421f5ccbc82c85f83bd3ba593b121a46a1b9a554b3f0dd67a4bf"}, + {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ad1bc61c7f6b0e58106aaab034916b6cb041757f708b07fbcdd9d6e1ac629225"}, + {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:87f4e01b042c84e6090dbc4fbe3415ddd69f6bc0130382323f9d3f1b8dd71b46"}, + {file = "fastrlock-0.8.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d34546ad2e4a480b94b6797bcc5a322b3c705c4c74c3e4e545c4a3841c1b2d59"}, + {file = "fastrlock-0.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ebb32d776b61acd49f859a1d16b9e3d84e7b46d0d92aebd58acd54dc38e96664"}, + {file = "fastrlock-0.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:30bdbe4662992348132d03996700e1cf910d141d629179b967b146a22942264e"}, + {file = "fastrlock-0.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:07ed3c7b3867c05a3d6be4ced200c7767000f3431b9be6da66972822dd86e8be"}, + {file = "fastrlock-0.8.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:ddf5d247f686aec853ddcc9a1234bfcc6f57b0a0670d2ad82fc25d8ae7e6a15f"}, + {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:7269bb3fc15587b0c191eecd95831d771a7d80f0c48929e560806b038ff3066c"}, + {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:adcb9e77aa132cc6c9de2ffe7cf880a20aa8cdba21d367d1da1a412f57bddd5d"}, + {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:a3b8b5d2935403f1b4b25ae324560e94b59593a38c0d2e7b6c9872126a9622ed"}, + {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2587cedbb36c7988e707d83f0f1175c1f882f362b5ebbee25d70218ea33d220d"}, + {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9af691a9861027181d4de07ed74f0aee12a9650ac60d0a07f4320bff84b5d95f"}, + {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99dd6652bd6f730beadf74ef769d38c6bbd8ee6d1c15c8d138ea680b0594387f"}, + {file = "fastrlock-0.8.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:4d63b6596368dab9e0cc66bf047e7182a56f33b34db141816a4f21f5bf958228"}, + {file = "fastrlock-0.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ff75c90663d6e8996610d435e71487daa853871ad1770dd83dc0f2fc4997241e"}, + {file = "fastrlock-0.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e27c3cd27fbd25e5223c5c992b300cd4ee8f0a75c6f222ce65838138d853712c"}, + {file = "fastrlock-0.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:dd961a32a7182c3891cdebca417fda67496d5d5de6ae636962254d22723bdf52"}, + {file = "fastrlock-0.8.2.tar.gz", hash = "sha256:644ec9215cf9c4df8028d8511379a15d9c1af3e16d80e47f1b6fdc6ba118356a"}, +] + +[[package]] +name = "flatbuffers" +version = "23.5.26" +description = "The FlatBuffers serialization format for Python" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "flatbuffers-23.5.26-py2.py3-none-any.whl", hash = "sha256:c0ff356da363087b915fde4b8b45bdda73432fc17cddb3c8157472eab1422ad1"}, + {file = "flatbuffers-23.5.26.tar.gz", hash = "sha256:9ea1144cac05ce5d86e2859f431c6cd5e66cd9c78c558317c7955fb8d4c78d89"}, +] + +[[package]] +name = "fonttools" +version = "4.46.0" +description = "Tools to manipulate font files" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.46.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d4e69e2c7f93b695d2e6f18f709d501d945f65c1d237dafaabdd23cd935a5276"}, + {file = "fonttools-4.46.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:25852f0c63df0af022f698464a4a80f7d1d5bd974bcd22f995f6b4ad198e32dd"}, + {file = "fonttools-4.46.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:adab73618d0a328b203a0e242b3eba60a2b5662d9cb2bd16ed9c52af8a7d86af"}, + {file = "fonttools-4.46.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cf923a4a556ab4cc4c52f69a4a2db624cf5a2cf360394368b40c5152fe3321e"}, + {file = "fonttools-4.46.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:87c214197712cc14fd2a4621efce2a9c501a77041232b789568149a8a3161517"}, + {file = "fonttools-4.46.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:156ae342a1ed1fe38e180de471e98fbf5b2b6ae280fa3323138569c4ca215844"}, + {file = "fonttools-4.46.0-cp310-cp310-win32.whl", hash = "sha256:c506e3d3a9e898caee4dc094f34b49c5566870d5a2d1ca2125f0a9f35ecc2205"}, + {file = "fonttools-4.46.0-cp310-cp310-win_amd64.whl", hash = "sha256:f8bc3973ed58893c4107993e0a7ae34901cb572b5e798249cbef35d30801ffd4"}, + {file = "fonttools-4.46.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:982f69855ac258260f51048d9e0c53c5f19881138cc7ca06deb38dc4b97404b6"}, + {file = "fonttools-4.46.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c23c59d321d62588620f2255cf951270bf637d88070f38ed8b5e5558775b86c"}, + {file = "fonttools-4.46.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0e94244ec24a940ecfbe5b31c975c8a575d5ed2d80f9a280ce3b21fa5dc9c34"}, + {file = "fonttools-4.46.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a9f9cdd7ef63d1b8ac90db335762451452426b3207abd79f60da510cea62da5"}, + {file = "fonttools-4.46.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ca9eceebe70035b057ce549e2054cad73e95cac3fe91a9d827253d1c14618204"}, + {file = "fonttools-4.46.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8be6adfa4e15977075278dd0a0bae74dec59be7b969b5ceed93fb86af52aa5be"}, + {file = "fonttools-4.46.0-cp311-cp311-win32.whl", hash = "sha256:7b5636f5706d49f13b6d610fe54ee662336cdf56b5a6f6683c0b803e23d826d2"}, + {file = "fonttools-4.46.0-cp311-cp311-win_amd64.whl", hash = "sha256:49ea0983e55fd7586a809787cd4644a7ae471e53ab8ddc016f9093b400e32646"}, + {file = "fonttools-4.46.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7b460720ce81773da1a3e7cc964c48e1e11942b280619582a897fa0117b56a62"}, + {file = "fonttools-4.46.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8bee9f4fc8c99824a424ae45c789ee8c67cb84f8e747afa7f83b7d3cef439c3b"}, + {file = "fonttools-4.46.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3d7b96aba96e05e8c911ce2dfc5acc6a178b8f44f6aa69371ab91aa587563da"}, + {file = "fonttools-4.46.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e6aeb5c340416d11a3209d75c48d13e72deea9e1517837dd1522c1fd1f17c11"}, + {file = "fonttools-4.46.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c779f8701deedf41908f287aeb775b8a6f59875ad1002b98ac6034ae4ddc1b7b"}, + {file = "fonttools-4.46.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce199227ce7921eaafdd4f96536f16b232d6b580ce74ce337de544bf06cb2752"}, + {file = "fonttools-4.46.0-cp312-cp312-win32.whl", hash = "sha256:1c9937c4dd1061afd22643389445fabda858af5e805860ec3082a4bc07c7a720"}, + {file = "fonttools-4.46.0-cp312-cp312-win_amd64.whl", hash = "sha256:a9fa52ef8fd14d7eb3d813e1451e7ace3e1eebfa9b7237d3f81fee8f3de6a114"}, + {file = "fonttools-4.46.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c94564b1f3b5dd87e73577610d85115b1936edcc596deaf84a31bbe70e17456b"}, + {file = "fonttools-4.46.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4a50a1dfad7f7ba5ca3f99cc73bf5cdac67ceade8e4b355a877521f20ad1b63"}, + {file = "fonttools-4.46.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89c2c520f9492844ecd6316d20c6c7a157b5c0cb73a1411b3db28ee304f30122"}, + {file = "fonttools-4.46.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5b7905fd68eacb7cc56a13139da5c312c45baae6950dd00b02563c54508a041"}, + {file = "fonttools-4.46.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8485cc468288e213f31afdaf1fdda3c79010f542559fbba936a54f4644df2570"}, + {file = "fonttools-4.46.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:87c3299da7da55394fb324349db0ede38114a46aafd0e7dfcabfecd28cdd94c3"}, + {file = "fonttools-4.46.0-cp38-cp38-win32.whl", hash = "sha256:f5f1423a504ccc329efb5aa79738de83d38c072be5308788dde6bd419969d7f5"}, + {file = "fonttools-4.46.0-cp38-cp38-win_amd64.whl", hash = "sha256:6d4a4ebcc76e30898ff3296ea786491c70e183f738319ae2629e0d44f17ece42"}, + {file = "fonttools-4.46.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9a0e422ab79e5cb2b47913be6a4b5fd20c4c7ac34a24f3691a4e099e965e0b8"}, + {file = "fonttools-4.46.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:13ac0cba2fc63fa4b232f2a7971f35f35c6eaf10bd1271fa96d4ce6253a8acfd"}, + {file = "fonttools-4.46.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:795150d5edc595e1a2cfb3d65e8f4f3d027704fc2579f8990d381bef6b188eb6"}, + {file = "fonttools-4.46.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d00fc63131dcac6b25f50a5a129758438317e54e3ce5587163f7058de4b0e933"}, + {file = "fonttools-4.46.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3033b55f401a622de2630b3982234d97219d89b058607b87927eccb0f922313c"}, + {file = "fonttools-4.46.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e26e7fb908ae4f622813e7cb32cd2db6c24e3122bb3b98f25e832a2fe0e7e228"}, + {file = "fonttools-4.46.0-cp39-cp39-win32.whl", hash = "sha256:2d0eba685938c603f2f648dfc0aadbf8c6a4fe1c7ca608c2970a6ef39e00f254"}, + {file = "fonttools-4.46.0-cp39-cp39-win_amd64.whl", hash = "sha256:5200b01f463d97cc2b7ff8a1e3584151f4413e98cb8419da5f17d1dbb84cc214"}, + {file = "fonttools-4.46.0-py3-none-any.whl", hash = "sha256:5b627ed142398ea9202bd752c04311592558964d1a765fb2f78dc441a05633f4"}, + {file = "fonttools-4.46.0.tar.gz", hash = "sha256:2ae45716c27a41807d58a9f3f59983bdc8c0a46cb259e4450ab7e196253a9853"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "scipy"] +lxml = ["lxml (>=4.0,<5)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + +[[package]] +name = "furo" +version = "2022.12.7" +description = "A clean customisable Sphinx documentation theme." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "furo-2022.12.7-py3-none-any.whl", hash = "sha256:7cb76c12a25ef65db85ab0743df907573d03027a33631f17d267e598ebb191f7"}, + {file = "furo-2022.12.7.tar.gz", hash = "sha256:d8008f8efbe7587a97ba533c8b2df1f9c21ee9b3e5cad0d27f61193d38b1a986"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +pygments = ">=2.7" +sphinx = ">=5.0,<7.0" +sphinx-basic-ng = "*" + +[[package]] +name = "future" +version = "0.18.3" +description = "Clean single-source support for Python 3 and 2" +category = "main" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "future-0.18.3.tar.gz", hash = "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"}, +] + +[[package]] +name = "gast" +version = "0.5.4" +description = "Python AST that abstracts the underlying Python version" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "gast-0.5.4-py3-none-any.whl", hash = "sha256:6fc4fa5fa10b72fb8aab4ae58bcb023058386e67b6fa2e3e34cec5c769360316"}, + {file = "gast-0.5.4.tar.gz", hash = "sha256:9c270fe5f4b130969b54174de7db4e764b09b4f7f67ccfc32480e29f78348d97"}, +] + +[[package]] +name = "google-api-core" +version = "2.14.0" +description = "Google API client core library" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-api-core-2.14.0.tar.gz", hash = "sha256:5368a4502b793d9bbf812a5912e13e4e69f9bd87f6efb508460c43f5bbd1ce41"}, + {file = "google_api_core-2.14.0-py3-none-any.whl", hash = "sha256:de2fb50ed34d47ddbb2bd2dcf680ee8fead46279f4ed6b16de362aca23a18952"}, +] + +[package.dependencies] +google-auth = ">=2.14.1,<3.0.dev0" +googleapis-common-protos = ">=1.56.2,<2.0.dev0" +grpcio = [ + {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""}, + {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, +] +grpcio-status = [ + {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""}, + {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, +] +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" +requests = ">=2.18.0,<3.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] +grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] +grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] + +[[package]] +name = "google-auth" +version = "2.24.0" +description = "Google Authentication Library" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-auth-2.24.0.tar.gz", hash = "sha256:2ec7b2a506989d7dbfdbe81cb8d0ead8876caaed14f86d29d34483cbe99c57af"}, + {file = "google_auth-2.24.0-py2.py3-none-any.whl", hash = "sha256:9b82d5c8d3479a5391ea0a46d81cca698d328459da31d4a459d4e901a5d927e0"}, +] + +[package.dependencies] +cachetools = ">=2.0.0,<6.0" +pyasn1-modules = ">=0.2.1" +rsa = ">=3.1.4,<5" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] +enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] +pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] +reauth = ["pyu2f (>=0.1.5)"] +requests = ["requests (>=2.20.0,<3.0.0.dev0)"] + +[[package]] +name = "google-auth-oauthlib" +version = "1.0.0" +description = "Google Authentication Library" +category = "dev" +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"}, +] + +[package.dependencies] +google-auth = ">=2.15.0" +requests-oauthlib = ">=0.7.0" + +[package.extras] +tool = ["click (>=6.0.0)"] + +[[package]] +name = "google-pasta" +version = "0.2.0" +description = "pasta is an AST-based Python refactoring library" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "google-pasta-0.2.0.tar.gz", hash = "sha256:c9f2c8dfc8f96d0d5808299920721be30c9eec37f2389f28904f454565c8a16e"}, + {file = "google_pasta-0.2.0-py2-none-any.whl", hash = "sha256:4612951da876b1a10fe3960d7226f0c7682cf901e16ac06e473b267a5afa8954"}, + {file = "google_pasta-0.2.0-py3-none-any.whl", hash = "sha256:b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "googleapis-common-protos" +version = "1.61.0" +description = "Common protobufs used in Google APIs" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "googleapis-common-protos-1.61.0.tar.gz", hash = "sha256:8a64866a97f6304a7179873a465d6eee97b7a24ec6cfd78e0f575e96b821240b"}, + {file = "googleapis_common_protos-1.61.0-py2.py3-none-any.whl", hash = "sha256:22f1915393bb3245343f6efe87f6fe868532efc12aa26b391b15132e1279f1c0"}, +] + +[package.dependencies] +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] + +[[package]] +name = "grpcio" +version = "1.59.3" +description = "HTTP/2-based RPC framework" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "grpcio-1.59.3-cp310-cp310-linux_armv7l.whl", hash = "sha256:aca028a6c7806e5b61e5f9f4232432c52856f7fcb98e330b20b6bc95d657bdcc"}, + {file = "grpcio-1.59.3-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:19ad26a7967f7999c8960d2b9fe382dae74c55b0c508c613a6c2ba21cddf2354"}, + {file = "grpcio-1.59.3-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:72b71dad2a3d1650e69ad42a5c4edbc59ee017f08c32c95694172bc501def23c"}, + {file = "grpcio-1.59.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c0f0a11d82d0253656cc42e04b6a149521e02e755fe2e4edd21123de610fd1d4"}, + {file = "grpcio-1.59.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60cddafb70f9a2c81ba251b53b4007e07cca7389e704f86266e22c4bffd8bf1d"}, + {file = "grpcio-1.59.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6c75a1fa0e677c1d2b6d4196ad395a5c381dfb8385f07ed034ef667cdcdbcc25"}, + {file = "grpcio-1.59.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e1d8e01438d5964a11167eec1edb5f85ed8e475648f36c834ed5db4ffba24ac8"}, + {file = "grpcio-1.59.3-cp310-cp310-win32.whl", hash = "sha256:c4b0076f0bf29ee62335b055a9599f52000b7941f577daa001c7ef961a1fbeab"}, + {file = "grpcio-1.59.3-cp310-cp310-win_amd64.whl", hash = "sha256:b1f00a3e6e0c3dccccffb5579fc76ebfe4eb40405ba308505b41ef92f747746a"}, + {file = "grpcio-1.59.3-cp311-cp311-linux_armv7l.whl", hash = "sha256:3996aaa21231451161dc29df6a43fcaa8b332042b6150482c119a678d007dd86"}, + {file = "grpcio-1.59.3-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:cb4e9cbd9b7388fcb06412da9f188c7803742d06d6f626304eb838d1707ec7e3"}, + {file = "grpcio-1.59.3-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:8022ca303d6c694a0d7acfb2b472add920217618d3a99eb4b14edc7c6a7e8fcf"}, + {file = "grpcio-1.59.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b36683fad5664283755a7f4e2e804e243633634e93cd798a46247b8e54e3cb0d"}, + {file = "grpcio-1.59.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8239b853226e4824e769517e1b5232e7c4dda3815b200534500338960fcc6118"}, + {file = "grpcio-1.59.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0511af8653fbda489ff11d542a08505d56023e63cafbda60e6e00d4e0bae86ea"}, + {file = "grpcio-1.59.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e78dc982bda74cef2ddfce1c91d29b96864c4c680c634e279ed204d51e227473"}, + {file = "grpcio-1.59.3-cp311-cp311-win32.whl", hash = "sha256:6a5c3a96405966c023e139c3bcccb2c7c776a6f256ac6d70f8558c9041bdccc3"}, + {file = "grpcio-1.59.3-cp311-cp311-win_amd64.whl", hash = "sha256:ed26826ee423b11477297b187371cdf4fa1eca874eb1156422ef3c9a60590dd9"}, + {file = "grpcio-1.59.3-cp312-cp312-linux_armv7l.whl", hash = "sha256:45dddc5cb5227d30fa43652d8872dc87f086d81ab4b500be99413bad0ae198d7"}, + {file = "grpcio-1.59.3-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:1736496d74682e53dd0907fd515f2694d8e6a96c9a359b4080b2504bf2b2d91b"}, + {file = "grpcio-1.59.3-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:ddbd1a16138e52e66229047624de364f88a948a4d92ba20e4e25ad7d22eef025"}, + {file = "grpcio-1.59.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fcfa56f8d031ffda902c258c84c4b88707f3a4be4827b4e3ab8ec7c24676320d"}, + {file = "grpcio-1.59.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2eb8f0c7c0c62f7a547ad7a91ba627a5aa32a5ae8d930783f7ee61680d7eb8d"}, + {file = "grpcio-1.59.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8d993399cc65e3a34f8fd48dd9ad7a376734564b822e0160dd18b3d00c1a33f9"}, + {file = "grpcio-1.59.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c0bd141f4f41907eb90bda74d969c3cb21c1c62779419782a5b3f5e4b5835718"}, + {file = "grpcio-1.59.3-cp312-cp312-win32.whl", hash = "sha256:33b8fd65d4e97efa62baec6171ce51f9cf68f3a8ba9f866f4abc9d62b5c97b79"}, + {file = "grpcio-1.59.3-cp312-cp312-win_amd64.whl", hash = "sha256:0e735ed002f50d4f3cb9ecfe8ac82403f5d842d274c92d99db64cfc998515e07"}, + {file = "grpcio-1.59.3-cp37-cp37m-linux_armv7l.whl", hash = "sha256:ea40ce4404e7cca0724c91a7404da410f0144148fdd58402a5942971e3469b94"}, + {file = "grpcio-1.59.3-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:83113bcc393477b6f7342b9f48e8a054330c895205517edc66789ceea0796b53"}, + {file = "grpcio-1.59.3-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:73afbac602b8f1212a50088193601f869b5073efa9855b3e51aaaec97848fc8a"}, + {file = "grpcio-1.59.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:575d61de1950b0b0699917b686b1ca108690702fcc2df127b8c9c9320f93e069"}, + {file = "grpcio-1.59.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cd76057b5c9a4d68814610ef9226925f94c1231bbe533fdf96f6181f7d2ff9e"}, + {file = "grpcio-1.59.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:95d6fd804c81efe4879e38bfd84d2b26e339a0a9b797e7615e884ef4686eb47b"}, + {file = "grpcio-1.59.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0d42048b8a3286ea4134faddf1f9a59cf98192b94aaa10d910a25613c5eb5bfb"}, + {file = "grpcio-1.59.3-cp37-cp37m-win_amd64.whl", hash = "sha256:4619fea15c64bcdd9d447cdbdde40e3d5f1da3a2e8ae84103d94a9c1df210d7e"}, + {file = "grpcio-1.59.3-cp38-cp38-linux_armv7l.whl", hash = "sha256:95b5506e70284ac03b2005dd9ffcb6708c9ae660669376f0192a710687a22556"}, + {file = "grpcio-1.59.3-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:9e17660947660ccfce56c7869032910c179a5328a77b73b37305cd1ee9301c2e"}, + {file = "grpcio-1.59.3-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:00912ce19914d038851be5cd380d94a03f9d195643c28e3ad03d355cc02ce7e8"}, + {file = "grpcio-1.59.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e58b3cadaa3c90f1efca26ba33e0d408b35b497307027d3d707e4bcd8de862a6"}, + {file = "grpcio-1.59.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d787ecadea865bdf78f6679f6f5bf4b984f18f659257ba612979df97a298b3c3"}, + {file = "grpcio-1.59.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0814942ba1bba269db4e760a34388640c601dece525c6a01f3b4ff030cc0db69"}, + {file = "grpcio-1.59.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fb111aa99d3180c361a35b5ae1e2c63750220c584a1344229abc139d5c891881"}, + {file = "grpcio-1.59.3-cp38-cp38-win32.whl", hash = "sha256:eb8ba504c726befe40a356ecbe63c6c3c64c9a439b3164f5a718ec53c9874da0"}, + {file = "grpcio-1.59.3-cp38-cp38-win_amd64.whl", hash = "sha256:cdbc6b32fadab9bebc6f49d3e7ec4c70983c71e965497adab7f87de218e84391"}, + {file = "grpcio-1.59.3-cp39-cp39-linux_armv7l.whl", hash = "sha256:c82ca1e4be24a98a253d6dbaa216542e4163f33f38163fc77964b0f0d255b552"}, + {file = "grpcio-1.59.3-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:36636babfda14f9e9687f28d5b66d349cf88c1301154dc71c6513de2b6c88c59"}, + {file = "grpcio-1.59.3-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5f9b2e591da751ac7fdd316cc25afafb7a626dededa9b414f90faad7f3ccebdb"}, + {file = "grpcio-1.59.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a93a82876a4926bf451db82ceb725bd87f42292bacc94586045261f501a86994"}, + {file = "grpcio-1.59.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce31fa0bfdd1f2bb15b657c16105c8652186eab304eb512e6ae3b99b2fdd7d13"}, + {file = "grpcio-1.59.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:16da0e40573962dab6cba16bec31f25a4f468e6d05b658e589090fe103b03e3d"}, + {file = "grpcio-1.59.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1d1a17372fd425addd5812049fa7374008ffe689585f27f802d0935522cf4b7"}, + {file = "grpcio-1.59.3-cp39-cp39-win32.whl", hash = "sha256:52cc38a7241b5f7b4a91aaf9000fdd38e26bb00d5e8a71665ce40cfcee716281"}, + {file = "grpcio-1.59.3-cp39-cp39-win_amd64.whl", hash = "sha256:b491e5bbcad3020a96842040421e508780cade35baba30f402df9d321d1c423e"}, + {file = "grpcio-1.59.3.tar.gz", hash = "sha256:7800f99568a74a06ebdccd419dd1b6e639b477dcaf6da77ea702f8fb14ce5f80"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.59.3)"] + +[[package]] +name = "grpcio-status" +version = "1.59.3" +description = "Status proto mapping for gRPC" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "grpcio-status-1.59.3.tar.gz", hash = "sha256:65c394ba43380d6bdf8c04c61efc493104b5535552aed35817a1b4dc66598a1f"}, + {file = "grpcio_status-1.59.3-py3-none-any.whl", hash = "sha256:2fd2eb39ca4e9afb3c874c0878ff75b258db0b7dcc25570fc521f16ae0ab942a"}, +] + +[package.dependencies] +googleapis-common-protos = ">=1.5.5" +grpcio = ">=1.59.3" +protobuf = ">=4.21.6" + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "h5py" +version = "3.10.0" +description = "Read and write HDF5 files from Python" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "h5py-3.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b963fb772964fc1d1563c57e4e2e874022ce11f75ddc6df1a626f42bd49ab99f"}, + {file = "h5py-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:012ab448590e3c4f5a8dd0f3533255bc57f80629bf7c5054cf4c87b30085063c"}, + {file = "h5py-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:781a24263c1270a62cd67be59f293e62b76acfcc207afa6384961762bb88ea03"}, + {file = "h5py-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f42e6c30698b520f0295d70157c4e202a9e402406f50dc08f5a7bc416b24e52d"}, + {file = "h5py-3.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:93dd840bd675787fc0b016f7a05fc6efe37312a08849d9dd4053fd0377b1357f"}, + {file = "h5py-3.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2381e98af081b6df7f6db300cd88f88e740649d77736e4b53db522d8874bf2dc"}, + {file = "h5py-3.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:667fe23ab33d5a8a6b77970b229e14ae3bb84e4ea3382cc08567a02e1499eedd"}, + {file = "h5py-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90286b79abd085e4e65e07c1bd7ee65a0f15818ea107f44b175d2dfe1a4674b7"}, + {file = "h5py-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c013d2e79c00f28ffd0cc24e68665ea03ae9069e167087b2adb5727d2736a52"}, + {file = "h5py-3.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:92273ce69ae4983dadb898fd4d3bea5eb90820df953b401282ee69ad648df684"}, + {file = "h5py-3.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c97d03f87f215e7759a354460fb4b0d0f27001450b18b23e556e7856a0b21c3"}, + {file = "h5py-3.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86df4c2de68257b8539a18646ceccdcf2c1ce6b1768ada16c8dcfb489eafae20"}, + {file = "h5py-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba9ab36be991119a3ff32d0c7cbe5faf9b8d2375b5278b2aea64effbeba66039"}, + {file = "h5py-3.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:2c8e4fda19eb769e9a678592e67eaec3a2f069f7570c82d2da909c077aa94339"}, + {file = "h5py-3.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:492305a074327e8d2513011fa9fffeb54ecb28a04ca4c4227d7e1e9616d35641"}, + {file = "h5py-3.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9450464b458cca2c86252b624279115dcaa7260a40d3cb1594bf2b410a2bd1a3"}, + {file = "h5py-3.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd6f6d1384a9f491732cee233b99cd4bfd6e838a8815cc86722f9d2ee64032af"}, + {file = "h5py-3.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3074ec45d3dc6e178c6f96834cf8108bf4a60ccb5ab044e16909580352010a97"}, + {file = "h5py-3.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:212bb997a91e6a895ce5e2f365ba764debeaef5d2dca5c6fb7098d66607adf99"}, + {file = "h5py-3.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5dfc65ac21fa2f630323c92453cadbe8d4f504726ec42f6a56cf80c2f90d6c52"}, + {file = "h5py-3.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d4682b94fd36ab217352be438abd44c8f357c5449b8995e63886b431d260f3d3"}, + {file = "h5py-3.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aece0e2e1ed2aab076c41802e50a0c3e5ef8816d60ece39107d68717d4559824"}, + {file = "h5py-3.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43a61b2c2ad65b1fabc28802d133eed34debcc2c8b420cb213d3d4ef4d3e2229"}, + {file = "h5py-3.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:ae2f0201c950059676455daf92700eeb57dcf5caaf71b9e1328e6e6593601770"}, + {file = "h5py-3.10.0.tar.gz", hash = "sha256:d93adc48ceeb33347eb24a634fb787efc7ae4644e6ea4ba733d099605045c049"}, +] + +[package.dependencies] +numpy = ">=1.17.3" + +[[package]] +name = "httpcore" +version = "0.16.3" +description = "A minimal low-level HTTP client." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "httpcore-0.16.3-py3-none-any.whl", hash = "sha256:da1fb708784a938aa084bde4feb8317056c55037247c787bd7e19eb2c2949dc0"}, + {file = "httpcore-0.16.3.tar.gz", hash = "sha256:c5d6f04e2fc530f39e0c077e6a30caa53f1451096120f1f38b954afd0b17c0cb"}, +] + +[package.dependencies] +anyio = ">=3.0,<5.0" +certifi = "*" +h11 = ">=0.13,<0.15" +sniffio = ">=1.0.0,<2.0.0" + +[package.extras] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + +[[package]] +name = "httpx" +version = "0.23.3" +description = "The next generation HTTP client." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "httpx-0.23.3-py3-none-any.whl", hash = "sha256:a211fcce9b1254ea24f0cd6af9869b3d29aba40154e947d2a07bb499b3e310d6"}, + {file = "httpx-0.23.3.tar.gz", hash = "sha256:9818458eb565bb54898ccb9b8b251a28785dd4a55afbc23d0eb410754fe7d0f9"}, +] + +[package.dependencies] +certifi = "*" +httpcore = ">=0.15.0,<0.17.0" +rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<13)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + +[[package]] +name = "hyperopt" +version = "0.2.7" +description = "Distributed Asynchronous Hyperparameter Optimization" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "hyperopt-0.2.7-py2.py3-none-any.whl", hash = "sha256:f3046d91fe4167dbf104365016596856b2524a609d22f047a066fc1ac796427c"}, + {file = "hyperopt-0.2.7.tar.gz", hash = "sha256:1bf89ae58050bbd32c7307199046117feee245c2fd9ab6255c7308522b7ca149"}, +] + +[package.dependencies] +cloudpickle = "*" +future = "*" +networkx = ">=2.2" +numpy = "*" +py4j = "*" +scipy = "*" +six = "*" +tqdm = "*" + +[package.extras] +atpe = ["lightgbm", "scikit-learn"] +dev = ["black", "nose", "pre-commit", "pytest"] +mongotrials = ["pymongo"] +sparktrials = ["pyspark"] + +[[package]] +name = "idna" +version = "3.6" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, +] + +[[package]] +name = "imagesize" +version = "1.4.1" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] + +[[package]] +name = "importlib-metadata" +version = "7.0.0" +description = "Read metadata from Python packages" +category = "dev" +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"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] + +[[package]] +name = "importlib-resources" +version = "6.1.1" +description = "Read resources from Python packages" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, + {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, +] + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "ipython" +version = "8.18.1" +description = "IPython: Productive Interactive Computing" +category = "dev" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, + {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +prompt-toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5" +typing-extensions = {version = "*", markers = "python_version < \"3.10\""} + +[package.extras] +all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] + +[[package]] +name = "ipywidgets" +version = "8.1.1" +description = "Jupyter interactive widgets" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ipywidgets-8.1.1-py3-none-any.whl", hash = "sha256:2b88d728656aea3bbfd05d32c747cfd0078f9d7e159cf982433b58ad717eed7f"}, + {file = "ipywidgets-8.1.1.tar.gz", hash = "sha256:40211efb556adec6fa450ccc2a77d59ca44a060f4f9f136833df59c9f538e6e8"}, +] + +[package.dependencies] +comm = ">=0.1.3" +ipython = ">=6.1.0" +jupyterlab-widgets = ">=3.0.9,<3.1.0" +traitlets = ">=4.3.1" +widgetsnbextension = ">=4.0.9,<4.1.0" + +[package.extras] +test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] + +[[package]] +name = "iso8601" +version = "1.1.0" +description = "Simple module to parse ISO 8601 dates" +category = "dev" +optional = false +python-versions = ">=3.6.2,<4.0" +files = [ + {file = "iso8601-1.1.0-py3-none-any.whl", hash = "sha256:8400e90141bf792bce2634df533dc57e3bee19ea120a87bebcd3da89a58ad73f"}, + {file = "iso8601-1.1.0.tar.gz", hash = "sha256:32811e7b81deee2063ea6d2e94f8819a86d1f3811e49d23623a41fa832bef03f"}, +] + +[[package]] +name = "isort" +version = "5.12.0" +description = "A Python utility / library to sort Python imports." +category = "dev" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, + {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, +] + +[package.extras] +colors = ["colorama (>=0.4.3)"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] +plugins = ["setuptools"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] + +[[package]] +name = "jedi" +version = "0.19.1" +description = "An autocompletion tool for Python that can be used for text editors." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "joblib" +version = "1.3.2" +description = "Lightweight pipelining with Python functions" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "joblib-1.3.2-py3-none-any.whl", hash = "sha256:ef4331c65f239985f3f2220ecc87db222f08fd22097a3dd5698f693875f8cbb9"}, + {file = "joblib-1.3.2.tar.gz", hash = "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1"}, +] + +[[package]] +name = "jsonschema" +version = "4.17.3" +description = "An implementation of JSON Schema validation for Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, + {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, +] + +[package.dependencies] +attrs = ">=17.4.0" +pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jupyter-client" +version = "8.6.0" +description = "Jupyter protocol implementation and client libraries" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.6.0-py3-none-any.whl", hash = "sha256:909c474dbe62582ae62b758bca86d6518c85234bdee2d908c778db6d72f39d99"}, + {file = "jupyter_client-8.6.0.tar.gz", hash = "sha256:0642244bb83b4764ae60d07e010e15f0e2d275ec4e918a8f7b80fbbef3ca60c7"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "5.5.0" +description = "Jupyter core package. A base package on which Jupyter projects rely." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.5.0-py3-none-any.whl", hash = "sha256:e11e02cd8ae0a9de5c6c44abf5727df9f2581055afe00b22183f621ba3585805"}, + {file = "jupyter_core-5.5.0.tar.gz", hash = "sha256:880b86053bf298a8724994f95e99b99130659022a4f7f45f563084b6223861d3"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +description = "Pygments theme using JupyterLab CSS variables" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, + {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, +] + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.9" +description = "Jupyter interactive widgets for JupyterLab" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jupyterlab_widgets-3.0.9-py3-none-any.whl", hash = "sha256:3cf5bdf5b897bf3bccf1c11873aa4afd776d7430200f765e0686bd352487b58d"}, + {file = "jupyterlab_widgets-3.0.9.tar.gz", hash = "sha256:6005a4e974c7beee84060fdfba341a3218495046de8ae3ec64888e5fe19fdb4c"}, +] + +[[package]] +name = "keras" +version = "2.14.0" +description = "Deep learning for humans." +category = "dev" +optional = false +python-versions = ">=3.9" +files = [ + {file = "keras-2.14.0-py3-none-any.whl", hash = "sha256:d7429d1d2131cc7eb1f2ea2ec330227c7d9d38dab3dfdf2e78defee4ecc43fcd"}, + {file = "keras-2.14.0.tar.gz", hash = "sha256:22788bdbc86d9988794fe9703bb5205141da797c4faeeb59497c58c3d94d34ed"}, +] + +[[package]] +name = "kiwisolver" +version = "1.4.5" +description = "A fast implementation of the Cassowary constraint solver" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, + {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, +] + +[[package]] +name = "lark" +version = "0.11.3" +description = "a modern parsing library" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "lark-0.11.3.tar.gz", hash = "sha256:3100d9749b5a85735ec428b83100876a5da664804579e729c23a36341f961e7e"}, +] + +[package.extras] +atomic-cache = ["atomicwrites"] +nearley = ["js2py"] +regex = ["regex"] + +[[package]] +name = "latexcodec" +version = "2.0.1" +description = "A lexer and codec to work with LaTeX code in Python." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "latexcodec-2.0.1-py2.py3-none-any.whl", hash = "sha256:c277a193638dc7683c4c30f6684e3db728a06efb0dc9cf346db8bd0aa6c5d271"}, + {file = "latexcodec-2.0.1.tar.gz", hash = "sha256:2aa2551c373261cefe2ad3a8953a6d6533e68238d180eb4bb91d7964adb3fe9a"}, +] + +[package.dependencies] +six = ">=1.4.1" + +[[package]] +name = "lazy-object-proxy" +version = "1.9.0" +description = "A fast and thorough lazy object proxy." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, +] + +[[package]] +name = "libclang" +version = "16.0.6" +description = "Clang Python Bindings, mirrored from the official LLVM repo: https://github.com/llvm/llvm-project/tree/main/clang/bindings/python, to make the installation process easier." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "libclang-16.0.6-1-py2.py3-none-manylinux2014_aarch64.whl", hash = "sha256:88bc7e7b393c32e41e03ba77ef02fdd647da1f764c2cd028e69e0837080b79f6"}, + {file = "libclang-16.0.6-1-py2.py3-none-manylinux2014_armv7l.whl", hash = "sha256:d80ed5827736ed5ec2bcedf536720476fd9d4fa4c79ef0cb24aea4c59332f361"}, + {file = "libclang-16.0.6-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:da9e47ebc3f0a6d90fb169ef25f9fbcd29b4a4ef97a8b0e3e3a17800af1423f4"}, + {file = "libclang-16.0.6-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:e1a5ad1e895e5443e205568c85c04b4608e4e973dae42f4dfd9cb46c81d1486b"}, + {file = "libclang-16.0.6-py2.py3-none-manylinux2010_x86_64.whl", hash = "sha256:9dcdc730939788b8b69ffd6d5d75fe5366e3ee007f1e36a99799ec0b0c001492"}, + {file = "libclang-16.0.6-py2.py3-none-manylinux2014_aarch64.whl", hash = "sha256:8130482120500476a027171f8f3c8dfc2536b591716eea71fc5da22cae13131b"}, + {file = "libclang-16.0.6-py2.py3-none-manylinux2014_armv7l.whl", hash = "sha256:1e940048f51d0b0999099a9b78629ab8a64b62af5e9ff1b2b062439c21ee244d"}, + {file = "libclang-16.0.6-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f04e3060ae1f207f234d0608900c99c50edcb743e5e18276d78da2ddd727d39f"}, + {file = "libclang-16.0.6-py2.py3-none-win_amd64.whl", hash = "sha256:daab4a11dae228f1efa9efa3fe638b493b14d8d52c71fb3c7019e2f1df4514c2"}, + {file = "libclang-16.0.6-py2.py3-none-win_arm64.whl", hash = "sha256:4a9acbfd9c135a72f80d5dbff7588dfb0c81458244a89b9e83526e8595880e0a"}, + {file = "libclang-16.0.6.tar.gz", hash = "sha256:4acdde39dfe410c877b4ccc0d4b57eb952100e4ee26bbdf6cfdb88e2033a7d31"}, +] + +[[package]] +name = "llvmlite" +version = "0.41.1" +description = "lightweight wrapper around basic LLVM functionality" +category = "dev" +optional = false +python-versions = ">=3.8" +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"}, +] + +[[package]] +name = "markdown" +version = "3.5.1" +description = "Python implementation of John Gruber's Markdown." +category = "dev" +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"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markupsafe" +version = "2.1.3" +description = "Safely add untrusted strings to HTML/XML markup." +category = "dev" +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"}, +] + +[[package]] +name = "matplotlib" +version = "3.8.2" +description = "Python plotting package" +category = "dev" +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"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} +kiwisolver = ">=1.3.1" +numpy = ">=1.21,<2" +packaging = ">=20.0" +pillow = ">=8" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + +[[package]] +name = "matplotlib-inline" +version = "0.1.6" +description = "Inline Matplotlib backend for Jupyter" +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, + {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mistune" +version = "3.0.2" +description = "A sane and fast Markdown parser with useful plugins and renderers" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, + {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, +] + +[[package]] +name = "ml-dtypes" +version = "0.2.0" +description = "" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ml_dtypes-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:df6a76e1c8adf484feb138ed323f9f40a7b6c21788f120f7c78bec20ac37ee81"}, + {file = "ml_dtypes-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc29a0524ef5e23a7fbb8d881bdecabeb3fc1d19d9db61785d077a86cb94fab2"}, + {file = "ml_dtypes-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f08c391c2794f2aad358e6f4c70785a9a7b1df980ef4c232b3ccd4f6fe39f719"}, + {file = "ml_dtypes-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:75015818a7fccf99a5e8ed18720cb430f3e71a8838388840f4cdf225c036c983"}, + {file = "ml_dtypes-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e70047ec2c83eaee01afdfdabee2c5b0c133804d90d0f7db4dd903360fcc537c"}, + {file = "ml_dtypes-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36d28b8861a8931695e5a31176cad5ae85f6504906650dea5598fbec06c94606"}, + {file = "ml_dtypes-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e85ba8e24cf48d456e564688e981cf379d4c8e644db0a2f719b78de281bac2ca"}, + {file = "ml_dtypes-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:832a019a1b6db5c4422032ca9940a990fa104eee420f643713241b3a518977fa"}, + {file = "ml_dtypes-0.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8faaf0897942c8253dd126662776ba45f0a5861968cf0f06d6d465f8a7bc298a"}, + {file = "ml_dtypes-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b984cddbe8173b545a0e3334fe56ea1a5c3eb67c507f60d0cfde1d3fa8f8c2"}, + {file = "ml_dtypes-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:022d5a4ee6be14569c2a9d1549e16f1ec87ca949681d0dca59995445d5fcdd5b"}, + {file = "ml_dtypes-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:50845af3e9a601810751b55091dee6c2562403fa1cb4e0123675cf3a4fc2c17a"}, + {file = "ml_dtypes-0.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f00c71c8c63e03aff313bc6a7aeaac9a4f1483a921a6ffefa6d4404efd1af3d0"}, + {file = "ml_dtypes-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80d304c836d73f10605c58ccf7789c171cc229bfb678748adfb7cea2510dfd0e"}, + {file = "ml_dtypes-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32107e7fa9f62db9a5281de923861325211dfff87bd23faefb27b303314635ab"}, + {file = "ml_dtypes-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:1749b60348da71fd3c2ab303fdbc1965958dc50775ead41f5669c932a341cafd"}, + {file = "ml_dtypes-0.2.0.tar.gz", hash = "sha256:6488eb642acaaf08d8020f6de0a38acee7ac324c1e6e92ee0c0fea42422cb797"}, +] + +[package.dependencies] +numpy = [ + {version = ">1.20", markers = "python_version <= \"3.9\""}, + {version = ">=1.23.3", markers = "python_version > \"3.10\""}, + {version = ">=1.21.2", markers = "python_version > \"3.9\""}, +] + +[package.extras] +dev = ["absl-py", "pyink", "pylint (>=2.6.0)", "pytest", "pytest-xdist"] + +[[package]] +name = "mpmath" +version = "1.3.0" +description = "Python library for arbitrary-precision floating-point arithmetic" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, + {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, +] + +[package.extras] +develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] +docs = ["sphinx"] +gmpy = ["gmpy2 (>=2.1.0a4)"] +tests = ["pytest (>=4.6)"] + +[[package]] +name = "msgpack" +version = "1.0.7" +description = "MessagePack serializer" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "msgpack-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:04ad6069c86e531682f9e1e71b71c1c3937d6014a7c3e9edd2aa81ad58842862"}, + {file = "msgpack-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cca1b62fe70d761a282496b96a5e51c44c213e410a964bdffe0928e611368329"}, + {file = "msgpack-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e50ebce52f41370707f1e21a59514e3375e3edd6e1832f5e5235237db933c98b"}, + {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7b4f35de6a304b5533c238bee86b670b75b03d31b7797929caa7a624b5dda6"}, + {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28efb066cde83c479dfe5a48141a53bc7e5f13f785b92ddde336c716663039ee"}, + {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cb14ce54d9b857be9591ac364cb08dc2d6a5c4318c1182cb1d02274029d590d"}, + {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b573a43ef7c368ba4ea06050a957c2a7550f729c31f11dd616d2ac4aba99888d"}, + {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ccf9a39706b604d884d2cb1e27fe973bc55f2890c52f38df742bc1d79ab9f5e1"}, + {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cb70766519500281815dfd7a87d3a178acf7ce95390544b8c90587d76b227681"}, + {file = "msgpack-1.0.7-cp310-cp310-win32.whl", hash = "sha256:b610ff0f24e9f11c9ae653c67ff8cc03c075131401b3e5ef4b82570d1728f8a9"}, + {file = "msgpack-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:a40821a89dc373d6427e2b44b572efc36a2778d3f543299e2f24eb1a5de65415"}, + {file = "msgpack-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:576eb384292b139821c41995523654ad82d1916da6a60cff129c715a6223ea84"}, + {file = "msgpack-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:730076207cb816138cf1af7f7237b208340a2c5e749707457d70705715c93b93"}, + {file = "msgpack-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:85765fdf4b27eb5086f05ac0491090fc76f4f2b28e09d9350c31aac25a5aaff8"}, + {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3476fae43db72bd11f29a5147ae2f3cb22e2f1a91d575ef130d2bf49afd21c46"}, + {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d4c80667de2e36970ebf74f42d1088cc9ee7ef5f4e8c35eee1b40eafd33ca5b"}, + {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b0bf0effb196ed76b7ad883848143427a73c355ae8e569fa538365064188b8e"}, + {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f9a7c509542db4eceed3dcf21ee5267ab565a83555c9b88a8109dcecc4709002"}, + {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:84b0daf226913133f899ea9b30618722d45feffa67e4fe867b0b5ae83a34060c"}, + {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ec79ff6159dffcc30853b2ad612ed572af86c92b5168aa3fc01a67b0fa40665e"}, + {file = "msgpack-1.0.7-cp311-cp311-win32.whl", hash = "sha256:3e7bf4442b310ff154b7bb9d81eb2c016b7d597e364f97d72b1acc3817a0fdc1"}, + {file = "msgpack-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:3f0c8c6dfa6605ab8ff0611995ee30d4f9fcff89966cf562733b4008a3d60d82"}, + {file = "msgpack-1.0.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f0936e08e0003f66bfd97e74ee530427707297b0d0361247e9b4f59ab78ddc8b"}, + {file = "msgpack-1.0.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98bbd754a422a0b123c66a4c341de0474cad4a5c10c164ceed6ea090f3563db4"}, + {file = "msgpack-1.0.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b291f0ee7961a597cbbcc77709374087fa2a9afe7bdb6a40dbbd9b127e79afee"}, + {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebbbba226f0a108a7366bf4b59bf0f30a12fd5e75100c630267d94d7f0ad20e5"}, + {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e2d69948e4132813b8d1131f29f9101bc2c915f26089a6d632001a5c1349672"}, + {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdf38ba2d393c7911ae989c3bbba510ebbcdf4ecbdbfec36272abe350c454075"}, + {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:993584fc821c58d5993521bfdcd31a4adf025c7d745bbd4d12ccfecf695af5ba"}, + {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:52700dc63a4676669b341ba33520f4d6e43d3ca58d422e22ba66d1736b0a6e4c"}, + {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e45ae4927759289c30ccba8d9fdce62bb414977ba158286b5ddaf8df2cddb5c5"}, + {file = "msgpack-1.0.7-cp312-cp312-win32.whl", hash = "sha256:27dcd6f46a21c18fa5e5deed92a43d4554e3df8d8ca5a47bf0615d6a5f39dbc9"}, + {file = "msgpack-1.0.7-cp312-cp312-win_amd64.whl", hash = "sha256:7687e22a31e976a0e7fc99c2f4d11ca45eff652a81eb8c8085e9609298916dcf"}, + {file = "msgpack-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5b6ccc0c85916998d788b295765ea0e9cb9aac7e4a8ed71d12e7d8ac31c23c95"}, + {file = "msgpack-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:235a31ec7db685f5c82233bddf9858748b89b8119bf4538d514536c485c15fe0"}, + {file = "msgpack-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cab3db8bab4b7e635c1c97270d7a4b2a90c070b33cbc00c99ef3f9be03d3e1f7"}, + {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bfdd914e55e0d2c9e1526de210f6fe8ffe9705f2b1dfcc4aecc92a4cb4b533d"}, + {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36e17c4592231a7dbd2ed09027823ab295d2791b3b1efb2aee874b10548b7524"}, + {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38949d30b11ae5f95c3c91917ee7a6b239f5ec276f271f28638dec9156f82cfc"}, + {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ff1d0899f104f3921d94579a5638847f783c9b04f2d5f229392ca77fba5b82fc"}, + {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dc43f1ec66eb8440567186ae2f8c447d91e0372d793dfe8c222aec857b81a8cf"}, + {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dd632777ff3beaaf629f1ab4396caf7ba0bdd075d948a69460d13d44357aca4c"}, + {file = "msgpack-1.0.7-cp38-cp38-win32.whl", hash = "sha256:4e71bc4416de195d6e9b4ee93ad3f2f6b2ce11d042b4d7a7ee00bbe0358bd0c2"}, + {file = "msgpack-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:8f5b234f567cf76ee489502ceb7165c2a5cecec081db2b37e35332b537f8157c"}, + {file = "msgpack-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfef2bb6ef068827bbd021017a107194956918ab43ce4d6dc945ffa13efbc25f"}, + {file = "msgpack-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:484ae3240666ad34cfa31eea7b8c6cd2f1fdaae21d73ce2974211df099a95d81"}, + {file = "msgpack-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3967e4ad1aa9da62fd53e346ed17d7b2e922cba5ab93bdd46febcac39be636fc"}, + {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dd178c4c80706546702c59529ffc005681bd6dc2ea234c450661b205445a34d"}, + {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6ffbc252eb0d229aeb2f9ad051200668fc3a9aaa8994e49f0cb2ffe2b7867e7"}, + {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:822ea70dc4018c7e6223f13affd1c5c30c0f5c12ac1f96cd8e9949acddb48a61"}, + {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:384d779f0d6f1b110eae74cb0659d9aa6ff35aaf547b3955abf2ab4c901c4819"}, + {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f64e376cd20d3f030190e8c32e1c64582eba56ac6dc7d5b0b49a9d44021b52fd"}, + {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5ed82f5a7af3697b1c4786053736f24a0efd0a1b8a130d4c7bfee4b9ded0f08f"}, + {file = "msgpack-1.0.7-cp39-cp39-win32.whl", hash = "sha256:f26a07a6e877c76a88e3cecac8531908d980d3d5067ff69213653649ec0f60ad"}, + {file = "msgpack-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:1dc93e8e4653bdb5910aed79f11e165c85732067614f180f70534f056da97db3"}, + {file = "msgpack-1.0.7.tar.gz", hash = "sha256:572efc93db7a4d27e404501975ca6d2d9775705c2d922390d878fcf768d92c87"}, +] + +[[package]] +name = "nbclient" +version = "0.9.0" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +category = "dev" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "nbclient-0.9.0-py3-none-any.whl", hash = "sha256:a3a1ddfb34d4a9d17fc744d655962714a866639acd30130e9be84191cd97cd15"}, + {file = "nbclient-0.9.0.tar.gz", hash = "sha256:4b28c207877cf33ef3a9838cdc7a54c5ceff981194a82eac59d558f05487295e"}, +] + +[package.dependencies] +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +nbformat = ">=5.1" +traitlets = ">=5.4" + +[package.extras] +dev = ["pre-commit"] +docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] + +[[package]] +name = "nbconvert" +version = "7.12.0" +description = "Converting Jupyter Notebooks" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "nbconvert-7.12.0-py3-none-any.whl", hash = "sha256:5b6c848194d270cc55fb691169202620d7b52a12fec259508d142ecbe4219310"}, + {file = "nbconvert-7.12.0.tar.gz", hash = "sha256:b1564bd89f69a74cd6398b0362da94db07aafb991b7857216a766204a71612c0"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +bleach = "!=5.0.0" +defusedxml = "*" +importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} +jinja2 = ">=3.0" +jupyter-core = ">=4.7" +jupyterlab-pygments = "*" +markupsafe = ">=2.0" +mistune = ">=2.0.3,<4" +nbclient = ">=0.5.0" +nbformat = ">=5.7" +packaging = "*" +pandocfilters = ">=1.4.1" +pygments = ">=2.4.1" +tinycss2 = "*" +traitlets = ">=5.1" + +[package.extras] +all = ["nbconvert[docs,qtpdf,serve,test,webpdf]"] +docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)", "sphinxcontrib-spelling"] +qtpdf = ["nbconvert[qtpng]"] +qtpng = ["pyqtwebengine (>=5.15)"] +serve = ["tornado (>=6.1)"] +test = ["flaky", "ipykernel", "ipywidgets (>=7)", "pytest"] +webpdf = ["playwright"] + +[[package]] +name = "nbformat" +version = "5.9.2" +description = "The Jupyter Notebook format" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "nbformat-5.9.2-py3-none-any.whl", hash = "sha256:1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9"}, + {file = "nbformat-5.9.2.tar.gz", hash = "sha256:5f98b5ba1997dff175e77e0c17d5c10a96eaed2cbd1de3533d1fc35d5e111192"}, +] + +[package.dependencies] +fastjsonschema = "*" +jsonschema = ">=2.6" +jupyter-core = "*" +traitlets = ">=5.1" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["pep440", "pre-commit", "pytest", "testpath"] + +[[package]] +name = "nbsphinx" +version = "0.8.12" +description = "Jupyter Notebook Tools for Sphinx" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "nbsphinx-0.8.12-py3-none-any.whl", hash = "sha256:c15b681c7fce287000856f91fe1edac50d29f7b0c15bbc746fbe55c8eb84750b"}, + {file = "nbsphinx-0.8.12.tar.gz", hash = "sha256:76570416cdecbeb21dbf5c3d6aa204ced6c1dd7ebef4077b5c21b8c6ece9533f"}, +] + +[package.dependencies] +docutils = "*" +jinja2 = "*" +nbconvert = "!=5.4" +nbformat = "*" +sphinx = ">=1.8" +traitlets = ">=5" + +[[package]] +name = "networkx" +version = "3.2.1" +description = "Python package for creating and manipulating graphs and networks" +category = "main" +optional = false +python-versions = ">=3.9" +files = [ + {file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"}, + {file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"}, +] + +[package.extras] +default = ["matplotlib (>=3.5)", "numpy (>=1.22)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.4)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["nb2plots (>=0.7)", "nbconvert (<7.9)", "numpydoc (>=1.6)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.11)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[package]] +name = "numba" +version = "0.58.1" +description = "compiling Python code using LLVM" +category = "dev" +optional = false +python-versions = ">=3.8" +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"}, +] + +[package.dependencies] +llvmlite = ">=0.41.0dev0,<0.42" +numpy = ">=1.22,<1.27" + +[[package]] +name = "numpy" +version = "1.26.2" +description = "Fundamental package for array computing in Python" +category = "main" +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"}, +] + +[[package]] +name = "oauthlib" +version = "3.2.2" +description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, + {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, +] + +[package.extras] +rsa = ["cryptography (>=3.0.0)"] +signals = ["blinker (>=1.4.0)"] +signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] + +[[package]] +name = "opt-einsum" +version = "3.3.0" +description = "Optimizing numpys einsum function" +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "opt_einsum-3.3.0-py3-none-any.whl", hash = "sha256:2455e59e3947d3c275477df7f5205b30635e266fe6dc300e3d9f9646bfcea147"}, + {file = "opt_einsum-3.3.0.tar.gz", hash = "sha256:59f6475f77bbc37dcf7cd748519c0ec60722e91e63ca114e68821c0c54a46549"}, +] + +[package.dependencies] +numpy = ">=1.7" + +[package.extras] +docs = ["numpydoc", "sphinx (==1.2.3)", "sphinx-rtd-theme", "sphinxcontrib-napoleon"] +tests = ["pytest", "pytest-cov", "pytest-pep8"] + +[[package]] +name = "osqp" +version = "0.6.3" +description = "OSQP: The Operator Splitting QP Solver" +category = "dev" +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"}, +] + +[package.dependencies] +numpy = ">=1.7" +qdldl = "*" +scipy = ">=0.13.2" + +[[package]] +name = "packaging" +version = "23.2" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "pandas" +version = "2.1.3" +description = "Powerful data structures for data analysis, time series, and statistics" +category = "dev" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:acf08a73b5022b479c1be155d4988b72f3020f308f7a87c527702c5f8966d34f"}, + {file = "pandas-2.1.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3cc4469ff0cf9aa3a005870cb49ab8969942b7156e0a46cc3f5abd6b11051dfb"}, + {file = "pandas-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35172bff95f598cc5866c047f43c7f4df2c893acd8e10e6653a4b792ed7f19bb"}, + {file = "pandas-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59dfe0e65a2f3988e940224e2a70932edc964df79f3356e5f2997c7d63e758b4"}, + {file = "pandas-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0296a66200dee556850d99b24c54c7dfa53a3264b1ca6f440e42bad424caea03"}, + {file = "pandas-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:465571472267a2d6e00657900afadbe6097c8e1dc43746917db4dfc862e8863e"}, + {file = "pandas-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:04d4c58e1f112a74689da707be31cf689db086949c71828ef5da86727cfe3f82"}, + {file = "pandas-2.1.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7fa2ad4ff196768ae63a33f8062e6838efed3a319cf938fdf8b95e956c813042"}, + {file = "pandas-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4441ac94a2a2613e3982e502ccec3bdedefe871e8cea54b8775992485c5660ef"}, + {file = "pandas-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5ded6ff28abbf0ea7689f251754d3789e1edb0c4d0d91028f0b980598418a58"}, + {file = "pandas-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fca5680368a5139d4920ae3dc993eb5106d49f814ff24018b64d8850a52c6ed2"}, + {file = "pandas-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:de21e12bf1511190fc1e9ebc067f14ca09fccfb189a813b38d63211d54832f5f"}, + {file = "pandas-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a5d53c725832e5f1645e7674989f4c106e4b7249c1d57549023ed5462d73b140"}, + {file = "pandas-2.1.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7cf4cf26042476e39394f1f86868d25b265ff787c9b2f0d367280f11afbdee6d"}, + {file = "pandas-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72c84ec1b1d8e5efcbff5312abe92bfb9d5b558f11e0cf077f5496c4f4a3c99e"}, + {file = "pandas-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f539e113739a3e0cc15176bf1231a553db0239bfa47a2c870283fd93ba4f683"}, + {file = "pandas-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fc77309da3b55732059e484a1efc0897f6149183c522390772d3561f9bf96c00"}, + {file = "pandas-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:08637041279b8981a062899da0ef47828df52a1838204d2b3761fbd3e9fcb549"}, + {file = "pandas-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b99c4e51ef2ed98f69099c72c75ec904dd610eb41a32847c4fcbc1a975f2d2b8"}, + {file = "pandas-2.1.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f7ea8ae8004de0381a2376662c0505bb0a4f679f4c61fbfd122aa3d1b0e5f09d"}, + {file = "pandas-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcd76d67ca2d48f56e2db45833cf9d58f548f97f61eecd3fdc74268417632b8a"}, + {file = "pandas-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1329dbe93a880a3d7893149979caa82d6ba64a25e471682637f846d9dbc10dd2"}, + {file = "pandas-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:321ecdb117bf0f16c339cc6d5c9a06063854f12d4d9bc422a84bb2ed3207380a"}, + {file = "pandas-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:11a771450f36cebf2a4c9dbd3a19dfa8c46c4b905a3ea09dc8e556626060fe71"}, + {file = "pandas-2.1.3.tar.gz", hash = "sha256:22929f84bca106921917eb73c1521317ddd0a4c71b395bcf767a106e3494209f"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2,<2", markers = "python_version == \"3.11\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.1" + +[package.extras] +all = ["PyQt5 (>=5.15.6)", "SQLAlchemy (>=1.4.36)", "beautifulsoup4 (>=4.11.1)", "bottleneck (>=1.3.4)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=0.8.1)", "fsspec (>=2022.05.0)", "gcsfs (>=2022.05.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.8.0)", "matplotlib (>=3.6.1)", "numba (>=0.55.2)", "numexpr (>=2.8.0)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pandas-gbq (>=0.17.5)", "psycopg2 (>=2.9.3)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.5)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "pyxlsb (>=1.0.9)", "qtpy (>=2.2.0)", "s3fs (>=2022.05.0)", "scipy (>=1.8.1)", "tables (>=3.7.0)", "tabulate (>=0.8.10)", "xarray (>=2022.03.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)", "zstandard (>=0.17.0)"] +aws = ["s3fs (>=2022.05.0)"] +clipboard = ["PyQt5 (>=5.15.6)", "qtpy (>=2.2.0)"] +compression = ["zstandard (>=0.17.0)"] +computation = ["scipy (>=1.8.1)", "xarray (>=2022.03.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pyxlsb (>=1.0.9)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)"] +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)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.8.0)"] + +[[package]] +name = "pandocfilters" +version = "1.5.0" +description = "Utilities for writing pandoc filters in python" +category = "dev" +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"}, +] + +[[package]] +name = "parso" +version = "0.8.3" +description = "A Python Parser" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["docopt", "pytest (<6.0.0)"] + +[[package]] +name = "pdbpp" +version = "0.10.3" +description = "pdb++, a drop-in replacement for pdb" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pdbpp-0.10.3-py2.py3-none-any.whl", hash = "sha256:79580568e33eb3d6f6b462b1187f53e10cd8e4538f7d31495c9181e2cf9665d1"}, + {file = "pdbpp-0.10.3.tar.gz", hash = "sha256:d9e43f4fda388eeb365f2887f4e7b66ac09dce9b6236b76f63616530e2f669f5"}, +] + +[package.dependencies] +fancycompleter = ">=0.8" +pygments = "*" +wmctrl = "*" + +[package.extras] +funcsigs = ["funcsigs"] +testing = ["funcsigs", "pytest"] + +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pillow" +version = "10.1.0" +description = "Python Imaging Library (Fork)" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Pillow-10.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106"}, + {file = "Pillow-10.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818"}, + {file = "Pillow-10.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992"}, + {file = "Pillow-10.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f"}, + {file = "Pillow-10.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212"}, + {file = "Pillow-10.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2"}, + {file = "Pillow-10.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f"}, + {file = "Pillow-10.1.0.tar.gz", hash = "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "platformdirs" +version = "4.1.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +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"}, +] + +[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)"] + +[[package]] +name = "pluggy" +version = "1.3.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +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"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "ply" +version = "3.11" +description = "Python Lex & Yacc" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, + {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.41" +description = "Library for building powerful interactive command lines in Python" +category = "dev" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.41-py3-none-any.whl", hash = "sha256:f36fe301fafb7470e86aaf90f036eef600a3210be4decf461a5b1ca8403d3cb2"}, + {file = "prompt_toolkit-3.0.41.tar.gz", hash = "sha256:941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "proto-plus" +version = "1.22.3" +description = "Beautiful, Pythonic protocol buffers." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "proto-plus-1.22.3.tar.gz", hash = "sha256:fdcd09713cbd42480740d2fe29c990f7fbd885a67efc328aa8be6ee3e9f76a6b"}, + {file = "proto_plus-1.22.3-py3-none-any.whl", hash = "sha256:a49cd903bc0b6ab41f76bf65510439d56ca76f868adf0274e738bfdd096894df"}, +] + +[package.dependencies] +protobuf = ">=3.19.0,<5.0.0dev" + +[package.extras] +testing = ["google-api-core[grpc] (>=1.31.5)"] + +[[package]] +name = "protobuf" +version = "4.25.1" +description = "" +category = "dev" +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"}, +] + +[[package]] +name = "psutil" +version = "5.9.6" +description = "Cross-platform lib for process and system monitoring in Python." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "psutil-5.9.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:fb8a697f11b0f5994550555fcfe3e69799e5b060c8ecf9e2f75c69302cc35c0d"}, + {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:91ecd2d9c00db9817a4b4192107cf6954addb5d9d67a969a4f436dbc9200f88c"}, + {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:10e8c17b4f898d64b121149afb136c53ea8b68c7531155147867b7b1ac9e7e28"}, + {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:18cd22c5db486f33998f37e2bb054cc62fd06646995285e02a51b1e08da97017"}, + {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ca2780f5e038379e520281e4c032dddd086906ddff9ef0d1b9dcf00710e5071c"}, + {file = "psutil-5.9.6-cp27-none-win32.whl", hash = "sha256:70cb3beb98bc3fd5ac9ac617a327af7e7f826373ee64c80efd4eb2856e5051e9"}, + {file = "psutil-5.9.6-cp27-none-win_amd64.whl", hash = "sha256:51dc3d54607c73148f63732c727856f5febec1c7c336f8f41fcbd6315cce76ac"}, + {file = "psutil-5.9.6-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c69596f9fc2f8acd574a12d5f8b7b1ba3765a641ea5d60fb4736bf3c08a8214a"}, + {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92e0cc43c524834af53e9d3369245e6cc3b130e78e26100d1f63cdb0abeb3d3c"}, + {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4"}, + {file = "psutil-5.9.6-cp36-cp36m-win32.whl", hash = "sha256:3ebf2158c16cc69db777e3c7decb3c0f43a7af94a60d72e87b2823aebac3d602"}, + {file = "psutil-5.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:ff18b8d1a784b810df0b0fff3bcb50ab941c3b8e2c8de5726f9c71c601c611aa"}, + {file = "psutil-5.9.6-cp37-abi3-win32.whl", hash = "sha256:a6f01f03bf1843280f4ad16f4bde26b817847b4c1a0db59bf6419807bc5ce05c"}, + {file = "psutil-5.9.6-cp37-abi3-win_amd64.whl", hash = "sha256:6e5fb8dc711a514da83098bc5234264e551ad980cec5f85dabf4d38ed6f15e9a"}, + {file = "psutil-5.9.6-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:daecbcbd29b289aac14ece28eca6a3e60aa361754cf6da3dfb20d4d32b6c7f57"}, + {file = "psutil-5.9.6.tar.gz", hash = "sha256:e4b92ddcd7dd4cdd3f900180ea1e104932c7bce234fb88976e2a3b296441225a"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "py4j" +version = "0.10.9.7" +description = "Enables Python programs to dynamically access arbitrary Java objects" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "py4j-0.10.9.7-py2.py3-none-any.whl", hash = "sha256:85defdfd2b2376eb3abf5ca6474b51ab7e0de341c75a02f46dc9b5976f5a5c1b"}, + {file = "py4j-0.10.9.7.tar.gz", hash = "sha256:0b6e5315bb3ada5cf62ac651d107bb2ebc02def3dee9d9548e3baac644ea8dbb"}, +] + +[[package]] +name = "pyasn1" +version = "0.5.1" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pyasn1-0.5.1-py2.py3-none-any.whl", hash = "sha256:4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58"}, + {file = "pyasn1-0.5.1.tar.gz", hash = "sha256:6d391a96e59b23130a5cfa74d6fd7f388dbbe26cc8f1edf39fdddf08d9d6676c"}, +] + +[[package]] +name = "pyasn1-modules" +version = "0.3.0" +description = "A collection of ASN.1-based protocols modules" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, + {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, +] + +[package.dependencies] +pyasn1 = ">=0.4.6,<0.6.0" + +[[package]] +name = "pybind11" +version = "2.11.1" +description = "Seamless operability between C++11 and Python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pybind11-2.11.1-py3-none-any.whl", hash = "sha256:33cdd02a6453380dd71cc70357ce388ad1ee8d32bd0e38fc22b273d050aa29b3"}, + {file = "pybind11-2.11.1.tar.gz", hash = "sha256:00cd59116a6e8155aecd9174f37ba299d1d397ed4a6b86ac1dfe01b3e40f2cc4"}, +] + +[package.extras] +global = ["pybind11-global (==2.11.1)"] + +[[package]] +name = "pybtex" +version = "0.24.0" +description = "A BibTeX-compatible bibliography processor in Python" +category = "dev" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" +files = [ + {file = "pybtex-0.24.0-py2.py3-none-any.whl", hash = "sha256:e1e0c8c69998452fea90e9179aa2a98ab103f3eed894405b7264e517cc2fcc0f"}, + {file = "pybtex-0.24.0.tar.gz", hash = "sha256:818eae35b61733e5c007c3fcd2cfb75ed1bc8b4173c1f70b56cc4c0802d34755"}, +] + +[package.dependencies] +latexcodec = ">=1.0.4" +PyYAML = ">=3.01" +six = "*" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "pybtex-docutils" +version = "1.0.3" +description = "A docutils backend for pybtex." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pybtex-docutils-1.0.3.tar.gz", hash = "sha256:3a7ebdf92b593e00e8c1c538aa9a20bca5d92d84231124715acc964d51d93c6b"}, + {file = "pybtex_docutils-1.0.3-py3-none-any.whl", hash = "sha256:8fd290d2ae48e32fcb54d86b0efb8d573198653c7e2447d5bec5847095f430b9"}, +] + +[package.dependencies] +docutils = ">=0.14" +pybtex = ">=0.16" + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pydantic" +version = "1.10.13" +description = "Data validation and settings management using python type hints" +category = "dev" +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"}, +] + +[package.dependencies] +typing-extensions = ">=4.2.0" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + +[[package]] +name = "pygments" +version = "2.17.2" +description = "Pygments is a syntax highlighting package written in Python." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, +] + +[package.extras] +plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pyjwt" +version = "2.8.0" +description = "JSON Web Token implementation in Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, + {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, +] + +[package.extras] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] + +[[package]] +name = "pylint" +version = "2.17.7" +description = "python code static checker" +category = "dev" +optional = false +python-versions = ">=3.7.2" +files = [ + {file = "pylint-2.17.7-py3-none-any.whl", hash = "sha256:27a8d4c7ddc8c2f8c18aa0050148f89ffc09838142193fdbe98f172781a3ff87"}, + {file = "pylint-2.17.7.tar.gz", hash = "sha256:f4fcac7ae74cfe36bc8451e931d8438e4a476c20314b1101c458ad0f05191fad"}, +] + +[package.dependencies] +astroid = ">=2.15.8,<=2.17.0-dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = [ + {version = ">=0.2", markers = "python_version < \"3.11\""}, + {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, +] +isort = ">=4.2.5,<6" +mccabe = ">=0.6,<0.8" +platformdirs = ">=2.2.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.10.1" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] + +[[package]] +name = "pyparsing" +version = "3.1.1" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "dev" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, + {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pyquil" +version = "3.5.4" +description = "A Python library for creating Quantum Instruction Language (Quil) programs." +category = "dev" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "pyquil-3.5.4-py3-none-any.whl", hash = "sha256:ef36458b38b314f647f0e6cb067358e92033821f90fb7a533baa5ff59bfbaaf1"}, + {file = "pyquil-3.5.4.tar.gz", hash = "sha256:4fe65c83a4cf9164d3c7ddb314029d71b7388fb22fb56a1ba8f4dd3c1bb1d9a6"}, +] + +[package.dependencies] +deprecated = ">=1.2.13,<2.0.0" +lark = ">=0.11.1,<0.12.0" +networkx = ">=2.5" +numpy = ">=1.21,<2.0" +qcs-api-client = ">=0.21.0,<0.22.0" +rpcq = ">=3.10.0,<4.0.0" +scipy = ">=1.6.1,<2.0.0" +tenacity = ">=8.2.2,<9.0.0" +types-deprecated = ">=1.2.9.2,<2.0.0.0" +types-python-dateutil = ">=2.8.19,<3.0.0" +types-retry = ">=0.9.9,<0.10.0" + +[package.extras] +docs = ["Sphinx (>=4.0.2,<5.0.0)", "nbsphinx (>=0.8.6,<0.9.0)", "recommonmark (>=0.7.1,<0.8.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)"] +latex = ["ipython (>=7.21.0,<8.0.0)"] + +[[package]] +name = "pyreadline" +version = "2.1" +description = "A python implmementation of GNU readline." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pyreadline-2.1.zip", hash = "sha256:4530592fc2e85b25b1a9f79664433da09237c1a270e4d78ea5aa3a2c7229e2d1"}, +] + +[[package]] +name = "pyrepl" +version = "0.9.0" +description = "A library for building flexible command line interfaces" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pyrepl-0.9.0.tar.gz", hash = "sha256:292570f34b5502e871bbb966d639474f2b57fbfcd3373c2d6a2f3d56e681a775"}, +] + +[[package]] +name = "pyrsistent" +version = "0.20.0" +description = "Persistent/Functional/Immutable data structures" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyrsistent-0.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce"}, + {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f"}, + {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34"}, + {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b"}, + {file = "pyrsistent-0.20.0-cp310-cp310-win32.whl", hash = "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f"}, + {file = "pyrsistent-0.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7"}, + {file = "pyrsistent-0.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958"}, + {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8"}, + {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a"}, + {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224"}, + {file = "pyrsistent-0.20.0-cp311-cp311-win32.whl", hash = "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656"}, + {file = "pyrsistent-0.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee"}, + {file = "pyrsistent-0.20.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e"}, + {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e"}, + {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3"}, + {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d"}, + {file = "pyrsistent-0.20.0-cp312-cp312-win32.whl", hash = "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174"}, + {file = "pyrsistent-0.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d"}, + {file = "pyrsistent-0.20.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054"}, + {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98"}, + {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714"}, + {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86"}, + {file = "pyrsistent-0.20.0-cp38-cp38-win32.whl", hash = "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423"}, + {file = "pyrsistent-0.20.0-cp38-cp38-win_amd64.whl", hash = "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d"}, + {file = "pyrsistent-0.20.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce"}, + {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0"}, + {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022"}, + {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca"}, + {file = "pyrsistent-0.20.0-cp39-cp39-win32.whl", hash = "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f"}, + {file = "pyrsistent-0.20.0-cp39-cp39-win_amd64.whl", hash = "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf"}, + {file = "pyrsistent-0.20.0-py3-none-any.whl", hash = "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b"}, + {file = "pyrsistent-0.20.0.tar.gz", hash = "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4"}, +] + +[[package]] +name = "pytest" +version = "7.4.3" +description = "pytest: simple powerful testing with Python" +category = "dev" +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"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "4.1.0" +description = "Pytest plugin for measuring coverage." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, + {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, +] + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-rapidjson" +version = "1.13" +description = "Python wrapper around rapidjson" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "python-rapidjson-1.13.tar.gz", hash = "sha256:ffe9d382be84ddcf197c188d2f49baa8b47270cec95a1dcb62496e2af3eb71d4"}, + {file = "python_rapidjson-1.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12b0dad7a605d6482fecae18046d91ec772cef1db5d506256b5f399bf0de9b79"}, + {file = "python_rapidjson-1.13-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87ffa883e20bbb320695b68393b120d916e4bc9125da3ece1f5c32c65f3d2022"}, + {file = "python_rapidjson-1.13-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f6ea7c0d41a5daf1fbc91f749084bf41afcd48d9883a1fa00ec806fc04f2af2"}, + {file = "python_rapidjson-1.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:016c0143832f9679eaef35683c606086cea937a98c264cf830adfd0887cb1f68"}, + {file = "python_rapidjson-1.13-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e065e68dcada7df47c74fa974a5293601c97e8d38c1b4acea1700eb1f7ce1b18"}, + {file = "python_rapidjson-1.13-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7a700730b5109207799025aeade538ab830a7bbefc8612cfe565e660bdae706d"}, + {file = "python_rapidjson-1.13-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ee8bf49beccaa5acd458bc83e45d49892c906830580ecc17a744f15cfe752366"}, + {file = "python_rapidjson-1.13-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a6d910663a1f6c5c1658b176824e46dcf30370c3939a21575c78906e06e06ab3"}, + {file = "python_rapidjson-1.13-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ede37e4640cb9aaeb812963d2098f8bbff9a86b95a5638e9222bb619ba3a68c0"}, + {file = "python_rapidjson-1.13-cp310-cp310-win32.whl", hash = "sha256:2c86448740a4085197e8e3708c68bd21d3dfaa6d1b9821824a59dc22e90c1fc7"}, + {file = "python_rapidjson-1.13-cp310-cp310-win_amd64.whl", hash = "sha256:4873a3e2ee676f26c4cfdd0026f2a09220868e3df79d6981fab87f4bb5689588"}, + {file = "python_rapidjson-1.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ceca087be345f383999faf388298300f9a40a4e9d5cac142c0e1ce3f9ee3249"}, + {file = "python_rapidjson-1.13-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa60bf1bc77e8db0d4edafc92130dc70cb1b06c3ef47abaa83bef43198212b9b"}, + {file = "python_rapidjson-1.13-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dcc302a70a7addcced0901873bce03319b75035ed5bfda144be9b1c8ef4c724e"}, + {file = "python_rapidjson-1.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b951a1bece7ad6224c00634f0e2b52311830b10dead62713d2822979013a0eb"}, + {file = "python_rapidjson-1.13-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:677f7e3173aff366fb673abca99aa9e477b3607d86ecf83b21e8f5b2144db4c9"}, + {file = "python_rapidjson-1.13-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3d9c071acb3c9c6dc4a4a3cd2c776a09d5605e92610ff462df40803c7135f734"}, + {file = "python_rapidjson-1.13-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:438bed3cf5c0aebbbbdf5b545fa641051f3c34f5f3d991adbe0d57cf0dba4735"}, + {file = "python_rapidjson-1.13-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:ccdb9cf48a451bf69a862285f45ee69ce96109400c8823d85d385af13a977168"}, + {file = "python_rapidjson-1.13-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:69d15112ee3ed1ed7e8edc54a2fbbc3c21bca642faf64c0a3951ae8dfdfc53dc"}, + {file = "python_rapidjson-1.13-cp311-cp311-win32.whl", hash = "sha256:10d236ab4c04d98b427282f87a5c600d482ad001653f07d72d94319e043a029e"}, + {file = "python_rapidjson-1.13-cp311-cp311-win_amd64.whl", hash = "sha256:263828991e0335685feb283e8fd576de7520b0c7b61000bdb5d9f55d3b509c51"}, + {file = "python_rapidjson-1.13-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df351d0aa2f2b70a911964233938c1a0907b5df4f92a0ff7fa5724f9b05eadfd"}, + {file = "python_rapidjson-1.13-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c651217b33886b826b1e1d0506e2e7072f03c8e98b3e23edd5fb52d717a3d7cc"}, + {file = "python_rapidjson-1.13-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4557aebbdd93fa54e51cb9a66aca29096253803dfcfad9210378c1230e24d1dc"}, + {file = "python_rapidjson-1.13-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f682fa579de6ef4b0fb8308d3810e54acece8075864f061be380efab1363545"}, + {file = "python_rapidjson-1.13-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09cb57befa52eb6d229540bc268e9db0336428025773a282140b6d6a8c0b0cfc"}, + {file = "python_rapidjson-1.13-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bffb9953ac4adfddbb186f26a23b668697a1a18c9e6242238f911215fc4c19df"}, + {file = "python_rapidjson-1.13-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:c726c8ee15332b4257e11fc2f2f6d8c3b893abbc4529f7d0fe4db245d5d48958"}, + {file = "python_rapidjson-1.13-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:127c1511f5b6e792257a384b1d5adf9f510a0b9d7a9125e136efcf97c7f12d59"}, + {file = "python_rapidjson-1.13-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:674e924dcafb34568f1e9e86487a3a3cd608408b0656f593ead59f71550a8153"}, + {file = "python_rapidjson-1.13-cp312-cp312-win32.whl", hash = "sha256:d626ac73df1214ee69c75eadc407107715f38f895e52645c529d3cd0a98f06b8"}, + {file = "python_rapidjson-1.13-cp312-cp312-win_amd64.whl", hash = "sha256:896e5a748a9a153f03d47197f8e324948fb7815ae911c4da58f9d4b259541a83"}, + {file = "python_rapidjson-1.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fbd3fc5cd5a9c29064c3df8ad24c8f8f8e2b41244fb041c7889ed23b09224898"}, + {file = "python_rapidjson-1.13-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67aa202d5c6d957c8f2d95ee5e381de71215e9e31276763abd07ac0697f1850b"}, + {file = "python_rapidjson-1.13-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bdd559c991bee7c745834ecfd31db7286612cd72bdbe17706b225ad09063341"}, + {file = "python_rapidjson-1.13-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7fd4d54d9ced3a35a263e34daac36ff190d4927f80bd1d5b180e9114e172227"}, + {file = "python_rapidjson-1.13-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fca75f4e671eb83b7342c735a605ca85b0c9a3107bdba8f78e9c620b4f020f0c"}, + {file = "python_rapidjson-1.13-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3677a1534f43302736a87299ada097dd96b5644bfcd9997be5e1b15f535acdd7"}, + {file = "python_rapidjson-1.13-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3fd925c62c8c2a16e185c5e9bc3d3bc43c10c6ac0f8c50f99b6339dfc35d5234"}, + {file = "python_rapidjson-1.13-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:e5f44d35677b9dbb0dec8223cc7a0824c7d1947e2fcc207453ccd2dafc3786a9"}, + {file = "python_rapidjson-1.13-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c1f56d2546c2f2235595b14535e17037bf2a7956542c3eb65032b6282fdd9bf7"}, + {file = "python_rapidjson-1.13-cp38-cp38-win32.whl", hash = "sha256:93eebbbfd1cffffdfac0f02d11757f4a8017465ea88be24f8fbb0f22bf97f21e"}, + {file = "python_rapidjson-1.13-cp38-cp38-win_amd64.whl", hash = "sha256:7884325958745ec047a15eaa2c5b6b95b94bf22812e1d8c991729de39ae59b48"}, + {file = "python_rapidjson-1.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7789994fa71df0da256f5b8afe3949be293840c31d31de89ced058d5bce08ef"}, + {file = "python_rapidjson-1.13-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93db30e414770452119ff4bfa5234aebd36476663ea3542685a388b78a98e0e7"}, + {file = "python_rapidjson-1.13-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29fb34ee79c3e4646845edb7ddf857cdaeb3a30fbcd55b91bf9e79a04b9fde60"}, + {file = "python_rapidjson-1.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ffbe8b4bd475af1571bfc61679685a624740a19441fdd72fb360db2dc96a7a"}, + {file = "python_rapidjson-1.13-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d66f4196b35ce962bfce185d9860bbe23e5a075b48db7b8318650be3aefa307"}, + {file = "python_rapidjson-1.13-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1b9c8b7c0b99ad0bf5b1493883ce4a8a447ac30c0c6d8f26232c0ed6e8ed578f"}, + {file = "python_rapidjson-1.13-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf42f367c7950cc7169cfcd78e54d8ed607207e9d078fe13b1f5ffc992910960"}, + {file = "python_rapidjson-1.13-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:74b7ff43aecac7c83e1f3d2cce363c0b01c68923d6dd6874c5607b1eb2f61504"}, + {file = "python_rapidjson-1.13-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6ad430a03e180619b1f1e3d9e2a129bbfa2e7aed3e49bf2ef4db274286e8379a"}, + {file = "python_rapidjson-1.13-cp39-cp39-win32.whl", hash = "sha256:de295c31400a52f2d8b04f6358093fc574eef53e2a49faf7a334cc4adfc43aea"}, + {file = "python_rapidjson-1.13-cp39-cp39-win_amd64.whl", hash = "sha256:599fcf313db14b762204fbc325c5630516a2a1953e32015e37d06d4cd631800e"}, +] + +[[package]] +name = "pytz" +version = "2023.3.post1" +description = "World timezone definitions, modern and historical" +category = "dev" +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"}, +] + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {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"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {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"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {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"}, +] + +[[package]] +name = "pyzmq" +version = "25.1.2" +description = "Python bindings for 0MQ" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:e624c789359f1a16f83f35e2c705d07663ff2b4d4479bad35621178d8f0f6ea4"}, + {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49151b0efece79f6a79d41a461d78535356136ee70084a1c22532fc6383f4ad0"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9a5f194cf730f2b24d6af1f833c14c10f41023da46a7f736f48b6d35061e76e"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:faf79a302f834d9e8304fafdc11d0d042266667ac45209afa57e5efc998e3872"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f51a7b4ead28d3fca8dda53216314a553b0f7a91ee8fc46a72b402a78c3e43d"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0ddd6d71d4ef17ba5a87becf7ddf01b371eaba553c603477679ae817a8d84d75"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:246747b88917e4867e2367b005fc8eefbb4a54b7db363d6c92f89d69abfff4b6"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:00c48ae2fd81e2a50c3485de1b9d5c7c57cd85dc8ec55683eac16846e57ac979"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5a68d491fc20762b630e5db2191dd07ff89834086740f70e978bb2ef2668be08"}, + {file = "pyzmq-25.1.2-cp310-cp310-win32.whl", hash = "sha256:09dfe949e83087da88c4a76767df04b22304a682d6154de2c572625c62ad6886"}, + {file = "pyzmq-25.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:fa99973d2ed20417744fca0073390ad65ce225b546febb0580358e36aa90dba6"}, + {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:82544e0e2d0c1811482d37eef297020a040c32e0687c1f6fc23a75b75db8062c"}, + {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:01171fc48542348cd1a360a4b6c3e7d8f46cdcf53a8d40f84db6707a6768acc1"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc69c96735ab501419c432110016329bf0dea8898ce16fab97c6d9106dc0b348"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e124e6b1dd3dfbeb695435dff0e383256655bb18082e094a8dd1f6293114642"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7598d2ba821caa37a0f9d54c25164a4fa351ce019d64d0b44b45540950458840"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d1299d7e964c13607efd148ca1f07dcbf27c3ab9e125d1d0ae1d580a1682399d"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4e6f689880d5ad87918430957297c975203a082d9a036cc426648fcbedae769b"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cc69949484171cc961e6ecd4a8911b9ce7a0d1f738fcae717177c231bf77437b"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9880078f683466b7f567b8624bfc16cad65077be046b6e8abb53bed4eeb82dd3"}, + {file = "pyzmq-25.1.2-cp311-cp311-win32.whl", hash = "sha256:4e5837af3e5aaa99a091302df5ee001149baff06ad22b722d34e30df5f0d9097"}, + {file = "pyzmq-25.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:25c2dbb97d38b5ac9fd15586e048ec5eb1e38f3d47fe7d92167b0c77bb3584e9"}, + {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:11e70516688190e9c2db14fcf93c04192b02d457b582a1f6190b154691b4c93a"}, + {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:313c3794d650d1fccaaab2df942af9f2c01d6217c846177cfcbc693c7410839e"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b3cbba2f47062b85fe0ef9de5b987612140a9ba3a9c6d2543c6dec9f7c2ab27"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc31baa0c32a2ca660784d5af3b9487e13b61b3032cb01a115fce6588e1bed30"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c9087b109070c5ab0b383079fa1b5f797f8d43e9a66c07a4b8b8bdecfd88ee"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f8429b17cbb746c3e043cb986328da023657e79d5ed258b711c06a70c2ea7537"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5074adeacede5f810b7ef39607ee59d94e948b4fd954495bdb072f8c54558181"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7ae8f354b895cbd85212da245f1a5ad8159e7840e37d78b476bb4f4c3f32a9fe"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b264bf2cc96b5bc43ce0e852be995e400376bd87ceb363822e2cb1964fcdc737"}, + {file = "pyzmq-25.1.2-cp312-cp312-win32.whl", hash = "sha256:02bbc1a87b76e04fd780b45e7f695471ae6de747769e540da909173d50ff8e2d"}, + {file = "pyzmq-25.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:ced111c2e81506abd1dc142e6cd7b68dd53747b3b7ae5edbea4578c5eeff96b7"}, + {file = "pyzmq-25.1.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7b6d09a8962a91151f0976008eb7b29b433a560fde056ec7a3db9ec8f1075438"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:967668420f36878a3c9ecb5ab33c9d0ff8d054f9c0233d995a6d25b0e95e1b6b"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5edac3f57c7ddaacdb4d40f6ef2f9e299471fc38d112f4bc6d60ab9365445fb0"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0dabfb10ef897f3b7e101cacba1437bd3a5032ee667b7ead32bbcdd1a8422fe7"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2c6441e0398c2baacfe5ba30c937d274cfc2dc5b55e82e3749e333aabffde561"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:16b726c1f6c2e7625706549f9dbe9b06004dfbec30dbed4bf50cbdfc73e5b32a"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:a86c2dd76ef71a773e70551a07318b8e52379f58dafa7ae1e0a4be78efd1ff16"}, + {file = "pyzmq-25.1.2-cp36-cp36m-win32.whl", hash = "sha256:359f7f74b5d3c65dae137f33eb2bcfa7ad9ebefd1cab85c935f063f1dbb245cc"}, + {file = "pyzmq-25.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:55875492f820d0eb3417b51d96fea549cde77893ae3790fd25491c5754ea2f68"}, + {file = "pyzmq-25.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b8c8a419dfb02e91b453615c69568442e897aaf77561ee0064d789705ff37a92"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8807c87fa893527ae8a524c15fc505d9950d5e856f03dae5921b5e9aa3b8783b"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5e319ed7d6b8f5fad9b76daa0a68497bc6f129858ad956331a5835785761e003"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3c53687dde4d9d473c587ae80cc328e5b102b517447456184b485587ebd18b62"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9add2e5b33d2cd765ad96d5eb734a5e795a0755f7fc49aa04f76d7ddda73fd70"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e690145a8c0c273c28d3b89d6fb32c45e0d9605b2293c10e650265bf5c11cfec"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:00a06faa7165634f0cac1abb27e54d7a0b3b44eb9994530b8ec73cf52e15353b"}, + {file = "pyzmq-25.1.2-cp37-cp37m-win32.whl", hash = "sha256:0f97bc2f1f13cb16905a5f3e1fbdf100e712d841482b2237484360f8bc4cb3d7"}, + {file = "pyzmq-25.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6cc0020b74b2e410287e5942e1e10886ff81ac77789eb20bec13f7ae681f0fdd"}, + {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:bef02cfcbded83473bdd86dd8d3729cd82b2e569b75844fb4ea08fee3c26ae41"}, + {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e10a4b5a4b1192d74853cc71a5e9fd022594573926c2a3a4802020360aa719d8"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8c5f80e578427d4695adac6fdf4370c14a2feafdc8cb35549c219b90652536ae"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5dde6751e857910c1339890f3524de74007958557593b9e7e8c5f01cd919f8a7"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea1608dd169da230a0ad602d5b1ebd39807ac96cae1845c3ceed39af08a5c6df"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0f513130c4c361201da9bc69df25a086487250e16b5571ead521b31ff6b02220"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:019744b99da30330798bb37df33549d59d380c78e516e3bab9c9b84f87a9592f"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2e2713ef44be5d52dd8b8e2023d706bf66cb22072e97fc71b168e01d25192755"}, + {file = "pyzmq-25.1.2-cp38-cp38-win32.whl", hash = "sha256:07cd61a20a535524906595e09344505a9bd46f1da7a07e504b315d41cd42eb07"}, + {file = "pyzmq-25.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb7e49a17fb8c77d3119d41a4523e432eb0c6932187c37deb6fbb00cc3028088"}, + {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:94504ff66f278ab4b7e03e4cba7e7e400cb73bfa9d3d71f58d8972a8dc67e7a6"}, + {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6dd0d50bbf9dca1d0bdea219ae6b40f713a3fb477c06ca3714f208fd69e16fd8"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:004ff469d21e86f0ef0369717351073e0e577428e514c47c8480770d5e24a565"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c0b5ca88a8928147b7b1e2dfa09f3b6c256bc1135a1338536cbc9ea13d3b7add"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9a79f1d2495b167119d02be7448bfba57fad2a4207c4f68abc0bab4b92925b"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:518efd91c3d8ac9f9b4f7dd0e2b7b8bf1a4fe82a308009016b07eaa48681af82"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1ec23bd7b3a893ae676d0e54ad47d18064e6c5ae1fadc2f195143fb27373f7f6"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db36c27baed588a5a8346b971477b718fdc66cf5b80cbfbd914b4d6d355e44e2"}, + {file = "pyzmq-25.1.2-cp39-cp39-win32.whl", hash = "sha256:39b1067f13aba39d794a24761e385e2eddc26295826530a8c7b6c6c341584289"}, + {file = "pyzmq-25.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:8e9f3fabc445d0ce320ea2c59a75fe3ea591fdbdeebec5db6de530dd4b09412e"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a8c1d566344aee826b74e472e16edae0a02e2a044f14f7c24e123002dcff1c05"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:759cfd391a0996345ba94b6a5110fca9c557ad4166d86a6e81ea526c376a01e8"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c61e346ac34b74028ede1c6b4bcecf649d69b707b3ff9dc0fab453821b04d1e"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cb8fc1f8d69b411b8ec0b5f1ffbcaf14c1db95b6bccea21d83610987435f1a4"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3c00c9b7d1ca8165c610437ca0c92e7b5607b2f9076f4eb4b095c85d6e680a1d"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:df0c7a16ebb94452d2909b9a7b3337940e9a87a824c4fc1c7c36bb4404cb0cde"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:45999e7f7ed5c390f2e87ece7f6c56bf979fb213550229e711e45ecc7d42ccb8"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ac170e9e048b40c605358667aca3d94e98f604a18c44bdb4c102e67070f3ac9b"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1b604734bec94f05f81b360a272fc824334267426ae9905ff32dc2be433ab96"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:a793ac733e3d895d96f865f1806f160696422554e46d30105807fdc9841b9f7d"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0806175f2ae5ad4b835ecd87f5f85583316b69f17e97786f7443baaf54b9bb98"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ef12e259e7bc317c7597d4f6ef59b97b913e162d83b421dd0db3d6410f17a244"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea253b368eb41116011add00f8d5726762320b1bda892f744c91997b65754d73"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b9b1f2ad6498445a941d9a4fee096d387fee436e45cc660e72e768d3d8ee611"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8b14c75979ce932c53b79976a395cb2a8cd3aaf14aef75e8c2cb55a330b9b49d"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:889370d5174a741a62566c003ee8ddba4b04c3f09a97b8000092b7ca83ec9c49"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18fff090441a40ffda8a7f4f18f03dc56ae73f148f1832e109f9bffa85df15"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99a6b36f95c98839ad98f8c553d8507644c880cf1e0a57fe5e3a3f3969040882"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4345c9a27f4310afbb9c01750e9461ff33d6fb74cd2456b107525bbeebcb5be3"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3516e0b6224cf6e43e341d56da15fd33bdc37fa0c06af4f029f7d7dfceceabbc"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:146b9b1f29ead41255387fb07be56dc29639262c0f7344f570eecdcd8d683314"}, + {file = "pyzmq-25.1.2.tar.gz", hash = "sha256:93f1aa311e8bb912e34f004cf186407a4e90eec4f0ecc0efd26056bf7eda0226"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "qcs-api-client" +version = "0.21.6" +description = "A client library for accessing the Rigetti QCS API" +category = "dev" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "qcs_api_client-0.21.6-py3-none-any.whl", hash = "sha256:0231c9a741c137adc78539068b7fe1d4e1854bee4e3e868017abc4eb3876c3a0"}, + {file = "qcs_api_client-0.21.6.tar.gz", hash = "sha256:1da391ff03715c9d50e14aa6006b5f0c3cffde9018fb968ff27545cc90c87a9c"}, +] + +[package.dependencies] +attrs = ">=21.3.0,<22.0.0" +httpx = ">=0.23.0,<0.24.0" +iso8601 = ">=1.0.2,<2.0.0" +pydantic = ">=1.7.2,<2.0.0" +PyJWT = ">=2.4.0,<3.0.0" +python-dateutil = ">=2.8.1,<3.0.0" +retrying = ">=1.3.3,<2.0.0" +rfc3339 = ">=6.2,<7.0" +toml = ">=0.10.2,<0.11.0" + +[[package]] +name = "qdldl" +version = "0.1.7.post0" +description = "QDLDL, a free LDL factorization routine." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "qdldl-0.1.7.post0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8ab02e8b9ff86bd644a1935718387c82fbe04c31e3309cf9f7a121d02b1deda8"}, + {file = "qdldl-0.1.7.post0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e5d6753310377451ed4dc09b1ef28faf40108b713e7f55c8a8ae94d679a672"}, + {file = "qdldl-0.1.7.post0-cp310-cp310-win_amd64.whl", hash = "sha256:718d8e141832e96ba71ca1807a74813836c6403110faaa3d33a67de1af3b29c4"}, + {file = "qdldl-0.1.7.post0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0e3f06e8a49ddd834b24fc3d7afbba4fec0923101045aa2666e18d2a9980e329"}, + {file = "qdldl-0.1.7.post0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a81c46522dd6b3042e2348fa98128bb5c0e466f42bce214e80cfb766ff40930"}, + {file = "qdldl-0.1.7.post0-cp311-cp311-win_amd64.whl", hash = "sha256:4a86155f3de66c5db0e21544b7a2421c671028fa20da407686d2a8d0e9b57e51"}, + {file = "qdldl-0.1.7.post0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:717cb1892b033c01a0aae84ededcfa1f05bcb97013095d779c497e6c32f90dac"}, + {file = "qdldl-0.1.7.post0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fc35432913085d94b2327242cf51388467ef7a37ac0d71eb31b594b575dd498"}, + {file = "qdldl-0.1.7.post0-cp36-cp36m-win_amd64.whl", hash = "sha256:fd5cfd8c50f33ddacb830594a63b8c1093a24aea45312b9d2ed826cea5ece08a"}, + {file = "qdldl-0.1.7.post0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:981ca8672e9506976c663552c1eb6f6daf9726d62650b3bf5900260946156166"}, + {file = "qdldl-0.1.7.post0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8ec670d97cf756f9159dc0a11de5cf054e88aefe84bea1c7282f00334642843"}, + {file = "qdldl-0.1.7.post0-cp37-cp37m-win_amd64.whl", hash = "sha256:aa208703b44337a7e77f6f2663f7a452144becb4421970d534ff8297b92e1e10"}, + {file = "qdldl-0.1.7.post0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b42649484f7c0d8ee659224ecaac0a3e97f12531018207f4d7323e4071320eb1"}, + {file = "qdldl-0.1.7.post0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26aa3d6f0da7779265d72e8f418094003e75fa53c515a53bc03fd8b9bcfbf7de"}, + {file = "qdldl-0.1.7.post0-cp38-cp38-win_amd64.whl", hash = "sha256:e55bcd6962178029faf543addd49db145302dd51e19855fefa71b5fd55840eea"}, + {file = "qdldl-0.1.7.post0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c1dd0e570e65aaf35e10b7fb345f7ac763fd05a2227b9c06ce65e07993fc4984"}, + {file = "qdldl-0.1.7.post0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae161342529852b6248ace4642bc4ee371a7c1e0707b7bc43a43ef7e73c06ca3"}, + {file = "qdldl-0.1.7.post0-cp39-cp39-win_amd64.whl", hash = "sha256:092f6606690a2b9bd3c939f3147887e02de13bb068fbed5ffdc7459034def623"}, + {file = "qdldl-0.1.7.post0.tar.gz", hash = "sha256:f346a114c8342ee6d4dbd6471eef314199fb268d3bf7b95885ca351fde2b023f"}, +] + +[package.dependencies] +numpy = ">=1.7" +scipy = ">=0.13.2" + +[[package]] +name = "qibojit" +version = "0.1.3" +description = "Simulation tools based on numba and cupy." +category = "dev" +optional = false +python-versions = ">=3.9.0,<3.12" +files = [] +develop = false + +[package.dependencies] +numba = ">=0.51.0" +psutil = "^5.9.5" +qibo = ">=0.2.3" +scipy = "^1.10.1" + +[package.source] +type = "git" +url = "https://github.com/qiboteam/qibojit.git" +reference = "HEAD" +resolved_reference = "c621acf3c8b8ffaaa67f76114b5ab9a086aea6d8" + +[[package]] +name = "recommonmark" +version = "0.7.1" +description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "recommonmark-0.7.1-py2.py3-none-any.whl", hash = "sha256:1b1db69af0231efce3fa21b94ff627ea33dee7079a01dd0a7f8482c3da148b3f"}, + {file = "recommonmark-0.7.1.tar.gz", hash = "sha256:bdb4db649f2222dcd8d2d844f0006b958d627f732415d399791ee436a3686d67"}, +] + +[package.dependencies] +commonmark = ">=0.8.1" +docutils = ">=0.11" +sphinx = ">=1.3.1" + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-oauthlib" +version = "1.3.1" +description = "OAuthlib authentication support for Requests." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, + {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, +] + +[package.dependencies] +oauthlib = ">=3.0.0" +requests = ">=2.0.0" + +[package.extras] +rsa = ["oauthlib[signedtoken] (>=3.0.0)"] + +[[package]] +name = "retrying" +version = "1.3.4" +description = "Retrying" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "retrying-1.3.4-py3-none-any.whl", hash = "sha256:8cc4d43cb8e1125e0ff3344e9de678fefd85db3b750b81b2240dc0183af37b35"}, + {file = "retrying-1.3.4.tar.gz", hash = "sha256:345da8c5765bd982b1d1915deb9102fd3d1f7ad16bd84a9700b85f64d24e8f3e"}, +] + +[package.dependencies] +six = ">=1.7.0" + +[[package]] +name = "rfc3339" +version = "6.2" +description = "Format dates according to the RFC 3339." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "rfc3339-6.2-py3-none-any.whl", hash = "sha256:f44316b21b21db90a625cde04ebb0d46268f153e6093021fa5893e92a96f58a3"}, + {file = "rfc3339-6.2.tar.gz", hash = "sha256:d53c3b5eefaef892b7240ba2a91fef012e86faa4d0a0ca782359c490e00ad4d0"}, +] + +[[package]] +name = "rfc3986" +version = "1.5.0" +description = "Validating URI References per RFC 3986" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, + {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, +] + +[package.dependencies] +idna = {version = "*", optional = true, markers = "extra == \"idna2008\""} + +[package.extras] +idna2008 = ["idna"] + +[[package]] +name = "rpcq" +version = "3.11.0" +description = "The RPC framework and message specification for Rigetti QCS." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "rpcq-3.11.0.tar.gz", hash = "sha256:4361e759782f58dd0b8aa3a6d901e3ea5709f91c6a060bd444081fbb007b05a9"}, +] + +[package.dependencies] +msgpack = ">=0.6,<2.0" +python-rapidjson = "*" +pyzmq = ">=17" +"ruamel.yaml" = "*" + +[[package]] +name = "rsa" +version = "4.9" +description = "Pure-Python RSA implementation" +category = "dev" +optional = false +python-versions = ">=3.6,<4" +files = [ + {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, + {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, +] + +[package.dependencies] +pyasn1 = ">=0.1.3" + +[[package]] +name = "ruamel-yaml" +version = "0.18.5" +description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" +category = "dev" +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"}, +] + +[package.dependencies] +"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} + +[package.extras] +docs = ["mercurial (>5.7)", "ryd"] +jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] + +[[package]] +name = "ruamel-yaml-clib" +version = "0.2.8" +description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-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-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-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"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b"}, + {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win32.whl", hash = "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win32.whl", hash = "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win32.whl", hash = "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15"}, + {file = "ruamel.yaml.clib-0.2.8.tar.gz", hash = "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512"}, +] + +[[package]] +name = "scikit-learn" +version = "1.3.2" +description = "A set of python modules for machine learning and data mining" +category = "dev" +optional = false +python-versions = ">=3.8" +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"}, +] + +[package.dependencies] +joblib = ">=1.1.1" +numpy = ">=1.17.3,<2.0" +scipy = ">=1.5.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)"] + +[[package]] +name = "scipy" +version = "1.11.4" +description = "Fundamental algorithms for scientific computing in Python" +category = "main" +optional = false +python-versions = ">=3.9" +files = [ + {file = "scipy-1.11.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc9a714581f561af0848e6b69947fda0614915f072dfd14142ed1bfe1b806710"}, + {file = "scipy-1.11.4-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:cf00bd2b1b0211888d4dc75656c0412213a8b25e80d73898083f402b50f47e41"}, + {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9999c008ccf00e8fbcce1236f85ade5c569d13144f77a1946bef8863e8f6eb4"}, + {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:933baf588daa8dc9a92c20a0be32f56d43faf3d1a60ab11b3f08c356430f6e56"}, + {file = "scipy-1.11.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8fce70f39076a5aa62e92e69a7f62349f9574d8405c0a5de6ed3ef72de07f446"}, + {file = "scipy-1.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:6550466fbeec7453d7465e74d4f4b19f905642c89a7525571ee91dd7adabb5a3"}, + {file = "scipy-1.11.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f313b39a7e94f296025e3cffc2c567618174c0b1dde173960cf23808f9fae4be"}, + {file = "scipy-1.11.4-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1b7c3dca977f30a739e0409fb001056484661cb2541a01aba0bb0029f7b68db8"}, + {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00150c5eae7b610c32589dda259eacc7c4f1665aedf25d921907f4d08a951b1c"}, + {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530f9ad26440e85766509dbf78edcfe13ffd0ab7fec2560ee5c36ff74d6269ff"}, + {file = "scipy-1.11.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5e347b14fe01003d3b78e196e84bd3f48ffe4c8a7b8a1afbcb8f5505cb710993"}, + {file = "scipy-1.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:acf8ed278cc03f5aff035e69cb511741e0418681d25fbbb86ca65429c4f4d9cd"}, + {file = "scipy-1.11.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:028eccd22e654b3ea01ee63705681ee79933652b2d8f873e7949898dda6d11b6"}, + {file = "scipy-1.11.4-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c6ff6ef9cc27f9b3db93a6f8b38f97387e6e0591600369a297a50a8e96e835d"}, + {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b030c6674b9230d37c5c60ab456e2cf12f6784596d15ce8da9365e70896effc4"}, + {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad669df80528aeca5f557712102538f4f37e503f0c5b9541655016dd0932ca79"}, + {file = "scipy-1.11.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce7fff2e23ab2cc81ff452a9444c215c28e6305f396b2ba88343a567feec9660"}, + {file = "scipy-1.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:36750b7733d960d7994888f0d148d31ea3017ac15eef664194b4ef68d36a4a97"}, + {file = "scipy-1.11.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e619aba2df228a9b34718efb023966da781e89dd3d21637b27f2e54db0410d7"}, + {file = "scipy-1.11.4-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:f3cd9e7b3c2c1ec26364856f9fbe78695fe631150f94cd1c22228456404cf1ec"}, + {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d10e45a6c50211fe256da61a11c34927c68f277e03138777bdebedd933712fea"}, + {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91af76a68eeae0064887a48e25c4e616fa519fa0d38602eda7e0f97d65d57937"}, + {file = "scipy-1.11.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6df1468153a31cf55ed5ed39647279beb9cfb5d3f84369453b49e4b8502394fd"}, + {file = "scipy-1.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:ee410e6de8f88fd5cf6eadd73c135020bfbbbdfcd0f6162c36a7638a1ea8cc65"}, + {file = "scipy-1.11.4.tar.gz", hash = "sha256:90a2b78e7f5733b9de748f589f09225013685f9b218275257f8a8168ededaeaa"}, +] + +[package.dependencies] +numpy = ">=1.21.6,<1.28.0" + +[package.extras] +dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "scs" +version = "3.2.4.post1" +description = "Splitting conic solver" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "scs-3.2.4.post1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51fed30d2a4a1e6fbfc1e52b4cb3adeecbe89d7c47f3539b49afbb852415fe19"}, + {file = "scs-3.2.4.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb0524c0b9c3ed0d65dae161475accf3efa8e170938eb93251a60e9709b156ee"}, + {file = "scs-3.2.4.post1-cp310-cp310-win_amd64.whl", hash = "sha256:534519819eea96f18902a9fce15c4ec562b99d23b38dc843a48cb137b5641613"}, + {file = "scs-3.2.4.post1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d04ee4d19ac6d0f5053663bc48fcd5c5faed534272f13b10a4e173c814eea69"}, + {file = "scs-3.2.4.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c23b4299ab77ff5f654573d5667dc982292a8ef2b979053b38c40663919f13"}, + {file = "scs-3.2.4.post1-cp311-cp311-win_amd64.whl", hash = "sha256:ae4624938d3e3a8b7e508029275c6ad7a978fd48c158d0818f69f4ae764bf945"}, + {file = "scs-3.2.4.post1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:40294e22bfe509bdf7fd65a6b77c38cec22dcb3567ff5a75f3c41a1faf2ef1d5"}, + {file = "scs-3.2.4.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a2337acb0604770b6df1473254065a51c210ff9c82fc7c4490595510287a337"}, + {file = "scs-3.2.4.post1-cp312-cp312-win_amd64.whl", hash = "sha256:8689e75a57e59846e65d1c4b9d57e9964b00fcbb8e67fc77f98cf6e0a0530abd"}, + {file = "scs-3.2.4.post1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ad991b00d0a87c85db57bf2f1863c21bdc4e2f13837f6c35e809f5936bc6f165"}, + {file = "scs-3.2.4.post1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a28af160a44268e726a59d6cf340629b82940c1a643c4c87fe777e9cbe550d75"}, + {file = "scs-3.2.4.post1-cp37-cp37m-win_amd64.whl", hash = "sha256:f6283f725f3fee63d4631c2532d01a5b2ea65883b04d3da3be06084b1c60171b"}, + {file = "scs-3.2.4.post1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b3a622cf2120ae765f0f3ad5c6f4f86796d317e29132bab2ad4af3c14d9bf4d"}, + {file = "scs-3.2.4.post1-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:4b5259137c263304effa2b28d0125437ac23569e6e7753c115ae1206ec5033fd"}, + {file = "scs-3.2.4.post1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424710bc19b0506feee7e05e6d2b7af98acf09af5bd5353126164cbd46ac923f"}, + {file = "scs-3.2.4.post1-cp38-cp38-win_amd64.whl", hash = "sha256:e21bdc8046648846e2c204a6c5cf24eaaedd2b8f5e0a2ab41a647b0247b8d592"}, + {file = "scs-3.2.4.post1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cea0f7e9473f43f7edf1641d020ead7e39653a81c540fbdba8f3b7b8480038c9"}, + {file = "scs-3.2.4.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6126f1d7ed5ff368cb8c1836715b17a50074314579eefc6d511995a3ab93d70"}, + {file = "scs-3.2.4.post1-cp39-cp39-win_amd64.whl", hash = "sha256:18788befa5284bb1f49149bac7f813703de60ef5b6bf7698a9f1c3a5a49b78e4"}, + {file = "scs-3.2.4.post1.tar.gz", hash = "sha256:7015d7a56d1d5b53264fd277289ea169949309e26101677ff88cd0e5030d032f"}, +] + +[package.dependencies] +numpy = "*" +scipy = "*" + +[[package]] +name = "setuptools" +version = "69.0.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "dev" +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"}, +] + +[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-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, + {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, +] + +[[package]] +name = "soupsieve" +version = "2.5" +description = "A modern CSS selector implementation for Beautiful Soup." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] + +[[package]] +name = "sphinx" +version = "6.2.1" +description = "Python documentation generator" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Sphinx-6.2.1.tar.gz", hash = "sha256:6d56a34697bb749ffa0152feafc4b19836c755d90a7c59b72bc7dfd371b9cc6b"}, + {file = "sphinx-6.2.1-py3-none-any.whl", hash = "sha256:97787ff1fa3256a3eef9eda523a63dbf299f7b47e053cfcf684a1c2a8380c912"}, +] + +[package.dependencies] +alabaster = ">=0.7,<0.8" +babel = ">=2.9" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.18.1,<0.20" +imagesize = ">=1.3" +importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} +Jinja2 = ">=3.0" +packaging = ">=21.0" +Pygments = ">=2.13" +requests = ">=2.25.0" +snowballstemmer = ">=2.0" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = ">=2.0.0" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = ">=1.1.5" + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-simplify", "isort", "mypy (>=0.990)", "ruff", "sphinx-lint", "types-requests"] +test = ["cython", "filelock", "html5lib", "pytest (>=4.6)"] + +[[package]] +name = "sphinx-basic-ng" +version = "1.0.0b2" +description = "A modern skeleton for Sphinx themes." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b"}, + {file = "sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9"}, +] + +[package.dependencies] +sphinx = ">=4.0" + +[package.extras] +docs = ["furo", "ipython", "myst-parser", "sphinx-copybutton", "sphinx-inline-tabs"] + +[[package]] +name = "sphinx-copybutton" +version = "0.5.2" +description = "Add a copy button to each of your code cells." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd"}, + {file = "sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e"}, +] + +[package.dependencies] +sphinx = ">=1.8" + +[package.extras] +code-style = ["pre-commit (==2.12.1)"] +rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"] + +[[package]] +name = "sphinx-markdown-tables" +version = "0.0.17" +description = "A Sphinx extension for rendering tables written in markdown" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "sphinx-markdown-tables-0.0.17.tar.gz", hash = "sha256:6bc6d3d400eaccfeebd288446bc08dd83083367c58b85d40fe6c12d77ef592f1"}, + {file = "sphinx_markdown_tables-0.0.17-py3-none-any.whl", hash = "sha256:2bd0c30779653e4dd120300cbd9ca412c480738cc2241f6dea477a883f299e04"}, +] + +[package.dependencies] +markdown = ">=3.4" + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.7" +description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" +category = "dev" +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"}, +] + +[package.dependencies] +Sphinx = ">=5" + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-bibtex" +version = "2.5.0" +description = "Sphinx extension for BibTeX style citations." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "sphinxcontrib-bibtex-2.5.0.tar.gz", hash = "sha256:71b42e5db0e2e284f243875326bf9936aa9a763282277d75048826fef5b00eaa"}, + {file = "sphinxcontrib_bibtex-2.5.0-py3-none-any.whl", hash = "sha256:748f726eaca6efff7731012103417ef130ecdcc09501b4d0c54283bf5f059f76"}, +] + +[package.dependencies] +docutils = ">=0.8" +importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} +pybtex = ">=0.24" +pybtex-docutils = ">=1.0.0" +Sphinx = ">=2.1" + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.5" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" +category = "dev" +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"}, +] + +[package.dependencies] +Sphinx = ">=5" + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.4" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +category = "dev" +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"}, +] + +[package.dependencies] +Sphinx = ">=5" + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["html5lib", "pytest"] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] + +[package.extras] +test = ["flake8", "mypy", "pytest"] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.6" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" +category = "dev" +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"}, +] + +[package.dependencies] +Sphinx = ">=5" + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.9" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" +category = "dev" +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"}, +] + +[package.dependencies] +Sphinx = ">=5" + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "sympy" +version = "1.12" +description = "Computer algebra system (CAS) in Python" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, + {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"}, +] + +[package.dependencies] +mpmath = ">=0.19" + +[[package]] +name = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] + +[package.extras] +widechars = ["wcwidth"] + +[[package]] +name = "tenacity" +version = "8.2.3" +description = "Retry code until it succeeds" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, + {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, +] + +[package.extras] +doc = ["reno", "sphinx", "tornado (>=4.5)"] + +[[package]] +name = "tensorboard" +version = "2.14.1" +description = "TensorBoard lets you watch Tensors Flow" +category = "dev" +optional = false +python-versions = ">=3.9" +files = [ + {file = "tensorboard-2.14.1-py3-none-any.whl", hash = "sha256:3db108fb58f023b6439880e177743c5f1e703e9eeb5fb7d597871f949f85fd58"}, +] + +[package.dependencies] +absl-py = ">=0.4" +google-auth = ">=1.6.3,<3" +google-auth-oauthlib = ">=0.5,<1.1" +grpcio = ">=1.48.2" +markdown = ">=2.6.8" +numpy = ">=1.12.0" +protobuf = ">=3.19.6" +requests = ">=2.21.0,<3" +setuptools = ">=41.0.0" +six = ">1.9" +tensorboard-data-server = ">=0.7.0,<0.8.0" +werkzeug = ">=1.0.1" + +[[package]] +name = "tensorboard-data-server" +version = "0.7.2" +description = "Fast data loading for TensorBoard" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tensorboard_data_server-0.7.2-py3-none-any.whl", hash = "sha256:7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb"}, + {file = "tensorboard_data_server-0.7.2-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60"}, + {file = "tensorboard_data_server-0.7.2-py3-none-manylinux_2_31_x86_64.whl", hash = "sha256:ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530"}, +] + +[[package]] +name = "tensorflow" +version = "2.14.1" +description = "TensorFlow is an open source machine learning framework for everyone." +category = "dev" +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"}, +] + +[package.dependencies] +absl-py = ">=1.0.0" +astunparse = ">=1.6.0" +flatbuffers = ">=23.5.26" +gast = ">=0.2.1,<0.5.0 || >0.5.0,<0.5.1 || >0.5.1,<0.5.2 || >0.5.2" +google-pasta = ">=0.1.1" +grpcio = ">=1.24.3,<2.0" +h5py = ">=2.9.0" +keras = ">=2.14.0,<2.15" +libclang = ">=13.0.0" +ml-dtypes = "0.2.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" +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)"] + +[[package]] +name = "tensorflow-estimator" +version = "2.14.0" +description = "TensorFlow Estimator." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tensorflow_estimator-2.14.0-py2.py3-none-any.whl", hash = "sha256:820bf57c24aa631abb1bbe4371739ed77edb11361d61381fd8e790115ac0fd57"}, +] + +[[package]] +name = "tensorflow-io-gcs-filesystem" +version = "0.34.0" +description = "TensorFlow IO" +category = "dev" +optional = false +python-versions = ">=3.7, <3.12" +files = [ + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:d831702fbb270996b27cda7fde06e0825b2ea81fd8dd3ead35242f4f8b3889b8"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:b9a93fcb01db269bc845a1ced431f3c61201755ce5f9ec4885760f30122276ef"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5813c336b4f7cb0a01ff4cc6cbd3edf11ef67305baf0e3cf634911b702f493f8"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b035f4c92639657b6d376929d550ac3dee9e6c0523eb434eefe0a27bae3d05b"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:a17a616d2c7fae83de4424404815843507d40d4eb0d507c636a5493a20c3d958"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:ec4604c99cbb5b708f4516dee27aa655abae222b876c98b740f4c2f89dd5c001"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp311-cp311-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cbe26c4a3332589c7b724f147df453b5c226993aa8d346a15536358d77b364c4"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e6353123a5b51397950138a118876af833a7db66b531123bb86f82e80ab0e72"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f211d2b3db8f9931765992b607b71cbfb98c8cd6169079d004a67a94ab10ecb4"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:d3feba2dd76f7c188137c34642d68d378f0eed81636cb95090ecb1496722707c"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:44ad387a812a78e7424bb8bee3820521ae1c044bddf72b1e163e8df95c124a74"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:7f60183473f0ca966451bb1d1bb5dc29b3cf9c74d1d0e7f2ed46760ed56bd4af"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:3f346b287ed2400e09b13cfd8524222fd70a66aadb9164c645286c2087007e9f"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:027a07553367187f918a99661f63ae0506b91b77a70bee9c7ccaf3920bf7cfe7"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d8664bddbe4e7b56ce94db8b93ea9077a158fb5e15364e11e29f93015ceea24"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:182b0fbde7e9a537fda0b354c28b0b6c035736728de8fe2db7ef49cf90352014"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:0dafed144673e1173528768fe208a7c5a6e8edae40208381cac420ee7c918ec9"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:396bfff61b49f80b86ddebe0c76ae0f2731689cee49ad7d782625180b50b13af"}, + {file = "tensorflow_io_gcs_filesystem-0.34.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b20622f8572fcb6c93e8f7d626327472f263e47ebd63d2153ef09162ef5ef7b5"}, +] + +[package.extras] +tensorflow = ["tensorflow (>=2.13.0,<2.14.0)"] +tensorflow-aarch64 = ["tensorflow-aarch64 (>=2.13.0,<2.14.0)"] +tensorflow-cpu = ["tensorflow-cpu (>=2.13.0,<2.14.0)"] +tensorflow-gpu = ["tensorflow-gpu (>=2.13.0,<2.14.0)"] +tensorflow-rocm = ["tensorflow-rocm (>=2.13.0,<2.14.0)"] + +[[package]] +name = "termcolor" +version = "2.4.0" +description = "ANSI color formatting for output in terminal" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, + {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, +] + +[package.extras] +tests = ["pytest", "pytest-cov"] + +[[package]] +name = "threadpoolctl" +version = "3.2.0" +description = "threadpoolctl" +category = "dev" +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"}, +] + +[[package]] +name = "tinycss2" +version = "1.2.1" +description = "A tiny CSS parser" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tinycss2-1.2.1-py3-none-any.whl", hash = "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847"}, + {file = "tinycss2-1.2.1.tar.gz", hash = "sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627"}, +] + +[package.dependencies] +webencodings = ">=0.4" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["flake8", "isort", "pytest"] + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "tomlkit" +version = "0.12.3" +description = "Style preserving TOML library" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.12.3-py3-none-any.whl", hash = "sha256:b0a645a9156dc7cb5d3a1f0d4bab66db287fcb8e0430bdd4664a095ea16414ba"}, + {file = "tomlkit-0.12.3.tar.gz", hash = "sha256:75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4"}, +] + +[[package]] +name = "tornado" +version = "6.4" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +category = "dev" +optional = false +python-versions = ">= 3.8" +files = [ + {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, + {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, + {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, + {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, + {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, +] + +[[package]] +name = "tqdm" +version = "4.66.1" +description = "Fast, Extensible Progress Meter" +category = "main" +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"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "traitlets" +version = "5.14.0" +description = "Traitlets Python configuration system" +category = "dev" +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"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "types-deprecated" +version = "1.2.9.3" +description = "Typing stubs for Deprecated" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "types-Deprecated-1.2.9.3.tar.gz", hash = "sha256:ef87327adf3e3c4a4c7d8e06e58f6476710d3466ecfb53c49efb080804a70ef3"}, + {file = "types_Deprecated-1.2.9.3-py3-none-any.whl", hash = "sha256:24da9210763e5e1b3d0d4f6f8bba9ad3bb6af3fe7f6815fc37e3ede4681704f5"}, +] + +[[package]] +name = "types-python-dateutil" +version = "2.8.19.14" +description = "Typing stubs for python-dateutil" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "types-python-dateutil-2.8.19.14.tar.gz", hash = "sha256:1f4f10ac98bb8b16ade9dbee3518d9ace017821d94b057a425b069f834737f4b"}, + {file = "types_python_dateutil-2.8.19.14-py3-none-any.whl", hash = "sha256:f977b8de27787639986b4e28963263fd0e5158942b3ecef91b9335c130cb1ce9"}, +] + +[[package]] +name = "types-retry" +version = "0.9.9.4" +description = "Typing stubs for retry" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "types-retry-0.9.9.4.tar.gz", hash = "sha256:e4731dc684b56b875d9746459ad665d3bc281a56b530acdf1c97730167799941"}, + {file = "types_retry-0.9.9.4-py3-none-any.whl", hash = "sha256:f29760a9fe8b1fefe253e5fe6be7e4c0eba243932c600e0eccffb42a21d17765"}, +] + +[[package]] +name = "typing-extensions" +version = "4.8.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, +] + +[[package]] +name = "tzdata" +version = "2023.3" +description = "Provider of IANA time zone data" +category = "dev" +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"}, +] + +[[package]] +name = "urllib3" +version = "2.1.0" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "dev" +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"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "wcwidth" +version = "0.2.12" +description = "Measures the displayed width of unicode strings in a terminal" +category = "dev" +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"}, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "werkzeug" +version = "3.0.1" +description = "The comprehensive WSGI web application library." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "werkzeug-3.0.1-py3-none-any.whl", hash = "sha256:90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10"}, + {file = "werkzeug-3.0.1.tar.gz", hash = "sha256:507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc"}, +] + +[package.dependencies] +MarkupSafe = ">=2.1.1" + +[package.extras] +watchdog = ["watchdog (>=2.3)"] + +[[package]] +name = "wheel" +version = "0.42.0" +description = "A built-package format for Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "wheel-0.42.0-py3-none-any.whl", hash = "sha256:177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d"}, + {file = "wheel-0.42.0.tar.gz", hash = "sha256:c45be39f7882c9d34243236f2d63cbd58039e360f85d0913425fbd7ceea617a8"}, +] + +[package.extras] +test = ["pytest (>=6.0.0)", "setuptools (>=65)"] + +[[package]] +name = "widgetsnbextension" +version = "4.0.9" +description = "Jupyter interactive widgets for Jupyter Notebook" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "widgetsnbextension-4.0.9-py3-none-any.whl", hash = "sha256:91452ca8445beb805792f206e560c1769284267a30ceb1cec9f5bcc887d15175"}, + {file = "widgetsnbextension-4.0.9.tar.gz", hash = "sha256:3c1f5e46dc1166dfd40a42d685e6a51396fd34ff878742a3e47c6f0cc4a2a385"}, +] + +[[package]] +name = "wmctrl" +version = "0.5" +description = "A tool to programmatically control windows inside X" +category = "dev" +optional = false +python-versions = ">=2.7" +files = [ + {file = "wmctrl-0.5-py2.py3-none-any.whl", hash = "sha256:ae695c1863a314c899e7cf113f07c0da02a394b968c4772e1936219d9234ddd7"}, + {file = "wmctrl-0.5.tar.gz", hash = "sha256:7839a36b6fe9e2d6fd22304e5dc372dbced2116ba41283ea938b2da57f53e962"}, +] + +[package.dependencies] +attrs = "*" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "wrapt" +version = "1.14.1" +description = "Module for decorators, wrappers and monkey patching." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, + {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, + {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, + {file = "wrapt-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecee4132c6cd2ce5308e21672015ddfed1ff975ad0ac8d27168ea82e71413f55"}, + {file = "wrapt-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2020f391008ef874c6d9e208b24f28e31bcb85ccff4f335f15a3251d222b92d9"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2feecf86e1f7a86517cab34ae6c2f081fd2d0dac860cb0c0ded96d799d20b335"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:240b1686f38ae665d1b15475966fe0472f78e71b1b4903c143a842659c8e4cb9"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9008dad07d71f68487c91e96579c8567c98ca4c3881b9b113bc7b33e9fd78b8"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6447e9f3ba72f8e2b985a1da758767698efa72723d5b59accefd716e9e8272bf"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:acae32e13a4153809db37405f5eba5bac5fbe2e2ba61ab227926a22901051c0a"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49ef582b7a1152ae2766557f0550a9fcbf7bbd76f43fbdc94dd3bf07cc7168be"}, + {file = "wrapt-1.14.1-cp311-cp311-win32.whl", hash = "sha256:358fe87cc899c6bb0ddc185bf3dbfa4ba646f05b1b0b9b5a27c2cb92c2cea204"}, + {file = "wrapt-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:26046cd03936ae745a502abf44dac702a5e6880b2b01c29aea8ddf3353b68224"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, + {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, + {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, + {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, + {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, + {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, + {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, + {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, + {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, + {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, + {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, + {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, + {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, + {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, +] + +[[package]] +name = "zipp" +version = "3.17.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.9,<3.12" +content-hash = "ae8846337057c6c4fd800d53f1b7ef13a815b38af22bccfb2a47b4c5db667ce4" From 9ce8313e56a61361863e9742bf828a8377cbe265 Mon Sep 17 00:00:00 2001 From: Alessandro Candido Date: Tue, 5 Dec 2023 17:03:27 +0400 Subject: [PATCH 137/143] Remove multiprocessing as well The .nthreads attribute is then set to 0, to avoid the default coming from the abstract (currently 1), since TensorFlow will use multiple threads by default --- src/qibo/backends/tensorflow.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/qibo/backends/tensorflow.py b/src/qibo/backends/tensorflow.py index c11e7c9126..cc2a9a9bb0 100644 --- a/src/qibo/backends/tensorflow.py +++ b/src/qibo/backends/tensorflow.py @@ -1,5 +1,4 @@ import collections -import multiprocessing import os import numpy as np @@ -196,7 +195,7 @@ def __init__(self): elif cpu_devices: self.device = cpu_devices[0].name - self.nthreads = multiprocessing.cpu_count() + self.nthreads = 0 self.tensor_types = (np.ndarray, tf.Tensor, tf.Variable) From aaccdef79de9048bf04a31aeed675355aad05a49 Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Thu, 7 Dec 2023 11:23:00 +0000 Subject: [PATCH 138/143] Update src/qibo/quantum_info/metrics.py Co-authored-by: BrunoLiegiBastonLiegi <45011234+BrunoLiegiBastonLiegi@users.noreply.github.com> --- src/qibo/quantum_info/metrics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibo/quantum_info/metrics.py b/src/qibo/quantum_info/metrics.py index 3afb872b27..14b118eacf 100644 --- a/src/qibo/quantum_info/metrics.py +++ b/src/qibo/quantum_info/metrics.py @@ -1186,7 +1186,7 @@ def frame_potential( `arXiv:2205.09900 [quant-ph] `_. """ - if isinstance(power_t, int) is False: + if not isinstance(power_t, int): raise_error( TypeError, f"power_t must be type int, but it is type {type(power_t)}." ) From 85ae492832d53bdf9dd43fcf6199c5552430471a Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Thu, 7 Dec 2023 11:23:06 +0000 Subject: [PATCH 139/143] Update src/qibo/quantum_info/metrics.py Co-authored-by: BrunoLiegiBastonLiegi <45011234+BrunoLiegiBastonLiegi@users.noreply.github.com> --- src/qibo/quantum_info/metrics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibo/quantum_info/metrics.py b/src/qibo/quantum_info/metrics.py index 14b118eacf..b9f45bf53f 100644 --- a/src/qibo/quantum_info/metrics.py +++ b/src/qibo/quantum_info/metrics.py @@ -1191,7 +1191,7 @@ def frame_potential( TypeError, f"power_t must be type int, but it is type {type(power_t)}." ) - if isinstance(samples, int) is False: + if not isinstance(samples, int): raise_error( TypeError, f"samples must be type int, but it is type {type(samples)}." ) From 292e63aec4fdf174d259f0fa0d28069beab24579 Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Fri, 8 Dec 2023 13:19:04 +0400 Subject: [PATCH 140/143] ignore `tmp.npy` created by a test --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 56fb6c78d2..1027fc4ff3 100644 --- a/.gitignore +++ b/.gitignore @@ -134,6 +134,7 @@ dmypy.json # tmp files tmp/ +tmp.npy # Mac .DS_Store From 6909e26744691b79e1582623ce920a68c273e93e Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Fri, 8 Dec 2023 13:24:29 +0400 Subject: [PATCH 141/143] fix `numpy==True` method in `QuantumState` --- src/qibo/result.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/qibo/result.py b/src/qibo/result.py index 007fb2ea36..39babb81f3 100644 --- a/src/qibo/result.py +++ b/src/qibo/result.py @@ -68,7 +68,7 @@ def state(self, numpy: bool = False): """State's tensor representation as a backend tensor. Args: - numpy (bool, optional): If ``True`` the returned tensor will be a numpy array, + numpy (bool, optional): If ``True`` the returned tensor will be a ``numpy`` array, otherwise it will follow the backend tensor type. Defaults to ``False``. @@ -76,7 +76,8 @@ def state(self, numpy: bool = False): The state in the computational basis. """ if numpy: - return np.array(self._state) + return np.array(self._state.tolist()) + return self._state def probabilities(self, qubits: Optional[Union[list, set]] = None): From b724a4f85b63b1b603cb15def73df7118b81ef93 Mon Sep 17 00:00:00 2001 From: Renato Mello Date: Sat, 9 Dec 2023 04:57:25 +0000 Subject: [PATCH 142/143] Update src/qibo/quantum_info/metrics.py Co-authored-by: Matteo Robbiati <62071516+MatteoRobbiati@users.noreply.github.com> --- src/qibo/quantum_info/metrics.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/qibo/quantum_info/metrics.py b/src/qibo/quantum_info/metrics.py index b9f45bf53f..dd162462d3 100644 --- a/src/qibo/quantum_info/metrics.py +++ b/src/qibo/quantum_info/metrics.py @@ -1157,16 +1157,16 @@ def frame_potential( For :math:`n` qubits and moment :math:`t`, the frame potential :math:`\\mathcal{F}_{\\mathcal{U}}^{(t)}` if given by [1] - ..math:: + .. math:: \\mathcal{F}_{\\mathcal{U}}^{(t)} = \\int_{U,V \\in \\mathcal{U}} \\, - dU \\, dV \\, \\abs{\\tr(U^{\\dagger} \\, V)}^{2t} \\, , + \\text{d}U \\, \\text{d}V \\, \\text{abs}\\bigl[\\text{tr}(U^{\\dagger} \\, V)\\bigr]^{2t} \\, , where :math:`\\mathcal{U}` is the group of unitaries defined by the parametrized circuit. The frame potential is approximated by the average - ..math:: + .. math:: \\mathcal{F}_{\\mathcal{U}}^{(t)} \\approx \\frac{1}{N} \\, - \\sum_{k=1}^{N} \\, \\abs{\\tr(U_{k}^{\\dagger} \\, V_{k})}^{2t} \\, , + \\sum_{k=1}^{N} \\, \\text{abs}\\bigl[ \\text{tr}(U_{k}^{\\dagger} \\, V_{k})\\bigr]^{2t} \\, , where :math:`N` is the number of ``samples``. From 665d427c2e8d3a9e71d330cef13d106ef1fcd831 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 21:10:05 +0000 Subject: [PATCH 143/143] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pycqa/isort: 5.12.0 → 5.13.1](https://github.com/pycqa/isort/compare/5.12.0...5.13.1) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2d641a95aa..38f39908e3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -13,7 +13,7 @@ repos: hooks: - id: black - repo: https://github.com/pycqa/isort - rev: 5.12.0 + rev: 5.13.1 hooks: - id: isort args: ["--profile", "black"]