From 55dfa98c732892f8d4a7579ecb71a830f4ad809e Mon Sep 17 00:00:00 2001 From: Andrija Paurevic <46359773+andrijapau@users.noreply.github.com> Date: Tue, 28 Jan 2025 16:59:31 -0500 Subject: [PATCH 01/11] Fix deprecated code usage in `tutorial_odegen.py` (#1311) Providing `gradient_kwargs` as additional `kwargs` to `QNode` is deprecated as of: https://github.com/PennyLaneAI/pennylane/pull/6828. [sc-81531] --- demonstrations/tutorial_odegen.metadata.json | 2 +- demonstrations/tutorial_odegen.py | 45 +++++++++++--------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/demonstrations/tutorial_odegen.metadata.json b/demonstrations/tutorial_odegen.metadata.json index ab2eb2a794..df0ad04903 100644 --- a/demonstrations/tutorial_odegen.metadata.json +++ b/demonstrations/tutorial_odegen.metadata.json @@ -6,7 +6,7 @@ } ], "dateOfPublication": "2023-12-12T00:00:00+00:00", - "dateOfLastModification": "2024-10-07T00:00:00+00:00", + "dateOfLastModification": "2025-01-28T00:00:00+00:00", "categories": [ "Optimization", "Quantum Computing", diff --git a/demonstrations/tutorial_odegen.py b/demonstrations/tutorial_odegen.py index 257bb3884c..8894ff68d8 100644 --- a/demonstrations/tutorial_odegen.py +++ b/demonstrations/tutorial_odegen.py @@ -45,10 +45,10 @@ that can be executed on hardware. -SPS & ODEgen ------------- +SPS and ODEgen gradient rules +----------------------------- -Let us start by deriving both the SPS rule and ODEgen. +Let us start by deriving both the SPS and ODEgen rules. We are interested in cost functions of the form @@ -163,6 +163,7 @@ Let us define it in PennyLane and also import some libraries that we are going to need for this demo. """ + import pennylane as qml import numpy as np import jax.numpy as jnp @@ -181,21 +182,21 @@ ############################################################################## # We are going to consider a system of transmon qubits described by the Hamiltonian -# +# # .. math:: H(\theta, t) = - \sum_i \frac{\omega_i}{2} Z_i + \sum_i \Omega_i(t) \sin(\nu_i t + \phi_i(t)) Y_i + \sum_{q, p \in \mathcal{C}} \frac{g_{qp}}{2} (X_i X_p + Y_i Y_p). -# -# The first term describes the single qubits with frequencies :math:`\omega_i.` -# The second term describes the driving with drive amplitudes :math:`\Omega_i,` drive frequencies :math:`\nu_i` and phases :math:`\phi_i.` -# You can check out our :doc:`recent demo on driving qubits on OQC's Lucy ` if +# +# The first term describes the single qubits with frequencies :math:`\omega_i.` +# The second term describes the driving with drive amplitudes :math:`\Omega_i,` drive frequencies :math:`\nu_i` and phases :math:`\phi_i.` +# You can check out our :doc:`recent demo on driving qubits on OQC's Lucy ` if # you want to learn more about the details of controlling transmon qubits. -# The third term describes the coupling between neighboring qubits. We only have two qubits and a simple topology of +# The third term describes the coupling between neighboring qubits. We only have two qubits and a simple topology of # :math:`\mathcal{C} = \{(0, 1)\},` hence only one coupling constant :math:`g_{01}.` -# The coupling is necessary to generate entanglement, which is achieved with cross-resonant driving in fixed-coupling +# The coupling is necessary to generate entanglement, which is achieved with cross-resonant driving in fixed-coupling # transmon systems, as is the case here. -# -# We will use realistic parameters for the transmons, taken from the `coaxmon design paper `_ [#Patterson]_ +# +# We will use realistic parameters for the transmons, taken from the `coaxmon design paper `_ [#Patterson]_ # (this is the blue-print for the transmon qubits in OQC's Lucy that you can :doc:`access on a pulse level in PennyLane `). -# In order to prepare the singlet ground state, we will perform a cross-resonance pulse, i.e. driving one qubit at its coupled neighbor's +# In order to prepare the singlet ground state, we will perform a cross-resonance pulse, i.e. driving one qubit at its coupled neighbor's # frequency for entanglement generation (see [#Patterson]_ or [#Krantz]_) while simultaneously driving the other qubit on resonance. # We choose a gate time of :math:`100 \text{ ns}.` We will use a piecewise constant function :func:`~pennylane.pulse.pwc` to parametrize both # the amplitude :math:`\Omega_i(t)` and the phase :math:`\phi_i(t)` in time, with ``t_bins = 10`` time bins to allow for enough flexibility in the evolution. @@ -221,7 +222,7 @@ def wrapped(p, t): H_pulse += drive_field(T_CR, qubit_freq[0]) * qml.PauliY(wires[1]) # off-resonance driving of qubit 1 ############################################################################## -# We can now define the cost function that computes the expectation value of +# We can now define the cost function that computes the expectation value of # the Heisenberg Hamiltonian after evolving the state with the parametrized pulse Hamiltonian. # We then define the two separate qnodes with ODEgen and SPS as their differentiation methods, respectively. @@ -235,7 +236,14 @@ def qnode0(params): value_and_grad_jax = jax.jit(jax.value_and_grad(qnode_jax)) num_split_times = 8 -qnode_sps = qml.QNode(qnode0, dev, interface="jax", diff_method=qml.gradients.stoch_pulse_grad, use_broadcasting=True, num_split_times=num_split_times) +gradient_kwargs = {"use_broadcasting": True, "num_split_times": num_split_times} +qnode_sps = qml.QNode( + qnode0, + dev, + interface="jax", + diff_method=qml.gradients.stoch_pulse_grad, + gradient_kwargs=gradient_kwargs, +) value_and_grad_sps = jax.value_and_grad(qnode_sps) qnode_odegen = qml.QNode(qnode0, dev, interface="jax", diff_method=qml.gradients.pulse_odegen) @@ -304,12 +312,12 @@ def partial_step(grad_circuit, opt_state, theta): ############################################################################## -# We see that with analytic gradients (ODEgen), we can reach the ground state energy within 100 epochs, whereas with SPS gradients we cannot find the path +# We see that with analytic gradients (ODEgen), we can reach the ground state energy within 100 epochs, whereas with SPS gradients we cannot find the path # towards the minimum due to the stochasticity of the gradient estimates. Note that both optimizations start from the same (random) initial point. # This picture solidifies when repeating this procedure for multiple runs from different random initializations, as was demonstrated in [#Kottmann]_. # # We also want to make sure that this is a fair comparison in terms of quantum resources. In the case of ODEgen, we maximally have :math:`\mathcal{R}_\text{ODEgen} = 2 (4^n - 1) = 30` expectation values. -# For SPS we have :math:`2 N_g N_s = 32` (due to :math:`N_g = 2` and :math:`N_s=8` time samples per gradient that we chose in ``num_split_times`` above). Thus, overall, we require fewer +# For SPS we have :math:`2 N_g N_s = 32` (due to :math:`N_g = 2` and :math:`N_s=8` time samples per gradient that we chose in ``num_split_times`` above). Thus, overall, we require fewer # quantum resources for ODEgen gradients while achieving better performance. # # Conclusion @@ -323,9 +331,8 @@ def partial_step(grad_circuit, opt_state, theta): # Running VQE using ODEgen on hardware has recently been demonstrated in [#Kottmann]_ and you can directly find `the code here `_. - ############################################################################## -# +# # References # ---------- # From 68c6f08636cb7ca143b669a49dd08e985f62873b Mon Sep 17 00:00:00 2001 From: "Yushao Chen (Jerry)" Date: Mon, 3 Feb 2025 16:58:37 -0500 Subject: [PATCH 02/11] Fix controlled qubit unitary usage (#1310) **Title:** Adjust interface of `ControlledQubitUnitary` to be compatible with PennyLane v0.41 **Summary:** changed 5 occurences in demonstrations/tutorial_classically_boosted_vqe.py and demonstrations/tutorial_testing_symmetry.py **Related Shortcut Stories:** [sc-80842] --------- Co-authored-by: Alex Preciado --- .../tutorial_classically_boosted_vqe.metadata.json | 2 +- demonstrations/tutorial_classically_boosted_vqe.py | 2 +- demonstrations/tutorial_testing_symmetry.metadata.json | 2 +- demonstrations/tutorial_testing_symmetry.py | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/demonstrations/tutorial_classically_boosted_vqe.metadata.json b/demonstrations/tutorial_classically_boosted_vqe.metadata.json index 797d86cf63..df8e6990f6 100644 --- a/demonstrations/tutorial_classically_boosted_vqe.metadata.json +++ b/demonstrations/tutorial_classically_boosted_vqe.metadata.json @@ -9,7 +9,7 @@ } ], "dateOfPublication": "2022-10-31T00:00:00+00:00", - "dateOfLastModification": "2024-12-13T00:00:00+00:00", + "dateOfLastModification": "2025-01-23T00:00:00+00:00", "categories": [ "Quantum Chemistry" ], diff --git a/demonstrations/tutorial_classically_boosted_vqe.py b/demonstrations/tutorial_classically_boosted_vqe.py index dd65f9a332..986ec0a7b2 100644 --- a/demonstrations/tutorial_classically_boosted_vqe.py +++ b/demonstrations/tutorial_classically_boosted_vqe.py @@ -449,7 +449,7 @@ def hadamard_test(Uq, Ucl, component="real"): qml.Hadamard(wires=[0]) qml.ControlledQubitUnitary( - Uq.conjugate().T @ Ucl, control_wires=[0], wires=wires[1:] + Uq.conjugate().T @ Ucl, wires=wires ) qml.Hadamard(wires=[0]) diff --git a/demonstrations/tutorial_testing_symmetry.metadata.json b/demonstrations/tutorial_testing_symmetry.metadata.json index 2a7ca1c3df..b42d1b3179 100644 --- a/demonstrations/tutorial_testing_symmetry.metadata.json +++ b/demonstrations/tutorial_testing_symmetry.metadata.json @@ -6,7 +6,7 @@ } ], "dateOfPublication": "2023-01-24T00:00:00+00:00", - "dateOfLastModification": "2024-11-06T00:00:00+00:00", + "dateOfLastModification": "2025-01-23T00:00:00+00:00", "categories": [ "Algorithms", "Quantum Computing" diff --git a/demonstrations/tutorial_testing_symmetry.py b/demonstrations/tutorial_testing_symmetry.py index 61e0776885..802ac04055 100644 --- a/demonstrations/tutorial_testing_symmetry.py +++ b/demonstrations/tutorial_testing_symmetry.py @@ -308,14 +308,14 @@ def prep_plus(): # Implement controlled symmetry operations on system def CU_sys(): - qml.ControlledQubitUnitary(c_mat @ c_mat, control_wires=[aux[0]], wires=system) - qml.ControlledQubitUnitary(c_mat, control_wires=[aux[1]], wires=system) + qml.ControlledQubitUnitary(c_mat @ c_mat, wires=[aux[0]] + list(system)) + qml.ControlledQubitUnitary(c_mat, wires=[aux[1]] + list(system)) # Implement controlled symmetry operations on copy def CU_cpy(): - qml.ControlledQubitUnitary(c_mat @ c_mat, control_wires=[aux[0]], wires=copy) - qml.ControlledQubitUnitary(c_mat, control_wires=[aux[1]], wires=copy) + qml.ControlledQubitUnitary(c_mat @ c_mat, wires=[aux[0]] + list(copy)) + qml.ControlledQubitUnitary(c_mat, wires=[aux[1]] + list(copy)) ###################################################################### # Let’s combine everything and actually run our circuit! From 691322da4c1364c56e5aed7dd75f4c98563dda0e Mon Sep 17 00:00:00 2001 From: Andrija Paurevic <46359773+andrijapau@users.noreply.github.com> Date: Fri, 14 Feb 2025 13:47:53 -0500 Subject: [PATCH 03/11] Fix `tutorial_pulse_programming101.py` to type cast `expval` (#1317) **Context:** In https://github.com/PennyLaneAI/pennylane/pull/6939, a fix was made to `qml.expval` so that it no longer silently converts the result to a real number. However, in `tutorial_pulse_programming101.py` we use a Hamiltonian with complex-typed coefficients. This resulted in an imaginary expectation value (`X+0j`) and broke the `jax.value_and_grad` function. **Description of change:** Wrap the `qnode` function to get the expectation value and convert it to a real number. This allows `jax.value_and_grad` to be used and fixes the demo. --- .../tutorial_pulse_programming101.metadata.json | 2 +- demonstrations/tutorial_pulse_programming101.py | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/demonstrations/tutorial_pulse_programming101.metadata.json b/demonstrations/tutorial_pulse_programming101.metadata.json index 7801031d1f..9c5a8f71c3 100644 --- a/demonstrations/tutorial_pulse_programming101.metadata.json +++ b/demonstrations/tutorial_pulse_programming101.metadata.json @@ -6,7 +6,7 @@ } ], "dateOfPublication": "2023-03-08T00:00:00+00:00", - "dateOfLastModification": "2024-10-07T00:00:00+00:00", + "dateOfLastModification": "2025-02-14T00:00:00+00:00", "categories": [ "Quantum Hardware", "Quantum Computing" diff --git a/demonstrations/tutorial_pulse_programming101.py b/demonstrations/tutorial_pulse_programming101.py index b1b4ce33ea..aa050030a1 100644 --- a/demonstrations/tutorial_pulse_programming101.py +++ b/demonstrations/tutorial_pulse_programming101.py @@ -322,15 +322,21 @@ def wrapped(p, t): ############################################################################## # Now we define the ``qnode`` that computes the expectation value of the molecular Hamiltonian. +# We need to wrap the ``qnode`` in a function so that we can convert the expectation value to a real number. +# This will enable use to make use of gradient descent methods that require real-valued loss functions. dev = qml.device("default.qubit", wires=range(n_wires)) -@qml.qnode(dev, interface="jax") def qnode(theta, t=duration): - qml.BasisState(jnp.array(data.tapered_hf_state), wires=H_obj.wires) - qml.evolve(H_pulse)(params=(*theta, *theta), t=t) - return qml.expval(H_obj) + @qml.qnode(dev) + def _qnode_inner(theta, t=duration): + qml.BasisState(jnp.array(data.tapered_hf_state), wires=H_obj.wires) + qml.evolve(H_pulse)(params=(*theta, *theta), t=t) + return qml.expval(H_obj) + + expectation_value = _qnode_inner(theta, t) # Execute the qnode + return jnp.real(expectation_value) # Typecast to real number value_and_grad = jax.jit(jax.value_and_grad(qnode)) From cc8002226d760850c8765c571ea5c38fa6d0597b Mon Sep 17 00:00:00 2001 From: "Yushao Chen (Jerry)" Date: Wed, 12 Mar 2025 09:35:37 -0400 Subject: [PATCH 04/11] Update `tutorial_noisy_circuits.py` to port `default.mixed` free of legacy interfaces (#1284) **Title:** Update `tutorial_noisy_circuits.py` to port `default.mixed` free of legacy interfaces **Summary:** In the Tutorial of Noisy Circuits, there's a call `dev.state` which is a legacy-only interface. In our current standard, the device object will not store the state any more and we should return the latest state via the corresponding measure. **Relevant references:** **Possible Drawbacks:** **Related GitHub Issues:** ---- --------- Co-authored-by: Andrija Paurevic <46359773+andrijapau@users.noreply.github.com> Co-authored-by: Isaac De Vlugt --- demonstrations/tutorial_noisy_circuits.metadata.json | 2 +- demonstrations/tutorial_noisy_circuits.py | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/demonstrations/tutorial_noisy_circuits.metadata.json b/demonstrations/tutorial_noisy_circuits.metadata.json index 92522adae3..0ba26ef0b7 100644 --- a/demonstrations/tutorial_noisy_circuits.metadata.json +++ b/demonstrations/tutorial_noisy_circuits.metadata.json @@ -6,7 +6,7 @@ } ], "dateOfPublication": "2021-02-22T00:00:00+00:00", - "dateOfLastModification": "2024-10-07T00:00:00+00:00", + "dateOfLastModification": "2024-12-18T00:00:00+00:00", "categories": [ "Getting Started" ], diff --git a/demonstrations/tutorial_noisy_circuits.py b/demonstrations/tutorial_noisy_circuits.py index 1491215009..af1a7f4d7e 100644 --- a/demonstrations/tutorial_noisy_circuits.py +++ b/demonstrations/tutorial_noisy_circuits.py @@ -144,12 +144,13 @@ def bitflip_circuit(p): qml.CNOT(wires=[0, 1]) qml.BitFlip(p, wires=0) qml.BitFlip(p, wires=1) - return qml.expval(qml.PauliZ(0) @ qml.PauliZ(1)) + return qml.expval(qml.PauliZ(0) @ qml.PauliZ(1)), qml.state() ps = [0.001, 0.01, 0.1, 0.2] for p in ps: - print(f"QNode output for bit flip probability {p} is {bitflip_circuit(p):.4f}") + result = bitflip_circuit(p) + print(f"QNode output for bit flip probability {p} is {result[0]:.4f}") ###################################################################### @@ -158,7 +159,7 @@ def bitflip_circuit(p): # mitigation and error correction are so important. We can use PennyLane to look under the hood and # see the output state of the circuit for the largest noise parameter -print(f"Output state for bit flip probability {p} is \n{np.real(dev.state)}") +print(f"Output state for bit flip probability {p} is \n{result[1]}") ###################################################################### # Besides the bit flip channel, PennyLane supports several other noisy channels that are commonly From 97e27db59ba1c5371521bf3d7a3dd8c2e13e1dee Mon Sep 17 00:00:00 2001 From: "Yushao Chen (Jerry)" Date: Thu, 13 Mar 2025 15:56:18 -0400 Subject: [PATCH 05/11] Upgrade scipy (#1323) **Title:** `scipy` used in qml has been very old. Upgrade `scipy` version to 1.12 **Summary:** `scipy`: 1.11.4 -> 1.12.0 `mitiq`: 0.32 -> 0.43 `qutip`: 4.7.3 -> 5.1.0 **Relevant references:** **Possible Drawbacks:** **Related GitHub Issues:** [sc-86308] --- poetry.lock | 749 +++++++------------------------------------------ pyproject.toml | 5 +- 2 files changed, 109 insertions(+), 645 deletions(-) diff --git a/poetry.lock b/poetry.lock index d497c996b5..eff89c4dac 100644 --- a/poetry.lock +++ b/poetry.lock @@ -661,138 +661,46 @@ numpy = ">=1.24.1" toolz = ">=0.9.0" typing_extensions = ">=4.2.0" -[[package]] -name = "cirq" -version = "1.0.0" -description = "A framework for creating, editing, and invoking Noisy Intermediate Scale Quantum (NISQ) circuits." -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "cirq-1.0.0-py3-none-any.whl", hash = "sha256:8d61feba1c8d2a37d82a53e2500fb2430ad8e0ca7c3e2562fbd554bea0d9d7f7"}, -] - -[package.dependencies] -cirq-aqt = "1.0.0" -cirq-core = "1.0.0" -cirq-google = "1.0.0" -cirq-ionq = "1.0.0" -cirq-pasqal = "1.0.0" -cirq-rigetti = "1.0.0" -cirq-web = "1.0.0" - -[package.extras] -dev-env = ["asv", "black (==22.3.0)", "codeowners", "coverage (<=6.2)", "dill (==0.3.4)", "filelock (>=3.0.12,<3.1.0)", "flynt (>=0.60,<1.0)", "freezegun (>=0.3.15,<0.4.0)", "grpcio-tools (>=1.37.0,<1.38.0)", "importlib-metadata", "ipykernel (==5.3.4)", "ipython", "ipython (==7.31.1)", "mypy (==0.961.0)", "mypy-protobuf (==1.10)", "notebook (>=6.4.1,<=6.4.7)", "papermill (>=2.3.2,<2.4.0)", "pylint (>=2.13.0,<2.14.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-xdist (>=2.2.0,<2.3.0)", "qiskit-aer (>=0.10.4,<0.11.0)", "rstcheck (>=3.3.1,<3.4.0)", "seaborn (>=0.11.1,<0.12.0)", "setuptools", "twine", "types-backports (==0.1.3)", "types-protobuf (==3.19.22)", "types-requests (==2.28.1)", "types-setuptools (==62.6.1)", "virtualenv", "virtualenv-clone", "wheel"] - -[[package]] -name = "cirq-aqt" -version = "1.0.0" -description = "A Cirq package to simulate and connect to Alpine Quantum Technologies quantum computers" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "cirq_aqt-1.0.0-py3-none-any.whl", hash = "sha256:db7af0b40ceded8a5951f74f36e2235a873df519078e069a6e4d00fda4acd82d"}, -] - -[package.dependencies] -cirq-core = "1.0.0" -requests = ">=2.18,<3.0" - [[package]] name = "cirq-core" -version = "1.0.0" +version = "1.4.1" description = "A framework for creating, editing, and invoking Noisy Intermediate Scale Quantum (NISQ) circuits." optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.10.0" files = [ - {file = "cirq_core-1.0.0-py3-none-any.whl", hash = "sha256:a1df552e99ab339121c40c7bf4d18ba542bba151dd8b5ac8c4c33b7b9d46ba10"}, + {file = "cirq_core-1.4.1-py3-none-any.whl", hash = "sha256:869db60413265c41a8206854c1d4ca9bad5fac9cfd7c6a10685b5a6d516defa0"}, ] [package.dependencies] -duet = ">=0.2.7,<0.3.0" +attrs = ">=21.3.0" +duet = ">=0.2.8" matplotlib = ">=3.0,<4.0" -networkx = ">=2.4,<3.0" -numpy = ">=1.16,<2.0" +networkx = ">=2.4" +numpy = ">=1.22,<2.0" pandas = "*" -scipy = "*" +scipy = ">=1.0,<2.0" sortedcontainers = ">=2.0,<3.0" sympy = "*" tqdm = "*" -typing-extensions = "*" +typing-extensions = ">=4.2" [package.extras] -contrib = ["autoray", "numba (>=0.53.0)", "opt-einsum", "ply (>=3.4)", "pylatex (>=1.3.0,<1.4.0)", "quimb"] - -[[package]] -name = "cirq-google" -version = "1.0.0" -description = "The Cirq module that provides tools and access to the Google Quantum Computing Service" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "cirq_google-1.0.0-py3-none-any.whl", hash = "sha256:8fd1df0fd97d1ee076c01a2b2ab86aac966692890fb2793a45ef2393a6ccc4ab"}, -] - -[package.dependencies] -cirq-core = "1.0.0" -google-api-core = {version = ">=1.14.0,<2.0.0dev", extras = ["grpc"]} -proto-plus = ">=1.20.0" -protobuf = ">=3.15.0,<4" - -[[package]] -name = "cirq-ionq" -version = "1.0.0" -description = "A Cirq package to simulate and connect to IonQ quantum computers" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "cirq_ionq-1.0.0-py3-none-any.whl", hash = "sha256:31ff254a5b514736f79a92a186d473b3e40550c94ad36aeebddea1cb840fb065"}, -] - -[package.dependencies] -cirq-core = "1.0.0" -requests = ">=2.18,<3.0" +contrib = ["opt-einsum", "ply (>=3.6)", "pylatex (>=1.4,<2.0)", "quimb (>=1.7,<2.0)"] [[package]] name = "cirq-pasqal" -version = "1.0.0" +version = "1.4.1" description = "A Cirq package to simulate and connect to Pasqal quantum computers" optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.10.0" files = [ - {file = "cirq_pasqal-1.0.0-py3-none-any.whl", hash = "sha256:1243aae6514aadb6a5e2f729da3d99904d20631e7d2a7fbaef69c7377a9158b5"}, + {file = "cirq_pasqal-1.4.1-py3-none-any.whl", hash = "sha256:eb0cdad9f33159e436f38bf761bbacaebebb70c0a3a3bd0e7dfb08d079869489"}, ] [package.dependencies] -cirq-core = "1.0.0" +cirq-core = "1.4.1" requests = ">=2.18,<3.0" -[[package]] -name = "cirq-rigetti" -version = "1.0.0" -description = "A Cirq package to simulate and connect to Rigetti quantum computers and Quil QVM" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "cirq_rigetti-1.0.0-py3-none-any.whl", hash = "sha256:a0ff2ac5dea2b175ced45ade23bd2bfc2f1d8d280b6a003b1dcdddfdd579c0bd"}, -] - -[package.dependencies] -cirq-core = "1.0.0" -pyquil = ">=3.0.0" - -[[package]] -name = "cirq-web" -version = "1.0.0" -description = "Web-based 3D visualization tools for Cirq." -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "cirq_web-1.0.0-py3-none-any.whl", hash = "sha256:e3ebc6043b5a6a2a4ba57a71ea9ea5bc487732527b4512961e4c4ce90b2f5744"}, -] - -[package.dependencies] -cirq-core = "1.0.0" - [[package]] name = "clarabel" version = "0.10.0" @@ -1297,23 +1205,6 @@ files = [ {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, ] -[[package]] -name = "deprecated" -version = "1.2.18" -description = "Python @deprecated decorator to deprecate old python classes, functions or methods." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -files = [ - {file = "Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec"}, - {file = "deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d"}, -] - -[package.dependencies] -wrapt = ">=1.10,<2" - -[package.extras] -dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "setuptools", "tox"] - [[package]] name = "deprecation" version = "2.1.0" @@ -2447,30 +2338,6 @@ files = [ {file = "gast-0.6.0.tar.gz", hash = "sha256:88fc5300d32c7ac6ca7b515310862f71e6fdf2c029bbec7c66c0f5dd47b6b1fb"}, ] -[[package]] -name = "google-api-core" -version = "1.34.1" -description = "Google API client core library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-api-core-1.34.1.tar.gz", hash = "sha256:3399c92887a97d33038baa4bfd3bf07acc05d474b0171f333e1f641c1364e552"}, - {file = "google_api_core-1.34.1-py3-none-any.whl", hash = "sha256:52bcc9d9937735f8a3986fa0bbf9135ae9cf5393a722387e5eced520e39c774a"}, -] - -[package.dependencies] -google-auth = ">=1.25.0,<3.0dev" -googleapis-common-protos = ">=1.56.2,<2.0dev" -grpcio = {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""} -grpcio-status = {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""} -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.0.0dev" -requests = ">=2.18.0,<3.0.0dev" - -[package.extras] -grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio-status (>=1.33.2,<2.0dev)"] -grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0dev)"] -grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0dev)"] - [[package]] name = "google-auth" version = "2.38.0" @@ -2528,23 +2395,6 @@ files = [ [package.dependencies] six = "*" -[[package]] -name = "googleapis-common-protos" -version = "1.68.0" -description = "Common protobufs used in Google APIs" -optional = false -python-versions = ">=3.7" -files = [ - {file = "googleapis_common_protos-1.68.0-py2.py3-none-any.whl", hash = "sha256:aaf179b2f81df26dfadac95def3b16a95064c76a5f45f07e4c68a21bb371c4ac"}, - {file = "googleapis_common_protos-1.68.0.tar.gz", hash = "sha256:95d38161f4f9af0d9423eed8fb7b64ffd2568c3464eb542ff02c5bfa1953ab3c"}, -] - -[package.dependencies] -protobuf = ">=3.20.2,<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,<6.0.0.dev0" - -[package.extras] -grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] - [[package]] name = "greenlet" version = "3.1.1" @@ -2698,22 +2548,6 @@ files = [ [package.extras] protobuf = ["grpcio-tools (>=1.70.0)"] -[[package]] -name = "grpcio-status" -version = "1.48.2" -description = "Status proto mapping for gRPC" -optional = false -python-versions = ">=3.6" -files = [ - {file = "grpcio-status-1.48.2.tar.gz", hash = "sha256:53695f45da07437b7c344ee4ef60d370fd2850179f5a28bb26d8e2aa1102ec11"}, - {file = "grpcio_status-1.48.2-py3-none-any.whl", hash = "sha256:2c33bbdbe20188b2953f46f31af669263b6ee2a9b2d38fa0d36ee091532e21bf"}, -] - -[package.dependencies] -googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.48.2" -protobuf = ">=3.12.0" - [[package]] name = "h11" version = "0.14.0" @@ -3394,21 +3228,6 @@ files = [ {file = "kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e"}, ] -[[package]] -name = "lark" -version = "0.11.3" -description = "a modern parsing library" -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 = "libclang" version = "18.1.1" @@ -3861,23 +3680,29 @@ scipy = ">=1.7.3" [[package]] name = "mitiq" -version = "0.32.0" +version = "0.43.0" description = "Mitiq is an open source toolkit for implementing error mitigation techniques on most current intermediate-scale quantum computers." optional = false -python-versions = ">=3.9,<3.12" +python-versions = "<3.13,>=3.10" files = [ - {file = "mitiq-0.32.0-py3-none-any.whl", hash = "sha256:8f61880383931aae93bc108591543a967185a54dbc89ed1faf5dd30a7b8f59ca"}, - {file = "mitiq-0.32.0.tar.gz", hash = "sha256:b44a9257055d4ef5d17ccfb211f1a4fcb3722139b5e48d795e13501470d1d7ef"}, + {file = "mitiq-0.43.0-py3-none-any.whl", hash = "sha256:3af95694a173bd1a1e3558769dc4d2aa7552b0e12967c1f83f2a6b3d90191442"}, + {file = "mitiq-0.43.0.tar.gz", hash = "sha256:e2db3a68dafcbd06c616d8a1ed9f9a7e70e2a1b0b99cd826e124790fdd6bf575"}, ] [package.dependencies] -cirq = ">=1.0.0,<1.4.0" +cirq-core = ">=1.4.0,<1.5.0" numpy = ">=1.22.0" -scipy = ">=1.5.0,<=1.11.4" +scipy = ">=1.10.1,<=1.14.1" tabulate = "*" [package.extras] -development = ["Sphinx (==5.2.3)", "amazon-braket-sdk (>=1.64.1,<1.65.0)", "black (==22.10)", "bqskit[ext] (==1.0.4)", "flake8 (==6.0.0)", "isort (==5.13.2)", "jupytext (==1.14.1)", "matplotlib (==3.8.1)", "mypy (==1.0.0)", "myst-nb (==1.0.0)", "nbsphinx (==0.9.1)", "openfermion (==1.6.0)", "openfermionpyscf (==0.5)", "pandas (==2.1.3)", "pennylane (>=0.33.1,<0.34.0)", "pennylane-qiskit (>=0.33.1,<0.34.0)", "pydata-sphinx-theme (==0.11.0)", "pyquil (>=3.5.4,<3.6.0)", "pyscf (==2.4.0)", "pytest (==7.1.3)", "pytest-cov (==4.0.0)", "pytest-xdist[psutil] (==3.0.2)", "qiskit (>=0.45.1,<0.46.0)", "qiskit-aer (>=0.13.1,<0.14.0)", "qiskit-ibm-provider (>=0.7.3,<0.8.0)", "seaborn (==0.13.0)", "sphinx-autodoc-typehints (==1.19.4)", "sphinx-copybutton (==0.5.0)", "sphinx-gallery (==0.10.1)", "sphinxcontrib-bibtex (==2.5.0)", "stim (==1.12.1)", "stimcirq (==1.12.1)", "types-tabulate"] +braket = ["amazon-braket-sdk (>=1.69.0,<1.70.0)", "cirq-ionq (>=1.4.0,<1.5.0)"] +cirq = ["cirq-core (>=1.4.0,<1.5.0)"] +development = ["Sphinx (==8.0.2)", "amazon-braket-sdk (>=1.69.0,<1.70.0)", "bqskit (==1.1.1)", "cirq-core (>=1.4.0,<1.5.0)", "cirq-ionq (>=1.4.0,<1.5.0)", "cirq-rigetti (>=1.4.0,<1.5.0)", "jupytext (==1.16.1)", "matplotlib (==3.8.1)", "mypy (==1.0.0)", "myst-nb (==1.1.1)", "myst-parser (==4.0.0)", "nbsphinx (==0.9.3)", "openfermion (==1.6.1)", "openfermionpyscf (==0.5)", "pandas (==2.1.3)", "pennylane (>=0.36.0,<0.37.0)", "pennylane-qiskit (>=0.36.0,<0.37.0)", "ply (==3.11)", "pydata-sphinx-theme (==0.15.4)", "pyqrack (==1.32.27)", "pyquil (>=3.5.4,<3.6.0)", "pyscf (==2.8.0)", "pytest (==8.0.0)", "pytest-cov (==6.0.0)", "pytest-xdist[psutil] (==3.0.2)", "qibo (>=0.2.15,<0.3.0)", "qiskit (>=1.3.1,<1.4.0)", "qiskit-aer (>=0.15.1,<0.16.0)", "qiskit-ibm-runtime (>=0.20.0,<0.21.0)", "ruff (==0.3.1)", "seaborn (==0.13.0)", "sphinx-autodoc-typehints (==2.0.0)", "sphinx-copybutton (==0.5.2)", "sphinx-design (==0.6.1)", "sphinx-gallery (==0.15.0)", "sphinx-tags (==0.4)", "sphinxcontrib-bibtex (==2.6.2)", "stim (==1.14.0)", "stimcirq (==1.14.0)", "types-tabulate"] +pennylane = ["pennylane (>=0.36.0,<0.37.0)", "pennylane-qiskit (>=0.36.0,<0.37.0)"] +pyquil = ["cirq-rigetti (>=1.4.0,<1.5.0)", "pyquil (>=3.5.4,<3.6.0)"] +qibo = ["qibo (>=0.2.15,<0.3.0)"] +qiskit = ["ply (==3.11)", "qiskit (>=1.3.1,<1.4.0)", "qiskit-aer (>=0.15.1,<0.16.0)", "qiskit-ibm-runtime (>=0.20.0,<0.21.0)"] [[package]] name = "ml-dtypes" @@ -5498,23 +5323,6 @@ files = [ {file = "propcache-0.3.0.tar.gz", hash = "sha256:a8fd93de4e1d278046345f49e2238cdb298589325849b2645d4a94c53faeffc5"}, ] -[[package]] -name = "proto-plus" -version = "1.26.0" -description = "Beautiful, Pythonic protocol buffers" -optional = false -python-versions = ">=3.7" -files = [ - {file = "proto_plus-1.26.0-py3-none-any.whl", hash = "sha256:bf2dfaa3da281fc3187d12d224c707cb57214fb2c22ba854eb0c105a3fb2d4d7"}, - {file = "proto_plus-1.26.0.tar.gz", hash = "sha256:6e93d5f5ca267b54300880fff156b6a3386b3fa3f43b1da62e680fc0c586ef22"}, -] - -[package.dependencies] -protobuf = ">=3.19.0,<6.0.0dev" - -[package.extras] -testing = ["google-api-core (>=1.31.5)"] - [[package]] name = "protobuf" version = "3.20.3" @@ -5878,36 +5686,6 @@ files = [ [package.extras] dev = ["pytest (>=7.3.1)"] -[[package]] -name = "pyquil" -version = "4.10.1" -description = "A Python library for creating Quantum Instruction Language (Quil) programs." -optional = false -python-versions = "<=3.12,>=3.8" -files = [ - {file = "pyquil-4.10.1-py3-none-any.whl", hash = "sha256:b73288fb1e8252dc959c7282877d4bd890f4bf21df414ffbe9b721c8b348b1a6"}, - {file = "pyquil-4.10.1.tar.gz", hash = "sha256:f015d848dfb501ca24748c89f53a441a6afc410e9170b1e8225e940af1ff1237"}, -] - -[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.22,<2.0" -packaging = ">=23.1,<24.0" -qcs-sdk-python = "0.17.9" -rpcq = ">=3.10.0,<4.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 (>=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.20.0" @@ -6088,88 +5866,6 @@ asyncio-client = ["aiohttp (>=3.4)"] client = ["requests (>=2.21.0)", "websocket-client (>=0.54.0)"] docs = ["sphinx"] -[[package]] -name = "python-rapidjson" -version = "1.20" -description = "Python wrapper around rapidjson" -optional = false -python-versions = ">=3.6" -files = [ - {file = "python_rapidjson-1.20-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeaa8487fdd8db409bd2e0c41c59cee3b9f1d08401fc75520f7d35c7a22d8789"}, - {file = "python_rapidjson-1.20-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:425c2bb8e778a04497953482c251944b2736f61012d897f17b73da3eca060c27"}, - {file = "python_rapidjson-1.20-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7cbbff9696ea01dd8a29502cb314471c9a5d4239f2f3b7e35b6adbde2cc620"}, - {file = "python_rapidjson-1.20-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:83a48f96d0abb8349a4d42f029259b755d8c6fd347f5de2d640e164c3f45e63b"}, - {file = "python_rapidjson-1.20-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cb3ad353ec083a6dcf0552f1fce3c490f92e2fccf9a81eac42835297a8431a1"}, - {file = "python_rapidjson-1.20-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f7b6574887d8828f34eb3384092d6e6c290e8fbb12703c409dbdde814612657"}, - {file = "python_rapidjson-1.20-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:403e4986484f01f79fdce00b48c12a1b39d16e822cd37c60843ab26455ab0680"}, - {file = "python_rapidjson-1.20-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e3f89a58d7709d5879586e9dbfd11be76a799e8fbdbb5eddaffaeba9b572fba3"}, - {file = "python_rapidjson-1.20-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b0d07d4f0ebbb2228d5140463f11ac519147b9d791f7e40b3edf518a806be3cc"}, - {file = "python_rapidjson-1.20-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a5fb413414b92763a54d53b732df3c9de1b114012c8881a3d1215a19b9fca494"}, - {file = "python_rapidjson-1.20-cp310-cp310-win32.whl", hash = "sha256:9831430f17101a6a249e07db9c42d26c3263e6009450722cce0c14726421f434"}, - {file = "python_rapidjson-1.20-cp310-cp310-win_amd64.whl", hash = "sha256:fbff5caf127c5bed4d6620f95a039dd9e293784d844af50782aaf278a743acb4"}, - {file = "python_rapidjson-1.20-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:328095d6d558090c29d24d889482b10dcc3ade3b77c93a61ea86794623046628"}, - {file = "python_rapidjson-1.20-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fc7a095f77eb3bb6acff94acf868a100faaf06028c4b513428f161cd55030476"}, - {file = "python_rapidjson-1.20-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce4cee141c924300cbedba1e5bea05b13484598d1e550afc5b50209ba73c62f2"}, - {file = "python_rapidjson-1.20-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4355bcfc8629d15f6246011b40e84cc368d842518a91adb15c5eba211305ee5b"}, - {file = "python_rapidjson-1.20-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dd9c5e661d17eafa44b2875f6ce55178cc87388575ce3cd3c606d5a33772b49"}, - {file = "python_rapidjson-1.20-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd978c7669cc844f669a48d2a6019fb9134a2385536f806fe265a1e374c3573a"}, - {file = "python_rapidjson-1.20-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fc52405435ce875aa000afa2637ea267eb0d4ab9622f9b97c92d92cb1a9c440"}, - {file = "python_rapidjson-1.20-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bef1eca712fb9fd5d2edd724dd1dd8a608215d6afcaee4f351b3e99e3f73f720"}, - {file = "python_rapidjson-1.20-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6355cb690bf64629767206524d4d00da909970d46d8fc0b367f339975e4eb419"}, - {file = "python_rapidjson-1.20-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f974c4e11be833221062fc4c3129bed172082792b33ef9fc1b8104f49c514f1d"}, - {file = "python_rapidjson-1.20-cp311-cp311-win32.whl", hash = "sha256:06ee7bcf660ebbdf1953aa7bf74214b722d934928c7b9f2a23b12e0713b61fa4"}, - {file = "python_rapidjson-1.20-cp311-cp311-win_amd64.whl", hash = "sha256:9df543521fa4b69589c42772b2f32a6c334b3b5fc612cd6dc3705136d0788da3"}, - {file = "python_rapidjson-1.20-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6056fcc8caeb9b04775bf655568bba362c7670ab792c1b438671bb056db954cd"}, - {file = "python_rapidjson-1.20-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:225bd4cbabfe7910261cbcebb8b811d4ff98e90cdd17c233b916c6aa71a9553f"}, - {file = "python_rapidjson-1.20-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:026077b663acf93a3f2b1adb87282e611a30214b8ae8001b7e4863a3b978e646"}, - {file = "python_rapidjson-1.20-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:884e1dd4c0770ed424737941af4d5dc9014995f9c33595f151af13f83ce282c3"}, - {file = "python_rapidjson-1.20-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f55531c8197cb7a21a5ef0ffa46f2b8fc8c5fe7c6fd08bdbd2063ae65d2ff65"}, - {file = "python_rapidjson-1.20-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c60121d155562dc694c05ed7df4e39e42ee1d3adff2a060c64a004498e6451f7"}, - {file = "python_rapidjson-1.20-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3a6620eed0b04196f37fab7048c1d672d03391bb29d7f09ee8fee8dea33f11f4"}, - {file = "python_rapidjson-1.20-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ddb63eff401ce7cf20cdd5e21942fc23fbe0e1dc1d96d7ae838645fb1f74fb47"}, - {file = "python_rapidjson-1.20-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:05e28c3dbb4a0d74ec13af9668ef2b9f302edf83cf7ce1d8316a95364720eec0"}, - {file = "python_rapidjson-1.20-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b733978ecd84fc5df9a778ce821dc1f3113f7bfc2493cac0bb17efb4ae0bb8fa"}, - {file = "python_rapidjson-1.20-cp312-cp312-win32.whl", hash = "sha256:d87041448cec00e2db5d858625a76dc1b59eef6691a039acff6d92ad8581cfc1"}, - {file = "python_rapidjson-1.20-cp312-cp312-win_amd64.whl", hash = "sha256:5d3be149ce5475f9605f01240487541057792abad94d3fd0cd56af363cf5a4dc"}, - {file = "python_rapidjson-1.20-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:daee815b4c20ca6e4dbc6bde373dd3f65b53813d775f1c94b765b33b402513a7"}, - {file = "python_rapidjson-1.20-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:083df379c769b30f9bc40041c91fd9d8f7bb8ca2b3c7170258842aced2098e05"}, - {file = "python_rapidjson-1.20-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9399ad75a2e3377f9e6208caabe73eb9354cd01b732407475ccadcd42c577df"}, - {file = "python_rapidjson-1.20-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:599ab208ccf6172d6cfac1abe048c837e62612f91f97d198e32773c45346a0b4"}, - {file = "python_rapidjson-1.20-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf3c0e2a5b97b0d07311f15f0dce4434e43dec865c3794ad1b10d968460fd665"}, - {file = "python_rapidjson-1.20-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8064b8edb57ddd9e3ffa539cf2ec2f03515751fb0698b40ba5cb66a2123af19"}, - {file = "python_rapidjson-1.20-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bc79d7f00f7538e027960ca6bcd1e03ed99fcf660d4d882d1c22f641155d0db0"}, - {file = "python_rapidjson-1.20-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:87aa0b01b8c20984844f1440b8ff6bdb32de911a1750fed344b9daed33b4b52b"}, - {file = "python_rapidjson-1.20-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4099cb9eae8a0ce19c09e02729eb6d69d5180424f13a2641a6c407d053e47a82"}, - {file = "python_rapidjson-1.20-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4c680cd2b4de760ff6875de71fe6a87bd610aa116593d62e4f81a563be86ae18"}, - {file = "python_rapidjson-1.20-cp313-cp313-win32.whl", hash = "sha256:9e431a7afc77aa874fed537c9f6bf5fcecaef124ebeae2a2379d3b9e9adce74b"}, - {file = "python_rapidjson-1.20-cp313-cp313-win_amd64.whl", hash = "sha256:7444bc7e6a04c03d6ed748b5dab0798fa2b3f2b303be8c38d3af405b2cac6d63"}, - {file = "python_rapidjson-1.20-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:69e702fe74fe8c44c6253bb91364a270dc49f704920c90e01040155bd600a5fd"}, - {file = "python_rapidjson-1.20-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b9496b1e9d6247e8802ac559b7eebb5f3cae426d1c1dbde4049c63dff0941370"}, - {file = "python_rapidjson-1.20-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1446e902b6c781f271bf8556da636c1375cbb208e25f92e1af4cc2d92cf0cf15"}, - {file = "python_rapidjson-1.20-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:368ecdf4031abbde9c94aac40981d9a1238e6bcfef9fbfee441047b4757d6033"}, - {file = "python_rapidjson-1.20-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:924f9ea302494d4a4d540d3509f8f1f15622ea7d614c6f29df3188d52c6cb546"}, - {file = "python_rapidjson-1.20-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:632acb2dfa29883723e24bb2ce47c726edd5f672341553a5184db68f78d3bd09"}, - {file = "python_rapidjson-1.20-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c2f85da53286e67778d4061ef32ff44ca9b5f945030463716e046ee8985319f8"}, - {file = "python_rapidjson-1.20-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c05c8602c019cc0db19601fdc4927755a9d33f21d01beb3d5767313d7a81360d"}, - {file = "python_rapidjson-1.20-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7d36aab758bfb1b59e0a849cd20e971eda951a04d3586bb5f6cb460bfc7c103d"}, - {file = "python_rapidjson-1.20-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e5774c905034362298312116f9b58c181e91a09800e4e5cede7b3d460a6a9fde"}, - {file = "python_rapidjson-1.20-cp38-cp38-win32.whl", hash = "sha256:488d0c6155004b5177225eaf331bb1838616da05ae966dd24a7d442751c1d193"}, - {file = "python_rapidjson-1.20-cp38-cp38-win_amd64.whl", hash = "sha256:00183c4938cd491b98b1a43626bc5a381842ceba87644cb91b25555f3fc3c0bf"}, - {file = "python_rapidjson-1.20-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f510ffe32fec319699f0c1ea9cee5bde47c33202b034b85c5d1b9ace682aa96a"}, - {file = "python_rapidjson-1.20-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2b624b3613fb7b8dfef4adc709bf39489be8c655cd9d24dc4e2cc16fc5def83"}, - {file = "python_rapidjson-1.20-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9f813a37d1f708a221f1f7d8c97c437d10597261810c1d3b52cf8f248d66c0"}, - {file = "python_rapidjson-1.20-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c3f7085c52259c56af72462df7620c3b8bb95575fd9b8c3a073728855e93269"}, - {file = "python_rapidjson-1.20-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:871f2eeb0907f3d7ab09efe04c5b5e2886c275ea568f7867c97468ae14cdd52f"}, - {file = "python_rapidjson-1.20-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7c0408e7f52f32cf4bdd5aa305f005914b0143cac69d42575e2d40e8678cd72"}, - {file = "python_rapidjson-1.20-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ec17a18df700e1f956fc5a0c41cbb3cc746c44c0fef38988efba9b2cb607ecfa"}, - {file = "python_rapidjson-1.20-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1c0303bd445312a78485a9adba06dfdb84561c5157a9cda7999fefb36df4c6cc"}, - {file = "python_rapidjson-1.20-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:303b079ef268a996242be51ae80c8b563ee2d73489ab4f16199fef2216e80765"}, - {file = "python_rapidjson-1.20-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5adcef7a27abafbb2b3d0b02c822dfd9b4b329769cb97810b7f9733e1fda0498"}, - {file = "python_rapidjson-1.20-cp39-cp39-win32.whl", hash = "sha256:3e963e78fff6ab5ab2ae847b65683774c48b9b192307380f2175540d6423fd73"}, - {file = "python_rapidjson-1.20-cp39-cp39-win_amd64.whl", hash = "sha256:1fc3bba6632ecffeb1897fdf98858dc50a677237f4241853444c70a041158a90"}, - {file = "python_rapidjson-1.20.tar.gz", hash = "sha256:115f08c86d2df7543c02605e77c84727cdabc4b08310d2f097e953efeaaa73eb"}, -] - [[package]] name = "python-socketio" version = "5.12.1" @@ -6274,127 +5970,6 @@ files = [ {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] -[[package]] -name = "pyzmq" -version = "26.2.1" -description = "Python bindings for 0MQ" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyzmq-26.2.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:f39d1227e8256d19899d953e6e19ed2ccb689102e6d85e024da5acf410f301eb"}, - {file = "pyzmq-26.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a23948554c692df95daed595fdd3b76b420a4939d7a8a28d6d7dea9711878641"}, - {file = "pyzmq-26.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95f5728b367a042df146cec4340d75359ec6237beebf4a8f5cf74657c65b9257"}, - {file = "pyzmq-26.2.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95f7b01b3f275504011cf4cf21c6b885c8d627ce0867a7e83af1382ebab7b3ff"}, - {file = "pyzmq-26.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80a00370a2ef2159c310e662c7c0f2d030f437f35f478bb8b2f70abd07e26b24"}, - {file = "pyzmq-26.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:8531ed35dfd1dd2af95f5d02afd6545e8650eedbf8c3d244a554cf47d8924459"}, - {file = "pyzmq-26.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cdb69710e462a38e6039cf17259d328f86383a06c20482cc154327968712273c"}, - {file = "pyzmq-26.2.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e7eeaef81530d0b74ad0d29eec9997f1c9230c2f27242b8d17e0ee67662c8f6e"}, - {file = "pyzmq-26.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:361edfa350e3be1f987e592e834594422338d7174364763b7d3de5b0995b16f3"}, - {file = "pyzmq-26.2.1-cp310-cp310-win32.whl", hash = "sha256:637536c07d2fb6a354988b2dd1d00d02eb5dd443f4bbee021ba30881af1c28aa"}, - {file = "pyzmq-26.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:45fad32448fd214fbe60030aa92f97e64a7140b624290834cc9b27b3a11f9473"}, - {file = "pyzmq-26.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:d9da0289d8201c8a29fd158aaa0dfe2f2e14a181fd45e2dc1fbf969a62c1d594"}, - {file = "pyzmq-26.2.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:c059883840e634a21c5b31d9b9a0e2b48f991b94d60a811092bc37992715146a"}, - {file = "pyzmq-26.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ed038a921df836d2f538e509a59cb638df3e70ca0fcd70d0bf389dfcdf784d2a"}, - {file = "pyzmq-26.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9027a7fcf690f1a3635dc9e55e38a0d6602dbbc0548935d08d46d2e7ec91f454"}, - {file = "pyzmq-26.2.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d75fcb00a1537f8b0c0bb05322bc7e35966148ffc3e0362f0369e44a4a1de99"}, - {file = "pyzmq-26.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0019cc804ac667fb8c8eaecdb66e6d4a68acf2e155d5c7d6381a5645bd93ae4"}, - {file = "pyzmq-26.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:f19dae58b616ac56b96f2e2290f2d18730a898a171f447f491cc059b073ca1fa"}, - {file = "pyzmq-26.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f5eeeb82feec1fc5cbafa5ee9022e87ffdb3a8c48afa035b356fcd20fc7f533f"}, - {file = "pyzmq-26.2.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:000760e374d6f9d1a3478a42ed0c98604de68c9e94507e5452951e598ebecfba"}, - {file = "pyzmq-26.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:817fcd3344d2a0b28622722b98500ae9c8bfee0f825b8450932ff19c0b15bebd"}, - {file = "pyzmq-26.2.1-cp311-cp311-win32.whl", hash = "sha256:88812b3b257f80444a986b3596e5ea5c4d4ed4276d2b85c153a6fbc5ca457ae7"}, - {file = "pyzmq-26.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:ef29630fde6022471d287c15c0a2484aba188adbfb978702624ba7a54ddfa6c1"}, - {file = "pyzmq-26.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:f32718ee37c07932cc336096dc7403525301fd626349b6eff8470fe0f996d8d7"}, - {file = "pyzmq-26.2.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:a6549ecb0041dafa55b5932dcbb6c68293e0bd5980b5b99f5ebb05f9a3b8a8f3"}, - {file = "pyzmq-26.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0250c94561f388db51fd0213cdccbd0b9ef50fd3c57ce1ac937bf3034d92d72e"}, - {file = "pyzmq-26.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36ee4297d9e4b34b5dc1dd7ab5d5ea2cbba8511517ef44104d2915a917a56dc8"}, - {file = "pyzmq-26.2.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2a9cb17fd83b7a3a3009901aca828feaf20aa2451a8a487b035455a86549c09"}, - {file = "pyzmq-26.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:786dd8a81b969c2081b31b17b326d3a499ddd1856e06d6d79ad41011a25148da"}, - {file = "pyzmq-26.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:2d88ba221a07fc2c5581565f1d0fe8038c15711ae79b80d9462e080a1ac30435"}, - {file = "pyzmq-26.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c84c1297ff9f1cd2440da4d57237cb74be21fdfe7d01a10810acba04e79371a"}, - {file = "pyzmq-26.2.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:46d4ebafc27081a7f73a0f151d0c38d4291656aa134344ec1f3d0199ebfbb6d4"}, - {file = "pyzmq-26.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:91e2bfb8e9a29f709d51b208dd5f441dc98eb412c8fe75c24ea464734ccdb48e"}, - {file = "pyzmq-26.2.1-cp312-cp312-win32.whl", hash = "sha256:4a98898fdce380c51cc3e38ebc9aa33ae1e078193f4dc641c047f88b8c690c9a"}, - {file = "pyzmq-26.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:a0741edbd0adfe5f30bba6c5223b78c131b5aa4a00a223d631e5ef36e26e6d13"}, - {file = "pyzmq-26.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:e5e33b1491555843ba98d5209439500556ef55b6ab635f3a01148545498355e5"}, - {file = "pyzmq-26.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:099b56ef464bc355b14381f13355542e452619abb4c1e57a534b15a106bf8e23"}, - {file = "pyzmq-26.2.1-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:651726f37fcbce9f8dd2a6dab0f024807929780621890a4dc0c75432636871be"}, - {file = "pyzmq-26.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57dd4d91b38fa4348e237a9388b4423b24ce9c1695bbd4ba5a3eada491e09399"}, - {file = "pyzmq-26.2.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d51a7bfe01a48e1064131f3416a5439872c533d756396be2b39e3977b41430f9"}, - {file = "pyzmq-26.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7154d228502e18f30f150b7ce94f0789d6b689f75261b623f0fdc1eec642aab"}, - {file = "pyzmq-26.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:f1f31661a80cc46aba381bed475a9135b213ba23ca7ff6797251af31510920ce"}, - {file = "pyzmq-26.2.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:290c96f479504439b6129a94cefd67a174b68ace8a8e3f551b2239a64cfa131a"}, - {file = "pyzmq-26.2.1-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f2c307fbe86e18ab3c885b7e01de942145f539165c3360e2af0f094dd440acd9"}, - {file = "pyzmq-26.2.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:b314268e716487bfb86fcd6f84ebbe3e5bec5fac75fdf42bc7d90fdb33f618ad"}, - {file = "pyzmq-26.2.1-cp313-cp313-win32.whl", hash = "sha256:edb550616f567cd5603b53bb52a5f842c0171b78852e6fc7e392b02c2a1504bb"}, - {file = "pyzmq-26.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:100a826a029c8ef3d77a1d4c97cbd6e867057b5806a7276f2bac1179f893d3bf"}, - {file = "pyzmq-26.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:6991ee6c43e0480deb1b45d0c7c2bac124a6540cba7db4c36345e8e092da47ce"}, - {file = "pyzmq-26.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:25e720dba5b3a3bb2ad0ad5d33440babd1b03438a7a5220511d0c8fa677e102e"}, - {file = "pyzmq-26.2.1-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:9ec6abfb701437142ce9544bd6a236addaf803a32628d2260eb3dbd9a60e2891"}, - {file = "pyzmq-26.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e1eb9d2bfdf5b4e21165b553a81b2c3bd5be06eeddcc4e08e9692156d21f1f6"}, - {file = "pyzmq-26.2.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90dc731d8e3e91bcd456aa7407d2eba7ac6f7860e89f3766baabb521f2c1de4a"}, - {file = "pyzmq-26.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b6a93d684278ad865fc0b9e89fe33f6ea72d36da0e842143891278ff7fd89c3"}, - {file = "pyzmq-26.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:c1bb37849e2294d519117dd99b613c5177934e5c04a5bb05dd573fa42026567e"}, - {file = "pyzmq-26.2.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:632a09c6d8af17b678d84df442e9c3ad8e4949c109e48a72f805b22506c4afa7"}, - {file = "pyzmq-26.2.1-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:fc409c18884eaf9ddde516d53af4f2db64a8bc7d81b1a0c274b8aa4e929958e8"}, - {file = "pyzmq-26.2.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:17f88622b848805d3f6427ce1ad5a2aa3cf61f12a97e684dab2979802024d460"}, - {file = "pyzmq-26.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3ef584f13820d2629326fe20cc04069c21c5557d84c26e277cfa6235e523b10f"}, - {file = "pyzmq-26.2.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:160194d1034902937359c26ccfa4e276abffc94937e73add99d9471e9f555dd6"}, - {file = "pyzmq-26.2.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:574b285150afdbf0a0424dddf7ef9a0d183988eb8d22feacb7160f7515e032cb"}, - {file = "pyzmq-26.2.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44dba28c34ce527cf687156c81f82bf1e51f047838d5964f6840fd87dfecf9fe"}, - {file = "pyzmq-26.2.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9fbdb90b85c7624c304f72ec7854659a3bd901e1c0ffb2363163779181edeb68"}, - {file = "pyzmq-26.2.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a7ad34a2921e8f76716dc7205c9bf46a53817e22b9eec2e8a3e08ee4f4a72468"}, - {file = "pyzmq-26.2.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:866c12b7c90dd3a86983df7855c6f12f9407c8684db6aa3890fc8027462bda82"}, - {file = "pyzmq-26.2.1-cp37-cp37m-win32.whl", hash = "sha256:eeb37f65350d5c5870517f02f8bbb2ac0fbec7b416c0f4875219fef305a89a45"}, - {file = "pyzmq-26.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4eb3197f694dfb0ee6af29ef14a35f30ae94ff67c02076eef8125e2d98963cd0"}, - {file = "pyzmq-26.2.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:36d4e7307db7c847fe37413f333027d31c11d5e6b3bacbb5022661ac635942ba"}, - {file = "pyzmq-26.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1c6ae0e95d0a4b0cfe30f648a18e764352d5415279bdf34424decb33e79935b8"}, - {file = "pyzmq-26.2.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5b4fc44f5360784cc02392f14235049665caaf7c0fe0b04d313e763d3338e463"}, - {file = "pyzmq-26.2.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:51431f6b2750eb9b9d2b2952d3cc9b15d0215e1b8f37b7a3239744d9b487325d"}, - {file = "pyzmq-26.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdbc78ae2065042de48a65f1421b8af6b76a0386bb487b41955818c3c1ce7bed"}, - {file = "pyzmq-26.2.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d14f50d61a89b0925e4d97a0beba6053eb98c426c5815d949a43544f05a0c7ec"}, - {file = "pyzmq-26.2.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:004837cb958988c75d8042f5dac19a881f3d9b3b75b2f574055e22573745f841"}, - {file = "pyzmq-26.2.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0b2007f28ce1b8acebdf4812c1aab997a22e57d6a73b5f318b708ef9bcabbe95"}, - {file = "pyzmq-26.2.1-cp38-cp38-win32.whl", hash = "sha256:269c14904da971cb5f013100d1aaedb27c0a246728c341d5d61ddd03f463f2f3"}, - {file = "pyzmq-26.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:31fff709fef3b991cfe7189d2cfe0c413a1d0e82800a182cfa0c2e3668cd450f"}, - {file = "pyzmq-26.2.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:a4bffcadfd40660f26d1b3315a6029fd4f8f5bf31a74160b151f5c577b2dc81b"}, - {file = "pyzmq-26.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e76ad4729c2f1cf74b6eb1bdd05f6aba6175999340bd51e6caee49a435a13bf5"}, - {file = "pyzmq-26.2.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8b0f5bab40a16e708e78a0c6ee2425d27e1a5d8135c7a203b4e977cee37eb4aa"}, - {file = "pyzmq-26.2.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e8e47050412f0ad3a9b2287779758073cbf10e460d9f345002d4779e43bb0136"}, - {file = "pyzmq-26.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f18ce33f422d119b13c1363ed4cce245b342b2c5cbbb76753eabf6aa6f69c7d"}, - {file = "pyzmq-26.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ceb0d78b7ef106708a7e2c2914afe68efffc0051dc6a731b0dbacd8b4aee6d68"}, - {file = "pyzmq-26.2.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ebdd96bd637fd426d60e86a29ec14b8c1ab64b8d972f6a020baf08a30d1cf46"}, - {file = "pyzmq-26.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:03719e424150c6395b9513f53a5faadcc1ce4b92abdf68987f55900462ac7eec"}, - {file = "pyzmq-26.2.1-cp39-cp39-win32.whl", hash = "sha256:ef5479fac31df4b304e96400fc67ff08231873ee3537544aa08c30f9d22fce38"}, - {file = "pyzmq-26.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:f92a002462154c176dac63a8f1f6582ab56eb394ef4914d65a9417f5d9fde218"}, - {file = "pyzmq-26.2.1-cp39-cp39-win_arm64.whl", hash = "sha256:1fd4b3efc6f62199886440d5e27dd3ccbcb98dfddf330e7396f1ff421bfbb3c2"}, - {file = "pyzmq-26.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:380816d298aed32b1a97b4973a4865ef3be402a2e760204509b52b6de79d755d"}, - {file = "pyzmq-26.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97cbb368fd0debdbeb6ba5966aa28e9a1ae3396c7386d15569a6ca4be4572b99"}, - {file = "pyzmq-26.2.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf7b5942c6b0dafcc2823ddd9154f419147e24f8df5b41ca8ea40a6db90615c"}, - {file = "pyzmq-26.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fe6e28a8856aea808715f7a4fc11f682b9d29cac5d6262dd8fe4f98edc12d53"}, - {file = "pyzmq-26.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bd8fdee945b877aa3bffc6a5a8816deb048dab0544f9df3731ecd0e54d8c84c9"}, - {file = "pyzmq-26.2.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ee7152f32c88e0e1b5b17beb9f0e2b14454235795ef68c0c120b6d3d23d12833"}, - {file = "pyzmq-26.2.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:baa1da72aecf6a490b51fba7a51f1ce298a1e0e86d0daef8265c8f8f9848eb77"}, - {file = "pyzmq-26.2.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:49135bb327fca159262d8fd14aa1f4a919fe071b04ed08db4c7c37d2f0647162"}, - {file = "pyzmq-26.2.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8bacc1a10c150d58e8a9ee2b2037a70f8d903107e0f0b6e079bf494f2d09c091"}, - {file = "pyzmq-26.2.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:09dac387ce62d69bec3f06d51610ca1d660e7849eb45f68e38e7f5cf1f49cbcb"}, - {file = "pyzmq-26.2.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:70b3a46ecd9296e725ccafc17d732bfc3cdab850b54bd913f843a0a54dfb2c04"}, - {file = "pyzmq-26.2.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:59660e15c797a3b7a571c39f8e0b62a1f385f98ae277dfe95ca7eaf05b5a0f12"}, - {file = "pyzmq-26.2.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0f50db737d688e96ad2a083ad2b453e22865e7e19c7f17d17df416e91ddf67eb"}, - {file = "pyzmq-26.2.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a003200b6cd64e89b5725ff7e284a93ab24fd54bbac8b4fa46b1ed57be693c27"}, - {file = "pyzmq-26.2.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f9ba5def063243793dec6603ad1392f735255cbc7202a3a484c14f99ec290705"}, - {file = "pyzmq-26.2.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1238c2448c58b9c8d6565579393148414a42488a5f916b3f322742e561f6ae0d"}, - {file = "pyzmq-26.2.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8eddb3784aed95d07065bcf94d07e8c04024fdb6b2386f08c197dfe6b3528fda"}, - {file = "pyzmq-26.2.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0f19c2097fffb1d5b07893d75c9ee693e9cbc809235cf3f2267f0ef6b015f24"}, - {file = "pyzmq-26.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0995fd3530f2e89d6b69a2202e340bbada3191014352af978fa795cb7a446331"}, - {file = "pyzmq-26.2.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7c6160fe513654e65665332740f63de29ce0d165e053c0c14a161fa60dd0da01"}, - {file = "pyzmq-26.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8ec8e3aea6146b761d6c57fcf8f81fcb19f187afecc19bf1701a48db9617a217"}, - {file = "pyzmq-26.2.1.tar.gz", hash = "sha256:17d72a74e5e9ff3829deb72897a175333d3ef5b5413948cae3cf7ebf0b02ecca"}, -] - -[package.dependencies] -cffi = {version = "*", markers = "implementation_name == \"pypy\""} - [[package]] name = "pyzx" version = "0.7.0" @@ -6412,39 +5987,6 @@ pyperclip = ">=1.8.1" tqdm = ">=4.56.0" typing-extensions = ">=3.7.4" -[[package]] -name = "qcs-sdk-python" -version = "0.17.9" -description = "Python interface for the QCS Rust SDK" -optional = false -python-versions = "*" -files = [ - {file = "qcs_sdk_python-0.17.9-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5797c1db68b4194f0729fe56e93a7d25dbcf752989fbf26d9d6709d020e8d367"}, - {file = "qcs_sdk_python-0.17.9-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:7b9ee8171ae1c396ba4de4897098cff95131f803dde11692201288dea17bacb5"}, - {file = "qcs_sdk_python-0.17.9-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b03cc65f1981f76460163946f65e2c5522754dfe95cba3bf2bde595474bcdac6"}, - {file = "qcs_sdk_python-0.17.9-cp310-none-win_amd64.whl", hash = "sha256:640ebc07b5422cf1d2cefea78f676c1bab6bb4d83bf379e0e88ecd6538136755"}, - {file = "qcs_sdk_python-0.17.9-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:d94992e4dacb4d3684448222e7931ec55567d7ca3c09a9e13c19e9a7a00ddc80"}, - {file = "qcs_sdk_python-0.17.9-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:c26dbc0c61dcac5a7a54486f07579de87dbaa793a6946f1a9c6302d77ec129a2"}, - {file = "qcs_sdk_python-0.17.9-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:7b31a0b33b3d955edcfecd6a4e495342f0d06947dc6b96fb7787578ecd91db38"}, - {file = "qcs_sdk_python-0.17.9-cp311-none-win_amd64.whl", hash = "sha256:979d03e5f6bcbfb9265504bf513d7f165d3d6dc8324708c1f602440caa7992fb"}, - {file = "qcs_sdk_python-0.17.9-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:b477a51a6ee8e2680aa54f1fc68264fd9825100c303ce954ea29e466d9a546a3"}, - {file = "qcs_sdk_python-0.17.9-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:a19e6260d546419861548f3fdad8ebf5c9f1ab23cf4540b574b809ba3c02f253"}, - {file = "qcs_sdk_python-0.17.9-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:13c2fe8998d4018cc3e3fc4f87a2a4edc2845eadcab6aea220b8ff698627b96c"}, - {file = "qcs_sdk_python-0.17.9-cp312-none-win_amd64.whl", hash = "sha256:6139a0623436fa4612b6e3586fab1d6fd9b844f6aedc2de54447a5e14ed136d8"}, - {file = "qcs_sdk_python-0.17.9-cp38-cp38-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:24df93b80a581a8bce61dc680a4c64bf99d93f7e806aca82534f3c7d6b66a0ca"}, - {file = "qcs_sdk_python-0.17.9-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:223eaa736cdd9c6fef968c9acc6b811ecd7acb0b38e27a9ff5963bf2f0feba21"}, - {file = "qcs_sdk_python-0.17.9-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:3d02f3e2b49f8dda967e26cce093534cb5d22a0193f5f069d2f748190fc6b700"}, - {file = "qcs_sdk_python-0.17.9-cp38-none-win_amd64.whl", hash = "sha256:e88d7f9f4456514f27b29252e4d0d11d29719d28519e7d0fdc9028bafe67737f"}, - {file = "qcs_sdk_python-0.17.9-cp39-cp39-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7669291e25da0c8e303b02463805d7a2233fd4ea7192acee2b1585617b17dd09"}, - {file = "qcs_sdk_python-0.17.9-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:5712843c42cf9a5d7e66d379d50eae66674307368ec93c84b54fad074ba83ce9"}, - {file = "qcs_sdk_python-0.17.9-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:c5dae0c688c39dff49a0424a6397ff67e0f3ca9821eab498f50ec0df04c2b42d"}, - {file = "qcs_sdk_python-0.17.9-cp39-none-win_amd64.whl", hash = "sha256:90a89f935d3898a770a91c6f0361cb9ec901e87a3ca2d35d7b01a915a9482eac"}, - {file = "qcs_sdk_python-0.17.9.tar.gz", hash = "sha256:acb5ad02fc924bb9ce3e037b2c6df3f12562ea26f7ed9908e72cbcae0680b5c2"}, -] - -[package.dependencies] -quil = "0.10.0" - [[package]] name = "qdldl" version = "0.1.7.post5" @@ -6667,41 +6209,6 @@ waitress = "*" [package.extras] iqm = ["qiskit-iqm"] -[[package]] -name = "quil" -version = "0.10.0" -description = "A Python package for building and parsing Quil programs." -optional = false -python-versions = ">=3.8" -files = [ - {file = "quil-0.10.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:3343ac253a6d8f65c0f171c381faab1b00cb18122d4adc1d559e757d5bae84ce"}, - {file = "quil-0.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9a21333d37990fd627b270b48d864a1497171f05b2e8264747270a9912eb06e"}, - {file = "quil-0.10.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4af1cc2708b1d2fd7c1f3b659f9acea19ef4e4c6d72f8b58bfc6cf11f648119a"}, - {file = "quil-0.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:accb1ab83f0944f9d8746dbb4bc5841d77c4376f7fc804ff0d3c87a0c7751d3a"}, - {file = "quil-0.10.0-cp310-none-win_amd64.whl", hash = "sha256:d7f48cf588b8f95e4c02dd819d7d69cc5e131708ee0318be83eaa717d542de57"}, - {file = "quil-0.10.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:4ed084149d74cf2a68763d8f6accf2f7880c51bc10a8a7c193d8659b94fd777d"}, - {file = "quil-0.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a98dca165af4f84afff924e3f9429237b206c985d6cdbc6930b991bb5c11f321"}, - {file = "quil-0.10.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96765c2f51bec543cf4df3399fb071ac6899ac9225fbcae5d995c319710eab39"}, - {file = "quil-0.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d21621e73318b197f74cfa62790e3551a94baed79d154d3c67837891b3ed96ff"}, - {file = "quil-0.10.0-cp311-none-win_amd64.whl", hash = "sha256:a7be6e36b8bda247ed0e8ae5df162738e388e5a6d6e545dfc438a20c2b1ba70a"}, - {file = "quil-0.10.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:14b51f3ed4a0e106cb49aa6adb5d4cfcd08f92125ea9828b5b366d058a9cacc6"}, - {file = "quil-0.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e93034a7a040b711dc000d9612b5d951fdb59b5ffc72b078322ed691df11523d"}, - {file = "quil-0.10.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb0132f4ea198c975e9abb062c8cdb69622028a7ee623273f62f9d46ae250170"}, - {file = "quil-0.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f3ae6c74983a26cdc3ed587508bb6f0f3442ff3eb45da294ef3047cedaee72e"}, - {file = "quil-0.10.0-cp312-none-win_amd64.whl", hash = "sha256:dd7b6c1575dbe7fa7e6d192ab0c455cff87c4bf069ce0ac58eea6744c7edfe2e"}, - {file = "quil-0.10.0-cp38-cp38-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8a54184e83c02e1303c5f6f34de37c69d7296feff575e93f28f8e2689f351ad7"}, - {file = "quil-0.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b744d9b3e39458e39424d9240bebf8dd3e9a61ea7b833a982aede4254a92419b"}, - {file = "quil-0.10.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9f84ee50c0a1382d9dd1d2112fcfe5a13b2f812ebd0177bef2d68aa86d9ed11c"}, - {file = "quil-0.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50602a8adf10d6df4fcec95244cf633982e18eba59f6fcca19ed3fc6b11141ea"}, - {file = "quil-0.10.0-cp38-none-win_amd64.whl", hash = "sha256:d056f08dc387c67382cb51c1edbffd9e1050fa301fe2eb9d5cc8470125e0430c"}, - {file = "quil-0.10.0-cp39-cp39-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:d574c96bf5af47aea1f3e9e855fa6652c74ade1cb9fc9f8bb5a74b577f2e5145"}, - {file = "quil-0.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f94bcde3f2e231f2d8409f23743cd9e20a9abf056632dbb24845c8d0d0fec832"}, - {file = "quil-0.10.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63534dd0a32d3e8840fb8551797db65e0cb49a33592fca60997b2b039050d063"}, - {file = "quil-0.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ec667b7dea20f8d3248766d9ae49102f54961c81d345fe9fdb0c39954dfc670"}, - {file = "quil-0.10.0-cp39-none-win_amd64.whl", hash = "sha256:bbeabf5dfb1bcfbbb04ebd4ff85517ecf1cffc64972b4b64d5c5355bf3e959fd"}, - {file = "quil-0.10.0.tar.gz", hash = "sha256:381d6551366dd0403ba5bc2c18d851dc53688da938aaec768e93a8f87e4b4cde"}, -] - [[package]] name = "quimb" version = "1.8.2" @@ -6770,46 +6277,42 @@ test = ["openfermion"] [[package]] name = "qutip" -version = "4.7.3" +version = "5.1.0" description = "QuTiP: The Quantum Toolbox in Python" optional = false -python-versions = "*" +python-versions = ">=3.10" files = [ - {file = "qutip-4.7.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ea947c32b5b31446997113271891fe2af91b9e7c58fca92482ce816de66fcbbc"}, - {file = "qutip-4.7.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3534b7b7d33c1536c0fe3bc000c4ef6ba33a9bca327234d520a982a06ad07b3"}, - {file = "qutip-4.7.3-cp310-cp310-win_amd64.whl", hash = "sha256:d1a46ea51ea7c62d69d1acb63cb8e907c44ac75934cf7fa93bd3b4a24462a88e"}, - {file = "qutip-4.7.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fecb3d851f938b714c3d45be8baf921129d7ddedbafc948a4bc08cf7b95c27dd"}, - {file = "qutip-4.7.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47cbbfed0acb5cc612b19ac9e2a8f3c596ab7511b91e36f69e97cdec27d8508e"}, - {file = "qutip-4.7.3-cp311-cp311-win_amd64.whl", hash = "sha256:04e751469a6dff44f9ed8d46ff09b1c7e2c5177e91a8083427d163c8271688a8"}, - {file = "qutip-4.7.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c078e11e02f0a1d77f8ddff7f245bebf8aa261e19616ef502dba97aef4e4fa9c"}, - {file = "qutip-4.7.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bb9e71d7891fe9d288573d283cb709b533e9bf9fd8b95ffe616882b38fe6453f"}, - {file = "qutip-4.7.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f76b6d13a8d5816055a9d79de6df15930384d20f8ee1c6a088f6e3925aa6b79c"}, - {file = "qutip-4.7.3-cp36-cp36m-win32.whl", hash = "sha256:b92523889c0be7a593a652638c2aef2ecbad7436aeb6957ca783e7aa1e47dce3"}, - {file = "qutip-4.7.3-cp36-cp36m-win_amd64.whl", hash = "sha256:c5febc4ea0cb17af7370d89f8c1bf0735755d6f76b988058164be19ad35de5a7"}, - {file = "qutip-4.7.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:51fac208a1c04a44cf2e2ada1793288293a9d18755d78d3e1399031169f50227"}, - {file = "qutip-4.7.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3fd6e4509b748cd3f586cfa41421975e1a290b2b8a4d765265176f798f1dc769"}, - {file = "qutip-4.7.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:15c7ae39ab39feb69bfd6bb0b9ea0258e7504383475b4b1f32c8ca8f70c0210f"}, - {file = "qutip-4.7.3-cp37-cp37m-win32.whl", hash = "sha256:8d3de71cf768fb20a987a8ca4cfef5bd94a90190ed50b5327bff32ca1869781e"}, - {file = "qutip-4.7.3-cp37-cp37m-win_amd64.whl", hash = "sha256:3fe273d17f86e25539c16e4f189d639f0ae72402240968b108baed3b990d0a60"}, - {file = "qutip-4.7.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:23c0c562c51642e3f90c28b09354906909cd21f82103f78566dc9afa5c860536"}, - {file = "qutip-4.7.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7696f4c053a2c575a13fec4dbeecb2fbfa26a4c528e7540ef4b0792a89e0c92"}, - {file = "qutip-4.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:1f4794d68e6b98cc65390cf2af5172cde80a4e870ae2249010c66665cc9a1a89"}, - {file = "qutip-4.7.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:074cd30890cc1b2d26b391aa778a93b1203e9b531902c2931a16387cdf7f0461"}, - {file = "qutip-4.7.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd539c6695d1d11f0118f5083591f600cb9adaeffca274f2d9b2812df629deeb"}, - {file = "qutip-4.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:d27cf80dc3a80f7db701f04f031dd807b07e66a57db78731ac162b9d2fe6a6d7"}, - {file = "qutip-4.7.3.tar.gz", hash = "sha256:abaf8281cacdb31b822456b4732d591939781ab94561f42bc081a64e3fda713d"}, -] - -[package.dependencies] -numpy = ">=1.16.6" + {file = "qutip-5.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c571e2037b283c7e675748bea0bbac30c6b6203405072d0ee0f1c6db7e298e97"}, + {file = "qutip-5.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8c836eb256e2e31f1fc28cfc2a44f853dcb5d1316d2ce5a3d0d2e5bd76ab737c"}, + {file = "qutip-5.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:239c091fe079d099f244e7b6787998120e72285dc9fb8dc8324aad7ae4227a9c"}, + {file = "qutip-5.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:02d347703c3cae9cbe7e69a1c3a00b151ae0117eda2e86c88993f6c7ca4e0bdd"}, + {file = "qutip-5.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9cde237171e68b2ed84d5243d4ae04aa2476ac89a6da6597cfeaee868e37a865"}, + {file = "qutip-5.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:06e0386a7fb4ab137ae58fe163e9c28a0809fec90179b0e44b80b587f9951fb8"}, + {file = "qutip-5.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d3ce8c991cd5e78845b063326ca0aee122ee6515ee2c0a8861927ca3735c21c"}, + {file = "qutip-5.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:9549682901c87e6c5fbf9aced4f1c75aa37f4a5b9c601d29a662419f43c25ae3"}, + {file = "qutip-5.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8f3836c450b58fb3604ceda8a236d2a2ea5a8bb40e6b1303577bab521c14882c"}, + {file = "qutip-5.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2291863632191e94d2cbcb2bca687d27d69538a3f907656bf0f466fb6b7d8d03"}, + {file = "qutip-5.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02bd9ba74ac3196f1e40f28942ba1e4eae940aaccc885c834abeceb3be069b2b"}, + {file = "qutip-5.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ec61234e51109865000f6325d2d496d0dbe795243da4828f9284fb0fc7629e00"}, + {file = "qutip-5.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d6042c6f527bbe9522f397cb4887464f328fab1eb0d066fe7640082e98c026e8"}, + {file = "qutip-5.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5e0b790d1631c440b2da5416f2ecc3e50a59534d2b86f1aab72a092313c28861"}, + {file = "qutip-5.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab9a44aa4dc9ddf63d4459c7bbf2a8531bf2f35fc9bb26ec25d6112662d986f8"}, + {file = "qutip-5.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:745d2547f2e7187dda50b757688119b7739083ff41383c452d999921edaaac4e"}, + {file = "qutip-5.1.0.tar.gz", hash = "sha256:cc2660cae337d79fb344ab7a03810f40189821863d7be75ddc3aab9ed96960f5"}, +] + +[package.dependencies] +numpy = ">=1.22" packaging = "*" -scipy = ">=1.0" +scipy = ">=1.9" [package.extras] -full = ["cvxopt", "cvxpy (>=1.0)", "cython (>=0.29.20,<3.0.0)", "ipython", "matplotlib (>=1.2.1)", "pytest (>=5.2)", "pytest-rerunfailures"] -graphics = ["matplotlib (>=1.2.1)"] +extras = ["loky", "mpmath", "tqdm"] +full = ["cvxopt", "cvxpy (>=1.0)", "cython (>=0.29.20)", "filelock", "ipython", "loky", "matplotlib (>=3.5)", "mpmath", "pytest (>=5.2)", "pytest-rerunfailures", "setuptools", "tqdm"] +graphics = ["matplotlib (>=3.5)"] ipython = ["ipython"] -runtime-compilation = ["cython (>=0.29.20,<3.0.0)"] +mpi = ["mpi4py"] +runtime-compilation = ["cython (>=0.29.20)", "filelock", "setuptools"] semidefinite = ["cvxopt", "cvxpy (>=1.0)"] tests = ["pytest (>=5.2)", "pytest-rerunfailures"] @@ -7060,22 +6563,6 @@ pygments = ">=2.13.0,<3.0.0" [package.extras] jupyter = ["ipywidgets (>=7.5.1,<9)"] -[[package]] -name = "rpcq" -version = "3.11.0" -description = "The RPC framework and message specification for Rigetti QCS." -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" @@ -7121,6 +6608,7 @@ files = [ {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f66efbc1caa63c088dead1c4170d148eabc9b80d95fb75b6c92ac0aad2437d76"}, {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22353049ba4181685023b25b5b51a574bce33e7f51c759371a7422dcae5402a6"}, {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:932205970b9f9991b34f55136be327501903f7c66830e9760a8ffb15b07f05cd"}, + {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a52d48f4e7bf9005e8f0a89209bf9a73f7190ddf0489eee5eb51377385f59f2a"}, {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-win32.whl", hash = "sha256:3eac5a91891ceb88138c113f9db04f3cebdae277f5d44eaa3651a4f573e6a5da"}, {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-win_amd64.whl", hash = "sha256:ab007f2f5a87bd08ab1499bdf96f3d5c6ad4dcfa364884cb4549aa0154b13a28"}, {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6"}, @@ -7129,6 +6617,7 @@ files = [ {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52"}, {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642"}, {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2"}, + {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1492a6051dab8d912fc2adeef0e8c72216b24d57bd896ea607cb90bb0c4981d3"}, {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-win32.whl", hash = "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4"}, {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-win_amd64.whl", hash = "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb"}, {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632"}, @@ -7137,6 +6626,7 @@ files = [ {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd"}, {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31"}, {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680"}, + {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d"}, {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5"}, {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4"}, {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a"}, @@ -7145,6 +6635,7 @@ files = [ {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6"}, {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf"}, {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1"}, + {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01"}, {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6"}, {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3"}, {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fc4b630cd3fa2cf7fce38afa91d7cfe844a9f75d7f0f36393fa98815e911d987"}, @@ -7153,6 +6644,7 @@ files = [ {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2f1c3765db32be59d18ab3953f43ab62a761327aafc1594a2a1fbe038b8b8a7"}, {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d85252669dc32f98ebcd5d36768f5d4faeaeaa2d655ac0473be490ecdae3c285"}, {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e143ada795c341b56de9418c58d028989093ee611aa27ffb9b7f609c00d813ed"}, + {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2c59aa6170b990d8d2719323e628aaf36f3bfbc1c26279c0eeeb24d05d2d11c7"}, {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-win32.whl", hash = "sha256:beffaed67936fbbeffd10966a4eb53c402fafd3d6833770516bf7314bc6ffa12"}, {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-win_amd64.whl", hash = "sha256:040ae85536960525ea62868b642bdb0c2cc6021c9f9d507810c0c604e66f5a7b"}, {file = "ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f"}, @@ -7257,45 +6749,53 @@ tests = ["black (>=23.3.0)", "matplotlib (>=3.1.3)", "mypy (>=1.3)", "numpydoc ( [[package]] name = "scipy" -version = "1.11.4" +version = "1.14.1" description = "Fundamental algorithms for scientific computing in Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" 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"] + {file = "scipy-1.14.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:b28d2ca4add7ac16ae8bb6632a3c86e4b9e4d52d3e34267f6e1b0c1f8d87e389"}, + {file = "scipy-1.14.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d0d2821003174de06b69e58cef2316a6622b60ee613121199cb2852a873f8cf3"}, + {file = "scipy-1.14.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8bddf15838ba768bb5f5083c1ea012d64c9a444e16192762bd858f1e126196d0"}, + {file = "scipy-1.14.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:97c5dddd5932bd2a1a31c927ba5e1463a53b87ca96b5c9bdf5dfd6096e27efc3"}, + {file = "scipy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ff0a7e01e422c15739ecd64432743cf7aae2b03f3084288f399affcefe5222d"}, + {file = "scipy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e32dced201274bf96899e6491d9ba3e9a5f6b336708656466ad0522d8528f69"}, + {file = "scipy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8426251ad1e4ad903a4514712d2fa8fdd5382c978010d1c6f5f37ef286a713ad"}, + {file = "scipy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:a49f6ed96f83966f576b33a44257d869756df6cf1ef4934f59dd58b25e0327e5"}, + {file = "scipy-1.14.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:2da0469a4ef0ecd3693761acbdc20f2fdeafb69e6819cc081308cc978153c675"}, + {file = "scipy-1.14.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:c0ee987efa6737242745f347835da2cc5bb9f1b42996a4d97d5c7ff7928cb6f2"}, + {file = "scipy-1.14.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3a1b111fac6baec1c1d92f27e76511c9e7218f1695d61b59e05e0fe04dc59617"}, + {file = "scipy-1.14.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8475230e55549ab3f207bff11ebfc91c805dc3463ef62eda3ccf593254524ce8"}, + {file = "scipy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:278266012eb69f4a720827bdd2dc54b2271c97d84255b2faaa8f161a158c3b37"}, + {file = "scipy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fef8c87f8abfb884dac04e97824b61299880c43f4ce675dd2cbeadd3c9b466d2"}, + {file = "scipy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b05d43735bb2f07d689f56f7b474788a13ed8adc484a85aa65c0fd931cf9ccd2"}, + {file = "scipy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:716e389b694c4bb564b4fc0c51bc84d381735e0d39d3f26ec1af2556ec6aad94"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:631f07b3734d34aced009aaf6fedfd0eb3498a97e581c3b1e5f14a04164a456d"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:af29a935803cc707ab2ed7791c44288a682f9c8107bc00f0eccc4f92c08d6e07"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2843f2d527d9eebec9a43e6b406fb7266f3af25a751aa91d62ff416f54170bc5"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:eb58ca0abd96911932f688528977858681a59d61a7ce908ffd355957f7025cfc"}, + {file = "scipy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30ac8812c1d2aab7131a79ba62933a2a76f582d5dbbc695192453dae67ad6310"}, + {file = "scipy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f9ea80f2e65bdaa0b7627fb00cbeb2daf163caa015e59b7516395fe3bd1e066"}, + {file = "scipy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:edaf02b82cd7639db00dbff629995ef185c8df4c3ffa71a5562a595765a06ce1"}, + {file = "scipy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:2ff38e22128e6c03ff73b6bb0f85f897d2362f8c052e3b8ad00532198fbdae3f"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1729560c906963fc8389f6aac023739ff3983e727b1a4d87696b7bf108316a79"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:4079b90df244709e675cdc8b93bfd8a395d59af40b72e339c2287c91860deb8e"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e0cf28db0f24a38b2a0ca33a85a54852586e43cf6fd876365c86e0657cfe7d73"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0c2f95de3b04e26f5f3ad5bb05e74ba7f68b837133a4492414b3afd79dfe540e"}, + {file = "scipy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b99722ea48b7ea25e8e015e8341ae74624f72e5f21fc2abd45f3a93266de4c5d"}, + {file = "scipy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5149e3fd2d686e42144a093b206aef01932a0059c2a33ddfa67f5f035bdfe13e"}, + {file = "scipy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4f5a7c49323533f9103d4dacf4e4f07078f360743dec7f7596949149efeec06"}, + {file = "scipy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:baff393942b550823bfce952bb62270ee17504d02a1801d7fd0719534dfb9c84"}, + {file = "scipy-1.14.1.tar.gz", hash = "sha256:5a275584e726026a5699459aa72f828a610821006228e841b94275c4a7c08417"}, +] + +[package.dependencies] +numpy = ">=1.23.5,<2.3" + +[package.extras] +dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] +doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.13.1)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<=7.3.7)", "sphinx-design (>=0.4.0)"] +test = ["Cython", "array-api-strict (>=2.0)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "scipy-openblas32" @@ -8130,21 +7630,6 @@ files = [ [package.dependencies] tqdm = "*" -[[package]] -name = "tenacity" -version = "8.5.0" -description = "Retry code until it succeeds" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tenacity-8.5.0-py3-none-any.whl", hash = "sha256:b594c2a5945830c267ce6b79a166228323ed52718f30302c1359836112346687"}, - {file = "tenacity-8.5.0.tar.gz", hash = "sha256:8bc6c0c8a09b31e6cad13c47afbed1a567518250a9a171418582ed8d9c20ca78"}, -] - -[package.extras] -doc = ["reno", "sphinx"] -test = ["pytest", "tornado (>=4.5)", "typeguard"] - [[package]] name = "tensorboard" version = "2.14.1" @@ -8744,17 +8229,6 @@ rich = ">=10.11.0" shellingham = ">=1.3.0" typing-extensions = ">=3.7.4.3" -[[package]] -name = "types-deprecated" -version = "1.2.15.20241117" -description = "Typing stubs for Deprecated" -optional = false -python-versions = ">=3.8" -files = [ - {file = "types-Deprecated-1.2.15.20241117.tar.gz", hash = "sha256:924002c8b7fddec51ba4949788a702411a2e3636cd9b2a33abd8ee119701d77e"}, - {file = "types_Deprecated-1.2.15.20241117-py3-none-any.whl", hash = "sha256:a0cc5e39f769fc54089fd8e005416b55d74aa03f6964d2ed1a0b0b2e28751884"}, -] - [[package]] name = "types-python-dateutil" version = "2.9.0.20241206" @@ -8766,17 +8240,6 @@ files = [ {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, ] -[[package]] -name = "types-retry" -version = "0.9.9.20241221" -description = "Typing stubs for retry" -optional = false -python-versions = ">=3.8" -files = [ - {file = "types_retry-0.9.9.20241221-py3-none-any.whl", hash = "sha256:d1ef1a60573470525e65267192dd712b93f0f0acf3019c4c1afe173cde3289cb"}, - {file = "types_retry-0.9.9.20241221.tar.gz", hash = "sha256:ebad6d495a5a04ab0d06d4156a665528c3b84a8461aa019dd6e5d3e33c2aa1e0"}, -] - [[package]] name = "types-setuptools" version = "75.8.0.20250225" @@ -9612,4 +9075,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "~3.10.0" -content-hash = "6993eb4c5db719f7a8b7867330651d516288f1c5f146540669752ac413c87160" +content-hash = "7d4617176755cc00f125191fe224018929d4a0ed4104856d4616194e9074da9f" diff --git a/pyproject.toml b/pyproject.toml index ec660b8dd0..1a4f9b3b9c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -61,6 +61,7 @@ pennylane-qulacs = "0.40.0" pennylane-catalyst = "0.10.0" ########################################################## +scipy = ">=1.12" numpy = "~1.24" matplotlib = "3.7.2" jax = "0.4.28" @@ -79,8 +80,8 @@ pydantic = "^2.8.2" ply = "3.11" optax = "0.2.3" flax = "0.9.0" -qutip = "4.7.3" -mitiq = "0.32.0" +qutip = "5.1.0" +mitiq = "0.43.0" pennylane-qrack = "0.11.1" pyqrack = "1.32.12" zstd = "*" From 88faa1bcbb744c6519b98658de420231ae66dfa4 Mon Sep 17 00:00:00 2001 From: Korbinian Kottmann <43949391+Qottmann@users.noreply.github.com> Date: Mon, 17 Mar 2025 23:09:46 +0100 Subject: [PATCH 06/11] Use `qml.lie_closure` and `qml.structure_constants` top level (#1329) Fixing some deprecation warnings --- demonstrations/tutorial_kak_decomposition.metadata.json | 2 +- demonstrations/tutorial_kak_decomposition.py | 2 +- demonstrations/tutorial_liesim.metadata.json | 2 +- demonstrations/tutorial_liesim.py | 4 ++-- demonstrations/tutorial_liesim_extension.metadata.json | 2 +- demonstrations/tutorial_liesim_extension.py | 2 +- demonstrations_v2/tutorial_kak_decomposition/demo.py | 2 +- demonstrations_v2/tutorial_kak_decomposition/metadata.json | 2 +- demonstrations_v2/tutorial_liesim/demo.py | 4 ++-- demonstrations_v2/tutorial_liesim/metadata.json | 2 +- demonstrations_v2/tutorial_liesim_extension/demo.py | 2 +- demonstrations_v2/tutorial_liesim_extension/metadata.json | 2 +- 12 files changed, 14 insertions(+), 14 deletions(-) diff --git a/demonstrations/tutorial_kak_decomposition.metadata.json b/demonstrations/tutorial_kak_decomposition.metadata.json index 94e43e6012..ae7f442f81 100644 --- a/demonstrations/tutorial_kak_decomposition.metadata.json +++ b/demonstrations/tutorial_kak_decomposition.metadata.json @@ -6,7 +6,7 @@ } ], "dateOfPublication": "2024-11-25T00:00:00+00:00", - "dateOfLastModification": "2025-01-07T09:00:00+00:00", + "dateOfLastModification": "2025-03-17T09:00:00+00:00", "categories": [ "Quantum Computing", "Algorithms" diff --git a/demonstrations/tutorial_kak_decomposition.py b/demonstrations/tutorial_kak_decomposition.py index a4789f8a4e..8a61aa3cc9 100644 --- a/demonstrations/tutorial_kak_decomposition.py +++ b/demonstrations/tutorial_kak_decomposition.py @@ -355,7 +355,7 @@ def check_cartan_decomposition(g, k, space_name): """Given an algebra g and an operator subspace k, verify that k is a subalgebra and gives rise to a Cartan decomposition.""" # Check Lie closure of k - k_lie_closure = qml.pauli.dla.lie_closure(k) + k_lie_closure = qml.lie_closure(k) k_is_closed = len(k_lie_closure) == len(k) print(f"The Lie closure of k is as big as k itself: {k_is_closed}.") diff --git a/demonstrations/tutorial_liesim.metadata.json b/demonstrations/tutorial_liesim.metadata.json index f3d75d959d..a307de56e6 100644 --- a/demonstrations/tutorial_liesim.metadata.json +++ b/demonstrations/tutorial_liesim.metadata.json @@ -6,7 +6,7 @@ } ], "dateOfPublication": "2024-06-07T00:00:00+00:00", - "dateOfLastModification": "2024-10-07T00:00:00+00:00", + "dateOfLastModification": "2025-03-17T00:00:00+00:00", "categories": [ "Quantum Computing", "Getting Started" diff --git a/demonstrations/tutorial_liesim.py b/demonstrations/tutorial_liesim.py index 14f91b9a05..20630ee3da 100644 --- a/demonstrations/tutorial_liesim.py +++ b/demonstrations/tutorial_liesim.py @@ -186,7 +186,7 @@ # work with PauliSentence instances for efficiency generators = [op.pauli_rep for op in generators] -dla = qml.pauli.lie_closure(generators, pauli=True) +dla = qml.lie_closure(generators, pauli=True) dim_g = len(dla) ############################################################################## @@ -239,7 +239,7 @@ # the forward pass of the expectation value computation. For demonstration purposes, # we choose a random subset of ``depth=10`` generators for gates from the DLA. -adjoint_repr = qml.pauli.structure_constants(dla) +adjoint_repr = qml.structure_constants(dla) depth = 10 gate_choice = np.random.choice(dim_g, size=depth) diff --git a/demonstrations/tutorial_liesim_extension.metadata.json b/demonstrations/tutorial_liesim_extension.metadata.json index 7da2c15c82..3837196b18 100644 --- a/demonstrations/tutorial_liesim_extension.metadata.json +++ b/demonstrations/tutorial_liesim_extension.metadata.json @@ -6,7 +6,7 @@ } ], "dateOfPublication": "2024-06-18T00:00:00+00:00", - "dateOfLastModification": "2025-01-13T00:00:00+00:00", + "dateOfLastModification": "2025-03-17T00:00:00+00:00", "categories": [ "Quantum Computing", "Quantum Machine Learning" diff --git a/demonstrations/tutorial_liesim_extension.py b/demonstrations/tutorial_liesim_extension.py index b11a640b6e..ce62806eb9 100644 --- a/demonstrations/tutorial_liesim_extension.py +++ b/demonstrations/tutorial_liesim_extension.py @@ -99,7 +99,7 @@ def TFIM(n): generators += [Z(i) for i in range(n)] generators = [op.pauli_rep for op in generators] - dla = qml.pauli.lie_closure(generators, pauli=True) + dla = qml.lie_closure(generators, pauli=True) dim_dla = len(dla) return generators, dla, dim_dla diff --git a/demonstrations_v2/tutorial_kak_decomposition/demo.py b/demonstrations_v2/tutorial_kak_decomposition/demo.py index a4789f8a4e..8a61aa3cc9 100644 --- a/demonstrations_v2/tutorial_kak_decomposition/demo.py +++ b/demonstrations_v2/tutorial_kak_decomposition/demo.py @@ -355,7 +355,7 @@ def check_cartan_decomposition(g, k, space_name): """Given an algebra g and an operator subspace k, verify that k is a subalgebra and gives rise to a Cartan decomposition.""" # Check Lie closure of k - k_lie_closure = qml.pauli.dla.lie_closure(k) + k_lie_closure = qml.lie_closure(k) k_is_closed = len(k_lie_closure) == len(k) print(f"The Lie closure of k is as big as k itself: {k_is_closed}.") diff --git a/demonstrations_v2/tutorial_kak_decomposition/metadata.json b/demonstrations_v2/tutorial_kak_decomposition/metadata.json index 94e43e6012..ae7f442f81 100644 --- a/demonstrations_v2/tutorial_kak_decomposition/metadata.json +++ b/demonstrations_v2/tutorial_kak_decomposition/metadata.json @@ -6,7 +6,7 @@ } ], "dateOfPublication": "2024-11-25T00:00:00+00:00", - "dateOfLastModification": "2025-01-07T09:00:00+00:00", + "dateOfLastModification": "2025-03-17T09:00:00+00:00", "categories": [ "Quantum Computing", "Algorithms" diff --git a/demonstrations_v2/tutorial_liesim/demo.py b/demonstrations_v2/tutorial_liesim/demo.py index 14f91b9a05..20630ee3da 100644 --- a/demonstrations_v2/tutorial_liesim/demo.py +++ b/demonstrations_v2/tutorial_liesim/demo.py @@ -186,7 +186,7 @@ # work with PauliSentence instances for efficiency generators = [op.pauli_rep for op in generators] -dla = qml.pauli.lie_closure(generators, pauli=True) +dla = qml.lie_closure(generators, pauli=True) dim_g = len(dla) ############################################################################## @@ -239,7 +239,7 @@ # the forward pass of the expectation value computation. For demonstration purposes, # we choose a random subset of ``depth=10`` generators for gates from the DLA. -adjoint_repr = qml.pauli.structure_constants(dla) +adjoint_repr = qml.structure_constants(dla) depth = 10 gate_choice = np.random.choice(dim_g, size=depth) diff --git a/demonstrations_v2/tutorial_liesim/metadata.json b/demonstrations_v2/tutorial_liesim/metadata.json index f3d75d959d..a307de56e6 100644 --- a/demonstrations_v2/tutorial_liesim/metadata.json +++ b/demonstrations_v2/tutorial_liesim/metadata.json @@ -6,7 +6,7 @@ } ], "dateOfPublication": "2024-06-07T00:00:00+00:00", - "dateOfLastModification": "2024-10-07T00:00:00+00:00", + "dateOfLastModification": "2025-03-17T00:00:00+00:00", "categories": [ "Quantum Computing", "Getting Started" diff --git a/demonstrations_v2/tutorial_liesim_extension/demo.py b/demonstrations_v2/tutorial_liesim_extension/demo.py index b11a640b6e..ce62806eb9 100644 --- a/demonstrations_v2/tutorial_liesim_extension/demo.py +++ b/demonstrations_v2/tutorial_liesim_extension/demo.py @@ -99,7 +99,7 @@ def TFIM(n): generators += [Z(i) for i in range(n)] generators = [op.pauli_rep for op in generators] - dla = qml.pauli.lie_closure(generators, pauli=True) + dla = qml.lie_closure(generators, pauli=True) dim_dla = len(dla) return generators, dla, dim_dla diff --git a/demonstrations_v2/tutorial_liesim_extension/metadata.json b/demonstrations_v2/tutorial_liesim_extension/metadata.json index 7da2c15c82..3837196b18 100644 --- a/demonstrations_v2/tutorial_liesim_extension/metadata.json +++ b/demonstrations_v2/tutorial_liesim_extension/metadata.json @@ -6,7 +6,7 @@ } ], "dateOfPublication": "2024-06-18T00:00:00+00:00", - "dateOfLastModification": "2025-01-13T00:00:00+00:00", + "dateOfLastModification": "2025-03-17T00:00:00+00:00", "categories": [ "Quantum Computing", "Quantum Machine Learning" From 75df4db333a774dc525fa983d81687c2144343a7 Mon Sep 17 00:00:00 2001 From: David Wierichs Date: Wed, 26 Mar 2025 09:04:38 +0100 Subject: [PATCH 07/11] Add references to new `qml.liealg` functionality in Lie algebraic demos (#1332) **Context** Recently, Lie algebraic functionality was promoted from `qml.labs` to `qml.liealg` module. Some demos related to Lie algebras code up their own variants of some of this functionality. **Changes** - This PR adds references to the PL functionalities and removes their copies within the "Fixed-depth Hamiltonian simulation via Cartan decomposition" demo. - The names of the variants in the demos are updated if there is a corresponding PennyLane pendant. - Naming change from "KAK theorem" to "KAK decomposition", following #1287 --------- Co-authored-by: Korbinian Kottmann <43949391+Qottmann@users.noreply.github.com> --- ...ion_via_cartan_decomposition.metadata.json | 2 +- ...ian_simulation_via_cartan_decomposition.py | 90 +++---------------- .../tutorial_kak_decomposition.metadata.json | 2 +- demonstrations/tutorial_kak_decomposition.py | 9 +- .../tutorial_liesim_extension.metadata.json | 2 +- demonstrations/tutorial_liesim_extension.py | 4 +- 6 files changed, 24 insertions(+), 85 deletions(-) diff --git a/demonstrations/tutorial_fixed_depth_hamiltonian_simulation_via_cartan_decomposition.metadata.json b/demonstrations/tutorial_fixed_depth_hamiltonian_simulation_via_cartan_decomposition.metadata.json index 1efc93770b..8779a9e547 100644 --- a/demonstrations/tutorial_fixed_depth_hamiltonian_simulation_via_cartan_decomposition.metadata.json +++ b/demonstrations/tutorial_fixed_depth_hamiltonian_simulation_via_cartan_decomposition.metadata.json @@ -6,7 +6,7 @@ } ], "dateOfPublication": "2024-12-19T00:00:00+00:00", - "dateOfLastModification": "2025-01-10T00:00:00+00:00", + "dateOfLastModification": "2025-03-26T00:00:00+00:00", "categories": [ "Quantum Computing", "Algorithms" diff --git a/demonstrations/tutorial_fixed_depth_hamiltonian_simulation_via_cartan_decomposition.py b/demonstrations/tutorial_fixed_depth_hamiltonian_simulation_via_cartan_decomposition.py index a4f5439a83..3be494501f 100644 --- a/demonstrations/tutorial_fixed_depth_hamiltonian_simulation_via_cartan_decomposition.py +++ b/demonstrations/tutorial_fixed_depth_hamiltonian_simulation_via_cartan_decomposition.py @@ -20,7 +20,7 @@ Introduction ------------ -The :doc:`KAK theorem ` is an important result from Lie theory that states that any Lie group element :math:`U` can be decomposed +The :doc:`KAK decomposition ` is an important result from Lie theory that states that any Lie group element :math:`U` can be decomposed as :math:`U = K_1 A K_2,` where :math:`K_{1, 2}` and :math:`A` are elements of two special sub-groups :math:`\mathcal{K}` and :math:`\mathcal{A},` respectively. In special cases, the decomposition simplifies to :math:`U = K A K^\dagger.` @@ -36,14 +36,14 @@ We can use this general result from Lie theory as a powerful circuit decomposition technique. .. note:: We recommend a basic understanding of Lie algebras, see e.g. our :doc:`introduction to (dynamical) Lie algebras for quantum practitioners `. - Otherwise, this demo should be self-contained, though for the mathematically inclined, we further recommend our :doc:`demo on the KAK theorem ` - that dives into the mathematical depths of the theorem and provides more background info. + Otherwise, this demo should be self-contained, though for the mathematically inclined, we further recommend our :doc:`demo on the KAK decomposition ` + that dives into the mathematical depths of the decomposition and provides more background info. Goal: Fast-forwarding time evolutions using the KAK decomposition ----------------------------------------------------------------- Unitary gates in quantum computing are described by the special unitary Lie group :math:`SU(2^n),` so we can use the KAK -theorem to decompose quantum gates into :math:`U = K_1 A K_2.` While the mathematical statement is rather straightforward, +decomposition to factorize quantum gates into :math:`U = K_1 A K_2.` While the mathematical statement is rather straightforward, actually finding this decomposition is not. We are going to follow the recipe prescribed in `Fixed Depth Hamiltonian Simulation via Cartan Decomposition `__ [#Kökcü]_, which tackles this decomposition on the level of the associated Lie algebra via Cartan decomposition. @@ -74,6 +74,7 @@ import numpy as np import pennylane as qml from pennylane import X, Y, Z +from pennylane.liealg import even_odd_involution, cartan_decomp, horizontal_cartan_subalgebra import jax import jax.numpy as jnp @@ -111,10 +112,8 @@ # One common choice of involution is the so-called even-odd involution for Pauli words, # :math:`P = P_1 \otimes P_2 .. \otimes P_n,` where :math:`P_j \in \{I, X, Y, Z\}.` # It essentially counts whether the number of non-identity Pauli operators in the Pauli word is even or odd. - -def even_odd_involution(op): - [pw] = op.pauli_rep - return len(pw) % 2 +# It is readily available in PennyLane as :func:`~.pennylane.liealg.even_odd_involution`, which +# we already imported above. even_odd_involution(X(0)), even_odd_involution(X(0) @ Y(3)) @@ -126,30 +125,9 @@ def even_odd_involution(op): # sort the operators by whether or not they yield a plus or minus sign from the involution function. # This is possible because the operators and involution nicely align with the eigenspace decomposition. -def cartan_decomposition(g, involution): - """Cartan Decomposition g = k + m - - Args: - g (List[PauliSentence]): the (dynamical) Lie algebra to decompose - involution (callable): Involution function :math:`\Theta(\cdot)` to act on PauliSentence ops, should return ``0/1`` or ``True/False``. - - Returns: - k (List[PauliSentence]): the vertical subspace :math:`\Theta(x) = x` - m (List[PauliSentence]): the horizontal subspace :math:`\Theta(x) = -x` """ - m = [] - k = [] - - for op in g: - if involution(op): # vertical space when involution returns True - k.append(op) - else: # horizontal space when involution returns False - m.append(op) - return k, m - -k, m = cartan_decomposition(g, even_odd_involution) +k, m = cartan_decomp(g, even_odd_involution) len(g), len(k), len(m) - ############################################################################## # We have successfully decomposed the 60-dimensional Lie algebra # into a 24-dimensional vertical subspace and a 36-dimensional subspace. @@ -187,51 +165,11 @@ def cartan_decomposition(g, involution): # that commute with it. # # We then obtain a further split of the vector space :math:`\mathfrak{m} = \tilde{\mathfrak{m}} \oplus \mathfrak{h},` -# where :math:`\tilde{\mathfrak{m}}` is just the remainder of :math:`\mathfrak{m}.` +# where :math:`\tilde{\mathfrak{m}}` is just the remainder of :math:`\mathfrak{m}.` The function +# :func:`~.pennylane.liealg.horizontal_cartan_subalgebra` returns some additional information, which we will +# not use here. -def _commutes_with_all(candidate, ops): - r"""Check if ``candidate`` commutes with all ``ops``""" - for op in ops: - com = candidate.commutator(op) - com.simplify() - - if not len(com) == 0: - return False - return True - -def cartan_subalgebra(m, which=0): - """Compute the Cartan subalgebra from the horizontal subspace :math:`\mathfrak{m}` - of the Cartan decomposition - - This implementation is specific for cases of bases of m with pure Pauli words as - detailed in Appendix C in `2104.00728 `__. - - Args: - m (List[PauliSentence]): the horizontal subspace :math:`\Theta(x) = -x - which (int): Choice for the initial element of m from which to construct - the maximal Abelian subalgebra - - Returns: - mtilde (List): remaining elements of :math:`\mathfrak{m}` - s.t. :math:`\mathfrak{m} = \tilde{\mathfrak{m}} \oplus \mathfrak{h}`. - h (List): Cartan subalgebra :math:`\mathfrak{h}`. - - """ - - h = [m[which]] # first candidate - mtilde = m.copy() - - for m_i in m: - if _commutes_with_all(m_i, h): - if m_i not in h: - h.append(m_i) - - for h_i in h: - mtilde.remove(h_i) - - return mtilde, h - -mtilde, h = cartan_subalgebra(m) +g, k, mtilde, h, _ = horizontal_cartan_subalgebra(k, m) len(g), len(k), len(mtilde), len(h) ############################################################################## @@ -241,7 +179,7 @@ def cartan_subalgebra(m, which=0): # Variational KhK decomposition # ----------------------------- # -# The KAK theorem is not constructive in the sense that it proves that there exists such a decomposition, but there is no general way of obtaining +# The KAK decomposition is not constructive in the sense that it proves that there exists such a decomposition, but there is no general way of obtaining # it. In particular, there are no linear algebra subroutines implemented in ``numpy`` or ``scipy`` that just compute it for us. # Here, we follow the construction of [#Kökcü]_ for the special case of :math:`H` being in the horizontal space and the decomposition # simplifying to :math:`H = K^\dagger h K`. @@ -478,7 +416,7 @@ def compute_res(Us): # Conclusion # ---------- # -# The KAK theorem is a very general mathematical result with far-reaching consequences. +# The KAK decomposition is a very general mathematical result with far-reaching consequences. # While there is no canonical way of obtaining an actual decomposition in practice, we followed # the approach of [#Kökcü]_ which uses a specifically designed loss function and variational # optimization to find the decomposition. diff --git a/demonstrations/tutorial_kak_decomposition.metadata.json b/demonstrations/tutorial_kak_decomposition.metadata.json index ae7f442f81..0c1bec711c 100644 --- a/demonstrations/tutorial_kak_decomposition.metadata.json +++ b/demonstrations/tutorial_kak_decomposition.metadata.json @@ -6,7 +6,7 @@ } ], "dateOfPublication": "2024-11-25T00:00:00+00:00", - "dateOfLastModification": "2025-03-17T09:00:00+00:00", + "dateOfLastModification": "2025-03-26T09:00:00+00:00", "categories": [ "Quantum Computing", "Algorithms" diff --git a/demonstrations/tutorial_kak_decomposition.py b/demonstrations/tutorial_kak_decomposition.py index 8a61aa3cc9..2d341a1b41 100644 --- a/demonstrations/tutorial_kak_decomposition.py +++ b/demonstrations/tutorial_kak_decomposition.py @@ -348,12 +348,13 @@ def is_orthogonal(op, basis): # # Let us define it in code, and check whether it gives rise to a Cartan decomposition. # As we want to look at another example later, we wrap everything in a function. +# A similar function is available in PennyLane as :func:`~.pennylane.liealg.check_cartan_decomp`. # -def check_cartan_decomposition(g, k, space_name): +def check_cartan_decomp(g, k, space_name): """Given an algebra g and an operator subspace k, verify that k is a subalgebra - and gives rise to a Cartan decomposition.""" + and gives rise to a Cartan decomposition. Similar to qml.liealg.check_cartan_decomp""" # Check Lie closure of k k_lie_closure = qml.lie_closure(k) k_is_closed = len(k_lie_closure) == len(k) @@ -387,7 +388,7 @@ def check_cartan_decomposition(g, k, space_name): u1 = [Z(0)] space_name = "SU(2)/U(1)" -p = check_cartan_decomposition(su2, u1, space_name) +p = check_cartan_decomp(su2, u1, space_name) ###################################################################### # Cartan subalgebras @@ -811,7 +812,7 @@ def theta_Y(x): # Define subalgebra su(2) ⊕ su(2) su2_su2 = [X(0), Y(0), Z(0), X(1), Y(1), Z(1)] space_name = "SU(4)/(SU(2)xSU(2))" -p = check_cartan_decomposition(su4, su2_su2, space_name) +p = check_cartan_decomp(su4, su2_su2, space_name) ###################################################################### # .. admonition:: Math detail: involution for two-qubit decomposition diff --git a/demonstrations/tutorial_liesim_extension.metadata.json b/demonstrations/tutorial_liesim_extension.metadata.json index 3837196b18..1807c7b04a 100644 --- a/demonstrations/tutorial_liesim_extension.metadata.json +++ b/demonstrations/tutorial_liesim_extension.metadata.json @@ -6,7 +6,7 @@ } ], "dateOfPublication": "2024-06-18T00:00:00+00:00", - "dateOfLastModification": "2025-03-17T00:00:00+00:00", + "dateOfLastModification": "2025-03-26T00:00:00+00:00", "categories": [ "Quantum Computing", "Quantum Machine Learning" diff --git a/demonstrations/tutorial_liesim_extension.py b/demonstrations/tutorial_liesim_extension.py index ce62806eb9..220702874e 100644 --- a/demonstrations/tutorial_liesim_extension.py +++ b/demonstrations/tutorial_liesim_extension.py @@ -100,8 +100,8 @@ def TFIM(n): generators = [op.pauli_rep for op in generators] dla = qml.lie_closure(generators, pauli=True) - dim_dla = len(dla) - return generators, dla, dim_dla + dim_g = len(dla) + return generators, dla, dim_g generators, dla, dim_g = TFIM(n=4) From e562b0ebd9a1ebd6ce1e25047f9cc727df1e4679 Mon Sep 17 00:00:00 2001 From: "Yushao Chen (Jerry)" Date: Tue, 1 Apr 2025 10:08:38 -0400 Subject: [PATCH 08/11] Update `tutorial_qnn_module_tf` after the deprecation of `qml.qnn.KerasLayer` (#1334) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Context:** `KerasLayer` has been already deprecated in PennyLane master branch (see https://github.com/PennyLaneAI/pennylane/pull/7097). This PR updates the `tutorial_qnn_module_tf` demo that relies on `KerasLayer` in `Keras2`. **Summary:** Converted the mentioned demo into non-executable. As a result, the following changes to output were made: - Uploaded our previous scatter plot figure into `_static` and show in the first output - Hardcoded the TF/Keras fitting output printing info as the second and third output - Removed those TF warnings that used to exist. Users shall still get these warnings printing if they run on their own ~Added user warning on the top of `tutorial_qnn_module_tf`.~ ~Inplace warning catchers for wherever the `KerasLayer` was used.~ **Relevant references:** **Possible Drawbacks:** **Related GitHub Issues:** [sc-86997] ---- If you are writing a demonstration, please answer these questions to facilitate the marketing process. * GOALS — Why are we working on this now? *Eg. Promote a new PL feature or show a PL implementation of a recent paper.* * AUDIENCE — Who is this for? *Eg. Chemistry researchers, PL educators, beginners in quantum computing.* * KEYWORDS — What words should be included in the marketing post? * Which of the following types of documentation is most similar to your file? (more details [here](https://www.notion.so/xanaduai/Different-kinds-of-documentation-69200645fe59442991c71f9e7d8a77f8)) - [ ] Tutorial - [ ] Demo - [ ] How-to --------- Co-authored-by: Josh Izaac Co-authored-by: Isaac De Vlugt <34751083+isaacdevlugt@users.noreply.github.com> Co-authored-by: Christina Lee --- .../qnn_module/sphx_glr_qnn_module_tf_001.png | Bin 0 -> 37224 bytes ...adata.json => qnn_module_tf.metadata.json} | 2 +- ...rial_qnn_module_tf.py => qnn_module_tf.py} | 58 ++++++++++++++++-- .../tutorial_qnn_module_torch.metadata.json | 2 +- demonstrations/tutorial_qnn_module_torch.py | 4 +- .../demo.py | 58 ++++++++++++++++-- .../metadata.json | 2 +- .../requirements.in | 0 .../tutorial_qnn_module_torch/demo.py | 4 +- .../tutorial_qnn_module_torch/metadata.json | 2 +- 10 files changed, 116 insertions(+), 16 deletions(-) create mode 100644 _static/demonstration_assets/qnn_module/sphx_glr_qnn_module_tf_001.png rename demonstrations/{tutorial_qnn_module_tf.metadata.json => qnn_module_tf.metadata.json} (93%) rename demonstrations/{tutorial_qnn_module_tf.py => qnn_module_tf.py} (81%) rename demonstrations_v2/{tutorial_qnn_module_tf => qnn_module_tf}/demo.py (81%) rename demonstrations_v2/{tutorial_qnn_module_tf => qnn_module_tf}/metadata.json (93%) rename demonstrations_v2/{tutorial_qnn_module_tf => qnn_module_tf}/requirements.in (100%) diff --git a/_static/demonstration_assets/qnn_module/sphx_glr_qnn_module_tf_001.png b/_static/demonstration_assets/qnn_module/sphx_glr_qnn_module_tf_001.png new file mode 100644 index 0000000000000000000000000000000000000000..1e7921e25e9635ff1324714a8ff06df0ff78ca17 GIT binary patch literal 37224 zcmeEN^;cD0v;~z;X)Yzw(%mU7jes;rcXug`bV;{@G)Q*|h~yRN?(Xil@At-df5rR3 zA>(q+<($3OUTdy7=Za8KlEFZQpu)kyVaUl!s=>iM`veCEzl@9sKH-MWuY>>iU8O#_ zsympwdKf#K!6_QMI@&t8+FE^lLR!Su?~)z#5OfR)wm|1My0aJFD& z(BB9EUxMN&tL*{@hh+@=2meE~$O;ZFZbD8{{Jm%9{(_t5dyC7?lcP3V<#2JFSJ?9l zbz*3C#VtO0hYNoWAM0Bd>{<>q-S-Ydnp3`_>U?RjK_<`t<+i!FMByN0B47j}=z{{Pqf|JwX-+@yWl#1un@ z3ZcrE-`B74rQMjhMxn0!`-~F&LML62351KtD-b{aeO!u*H&h{8{tIuNnlK^}d2n9` zKKESThu7nwEpB=XqH)D6-74MO1qnoD)>TT;@ivwq>EhG9Sr31JWIh%Z4!FYRC!z|n zsG6GnT9e@wpYUdJj)yVlx=S9mM6DSJ-5jhkuYNI#|c6yZK{`293!Gs-EV*btC%yZ&2ytUytaPn&5 zzzaZ8(+UTk{O5WY-zBgs;zm{&b1HBtt{tl1I$oVG+DES*ykmV;lbaM1Pw9GueHio` zcH@ixZftAkN-Nqta`t>$8i91~Cwkwqy#|Y49#IC5m!HhQQgd>e@23>&<+NfTU(Q1z zMGfA!4jkxkO>-${S_GCa{9DN%w9_&-3c|sw*7Cp)lYPR@H$HurNf(f;M-$PWp!WAU}C$Wz!tPBlhfTpc-TB=vE2Clj^=ouQEW=I%k z+_?yKvxvBJb??{;uVO76Q|L#C<|E?7-qrkK2*!St2dPOXPch7;aX&iwgB@)>q@$Za zpXzu1*$p!;(O;U9nbnMz+gDFl!#qX(+YlmJ$q>ZTSq-YR>6W0_d|Z&bymc|MeU7V|Va(z1uB3krq*~*g{bvN-vEQ~* z9Q)@n%7h)C=|5LgXI{Uhl{~(kDA*<@gnm0C2^~n;i;Xi}ecU$uu2%ZlII!0ZNf4~D zA~h8V(})CT60O#zFBoCYaCL~In$_5>`~`9E7C*?Di(3_pIuOxb1++(mwa-eJi)#l_ zEYZ;7MY7D~fG7`yMR|mmuA1BkeVP2N^-p42I@G~y&x<_ioTt0t{%iMfb~uPYe5sY= zLhxa9dp)*9cqptih@Kqu74VT5aVlI}_r!yXAMlYfvpW(rw}|wE;^o*uEa(bmvG&yL;u|7!xm+(WOcgK{jKL^fxy+_>kWdYl)3#>mq9CI>?m1 zvS8DFUp4&5Tyigr*VR*Mm}V=yjHDV{orAy5ChMN@6IwdNWBU=`Xn)WH@q6rqi{{8! zyW_@4_}J}vHmeF&Q_Y-PHXPkbgLy^%k6kKlFrwVgH^G(*ubGnf4{$A>%-+bT&URq4dId zY~sJ$dt6~l?%z)O{+dpb3Bik1HaeOs9u91nH0KZY;ZsU7QitS*9OoAWEcTYZOW0ee z$dmphlFl6?$E}k)gPyqLPP&!I9mb!eFL@XKiUl$gau!C%H zw4y8Zu-cc)Mz26-y`F4%qgCsx36Xi*nJ!oKMtFvb4s} zJS*$yOl@m(+&lN}^>>~kMWRnF<0b~}&Mz#m4)$S5rkfMC@b5%) z+~PU{T87Q!lFYEO6sD%x9v{Y)77gl`4y92eE7&V!m?)OG7OAR}wJ|QgZJ4Ce`mN4+ zxhm?q8xtFr2@ZXwYI^a3tMDRnEvhR^XM;AjBcLI=sT7M}pO?Qx7u|4P0NNjqLMb_3 zThT;BsS}SIV)nsxcm>($`+hga$DW{T%L(zY7E8O(fiLS!?i8b1f>s&y^kNo{AKxdA znkd_PVmBxpY$Utf&DIw*VJ3>I6l4ghpZO8RV@r5S@6GtrNirr9k?nHajDJ#sQtrzR z7fjC(%ziP^Iv73G`(!6;ugc%={Dq-T;7Qc>N7XB|3e78ohJ5`Y31n3{X}FN%1kO;` z_4uQD)%91^HI@+dTlZJ(`p8Hek$O2Q>LmP!mkxrGd0GEkzq0bV@Le<$Oyk<2KQ@V=0 z2GsUOUxkDoO=|*u6W0bJM7PV4=C;YgA47kh8`}196*t)bHBToUVcG2HIIuc(1J_@# z7oPl*DOs2z(C^7F4i;e=>lU1fE!5JJOsu2|#%`x=`4n;tKh8Dd&lKC5;N0974CSu( z?~ev~ZmO*%bb?{#!g|Cl0%hY&mu`&V&A*1v4JtX6!b5Kj?VP+7WOGOQWR%W+V{UPj zcHP?*-&gbEf{go`A^l8-`Y#K0)xZ{kMEE8QsxZqo4I3?fHSztq$re@<8IGY9lFLfG zAe9ge`7bi{vjZnK?>B5to{w)sDd%NWL2&I+W{3q_ia%o(AdK4XMxbiu@}Otd`4ETT zA<`WBZq$G>xau89Uy`MqE{-zUhE?FiBij(PS|ZSO1oAf` zqv+h$jZ7Y7%3@R056I9r!;ePHk?!9GnX(@iFHHEF0)%pB_w}C+XG;XWBx6-?L*SeH z?s%ijBq}dO!a=gsL7YKg3P$>17y57eteTL80@Swmfm&(5t;FJ_wss=JG-(3hDw*ZX z-Q)>q|5*=Pa4P(VDI8MG7vx&YOr9#L z2Bm}EI2N^vUM-M-%pU9Cqso_^Z)1;u*T%-zY%}h&<|MlNCGj&da|+>p$*jlp;5&A= z1IRj(R7pB^^Vf?yn$%M{YA-w=c2zS4*z(fyUCO@AOB=}X$5Va|e&KBq6l|4lE0o!j zo@C2q1YQaK0B0fB1>6gEEpaGN4d?aS)cKa@@L&5BKadVHnEzFe%p}LnwSj?+Cq4_6 zf(jV&iMD>@-K5!?*`Li@<>;i1jyE1B@fz3 za|+LxAzSDNLkr_~V+%oMYM2&;PIH+Twt`=^H2%%98GBAy8nk$S({)1^HS|dh7+sQ6 zQuUg!BYPcqJ>?ZdGU3iVwpx-=iSzIG3jhaosE7gf`i$OV+O3WzH^}Jb8HISi*D4Mk zvt@Mk8TW#=H8(QKn3wU2!Q!=_=y%PY!)kzHn0|K?HYnu=^#7(c6l`eBOdEYt^7dz_ z7ZBuRYL@=^9=Xzx^UL(H5zgx%=zgu1i{`TSbMRDnoJbzFDtd)h&V6Wu(^+4SYF&ru zc%xIIUr8W$P{KA-#onoDd>!k3cg@3x?AX_8d&>set+9p;MaGP`u228OW{>9cfOW6_x06%mQv-( zuUJ7oJELdK1=(Kimg#*5bXS{)$~?1eOZhhEN7FGU!rw=KVs{7p&J4rGz$02-tW=B( zS_2^`YA?6(ILhO6H-FLEYRS6eMH3xkv6GEH65z()ai}stvCMH(YRaitPd;pRS3NIn z*ztFYB(_l_lh{a0N2FnNp;Iv6+xvxjTLQEtJY)k_j<#EvdqdBQE)Ytl ztTZ>{gav}n4lhjhV`Nb&C3R{3TMkJ_IFsi7s>fxNFz)TL(1COK3*OHlC#|M?Xu7;A zMUF&7JU**myT57>9?G5%`ZtdQ;$d9mbvT-g`%0}i$_oMQ3{B9BfENYp){w~RbNQW+ z?T5>_J4+6|Yi8?&2Js%Q=;87ZCD{%hzP$P8Gt~)s;+sP?Hzdr^>s>R~tsvT~W||}bFgRu<@W9maZx+Mtg~;JMX&I);0{y9d#*Cm zSI^<#|32YhW2#_sPZ_!D=VN#^;q7^x}9IifwMBEg|N z9ZgLfx%;2G;1}B$@=&f|#CcaWtk;1Vk7|ya%Q3z)Mb88F2W?ee6B#%iz(tOTj*|Q$ zbK!-n6Lh!44oh!PpqEh~YCz zr`^LeJ=;lt>)UZd)YN-1)#w(3x$&recRD*!aD8Oflg8gz&=c5e7Hvyd1P}VX*)|9H zrAFy!WDQJ+0mx2QBinP!{d2fRP_Mma=)BPPlsS~|#wFDCf79LyoZNC3Y~!f=q&H~! zzMxp-iy81s7g3vml*tWjE{^i3+HKk&bs0{I=6I>q=W_GmL)vj*@o%wr5{Y`LIJkvUw6bia*Xp{8+iPACs;5_tQz+Yz+s0 zsr8puXHJEjYvj!la+y{NMUSuA7`MV4OFI>ZaQbTrP<_wS?!0z11!QR9Z@emOw|j@K z?2=+$pUpCX-+5*Eh&jAGLg8C1WHA*hm&o~2Q$*=R8l@?R1xpSdsrR2D#jSTqB1}(b z3_~KtbX18SQ)hWcwgxD~RMUp7PPMGeq?9-QY`wqv2jZUNF32r9UBIFIk6q|sf=Hni zATBz3BC#bJ--07ZiwQ>r(mU17qhP)|B+w$O!3 z9$iXyI;dW07qg>sf!`#HTN2EUXUi$|3;#Ga73-r{`&(PFDPSE%tv zPDOxUXf}963_VhtN->?dio#Q?Ua=4_B$xKlK-;CQl9GlbQVQNSBl?V^rT*oufU6G(*5@TZJuk+7 z(dSEK1z^@e%*(ms9$)cwcHi;Ftc-HrjTf)pmBZ6r>~w;8e=~ZA8))SxD){{f1%^r@gNFXj%=`g z)A5(V#Ubv5!PSTdx2NQO~!-VS~iOi|+$MXM^?%=nl}#m9k|uFM-}rExdOl=>+RZwy|@T=!qi(KFS(R8iG}=G)8*)Dd3g%r+Rr zT2lrG!1y=H*>G4-Ql6jkQ+T+|R~#AY41vUQ=(U#yKZ7EC}MnrAb$;T!1o3xh_vc#bKi}ZMsT@e*M z%KvBmUhzQq_QCxy4H`CAbYXqz7SXO^&OM!x9cv|Vbd4Dr!T$w5T3 zE}lkgs?pK(H9(lyD_!kgX$$e`{qTfj)_-gfI}Q}qJ{D8b2QMYUD7EFaiLmRbRx*vJ zdQDS^8BdUf|BRyJrx8HQ@o0G(RC@;y95E>yYe;1@Ub|D0jxrbK4k3!QEW=e~k45`f zoKy1Udf{}z7@YRHFZ#tdb?)rC7>TS?6qKOU#X3Na5*7ImYv;$gHTLz8DM1^ZAHvu` zEOfVLU)0}PWyGo#do=l4`j^nkf!UqceSg-6H_`&|r}C)QWQm5>8`0kfYz5N?eWqe5 zI|t<^+s~hgd~nJwDIEaJ0(D<7;3u;e)-Z4<$@#iQ=VDw&szwZ=F>-AbQU^`YYi@gj zu)90zGMS?#kXt4TO%wIEegDyR{QL8>EluRh?-m}4k(Cn)k7tdx6c(vfwhpwS_KI$M z^WQZ|(h$A_2#@h)XUnd5$oJ7h#K0w-itdZtF!M@(d2wq!^~}ziD~5=!Powyhby-EV zvBLHYd1PcV94pgw&x-AqdM^Md%AjSoga?$ zk^kU6-TG3|H9rx?=g_!z$b?jb>SYBrXrFV9a?X$g?a%$otfsvr5!Yxp5odRRjHNAUf98Z3*xE}vSjF%ZD`_;ty^m%x<(aj)jczt1m z;eIVs+#mvkrvNNGIcHO{M{_!6|1<~Dfg_2IvK#{d+*wk#WxBMQ&y>2)r@8(*R~t;z zmaO~F@;||G5@-!j))66Ws}IcQ(4Fuav_&+uxLMv$LI z`sdARx0Y7biHcJB+?jlt5Ptxn@>Blg1I9kyz$c{x$M+ptQ@K8OY|_#QX42!y2gq2t#ME+k{N-S}t?1XmNkF_j#R7%~ zEbes1*Q4Y6#cPKNZcnEbk}KBpzy>B*pT z!=YmJUh6C8NwJh~11vg;TqmCxpC)q(ya5@8M zpSiekxL{K$%zQ!J^BeeQKWPm8tBS{kMVSr$&55`8=z`EGTH-}<&J zd!GnIF0mPpuaI(}$uE4Vq^uxKS$9T#NIzK+_SXkA!D|~hsnR++=A010afZ5CqA`Yq zorkqH1JrL7Wr1oeo^JeBUf=5qQO3{S-Q0Q1$&E5@d>+4>@X=FpBHrNHa`>BG=pJ?jFuNXw6$bK*VcJkWtez#o5rgZULxq^NprH+`3 zfJs zBa~7Sc_jc;pYlIgx@uWUS+nSgN4ykkX^~-hyhe0ZCcy~WfHG2=I<*p0XneS^YFnea zzW<6Mblhw1PFA@X0>J^zvYc>}gS4S?*nSFAbKlw))=Hn8@U{7x>fbYYxp4H&?s)y} z!;polNDniW_nW?UhE2oNG&SMI`Ug+8K#XnxDxOX<-~&_KM*i5*#y&I#0l;G>RwP^5 zi(?7pw~?jupHA3iqpX9_ZVB$Fu=BBhxw*>x1z6*KMb=kBzq{8($Set08!NIbGqasu z-VcntZ!Iz-OrDtYH6D$4y>;*aDAf#8@o-Cx<_0X6(!~WNModRQv3M>=4%<(x+ms0^ z?jpP(HeL_jNw=Y-!<_p_V#ZdKc<-Fq>~CP^^q3Ao+s7 z?D-EHwz7A4ZEI~Es&dGbqyU`NzFC+Ja~VaS669e_>+~5^|INy9rK8~0y8$@F{qH~f>gfg$B24St|Y9M9q#L??~o05rzf-QLp14_v=0KGh=(k7OTG${dHy|Ak| zi+!bV^wwx0+fpe>2jlC};Hf2gGU~hXc^(g89^96PkAw#bTS53pt+C7g@OnTOV`%cY}sat8-Dx)YY4H;v1vc3oBBme|geEXi##GkwNxI(pY!Z$R1_` z%HH`j_mi)5fJmbgllpDnOJW=`%UmU~Ud?&Hv}i@YTkUUA&bQDDj^yOlE1u{h+`~LO zNe_C#PrSgX(CC(arR$G!aaL#RfJjj(@=IA)o#BnkLSg0iJI4+27H(QbZP(~nEuYP| z$p9<9T0RH)=vPgD% zC62Sqb2ET}2Pf8AUgDSN?BfGS=Dw!-^>83}-W+5DF0ClVe3SPN_AKqD>9oqjOT8o= zNB#LWn4+>1{^%Ut;0WS@zF(-&<3C#I>o%LlA+^|4$>ci50ZwmNP2bDq&5D_?+go=1 z3=AF%6K|h?Jsdgq7hAj>E_bvoxScH{ir{!NIbnB$?jKO^wOXMG5gMR0<)ANsymj^rq`?4kjhv)`6wJ8Hn+P^?l-qKs&ZQ99gL@!-EZ%n=iv7w|& znaL{zoy!B1#4A9OlXF*C_-HEgDoV2x% zmk!zk*1J=bxSDOx5)VIjZj$g1GSRzuMM+KlW}>I+_?B6^WT0qYZH@NfMxRT8O(F44 zWKJ>`a|I{}2W_9SJZ)zDU5EW;(&S+vWmkz-I_z{M+5{z;!H80l3gCDl7J9KQ(6I7* ze6Xm@47jV-Thz_&Ueza_R!CG`_}J*AhDCdExSYJF@x_5~b@F#qMORe?)F8TdFM%+x zk0VQHDM3$m0bOp*7hgm8P+<;K#1SZ^Z_5ciztje1PJE$NYa3GtVI|SZ%&P@hyXj0l zwZje>|5&4vAsV*6*4)1#gJ~h#gmB0J@ntsUR=CJKE)DZSr08}@C# zWb0M>!+}D1pP>LBscCY!`!?0h#_yjIlpD4W>mrL8sO|o0Sb@)(g&xjWl<<TvnE`mU-cV1<9wA+3{Y$*z<;dY0i$ zaG1ppd;%{6rh9dT$yJ+O_Vbj-|d|1_wJclz}y2Zss3SerR?OXd$l z%zvVeOAb4Ww;ck&*N)x_rm}Flr;o%yMVUyudmUg$?mZp-VPlZzE z8ABG9rG<4w%uMoG43yC$4HZfIu2o?k_nR>RagmLkNv9k^IAM$Fgzf-ICglz1i z0V<^qofkefxd{=iix$OtmZ%zEoW_gJ;|eGY^m8KdwrOgABFPeNop>my5Q`j<^IO%U zm`-=w#%N#(<96sSjLo}#A?fxR%G>#4kCMK%iK?u~K|=7BwzkH{FeQ~OyV(*M%dZYW zzjSd}Kh0L3pC^Jd%(J5~+c=daGGZ@X`lAAJ-e&@s#|Kc2FDa}7w7Wq0<5zqX13G2L z(ZDhY$unSmfsnLg=SRbmd$4ip{N0Rn`%mtys6 zs+jtv69h`0Vl6LHAH#3Q5%oBl8HLwg!_vUleWiZ$RCKwh)lfNMJ|9cEoTycMpgG3l z_A13zLudm;eXz%Gd!5)y!|&A?t9g13`(ktIzY8cnT5~99jB@Z7d@?9+Q)vPOJS^d} zJJ`Hga?tE`w`nKTXlI92-$JbLA|T>P8?OCi*Y`3z5do$X_oZX>@pXW3A%6ZV6w+>y z#_t<8N#I>9hABE>HTGCbwTJ5<782Q#XKx|tJo|Z7H+iIWRFhy`K!*mkT*D*eb9kf%4Kc+km+`ui-mmR`@j}q_Z*^I%r^&#;6aYa82>DQv;V9v>}Wi- zn@e~!peAYkgwQ?+%o@@$1RqlXI#%d4^_YZs@tP_EM*6>>f6PbG=oZ1pls4GKF0BpogG zG(}d}xCFnV;8DnZL;(392VUc)1^VHyeh@vR5p18+f*=h&&WiFpSN`?!Cj2xS4vx)* z?skt4nc^=Hev8#x>cd_$Q+w@t3u_KEnH{^Az&`Ywu|7e6-7_n9IQW4Wq0av9jQD{# ziKth%(F_#Zr8c6@^NZ(wOF8ZuY8qWhC?Q;UW55&C>Q z9NGObt%pl-@|)?|#x2#i&9B&axhHqo3bvuz4)O})%YiQ=?yvr?ko&PnTz|1j-&Yvk z@-$!vf-*5M8J715~FUBo?Rdb%OcuM+dY5C+HtgqB(39sk3fIIsx%YF z#k}i5eVdHcCS7vwcs9W_`^GG#r&tf;8W6Qn484R^YhbdtjLHUZ6NdazsH5T1>p?u#M)bJ!* z%p153s&u2D4(p?9`WbnfL@mg9W|_AgO9L!Sr48S@^KE`Lplzny6=DdlD|3J2USjlxz49RI z#$^+U=Rrw)=1LH?#2OQ$yZia*hTZ#brxMumWm}x1cH$91I3{({0wHUp$ ztK6!^&exWGw%rf(@ecp#mGjhq;kmAzAOW7{{tByfY74x$cth#_AK2cmRie(S<~E+E zNV$1V(BHqLg*C&!0+TlF)lMhqLDL2CC?!d#QF1AC>qJW@Yb%9|n`p{}|hd>gLVOwKr9sjG`2%Ou*E42^9*6fI{xi9dAH1pYy&0y@e54Fb=| z=hlL;3f!nh)Z1)$0y(Mlp!>?ZYIMQ@LmDl)eBnrsBF?>sx(l4fxd^;l<1Ov|WKc@oD6pnbh&XM%+(4F0@o0zIGV4{ubdlL5R)NR_v$9^ZB|Oe;`fo zX3{#P-_L*WMc-w(o0lF<4_n%Kjuaros|E9mY{q~YaC3?C`{V(z((0Y>qQ-3EO)-9c zNe21d0<1y*tZ~R~ja9ZnFGTV4%XNKTWweMa{yu5N0jJX{J(V_-{~PY89!FButD9C< zh}9@-)v~H=Wwq&#tpT<(xp0c*+modw3=+|2<0EPmieY&vT?myvOnNKi3`j@)eHWI> zVB1K)t3s?z?SX{}NoKmiIe?%TGeJ}(O9;Gr&Dw{9#m&Mt9)xK~T=Yk2l3=EYI5~{>gfaX8D{cE}d52P$W(1lH~9T3FwD0~1=6B^43QUK}? z8a!Ub9T-6*c>lnon3zI%u=ZW*j=qNY0~bby6>v~}k{KobB~<`nL!eI|jdwe~7>>)* z^UI(??pr|Qe1vaKe6}*Fmg-^HE4q8{n8riT`q}Uib;^J5nlwx^Q1wtqx(5*{rDqu} zi-Jx_UK;LUeyEGg>tI*aH3qZX&F7;6y@P>Zx;he1tCg?9hdAAS=GkNe?vL=+>y8fI zpU3^Xk61*-yr?|T(Vzs$bLjrF>ATMFD>-hS^JQywgA8(IKB4Z_)**O_4mtzdX5h#ukX)u&-#zDv1s`D=Cdtkjh;UK z=HI_24b7nHJ0zzQl9q-;0Qh^o_A^SEsB7SPD=;Pn0Ymrr_Fq;2L7*&rpYGL4$JcA?U28>is7ie8$4wgsej9NYTUy39Xu^)FDvw| zX+b-aLU7=A&4=M>{m25qk?Jl^y=i353*Dxm9WC6+w&%DD8;OkiisPG8&ITYL1P9eW1h8d*60K428Q3$Xbib%3qLBV!`8Wp^3hNIy z*G$K132@DB1t^<#EPjk=3h3ZJ5)}hgBgUSX+?ah_(a!ntKk8rA6J)~}h%b9|?pqEP z7_a_GJ@+1eFO@55;1^yk{83-Yqz(%!;U|H_Kk%elQSZ9{hR5>(|A3=~0MJJgh@bTT z!0h5HBV3^WaoTdF`|=0!vidk;m9(FP^^KJPo;hE8$J2~;TkaaJ*gRag3pDZ}lQ7rM z!OeHrE-W1ry0Fr!l__fA8AAQ3n~_V=KJMMTQO?7qrnvAeEmhhC4R)Xg#-2 z{g)*cc|VP+I&P=#1Ery@9cWp*`bNkG#C%eI)nGw{?&e>?%_6c~u~nD3NCKjLwZ$(5 z!nVRg^MI(ls7^pyLykrI?@h%aY^BE?ZX5$dvdV4vuuo3^|5hwZmYW)fji^4S$C^!tAWf4 zv&aJkfE#Y}*_8|8vy#JU7&u)hG+D<>fikiLmiD=sct2g!mMh|QQ>+stCnjjf%H}F5 ze8A?+dCF?Vu?ez%f(Hf(q@(-zXXXbRcLW&Ep1ZcUy1fRvg%C;WaTzYs%5bqtf<*xH zQf)_Pt!Rr!MZWDcxAFtoIL2)j3Vc^~wAOVJ*seXzqtVr$yjuLNhT}#n59(%I;>fJi ziC;(eu_m49Tf*V=d$>y9HS>Lhasw|iEBJnJSVnXnTItShM}e_PETLoaH6yWqE5#*i zaXWL_a|J)-zQuj-Tg_VS1h_A>3^kCX8T9TTCZ$2~)}NjfqxU~sG}8#d=tU~+Q8J4K@Dhs*JdYX`ZO7HrW{kN}PmRJ)NgIzv1}19BgH(H&Hp*g3!I z+^!Q4Y*Ee;*J=oof&7RtVoM*+mKEx4NR$p^<}= zN}gcQR+@7Ql7F_4MvRJCb===Rq|@SmkY)4Gg$u;)7f6ltns0!B(1QNl|3UP_L-TEe zx$4F9fE&i4>##TTOta`aFJ6~4wh(k`3v25K0g5@?hA_%FwQ*eek0Z1~4JaH~O#Y;r zZH3;*8Hhw169G@Rywk_VE;95&z$d6`rr;r4~3d|;i#H>`4kDb za}6b4V%O zMfeFEs{G5+pGql>@7qZ42ABJT-uWuks({#W1@VexUHVIU6qB>(r#U>EukWH@tX zEgTuMlS@&P+Tvt<@;%TN&gCroX$qRLDTvkfd>JpzoO|wUsv+hRI-P%ha-_r@b_cLP zc58#ev7f>GZZSkb}*#KT5y6pYoXdZC=wsE~KJsn!Fl@m2dQM6l(%dd_A-G)(#h6R13F~MIXb% z1}PWSb>Pepupwyh;=^Q$rRQTQ88_BFs$nfV@FMM2q_{qA$HwpThuP6Rjp^6PG)P2u z|1yo)z19;Qy{bm3jN=9)n4^Nt;9An`-Djg0K~JthH&~_3AG_@etxg{bO_UNvBP&jN zHcdpLE;m9q?P-ijkBRhAz@{LJFFg4e*6lKUc<3HXVeOjMI`0oL=g2 z{X}D5!N_suL{E&>BwGhD!ta|;^a-@rjXU46LB5fjB)%!dpywH<{mW=)apJ=`8uoq*f#)k@&VBvZ1+uQ~k(I1m#W#sk*?h-#yz~AfJ1i z1GVBtCwh|5?5(6wur#m7`))K-3?s%AkllwVDootudEoIkbZraeK2@CjLU`Ng>Z;W+ zYL-rm<=+$noH*hI-mD)srnI6C{&cVsy_U=E7??+@jB+>lcbD#vJH=47CU||Xv$Zw; ze5I=m8?rXTH}~V|p*{?T=ycRwR&omeGO~2YpEsvJ_$<3Vh^HjftBpaOk@_2@2%^@yD`;3}wkgnj2xE0DmBdkh_3&J|)yZ;Ik z+vhl(9J;pa1xRMKY`VR9d;~UDm~N+XoVoYe5Py*v~HW>U@sJV;cW>4>b%^Lv*!V4i1eB?JA(%g_9!SUh}6&_84b<%JGp z>~_0EpE}v@1d;bp(XSM2{aa7cvTZL)>6nK!OqIS8}U{CUt; z;!T8A_QhMjfFKIswwr-%(dFRfn#MTSB@u0zpl2YM=dmwGns*Ue+93%ZW}8V)pW616 zVl;DFGs}1WSNW7ylGgeb^6N4f(@zK|y(1hGZB>*IW8(=-Nj^qN1U`2KETzls=kh`f zBo~OET}IxQ_KZS?LD68#x27+u@EKWZRz?P$oSJ;vNO}VGI-u|R;YI)5y&ubLeZLJq z=23VnP)~>6K0RlZZWrtGunFBfv* zj{M)pL2H2dvdcc}DAPF0=~5)m#__Uh1Or927J;fVs8a<=PG2gg)2Tso$#rpX>`39F zjy(6#vUyhA_coF3949B3xkPb)q8-ZLP*Kbi2Qs|m-0L3x^691?fwSw@EFkpnyF1ic zI&L&l2R@r0JgWrrYb`(+W@M>sSR2c?0ppO)X_5N9K;LX2>%Z~5pj7*b8i9hb8WXwmUo;bW)Z$Rr9c)xp@9!0Fmp*MR$eG z7;hdKn9j-*kC+0ZfAiOmI$+Y^eR47&U$Y9{dOn3#pDQ}*;g$i~YHt3533$FMig{!H zum_Dm^L+jHUI2N6Tf#SKTrSTAvso98Ll zDv(|PLkb{+R146MC4`x2L6n?w7oHi3ij?c)vO2Fqqjdz0U5s)Q0WxRj*1)CQVl!+J7++T@><;`R7h z2FjbwVFUY?q}tD?LnU7zam}$T@TMGiq}}g8%4T!)li|pL73@ocCNT68m49UIDoL_k ze4q*u&4K3V7G9o8ZRc0VRD>m0cDEyx5ExB4u|4u^3l}s|fjQZgKro3)ezMSK!V+7| zKWSS>tao*24fg3@^Qd`hYA5jbo&XQCLHK*mUwuu-ldjVz%t`BFRwC4_q5Onh`E==m z0$>)01xRb@Lu?8OoM`&w7SGna`<_(+rw{}1Xbw(qLtx&&L}OItfkmvPC6rX752X&3 z`vj+VnSa)(ykjC=@d-74J=h;&xd4VuEjbj&Q-Ns+3<8vCiB=T?$7ji`qNQ66QCdqs z3Waki?=fVlm&zKb%bQtd48CU|getPe+T?74-<9(KugtG7Ml44l3ILBi zn7CWrWDq7EWB401Du%p*1_pzLR=*avk z>X0sEEp`$d^;7Q7WPBY39Pe5iJ`$hmdw{3-o%2&I0%nG#Dl1+!G`6a4F@t&N13?>4 z-$hJJGkkazYwm0RGxia`8!RyCzA{h*2Jv8cLq=hD;WHr3kugfVldSOr@_U}83EBwd ziBHIN-Spt1VAb>4DZ2raE|`}3T3qkS{qO{X-u9MGRMm6fjE3b|4y2T#MV1eksw zoaxvhnmo0|f$7bneqp~86&5$>8#Uk({(YZ*`~z5cgq$zM8e+2k^2SgcWe?2-d}9l+ zc>`?iV0bEG;s<*h5 zw)Hx9Jru5E{jM3*Z1Okx$@g$dnAEXgKI%BGo9TK-{KBm*UgY^$?%;=QcBu=5Y*(!L zI`~k%{XJO(pbkvkEmYHu{jI9EKP0EXd*whUQA-N~OD8H;liXFnJ8ut?Q!Y3Jj9GUq z^a1r7oNQUiEA0PjkKZD_>U?03S|L-v{WWvYqp$Ur@S!#q+1znU*8STi|NTQPgtq8h z*>XBUYEU&5VXi&!-UK@yE{HWS{CYD+-ZRbD6qh-0!aOcrclDg8hfQuE?xk4Hz${XF z5Ah)U8Lv_>kIEa6;#ubff<#ag>!p~J#g{lVBWv1 z&?-~77I(>BV6#d%6C6AnOFHEcMm=Irk^2+T{wo`TZGH@id|&){$GqHsn?KvlKUGw( zs9*vqbl+pAkU`cUPR@&8&pe+IaNO!jZM<9GeIM)B3bn*BP6@3LL}hkkAu&6l52 zRz?GB6<3;ZYHO7vs{`|#vTC%BQ9(=p@wwF79b&?jNiX}f*+?*M&#qXr=$Z%yPX6&H z6#K0T5jQ&)o;hv{;$A*lTj0v}T8{n;^Ce4ml^Um9S{;3q6S|>#`%kEdR7> zyVakBFLC;j$g$qxBaR3S#hhfK@NJK~fnH;S<|z{J0b>%j*9QW}^}K-cQn0(PGbG{$vy8Lql-+5>6wb#0zd*_qHrPNV+JmkuutlaeXxYBbqTyRGq zw)qv?Il##xz!=+HipNxgrc|?h$FI@hMynG zn72_prSd>k?!eAZ0y|bWz-SV{7^nR=zLxvsIB#QKy^`|toCVQr4sLUr_9=<3#SyR# zOtDHEd(Q`gNem_PIl#Wc$U1~@-!=z9O5$>gWo{RohA1*G_Rg3yNPb~W?na-HT?+p9 z+W`C#;2e_>B#heQ&zc`GQw^N$6{XNRd?_*o)qUe~Ej2i&1^z^$T(9LGZr|4C%cxv7^F~ntv8*Ls1;9l)Nyuh6yVD@|N&eI`6Tv^lzU%-f} zcQ>T|3N8*MchUv~;xz>zHoe8b2_@9+U%RD$%a7y}ZHELg2e_=o?JFTb2HYOe!G#Kf zx$6NZA8pC@PSWUNIMxkk@^fe-h|zZ)3ApXm)A3D*LuPe&7q^0QC;{j9qmaDDWEDVi zwbo{?N7rgFKKLF9g6AhTRQaEUaYO%MYrjYnlPJJKg^Znk0Au(Wj1AkN=3ZZ(ybgur z0>tz4HczwLW-edE?{265M)sdN*qZ6!sZiQQM~3>`wnIz6N(2hIBIw52f1QAk#VM~f zGX2Cm1i&p>tn!!b#in99<4*F~3}Ga9-y1x=hi8TMnwkT3V&-dnW8?Sdx%n1#|8ZeJ zEizspBWM`EA*lSony~05IAnGFQBHvzLpPwjE%-^Xj2?QFb+HY0G3MeNlEv$DQ$rle zClBJ^LD0C zm5DW3^QXJ`mOSMdZdlele?5g&A8ZVcJo&Od%uIgyn=W8>N9}Y&{OZ+oG}v}oZ1GP2 z=67mS`+~WZh<%7mp}f;B!Gg&>L{(m(6hAgTjbFi}(30lEliHta0`;g|I7vgB`%XT8 zG*3M>Y}{9ILGmNufxsbSD&|wqjf83hCbnmh>$okOx66a-3&L?7l$Pw9nzvt{>!@y4 z`k+pAY+t8^!9d!UHt^okw#p-pzrS$q-w~}1?ow>@E>DAK72n|1)@6Y+$4acV&fL!bw8CJ zUXC&H=vjo-ZEv$@&#|z@YvF{TPg{egs|kZ%#ezC17mEBmq@0 zAQJqsiDhhfejAZ~A+BEy{?k7|^-edHEv3p*86fGYWQPnj(>q5hQn01CMd})|C+t1n zHka;s%rDi{(-2XI%zu|04QfrFygqkE?B&`%7&K*(Ac?oP_UY)`?K1NG4l&o!(q;2j=Z?q%U**4w5K(8^@_|${BSt=2s34yv`?v{7r=kRKJe;e|@j`q8t ziT60fVC6mcfd=|t<6z!upo zn+b>y8|X{ZU)p0BD)gnVUGE}mV*Z9%hzj2tx-ba=x!f~O)Y=kdR@3Ns5~iEVSg`D; zSeh7<7@W`CAG8);drka91Wm)({3?0OHGNY+qteHi$t5C*Y|H(yuZ-kPes%x9(cZ0H z^InPNF-7eLsIgGw@@98WxFhciyJh2X^I#5n1a>&%P=5bU`*rTbiQ+#Hb^^%_@XV;- zjp=7b<8QyD_TXRkq>N75CKp%0QjWY@w%E@pEJq;;73GMA;+i$`#bqZ_{b;L>kv}i5 zPxKogZ!y}!^*(3*^)XX(}=h4_!08J2^ ziYQlMV+&EM3A$IZIV|L}8@t45ISY-jA9Pxmn1^E5@O&&-E)H*WG(07}J40x>C(K0? zLwIPQ>@z%wqzr7{x8|_wK8x(X1;dOV)#H_7){j;tF6>Lu5;@X(pJIis;znz<_ZfDl zFrjYez7o5-jVaTgR}IZiOVraaKWCX=X^-VKd%nNmd4)PBt-J>f1~65TnxAadY&+O` zLD$*9?gU-kl4nlw0l_k7QZrG)b2w04<+t>GR)cR~@Z!V4zui_If5T>KO)0dyyUpl8 z-j(`7^Q!J%*@oxv2!~K9LtB=qp>ZgJaY5xb2)snG0*q4xrTaJpjqw1cIbqlz537w z-f-Cw9X6(e8_Lsk@&VwWxuMJF&!sa~xt;MvM0LNtxy%(Da)s@Q&3kvNs6;OC*eo`! zYYuU@DWz)Ur5s%Uj&$vflI2T6*JBm`&LkUgv|L%YCz!I?K-YlwauN2bf*g!tE|O0d zZ70wG=nFwkiN#1r(p?~xo8U!bkpsA0d8>?bMlr-lq)ue?zHN5-M%*~mvznH@An-u( zdfxr(6WbS52B`OzJ{#$)4&m%MA}yN8N?frW)fdD1KUul$?1;$c@QCF34(j@>q>n8 zXW6>olO8C)pIFW`cmoC&i>IKxR5TL#*SgN{X}cygTe}>eXw*2evE*`on3r0Pwr35U z7)i%Vp=((ow$?2vbyWC3%mLcIhIBuMXH4_|G08=`fPA{U1C)G*DY{DDC5t%(a$WRi z)+P2dg2jhhdi>dUH_!V#E-swD^w!g;oTL|K%Y^j7q@ejL3b1;m+oPQ}Q+Ut_JXIrB z&2HQz!M|~#4aI!65=ZEFo^*c#_1LEtu0tshaWKMzH>FFK$1Hf2y)i(Sxl^?|FkXs` zUlg+{lY+vJQ2ADAb(M^L5M&G6s8A>Q(&~3|)m8|H?WRct+1K;+&Avkk==h#xB*9Pe z!1Dpxxfpm21cWa`|HNJN3fX)ZS+LG^2o~pAj!vNTJeXrRIw7x3nO-a+BS7-3(rrI9 zx?XdcK8^96=-C&R87<>lq1fWrxIt_tEQY+=IY#|JCd_F=OG)}YqC01&pj5Wr;F##{ zrunAXmed+X=wO0Gcr1>uq?JS{x$I18T;MNT%NVHQ{;)e%ouv4~=C51S0p4cE*p+LI zzkC(FTZ7W5LAlLC>uSEIS&z_2!uZQ__qjb(r{3K$|3t<>`>0~b*~bJYeNHaX7R2zr z*Sq}394$+@eAGs7@Pm5EKu?to#sw0+KGNMQ?!gwSc&fmMK20gCSnP z3G@|K-u3`%-!mV9^vL3*cuE;hciqkYsxqiAGF@$ z0NR+P=b6%oVe*;rCtq^u_u9Ytjk^NvM#E*vAKONQWFh-A2_!O|b~DfSlsJ3xZPSWBn)j7DaDyP4!ioh-&A!Mt z)$i@DSd{pZ!^^NcsOje<)01RtR6G3nx++kpeXGFg>Lo zc``&^tshZb9f{T^Pd$&+tV^lg)oZyB!N9R^0=ya+Dp`s@iU@LsqOwJhlk|1$-Ax9WHJk|~I_l5-aJTO6<-E)vi#98M944%V>HD+2J z)6HKX*(XHPCr|ILSk5g!Boy}-`kD~y7|(%)?;>Vc0WGu6C+IsW<=?XNtiL((Q#q%DZk=EIcIhD!QCD&@cnTt%TPBIvz8kQv zVczB2_Ff$mk!$30$9}BE#iDp(c13LO0buOF0=4Q>4x1-Btiz$1G7E7-YHP`Yj@wpg zpETDP>B*`L7r0?V*1~I3*94#1F#k4-s8XpQf4eBxkRH#6KXhxMSC_qAi#rL7g6}cU zOhf|;4eiL=lHSIFuc~~c(;_OP-|m$TY$y#aYzW%LE;7)0n&WgTxXkkwU7a`0JPkA$ z2jVA10g#5EFQo>PtpD?K4IyX^P4jjYuF!+7@g%MT3kUr%`DXX zc5im7K$r6?2hlSqY2@WBPSWook8^X`J}W@2na)k0(-Ig2hNiVse@y?|ssNv5W@d6iJ8=M3T?o)b1b)^Eho?hdRbdaWVd>e zr!&slkH$OZbxfZ-gG|FmPgu7Y9fs;d#p#ghZT;k)T`*Y9TK3P2egagdy#P4^GrTAs zW)JCMi@9`OI2t)&enu5@SR?lYuiB{tkIMnU=#B&M`1WAH0tVQoBUC+|JU1Y_A5;xF zdlN;c-saT+sy(e;c`K0vDU$d236UQ?r@9^g*d@zy_$cqAO|h3dlrX6?1+F@ts_x~# z0WChK81pootJ~2p23cP)ochzdRZ|_1`daT+j}DXtoe}uDVrTrVDaPEXjPChRa z@*@CW5HOect1j~$P^`i6>T7C8ya*NdU;iF(sq~6dG#TRna3`fuxH?qjgBx&NaeBhZ zmv#Cqwr%9We}Dy?2zNYNjFE6eY5U$$-YAD9fR}X+_%jL~86*U*MFU0sT%Zwz^i-_F zk#Vl(6I9Rt1eG#EZ|r{z5D?5Aosw8e>m$kn>lp#QPoOuJ+Q=fvwt##d@UN3P2(sCp=iple?C! zV8#Sb0+JruS)9?4<~e4w~SBe)vIwv(`t!6 zpgZ&MdIUl#r*6BulWHcl-b5CS-`CWPPN2RpYkAN2U2vNF@ziuufzF{AS>OTd%_;?9 zt@WF=EWMW36TI*Maf2$kmOG^J)T;%Iq~AP*9opR!iHn-L3zTY^pzJP$H?}Gc+@F#y{SK&-`tzV^0(CCWw@ClgaD4ovZX*L+0 zIJ}(m02$0}3gUx1$RG}y4@{7fY`|2mnpbnv7s1DfxYV=7_V zm=kiNX;_S_N>zEh@q)tU^fMJ0V+x7^A``G9Z3)j#WNa7TW(drg&zNoE#~;Gjoo-g0 ze%>Br)pT~GG^2jQ)@xyhqfHJuKUPmYxEz&Or=s_Jz*raX!H#eO3-G&eaThH=Z9&VN z90>3jiR6i-#%;5TVBSkX#9!W#*Db@5DLy(E9Tj);xE=R>_7OTeOW1SY}hLT{H{*9VT4y`Ahd_lY>d zpB~LF(%VX8-iA27`#H1O*6`Y!d#&VGhCYLvZ@#qyxD zaONfJpH}sK*6M5DN`1QLR3kps%XQJDZz4Y2Mg6x&{{#=_DB-Z_c%ZHSNh)9NrVVc0 zvQ+Fo;cpN)`c|#>d>5DqiQ;!I?Y$N~ahF4%&CNo|8QHNY3k+|a2G64gR&t9=ils_Q z3E+XH)gO01g6ii@>#e5E_EZk2XIB|pmaVq9i*ERbk&s7%Ge|28vhr0v8TSON0Ktqv zM|VV4*)@t*<#;^>GeB-YPUJcBZ7Ncp`i0>R7II#{Q9+JEoKOUD%2ZV%_5TH{rqt z$QVxBkz7ZjivuV&!d^q3<-`iN3tVeNn^kqP$sm8E_Sg{vYS}5@`>`OCV?sZVQ?D6$ z-h7c5Yid<0Erv__&o&Gnn>|lx_0g4bB09T~iWNV|o1nAYzlm=4{qN@wUc$cpcrC`E z5_z59o}m!wy@&-qIOy(3(Pi3rl!5|T0_5OK%o2V;kd(l z-%0Kb&AH7kc#5nKgtmVNR`ld+0P?ed4!rn(4)G+=utvKHJ`@w_Svx|Qk zL`s@?;((GyJX-Nec0=6D7p?GRg}?8C`PGJ{-fCfm!u#aZ9$f(_rvx%|V3tg5<9hdo zy9{{?or5;xdq%g2sbApy_k%7>xd!`V=G*El@^gMp}a5qdWRFFD^WMvi?3Xo&ME0GbEkjIKwYz2jLm`M*&X@6VT)CueyH~ zvlfZ|W`3D40y{DIZ8i(b?sT|O9W(wzpr^!Ij*FoN#xxSnvkfMU0};nSzXgOD=#pS- zs?M0s0^?oA=aS;s81!F0Nm8q57Wh`{xy5md6)G!ae9qZvi)y3EEe;iX@%+#5%6@hG z7{(=tGRTim%zUhm@OV~{`vnM7jM~jgY>~qW9$o+w(u@05z?4DkB%%w zrZchX0v>p*{OGFvNfAbTK zK8(#XdoF{iooCF+Xu((ZEiWJ`r&G-_9b@)T=9zo*v`0#U(Tz)qx|!7a+B_!@0)wLB zxwajk{)O~R?^kZh7@aQt&|y{27dU?7ipp((jK1_F&$Aa1uo{}zdbJe8b=C&jIUl#i zBteDsJZJt@aFp3od283=$Ikq+sLl^cp~uY?ggvcfz0qV9NfJRJt4F_0mxpfW4Q13P z!X2d#pYGU-N#2jUonL+(?aMu-yz~n*1{E(Dv&+1;(Alt8wSXP_Nh7(#Qvm0ET@Hpk?~cth}lL!i8H4^qFjf%-lt4=w-;PJ3MxuIuzWIFyq6zN_0I}z3v&I z7U<}d0%r(N_stNPKWVi!`5T1U+PVB!ItQbDC?Hk#IebR?s_yKLsM^bw!dDP>5xB+X*6)>XR_eogH$hZ*-^&8V~mDp>}%C31a#N;jg?~R?WG%6 z*>xSx=hpdsg_NPzQg%AEKa@T<&tD(Q0k;z(RH>fT^Xj36DOvn@zr{)}X9G*EfuH{K z2(hF}96BvrLDOT}%6>cX2?$1ajW921a+WBIz-YC@q*(xgEi(x3vD-L=c!-Q!@c?z79 zKUm$2dL`Ivz6hi+-vZ(J&W{Cr$4rz8)5yO@?uKvhD*d$QIg%g596(aLS}|aQG_`)y zE7%cu_it;nX`X{wx{-OBc^P65UY*xXi*84^VAE7Vg zB`DL6R3!7y^^cz0rB`(E?{$p2<=}{^hGdsWrfP`es_@1$2HD3}FQ0^qw-EXVsy#_L zJ|8RqStA0P59S+7sFVBnnV>jAGqb7$PsdG-iC z5B{J@H^s**w5-z@_sHvA0Ykv+q(p}uR$06N9nx&LM&?7*9;?IW_{z`(j-YQLJIuS= zvu5+{PB-1=ebikEFF+G*m14Sj%rZP{vH#{0O3`1dNA7`&)2+C#bLN^}d_1FF&~g@+ z4D=N`{tA_MJ%UZXFYz-MYP>_AuYs}(Xa#4F7orp>Nti*n0ZORANfP@wMNxBR_K zHR5m4`d_=ZygO4mGlLH?bx(Ek=5lIABDI)14=4%#(7;Od!pV}?dQW90W4>+Ys_*hG zO4exlQR*IJdNtLY3M2)odzmHNe#~fmBHl`rNLI?HP#jlIsxxl9e3LV|7y`fpaeddQ znkicPlG04T>j4PoBT#h{O-6l1TxJ31*TcE19=(6u9|k4NPdZKTm3Tor#eS?~c&O!e zBJR96Box^VPJsfGTAP10wyE(*alepiNpg3$D-qB!3UKHxQ`;_ts zP?P}&E5tVSa$b=;)d;xUkE1r|we!=wP=$xdz}CR7#fQ9`&ofGH@bVH*fZfI`vyTnP zO1VAH=|SAYe4G#X7C;R3&G$yzrP7+CtOClVswB#bw85reVsQq|9{aI>{lczq7X=qg zv-^O_Yb$+FUq-|QI6P7KbN>bc)ix#Gx}ex#zU^JdehXs|yUMS(o0qx{On2A5WTD1-Y+Y;1NpAOVy36U3s25-AK!L^=YU#3L{SN z8TGm6;cNkV&yE0~wwA$v1^Lp*tyXfTz~k0DzWJQhwX;BPB3A)RsaZ6Faxp0a=b^+t z(o;3`WQF2qN*Tpq$;)utz#v9}R3sFXUZ%s|@piM*A=amMFibh4q6KS;XZ|Gyt6Q$Drx;@iR^^=3S+L#M?1lNFPT$G=$V^xpl(!Z%}!7jvH`Xh9(@)A~e z)(iPAuekk*RDMEB4a|0=y+7~5$ok6zHf3Yrr^n~uZy@YNR8{&7E-mmUp1I~?T~4W9 zH5(m`PZAwQGL~zXxVh}_B>9<>HRI1u+|^EfV6=JXXYty}F4V_Wfjr-XQK>b`5@>f@ z+(&#!_Z5fo%N$Drs6d8gsp|XvpDexwhJA)b!|eQWwCU@wyehy)2$z{c?ygKZs*2XyxDs+5p{1{m~lf938n1f22jXruFUgM~-i<$AvoDQY^3gI0^ zZhPzPG(LzybENF)uwU7c9BwBUxQQgJpO$d)d#?$D?4gL=YhCZ*BHuz1vzVzavdl+T zE8u{M-|))FazLv7GgoyI)LejpBjLY(i82W zLc+>+uGT_~25`UDZ*z9kX^k}x_QjZ{i7d-CM5KOvnM525`81>Q^!0pZKsm;)Z8Q!hda0y_1BbH!q~nQbR|bB8tix_qP2| zLJ-}<4?QB3uRd9s_#|G+Bf6Z{05<)PfFNoWKaDxIv*_nC_91{h1WBF}{YY(ASp%HN zN1QTMM&^ry|CEt`=(Ezfg_pG!CzhH>xNhX4_HfLpbHPaKhE4Du^Rgr`bbb%d+>!BM z$z}S1#G@oenexNl+s51UcQdAWmu1xnx7YOA4C-3{To@x)TsC)GmCate=p@zf0na@t z3+_ku^ug(axM^*UJ*8Q^n%MB7M-AE$tiMY=E&xToI`J9Wy=n?Xu2Bhj#0w&e?C0rR zZtjLXG-vwPa%+J4 z8Y3nKPB{9-lp0cZD{4~!q}yGqXxhZ-GNO3EdU|Pq@Y8DHXrm?QWc8Lk+RZf1e3H1Z zbU7EPFs8Y@x(;pi@oQ!_wgs1t=z@lXK^q$OBX1lHbzg=Xb?}Y9mw6h+Kz+NLOz6{u zscNVddF>UZ-bH0w_eLZ*sb)o#r>9GqLz_2?%2j24#!SAAaY!;d!zGxQryN!EN&^>d zG^6Udt;~iioNPM24CdPB97*`Xccf1FqJ|Y#yv&rz)ehR#wfPS< z_ka#a&rGu@S%J03t1k>;PAU^-zmU0hd>XwO4xfh&^?!H?hpUyuY-sY+AIn`1_KL|`(I)WRY8UvCNImt(<*Q)04 zj`Fhb$&TzLmWb{zkzxZ*{s!G<>(B7(J^FlcC_6mSsPuIo6tt7Q zTnz?RE`&ku{I!bie5 z=ZODCJ=X>EVWuHG8YYc#$of+=Zq4%{NbwJ=918#pViv=vv$NZ$4sxJ)Lnn#RFKkre zFyuT#ZM!tw|AblZ;>heHh}SK4R!ic#k6_#IOE%bm=?%T#>UYHHZds-e9}6ge^u~BV zsPi(Um6zlJWh^9Y#SoaS_op9J`g6^DI`RAhuHpk9&E6}p$k8%9R!2tn_ zN6eFB{N)F-T5$c)uQ}}5E}a6ZIx({!Oav73a~hcACwo^kT^&-%F2`T2U(8O-`~=S8 zeD}JPaup`SZgtyqUgIh@9E=d2>|hNTpJ$kK1C@8#(cP!$6NPNAc9<5}a4p9yi0b%~ z4zt1kcfCvlhPF2|4Z#|CX{_9L%MQ~*HTwO;`LF*SNev9*<1+=OqgmbSCU)~nc7+0= z0(dfwrSr>LDaAKme|?W2_?4%fopBRKi=i9Ho*^-V0lY$C)?#pgi;jxfi@ESHi1sfvqoSpN*I1$nuOs6cPAfodvIV>3~Q(YO0_?vg+D(Q;;6zO!TR?UnjS+ z;I_$@KNcen_}0Y1jkDt&zmz5&7S=g?28Go9`i|?UZv?l`4W;luQAbN_Q3Nodgo`{b zeZbVAEN9gY5Ib`rcQ5cMN)h15Xysc0$h`7ta~|JmPNJEDhO)kq9xJCZ0v@t^Lyrx8BEk zH5tDo)*Vzu)fOMlT~7zHGV;vnAK@?VB9Dp}oK^2 zf|3Q?Kta%@o4LQ>+#VS6*Kg=DvRQZCgz=hKItmRwBMdvVDCvpmpBLe0qyVX?w%7|x zS!pj5DPg-S0=ycXb|+tD?RJ+Ut43=?_^FgP;c_HMroz^7tyX>lim_-+N%w3)pbm3f zt9`Sd3|59qRxG8>-nHZbLj9k3yTD5%T^tlnF#LWaaB>58_;m@=M9??s#!!u@DZ2Lw zGi46!72^@ZT7kc?%tl_@xYdGud%QzXCpMjbDhmT?0Ni>nd%DH@#PS|%p1Ds;QNU8(O(6x-4EImhfwFE4PL>HDP%kS@Q8a9HEF`i@I#quAN-qKrup#S2I#^R(h-nHBYQqYi1Um` z{5KSQs!Z(Rhs|ah%&r@#%9J zcNbgC5JFhrw%QNMx*95De8;SnyR_YaAR5i|fGX6-Fo_34k?~1(8+$W#lrLnnwC7X2 zg4d7b5=UT^(dFWL)^5xK&YD}il{ZZd)HV|e3*3!gkS3#i^n6=RT+3>;PElYpHN zDY5?+^F0JnbXIET?eHt z3o?_AH9>z^dLt|-%^vI&3DK+~hIN)abUMcyNNjCc)pU?gb*?^~68@)Kk7}~m7g7IW z@u)IdD>Y@JtyA#!4ac8Oy|~&mx&8NuplPXKGI!-=L{dBTawpEf%QT2mb04vHAx^4! z$wiD-OAUq;+fA(+__s3~R*c)^U)Hs7Ty+}94*ndtdXt&20%~52@g}?L29IaDsl^qL z9>oj^?E>a_ngadFw(o<#lm@mbyC9)+3~>_OPNt9b(91=_;r#gHVv`a<+Hl!WJb$Q9 zS9u0+nv;lVE!i`X_AWVnse#3C2ddq{$#2$4|9$xE141K*0&&sbC`jI>vl!t zopVmTY+T$6zl3uLGW#sS>D3-%K5cWKs;ItQ%8bzSQNZ4_e#duv%RCtN=CZV~raISY zOStP|%gi_(Pvgyw0d-`X;1m*ODCL=(>?}Qe39$8^ytj9%XFS{3k1>83OpF zJ=TW&BjJY*o&kUO7Nu*Fps>I@eA0*C*H4`OqO>dz4Gw5#B0H*v&-I_rhC)cUgjJJi z>I9#b5oT*Aq66s8{g_KzV#i!p(z?NF#E~tsHMR8fs)2+q$-F4@0xrv=c2)Q61MZg% zsW}8b>3`lWr>+^ycV~2!{uMWV9uS)+b&vYBr|6Sj2^#*i%sAZ?BfkG0tP8A9|Nj{@ zxum(~l_TnLmQ8>X#c4SM>gWSr_--ki?}OtR+v~Iy0)Gd8NmMI-V&p6*j7E(x!U5I9 z{@Ix)Kil3t>IJ*Hg%^>0*`c;m`$l}_@>Dmz#N6s#T1IM{>ID_IihCRhrA;L4|i8E%UH%E_wM{cd-5K>2hRXfL;J7Ae7j93x}+X@>6ZAu6Pyadh)7+sq>VDEp33=SFc3A#< z7Ut^%kN4@(OE^d5$0lyE+ zJ*zqQOp#(9tD*%$S+RN6UTMeF7>D?7dgUkW_6@%wUK-5Fc)~i{9nM+p>OXf~(|^R4 z?!i93@gtv@UUrs*+@PI3g@@Xw|LLPfAeaI_%2g#a{8pd10ucMD$w|P=*{%pq$4W6_ zOZM<#SMA<|4ANEs8_FjKqKK1j7#|&6TEZGV4_l7#RJv2FT|bL`NMENGjfm)zyN??_W8E;-ln^x%cpt-yaEGSMacdZikKY`?5i+q7G-kBdh&m zQ@+!;(8C-^XjP7G%?o$Sxhj%#w0*|l^w;)%T6@0}E z)uNVEYs{qd`51k@*)917Pn*dkghBg6;KX3mNWMYn8>TGAI6r)Q8!aUdt~mWxtWPJ3 zcd&pVWuD!-5S_XN>xOn4Pe5}3ci)Ve-Kt}l(yD8Z;|6FUgFo!-` z7u|YDYUTTGHYE2SQdb%eRdp+>KE}Wgp7{Htu?k z{~8{g0V~wi3h3^1o{pezcHuD8KyDiGszNSDoZgBW=(_J&a$4Usc2x12p3A9T8#755 z50$AtF|X^2F~5#Enq}B|9In)_B;WF6HoEwnGzFnaY{fUBS-%QU(WQ)bFj<)w?ATvY z)VpgbPr}@JbYHp#M^}Q`0(}|cF5qwhKin(7fc3?S`fJ^=-<$mV!Wk0bjt&DBw}L?; zFsVp!mG*1_YGZs?j<*a_TUufzJp?Uw@s7KP`!|FSUM7v)$Wf{xVCFlW;SXb4|E+KH zGid(12?&`6iI?0klR8efBZ#+Z`DfV1yX}zjS%~`5HylFkmN6Iq+hX|dDmqWcC4v@8 z`k>ck_`bO69quxB)ZSiui){Vp zS6txhWPWGQA-ACnovL_&cjr)I7*0tlfrt83rM; z+}(dy?Ll(i#X~290D%|;x?l6=qr$rmnWA2bRi_zfajk7A_I6rWYq_#{oQ(a1{ zvvS$xDnS<^(e}dM@TO0DSk3=ceUx|)%fjYAMX(}uz{BlS^?3he0B;znRh}Zy*inIM z+s~@XQe!BpDQ{6fx83V^!ggNDTa0e_m3jI0PM*CiSkfX+yQ%=g z?D!aTc&JnG#e0Z?wxE6RkBfMg{fyZj`$B@um7FY9Z0pk!iT0Aa;Y&(K@C@L;cpF$a zKf615#m#UVy!bnO?*G|=^th3wiN)wHn?k69k7#Q}Wr9~LaJsFs=;+%0=;njo^((t{ z>=>HJN8AvLM|;1_gDpW6)v7If!_!u45=U$Rpf5~xQidK?P0&Pg*CVR<=bTHPyGwFq zUcba?ZE0nABF+e!T?AF3Ra7aWMKd+Y8)dUdGUk)GT=$1&m?4|!6{;8>&D%Bv6UOey zke%m43#hdZVhXc(i1eSh2t52u$3v!tjsmHtzGnBgpPERJ`ptX(*<_WJ2)ACQ{ip&`kCwc=GbLJgt5rw^TI=|0!AOY zyAvzHrn;MlAF^r3YEe5#fDaTxFWVWi!F)RqYjs!f;L{Ee-|pV?95odUkM{SpR)Ldi%A5gNg=DqW!mt*-3&O41a?iP`se#o{Qpuf-o*9!jkwp?G_ zVbRWhm9E;pgPC0=*Y2`hU5}D{)B_zDr@;x_-IY(CI2-f$z5&GnuOOQir83+2@cps>4APsVwrvK2rS+opOxM*>h-`1^C>?^2}reaF4B zRK5AK+Pr7n-KJl@U3I4`LfMM+Lr;cg-crl0`(wznrQps3H4TnHMAEy7W7l%GRnAYm z3&;0|S%{H3B7zCUSn6tz?WeZn{L?o@tZrGY=plX3hNbBY?Y?y-$5D0moy_Eyt#;Mv zL=KP(_8_$yBtw1oyJXvaj$4eI?1heFObr=q@?A1%3^LU{&+O-4<@S-9+JF(LFUU3b z_f|xWh2e2Ng}$xA_~y5e2olwJ$|d3J3HGtB=GEH-$M8_L%*-JzTjs2Dg{I^R$f=`) z&KuV^@vN!!CnR3>A&P?(zj)0zMX#2OyxK};CQp7p_I?Z&uC;o6L)OG3W!qJ_&-chNiEqArQ z;rVQ%NReYXKC$iM@xpnyH65JCWnUcoot1zE5yolnW*!6 z7Edu=ZfIms545g=_lq2=D+gFK=tEEWfnI0zRwW}{Zt=Vz1BS@ofuA8!7T`DRs;{&( z!KU>NqUOXX>)8*{r|w6~%6d}DZ+CRAVly!oysn;>Hx+~RyN$f4 zNxPDTB;Vq{)$|0nm0b9&aj{hzUmbf--lXKg*ral*{{C3hE)#h`2)A8F5(9-le^NoR zHr>S`>LAJNLV7Du=Ulj7_#=qkp3fSQ;O-54cDpgIWH%jGJDhyCltUgrFf7h_#-Mg~9t+Qz> zPa>x>e>@&B=;hmJ`Rmt+JhR=3v~*-MbdEdpN5}r&<3Zi{q3Fapy}Aq5yPwO5pYkBD z0!!VfcrTm~HrF3tV^2}8JTgKnYI@eP>(z({HBT%NQvDuojRvpf4I-nwl2K?DixsQV zA}A1*sEQ62AL0yrb;?}MhIG(kXm#KGd2`wBS@q_!r-@U$gizNO5xL)NCdYhb9yd^x z4>g>x`p0n*ZE03dt9)7duPWutHkF9&1i=8ic2$B|>~EK=Ug^_VVkNC)F%{=g2UJ#= z>P5CqerOeoL9xa*ZlJ)iapUUhR=ipek%3xOUf;i&U-OaG!dJh~70W`1Z-2@^?CcU$ zwxe}$m$%F?Ang_WC74jUAs_;g6R*bjwx+sAUAvg6CChhHc{Xn^B28P*4z)6KhBy_nFE+X``mpTIL+1`Gc;aQKgWLOQ~J5Pmn?*7?D{<{ z5J5sv!K5+T_(yY%OSj}1rRLVV0 zBMG&}F;`eq&C+km{YBl@*7bwoI8If2@*`!==OYett9b#`QW+$qfSUfUr&R8!mX5I5 z`L}k2;V`RA@l=pP1NxHdT6~kCUivBsUe+5(G$$ge*h^YtsA#&Qw8uJV>8Vm1pwb#+ ztcUYC@Y<>w2YRx|x`m1Jhz8y(rlXZe%c``3}R4C$rm(YpTH?Qupsq|>~x2Z(aU z%~R#hr#*(syg!;r$eMZ zAK!NPyQFUDD=Tof?OKTtwUNGY@gVj3Ye`}v$q6mZl9b$HN4?`O#u8=khJmT!@l%tr zeIdx+ko$aG9a8nq&8IdRP%u?VM@<~;-J&#$4Q-6#Bcbx_bZzNSuNrsTd~~?mw~=o% zPB)kp+VO#H688OuUkI6Rza>g#d5<*D4DIS%H3PHItw78AFbiFoVuVlz`e%90u)5?5 zJn~0Ml*etn$AikmHL-5~1HWvSl_13j9NT;F+u(M!zTWTiDBRW4#^-t-TVAMGqj1o! z7V=xd@?KVDfcL@@<6M1Knm%0;J~f!h2G2Lr z-V1$etfaM|Y*c?cIh_|gMJPwlI6sia4_1yz+wR3dm;L+vXlh7NIWF`qGt2hZ@96CqK%&hnIUd zQcP{>)eoR`JbM#8s`U+AAqKBr=>4iH)#H98uL)-dOu9ww;tM<&`OeSulGJXfG|E7U z3i%CVzZwV5&!smnm7qHt#mj20>%B`ifB(leiQc~A^nHF?pZ{zo?dprg1&2VgT1$;a z8p?0jEpMIiIz;857L^%WHl)e53w0FvZM;k_^b{)arhOkQq;I*LlUj`p4W(k_nR`-q zks5g9B3+Rk1y0XiyZ`ob_q&J8^EtL*NJrw*@^3?U(?x7)jjMiF>`pT`=Di=fgjOxj zxsSwfT`$}$CKNhz-8M&nd26%_ndNj~b+HObhRLl*|0r8nWWy(taUhnlQl%>8crdbE zdlPxO2$EZq;sKygz6-l)J7^Qi05vb}r9)(tVB?)d(p!2MClGDxctfo>yrC#_paMEr1#5=U_GHqNym;()W$5-@% z8B9iGslTCtS5&m@IpxNDNt=|G!-raw-Y8owa1FD1rfQ&0c{^tQ?UT)UPF@xFzonB9 zawC2+FuYXZ)0rydsU(;+gv!||sx7nup7m!^xviWo@|vJptt3+rDg@V?G<(9ma^^?<%IirzrS;4Dcf*@wzjIA_;(Di&lV}UyUc5;WvtuOzR1lP36lxvVB~F+lwQ`e zekSi7gR+bsA{>7;kbvEJ^1>m1h4|>A%%-hz<8;a``A7DB$Ic&(7ne~tfvgHO{v8g% zxfm_SWWXJLmkuHTA9T5XQPYAhx7?>PeEuB>-&aWaC*%WZ;40L5(dB2KqNpj4@2S;z`daM7Wa(S>udl))y~%vIxpL1t!v*oonZ*- zI{W=twt3*B>qvJ8@pPA1ZB3OvLAsr2PPScjFy3g(7=kr}swh(#+1BZhG)mRww#+LW zQqK5~S36|klPZ_A*GIoQ-~(6tcSH}2fq>Fh5W%k*=cqhj#=sr%A9%o+4ij10DB{{< z-5SFuis%9EJ>%UB&g+Uf|2?#-$3`whOhkEj5k|oFj)3QEd{q*gNVfRShh`2u4mHd+MGagk| zWWP73H|t6<+b<7eFZ~I6+ngI=e{_ecVC7jfW1~Hk_uw_4G1g42(pO?Yxr3N^Y!VzX`Xiz%l83gx7f=XEUbb6Zd;L%*|KhA={b>__Mw5x zNd4~endqJc6n)c*zk~5({o*_7HkE1CFg-F+*e_vr;vhnNP~(>^+{k zfs@UyAfNPREa=FU2)vBHdH`U3WAE!k2>_wP7idw7Nq4}T1iUKL&jmb<{>}Rx84}ZJ z{l#MaT-e!8-$*b$pUsn*ylt)%VT{A2W3F%lD15vx?e#W*!q3-mUwR}R70ndG>aoU$ zwLyq_7Q;6H(eP_I+4P}uEeijBW_v)Gql3mS;{W#5;Xr`2?XNj};`@VtS4y*;spq)1 zZ>igFA7|CNHc_@X2JwB2j0b(Y-8mkDS3^7mmSF`cbG2?>$_;wEwf^i<1MYo0#Q6R! zoD}36Ui#(GIgK%U*ukrqE(P;eH9osMUg z<$HPI<$@jmj(1(lD|@p1;I#80`j0<#Is1+kK97yTw_uz`lqm*zNa$C&ybXuxfNs zw|oygNKyC4OGftcEQ61F!11N0| z(V6V40Ic55^DuwYee(bI?qq?ruPyo>&wu{KE6Cf!VEeQa2e}W2zRD=%oZdVw$|b8f zD1_yC+qG?r7T#6hk!j*!SIiM*oom9>EnvOy(GyRzcJ!}H}e zpMTr$zpp>t-oNf&){bepN4Fop-nTy`!gbHbza{A`YI(0e%P}-Oe{#+L@jdv70h zoAA*>a;^to&5S+edOLreWs@`VlGE|44N2I zsvV`hlkevH<@zL8?O|feD0#X0$-_%oKWy{%%=uH4ntcA|M)k_S7gExhm-#U;ZHfG4 zy|XNFZu3I(iY=!f`cJ-?VN}dG+YKmFSzsUeul()(9=DU-`s-zzs`*ulxrJqUZ^$qS zEI7L@eA3PIJ3lri+4z0a=Q+N|MzV47%#_>fQXZaO*~{TGoq;7|bE;Y8@5NigzaKk& z(pr6Tf4#@Iz4k8glg^w`E0$N8|7XUVy5!(vtZL^SFEI3qy;q4p!$05uxBi1aH&gz7 zdG)` or :doc:`JAX `. Creating neural networks in `Keras `__ is easy. Models are constructed from elementary *layers* and can be trained using a high-level API. For example, the following code @@ -67,6 +76,11 @@ plt.scatter(X[:, 0], X[:, 1], c=c) plt.show() +############################################################################## +# .. figure:: /_static/demonstration_assets/qnn_module/sphx_glr_qnn_module_tf_001.png +# :width: 100% +# :align: center + ############################################################################### # Defining a QNode # ---------------- @@ -166,7 +180,25 @@ def qnode(inputs, weights): fitting = model.fit(X, y_hot, epochs=6, batch_size=5, validation_split=0.25, verbose=2) -############################################################################### +############################################################################## +# .. rst-class:: sphx-glr-script-out +# +# .. code-block:: none +# +# Epoch 1/6 +# 30/30 - 4s - loss: 0.4153 - accuracy: 0.7333 - val_loss: 0.3183 - val_accuracy: 0.7800 - 4s/epoch - 123ms/step +# Epoch 2/6 +# 30/30 - 4s - loss: 0.2927 - accuracy: 0.8000 - val_loss: 0.2475 - val_accuracy: 0.8400 - 4s/epoch - 130ms/step +# Epoch 3/6 +# 30/30 - 4s - loss: 0.2272 - accuracy: 0.8333 - val_loss: 0.2111 - val_accuracy: 0.8200 - 4s/epoch - 119ms/step +# Epoch 4/6 +# 30/30 - 4s - loss: 0.1963 - accuracy: 0.8667 - val_loss: 0.1917 - val_accuracy: 0.8600 - 4s/epoch - 118ms/step +# Epoch 5/6 +# 30/30 - 4s - loss: 0.1772 - accuracy: 0.8667 - val_loss: 0.1828 - val_accuracy: 0.8600 - 4s/epoch - 117ms/step +# Epoch 6/6 +# 30/30 - 4s - loss: 0.1603 - accuracy: 0.8733 - val_loss: 0.2006 - val_accuracy: 0.8200 - 4s/epoch - 117ms/step +# +# # How did we do? The model looks to have successfully trained and the accuracy on both the # training and validation datasets is reasonably high. In practice, we would aim to push the # accuracy higher by thinking carefully about the model design and the choice of hyperparameters @@ -224,7 +256,25 @@ def qnode(inputs, weights): fitting = model.fit(X, y_hot, epochs=6, batch_size=5, validation_split=0.25, verbose=2) -############################################################################### +############################################################################## +# .. rst-class:: sphx-glr-script-out +# +# .. code-block:: none +# +# Epoch 1/6 +# 30/30 - 7s - loss: 0.3682 - accuracy: 0.7467 - val_loss: 0.2550 - val_accuracy: 0.8000 - 7s/epoch - 229ms/step +# Epoch 2/6 +# 30/30 - 7s - loss: 0.2428 - accuracy: 0.8067 - val_loss: 0.2105 - val_accuracy: 0.8400 - 7s/epoch - 224ms/step +# Epoch 3/6 +# 30/30 - 7s - loss: 0.2001 - accuracy: 0.8333 - val_loss: 0.1901 - val_accuracy: 0.8200 - 7s/epoch - 220ms/step +# Epoch 4/6 +# 30/30 - 7s - loss: 0.1816 - accuracy: 0.8600 - val_loss: 0.1776 - val_accuracy: 0.8200 - 7s/epoch - 224ms/step +# Epoch 5/6 +# 30/30 - 7s - loss: 0.1661 - accuracy: 0.8667 - val_loss: 0.1711 - val_accuracy: 0.8600 - 7s/epoch - 224ms/step +# Epoch 6/6 +# 30/30 - 7s - loss: 0.1520 - accuracy: 0.8600 - val_loss: 0.1807 - val_accuracy: 0.8200 - 7s/epoch - 221ms/step +# +# # Great! We've mastered the basics of constructing hybrid classical-quantum models using # PennyLane and Keras. Can you think of any interesting hybrid models to construct? How do they # perform on realistic datasets? diff --git a/demonstrations/tutorial_qnn_module_torch.metadata.json b/demonstrations/tutorial_qnn_module_torch.metadata.json index bfd569d229..f7e3189dc6 100644 --- a/demonstrations/tutorial_qnn_module_torch.metadata.json +++ b/demonstrations/tutorial_qnn_module_torch.metadata.json @@ -26,7 +26,7 @@ "relatedContent": [ { "type": "demonstration", - "id": "tutorial_qnn_module_tf", + "id": "qnn_module_tf", "weight": 1.0 } ] diff --git a/demonstrations/tutorial_qnn_module_torch.py b/demonstrations/tutorial_qnn_module_torch.py index f3f59a77ff..253d749eca 100644 --- a/demonstrations/tutorial_qnn_module_torch.py +++ b/demonstrations/tutorial_qnn_module_torch.py @@ -8,7 +8,7 @@ .. related:: - tutorial_qnn_module_tf Turning quantum nodes into Keras Layers + qnn_module_tf Turning quantum nodes into Keras Layers *Author: Tom Bromley — Posted: 02 November 2020. Last updated: 28 January 2021.* @@ -37,7 +37,7 @@ # .. note:: # # A similar demo explaining how to -# :doc:`turn quantum nodes into Keras layers ` +# :doc:`turn quantum nodes into Keras layers ` # is also available. # # Fixing the dataset and problem diff --git a/demonstrations_v2/tutorial_qnn_module_tf/demo.py b/demonstrations_v2/qnn_module_tf/demo.py similarity index 81% rename from demonstrations_v2/tutorial_qnn_module_tf/demo.py rename to demonstrations_v2/qnn_module_tf/demo.py index 8f8c906c1c..cf4237416c 100644 --- a/demonstrations_v2/tutorial_qnn_module_tf/demo.py +++ b/demonstrations_v2/qnn_module_tf/demo.py @@ -1,4 +1,7 @@ -""" +r""" +.. role:: html(raw) + :format: html + Turning quantum nodes into Keras Layers ======================================= @@ -10,7 +13,13 @@ tutorial_qnn_module_torch Turning quantum nodes into Torch Layers -*Author: Tom Bromley — Posted: 02 November 2020. Last updated: 28 January 2021.* +*Author: Tom Bromley — Posted: 02 November 2020. Last updated: 21 March 2025.* + +.. warning:: + + This demo is only compatible with PennyLane version 0.40 or below. + For usage with a later version of PennyLane, please consider using + :doc:`PyTorch ` or :doc:`JAX `. Creating neural networks in `Keras `__ is easy. Models are constructed from elementary *layers* and can be trained using a high-level API. For example, the following code @@ -67,6 +76,11 @@ plt.scatter(X[:, 0], X[:, 1], c=c) plt.show() +############################################################################## +# .. figure:: /_static/demonstration_assets/qnn_module/sphx_glr_qnn_module_tf_001.png +# :width: 100% +# :align: center + ############################################################################### # Defining a QNode # ---------------- @@ -166,7 +180,25 @@ def qnode(inputs, weights): fitting = model.fit(X, y_hot, epochs=6, batch_size=5, validation_split=0.25, verbose=2) -############################################################################### +############################################################################## +# .. rst-class:: sphx-glr-script-out +# +# .. code-block:: none +# +# Epoch 1/6 +# 30/30 - 4s - loss: 0.4153 - accuracy: 0.7333 - val_loss: 0.3183 - val_accuracy: 0.7800 - 4s/epoch - 123ms/step +# Epoch 2/6 +# 30/30 - 4s - loss: 0.2927 - accuracy: 0.8000 - val_loss: 0.2475 - val_accuracy: 0.8400 - 4s/epoch - 130ms/step +# Epoch 3/6 +# 30/30 - 4s - loss: 0.2272 - accuracy: 0.8333 - val_loss: 0.2111 - val_accuracy: 0.8200 - 4s/epoch - 119ms/step +# Epoch 4/6 +# 30/30 - 4s - loss: 0.1963 - accuracy: 0.8667 - val_loss: 0.1917 - val_accuracy: 0.8600 - 4s/epoch - 118ms/step +# Epoch 5/6 +# 30/30 - 4s - loss: 0.1772 - accuracy: 0.8667 - val_loss: 0.1828 - val_accuracy: 0.8600 - 4s/epoch - 117ms/step +# Epoch 6/6 +# 30/30 - 4s - loss: 0.1603 - accuracy: 0.8733 - val_loss: 0.2006 - val_accuracy: 0.8200 - 4s/epoch - 117ms/step +# +# # How did we do? The model looks to have successfully trained and the accuracy on both the # training and validation datasets is reasonably high. In practice, we would aim to push the # accuracy higher by thinking carefully about the model design and the choice of hyperparameters @@ -224,7 +256,25 @@ def qnode(inputs, weights): fitting = model.fit(X, y_hot, epochs=6, batch_size=5, validation_split=0.25, verbose=2) -############################################################################### +############################################################################## +# .. rst-class:: sphx-glr-script-out +# +# .. code-block:: none +# +# Epoch 1/6 +# 30/30 - 7s - loss: 0.3682 - accuracy: 0.7467 - val_loss: 0.2550 - val_accuracy: 0.8000 - 7s/epoch - 229ms/step +# Epoch 2/6 +# 30/30 - 7s - loss: 0.2428 - accuracy: 0.8067 - val_loss: 0.2105 - val_accuracy: 0.8400 - 7s/epoch - 224ms/step +# Epoch 3/6 +# 30/30 - 7s - loss: 0.2001 - accuracy: 0.8333 - val_loss: 0.1901 - val_accuracy: 0.8200 - 7s/epoch - 220ms/step +# Epoch 4/6 +# 30/30 - 7s - loss: 0.1816 - accuracy: 0.8600 - val_loss: 0.1776 - val_accuracy: 0.8200 - 7s/epoch - 224ms/step +# Epoch 5/6 +# 30/30 - 7s - loss: 0.1661 - accuracy: 0.8667 - val_loss: 0.1711 - val_accuracy: 0.8600 - 7s/epoch - 224ms/step +# Epoch 6/6 +# 30/30 - 7s - loss: 0.1520 - accuracy: 0.8600 - val_loss: 0.1807 - val_accuracy: 0.8200 - 7s/epoch - 221ms/step +# +# # Great! We've mastered the basics of constructing hybrid classical-quantum models using # PennyLane and Keras. Can you think of any interesting hybrid models to construct? How do they # perform on realistic datasets? diff --git a/demonstrations_v2/tutorial_qnn_module_tf/metadata.json b/demonstrations_v2/qnn_module_tf/metadata.json similarity index 93% rename from demonstrations_v2/tutorial_qnn_module_tf/metadata.json rename to demonstrations_v2/qnn_module_tf/metadata.json index 36a7aab856..15d489d26a 100644 --- a/demonstrations_v2/tutorial_qnn_module_tf/metadata.json +++ b/demonstrations_v2/qnn_module_tf/metadata.json @@ -6,7 +6,7 @@ } ], "dateOfPublication": "2020-11-02T00:00:00+00:00", - "dateOfLastModification": "2024-10-07T00:00:00+00:00", + "dateOfLastModification": "2025-03-21T00:00:00+00:00", "categories": [ "Devices and Performance", "Quantum Machine Learning" diff --git a/demonstrations_v2/tutorial_qnn_module_tf/requirements.in b/demonstrations_v2/qnn_module_tf/requirements.in similarity index 100% rename from demonstrations_v2/tutorial_qnn_module_tf/requirements.in rename to demonstrations_v2/qnn_module_tf/requirements.in diff --git a/demonstrations_v2/tutorial_qnn_module_torch/demo.py b/demonstrations_v2/tutorial_qnn_module_torch/demo.py index f3f59a77ff..253d749eca 100644 --- a/demonstrations_v2/tutorial_qnn_module_torch/demo.py +++ b/demonstrations_v2/tutorial_qnn_module_torch/demo.py @@ -8,7 +8,7 @@ .. related:: - tutorial_qnn_module_tf Turning quantum nodes into Keras Layers + qnn_module_tf Turning quantum nodes into Keras Layers *Author: Tom Bromley — Posted: 02 November 2020. Last updated: 28 January 2021.* @@ -37,7 +37,7 @@ # .. note:: # # A similar demo explaining how to -# :doc:`turn quantum nodes into Keras layers ` +# :doc:`turn quantum nodes into Keras layers ` # is also available. # # Fixing the dataset and problem diff --git a/demonstrations_v2/tutorial_qnn_module_torch/metadata.json b/demonstrations_v2/tutorial_qnn_module_torch/metadata.json index bfd569d229..f7e3189dc6 100644 --- a/demonstrations_v2/tutorial_qnn_module_torch/metadata.json +++ b/demonstrations_v2/tutorial_qnn_module_torch/metadata.json @@ -26,7 +26,7 @@ "relatedContent": [ { "type": "demonstration", - "id": "tutorial_qnn_module_tf", + "id": "qnn_module_tf", "weight": 1.0 } ] From 7c9828c95f152b01240db15553a6b86b9770d1bd Mon Sep 17 00:00:00 2001 From: Pietropaolo Frisoni Date: Mon, 7 Apr 2025 08:01:39 -0400 Subject: [PATCH 09/11] Temp update to makefile to install PL RC (#1338) As the name says. Change will be reverted after feature freeze. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index edfc64ec39..c99e23e3b9 100644 --- a/Makefile +++ b/Makefile @@ -78,7 +78,7 @@ environment: $$PYTHON_VENV_PATH/bin/python -m pip install --upgrade git+https://github.com/PennyLaneAI/pennylane-qulacs.git#egg=pennylane-qulacs;\ $$PYTHON_VENV_PATH/bin/python -m pip install --extra-index-url https://test.pypi.org/simple/ PennyLane-Catalyst --pre --upgrade;\ $$PYTHON_VENV_PATH/bin/python -m pip install --extra-index-url https://test.pypi.org/simple/ PennyLane-Lightning --pre --upgrade;\ - $$PYTHON_VENV_PATH/bin/python -m pip install --upgrade git+https://github.com/PennyLaneAI/pennylane.git#egg=pennylane;\ + $$PYTHON_VENV_PATH/bin/python -m pip install --upgrade git+https://github.com/PennyLaneAI/pennylane.git@v0.41.0-rc0#egg=pennylane;\ $$PYTHON_VENV_PATH/bin/python -m pip install --upgrade git+https://github.com/XanaduAI/iqpopt.git#egg=iqpopt;\ fi;\ fi From 3ed6603be360d7ad4e182cfcb65f61158f0b33f9 Mon Sep 17 00:00:00 2001 From: Korbinian Kottmann <43949391+Qottmann@users.noreply.github.com> Date: Fri, 11 Apr 2025 16:09:35 +0200 Subject: [PATCH 10/11] [Bug fix] Update fixed depth hamiltonian simulation demo (#1344) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The problem is that the computed horizontal CSA $\mathfrak{h}$ is not necessarily composed of just Pauli words, but soms of Paulis (Pauli sentence). The old version was assuming everything was Pauli, did the decomposition in terms of Pauli words, and accordingly counted elements. Updating this here to decompose in the actual basis of the horizontal CSA $\mathfrak{h}$ and show explicitly that the decomposition is stricly in it. edit: this works all well locally with correct jax, optax and pl version, but for some reason fails in CI 🅰️ 🅰️ 🅰️ edit2: increasing the tolerance in `horizontal_cartan_subalgebra` fixes this. A bit problematic that this cannot be reproduced locally 😢 --------- Co-authored-by: Yushao Chen (Jerry) Co-authored-by: David Wierichs --- ...ion_via_cartan_decomposition.metadata.json | 2 +- ...ian_simulation_via_cartan_decomposition.py | 26 ++++++++++++------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/demonstrations/tutorial_fixed_depth_hamiltonian_simulation_via_cartan_decomposition.metadata.json b/demonstrations/tutorial_fixed_depth_hamiltonian_simulation_via_cartan_decomposition.metadata.json index 8779a9e547..a78b88eea4 100644 --- a/demonstrations/tutorial_fixed_depth_hamiltonian_simulation_via_cartan_decomposition.metadata.json +++ b/demonstrations/tutorial_fixed_depth_hamiltonian_simulation_via_cartan_decomposition.metadata.json @@ -6,7 +6,7 @@ } ], "dateOfPublication": "2024-12-19T00:00:00+00:00", - "dateOfLastModification": "2025-03-26T00:00:00+00:00", + "dateOfLastModification": "2025-04-11T00:00:00+00:00", "categories": [ "Quantum Computing", "Algorithms" diff --git a/demonstrations/tutorial_fixed_depth_hamiltonian_simulation_via_cartan_decomposition.py b/demonstrations/tutorial_fixed_depth_hamiltonian_simulation_via_cartan_decomposition.py index 3be494501f..cb7ff2379b 100644 --- a/demonstrations/tutorial_fixed_depth_hamiltonian_simulation_via_cartan_decomposition.py +++ b/demonstrations/tutorial_fixed_depth_hamiltonian_simulation_via_cartan_decomposition.py @@ -169,7 +169,7 @@ # :func:`~.pennylane.liealg.horizontal_cartan_subalgebra` returns some additional information, which we will # not use here. -g, k, mtilde, h, _ = horizontal_cartan_subalgebra(k, m) +g, k, mtilde, h, _ = horizontal_cartan_subalgebra(k, m, tol=1e-8) len(g), len(k), len(mtilde), len(h) ############################################################################## @@ -220,10 +220,10 @@ # def run_opt( - value_and_grad, + loss, theta, - n_epochs=500, - lr=0.1, + n_epochs=1000, + lr=0.05, ): """Boilerplate JAX optimization""" value_and_grad = jax.jit(jax.value_and_grad(loss)) @@ -274,7 +274,7 @@ def loss(theta): A = K_m @ v_m @ K_m.conj().T return jnp.trace(A.conj().T @ H_m).real -theta0 = jnp.ones(len(k), dtype=float) +theta0 = jax.random.normal(jax.random.PRNGKey(0), shape=(len(k),), dtype=float) thetas, energy, _ = run_opt(loss, theta0, n_epochs=1000, lr=0.05) plt.plot(energy - np.min(energy)) @@ -297,13 +297,18 @@ def loss(theta): # .. math:: h_0 = K_c^\dagger H K_c. h_0_m = Kc_m.conj().T @ H_m @ Kc_m -h_0 = qml.pauli_decompose(h_0_m) -print(len(h_0)) +# decompose h_0_m in terms of the basis of h +basis = [qml.matrix(op, wire_order=range(n_wires)) for op in h] +coeffs = qml.pauli.trace_inner_product(h_0_m, basis) + +# ensure that decomposition is correct, i.e. h_0_m is truely an element of just h +h_0_m_recomposed = np.sum([c * op for c, op in zip(coeffs, basis)], axis=0) +print("Decomposition of h_0 is faithful: ", np.allclose(h_0_m_recomposed, h_0_m, atol=1e-10)) + +# sanity check that the horizontal CSA is Abelian, i.e. all its elements commute +print("All elements in h commute with each other: ", qml.liealg.check_abelian(h)) -# assure that h_0 is in \mathfrak{h} -h_vspace = qml.pauli.PauliVSpace(h) -not h_vspace.is_independent(h_0.pauli_rep) ############################################################################## # @@ -331,6 +336,7 @@ def loss(theta): t = 1. U_exact = qml.exp(-1j * t * H) U_exact_m = qml.matrix(U_exact, wire_order=range(n_wires)) +h_0 = qml.dot(coeffs, h) def U_kak(theta_opt, t): qml.adjoint(K)(theta_opt, k) From 22088961299fe34ec768179124521d7be845e693 Mon Sep 17 00:00:00 2001 From: JerryChen97 Date: Fri, 11 Apr 2025 10:48:38 -0400 Subject: [PATCH 11/11] Trigger two demos of urgent interests --- .../tutorial_how_to_import_qiskit_noise_models.metadata.json | 2 +- demonstrations/tutorial_how_to_import_qiskit_noise_models.py | 1 + demonstrations/tutorial_zne_catalyst.metadata.json | 2 +- demonstrations/tutorial_zne_catalyst.py | 1 + 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/demonstrations/tutorial_how_to_import_qiskit_noise_models.metadata.json b/demonstrations/tutorial_how_to_import_qiskit_noise_models.metadata.json index 78b1bd040a..3786483a90 100644 --- a/demonstrations/tutorial_how_to_import_qiskit_noise_models.metadata.json +++ b/demonstrations/tutorial_how_to_import_qiskit_noise_models.metadata.json @@ -6,7 +6,7 @@ } ], "dateOfPublication": "2024-11-25T00:00:00+00:00", - "dateOfLastModification": "2024-11-25T00:00:00+00:00", + "dateOfLastModification": "2025-04-11T00:00:00+00:00", "categories": [ "Quantum Computing", "How-to" diff --git a/demonstrations/tutorial_how_to_import_qiskit_noise_models.py b/demonstrations/tutorial_how_to_import_qiskit_noise_models.py index 7568184d0e..887921307f 100644 --- a/demonstrations/tutorial_how_to_import_qiskit_noise_models.py +++ b/demonstrations/tutorial_how_to_import_qiskit_noise_models.py @@ -15,6 +15,7 @@ custom user-defined or fake backend-based noise models. """ + ###################################################################### # Noise models in Qiskit and PennyLane # ------------------------------------ diff --git a/demonstrations/tutorial_zne_catalyst.metadata.json b/demonstrations/tutorial_zne_catalyst.metadata.json index f9cc710683..a2cd39b777 100644 --- a/demonstrations/tutorial_zne_catalyst.metadata.json +++ b/demonstrations/tutorial_zne_catalyst.metadata.json @@ -9,7 +9,7 @@ } ], "dateOfPublication": "2024-11-15T00:00:00+00:00", - "dateOfLastModification": "2024-11-25T09:00:00+00:00", + "dateOfLastModification": "2025-04-11T09:00:00+00:00", "categories": [ "Algorithms", "Quantum Computing" diff --git a/demonstrations/tutorial_zne_catalyst.py b/demonstrations/tutorial_zne_catalyst.py index 0addd8d542..847360513f 100644 --- a/demonstrations/tutorial_zne_catalyst.py +++ b/demonstrations/tutorial_zne_catalyst.py @@ -85,6 +85,7 @@ # pip install -U pennylane-catalyst pennylane-qrack # + ############################################################################## # Defining the mirror circuit # ---------------------------