diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md deleted file mode 100644 index 9c16c9d862..0000000000 --- a/.github/pull_request_template.md +++ /dev/null @@ -1,12 +0,0 @@ - - - -Checklist: -- [ ] Reviewers confirm new code works as expected. -- [ ] Tests are passing. -- [ ] Coverage does not decrease. -- [ ] Documentation is updated. -- [ ] Compatibility with Qibo modules (Please edit this section if the current pull request is not compatible with the following branches). - - [ ] Qibo: `master` - - [ ] Qibolab: `main` - - [ ] Qibolab_platforms_qrc: `main` diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f55c7a839b..3db85df1fd 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,7 +2,7 @@ # See https://pre-commit.com/hooks.html for more hooks repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.6.0 + rev: v5.0.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer @@ -11,20 +11,20 @@ repos: - id: check-merge-conflict - id: debug-statements - repo: https://github.com/psf/black - rev: 24.8.0 + rev: 25.1.0 hooks: - id: black - repo: https://github.com/pycqa/isort - rev: 5.13.2 + rev: 6.0.0 hooks: - id: isort args: ["--profile", "black"] - repo: https://github.com/asottile/pyupgrade - rev: v3.17.0 + rev: v3.19.1 hooks: - id: pyupgrade - repo: https://github.com/hadialqattan/pycln - rev: v2.4.0 + rev: v2.5.0 hooks: - id: pycln args: diff --git a/README.md b/README.md index 33e8988cc8..51f7dbb9f5 100644 --- a/README.md +++ b/README.md @@ -59,9 +59,9 @@ targets: [0] ``` ### How to run protocols -To run the protocols specified in the ```runcard```, Qibocal uses the `qq auto` command +To run the protocols specified in the ```runcard```, Qibocal uses the `qq run` command ```sh -qq auto -o +qq run -o ``` if `````` is specified, the results will be saved in it, otherwise ```qq``` will automatically create a default folder containing the current date and the username. @@ -81,5 +81,9 @@ Feel free to check [![DOI](https://zenodo.org/badge/511836317.svg)](https://zenodo.org/badge/latestdoi/511836317) - If you use the package please refer to [the documentation](https://qibo.science/qibo/stable/appendix/citing-qibo.html#publications) for citation instructions + +## Ongoing development + +A non-exhaustive list of possible protocols to be implemented in Qibocal is collected +[here](doc/dev/README.md). diff --git a/runcards/.gitignore b/calibration_scripts/.gitignore similarity index 100% rename from runcards/.gitignore rename to calibration_scripts/.gitignore diff --git a/calibration_scripts/README.md b/calibration_scripts/README.md new file mode 100644 index 0000000000..0ba87cd225 --- /dev/null +++ b/calibration_scripts/README.md @@ -0,0 +1,3 @@ +# Runcards + +The following folder contains examples of Qibocal scripts. diff --git a/runcards/rx_calibration.py b/calibration_scripts/rx_calibration.py similarity index 100% rename from runcards/rx_calibration.py rename to calibration_scripts/rx_calibration.py diff --git a/runcards/single_shot.py b/calibration_scripts/single_shot.py similarity index 100% rename from runcards/single_shot.py rename to calibration_scripts/single_shot.py diff --git a/doc/dev/README.md b/doc/dev/README.md new file mode 100644 index 0000000000..5322ce9062 --- /dev/null +++ b/doc/dev/README.md @@ -0,0 +1,39 @@ +# Qibocal Roadmap + +### High Priority +#### Single qubit + +- Rabi and flipping to calibrate pi/2 rotations (https://web.physics.ucsb.edu/~martinisgroup/theses/Chen2018.pdf par. 5.9) +- Kernels for integration +- Drag with detuning (https://arxiv.org/pdf/1904.06560) +- Cross-entropy benchmarking +- SNR in spectroscopies and SNR in the IQ plane + https://dsp.stackexchange.com/questions/24372/what-is-the-connection-between-analog-signal-to-noise-ratio-and-signal-to-noise. + https://arxiv.org/pdf/2106.06173.pdf +- Improve readout amplitude optimization with the outliers probability +(https://escholarship.org/content/qt0g29b4p0/qt0g29b4p0.pdf?t=prk0gj) +- Cryoscope (https://arxiv.org/pdf/1907.04818, https://github.com/qua-platform/qua-libs/blob/main/Quantum-Control-Applications/Superconducting/Single-Flux-Tunable-Transmon/Use%20Case%201%20-%20Paraoanu%20Lab%20-%20Cryoscope/readme.md) +- Optimal control with randomize benchmarking (https://arxiv.org/pdf/1403.0035) + +#### Two qubits + +- Cross resonance gates (https://journals.aps.org/prb/abstract/10.1103/PhysRevB.81.134507) +- SNZ / Martini Ansatz (https://arxiv.org/pdf/2008.07411 https://arxiv.org/pdf/1402.5467) +- Improve and test coupler routines +- Measure ZZ coupling in couplers (flux amplitude vs coupling) (Manenti Motta, par. 14.8.4) +- Improve and test iSWAP implementation + +### Low Priority +#### Single Qubit + +- Calibrate the other qubit states +- Carr-Purcell-Meiboom_Gill sequence +- Explore cosine pulse as X pulse (https://web.physics.ucsb.edu/~martinisgroup/theses/Chen2018.pdf par. 5.4) +- Active reset +- Measurement tomography https://arxiv.org/pdf/1310.6448.pdf +- XY-Z timing +(https://escholarship.org/content/qt0g29b4p0/qt0g29b4p0.pdf?t=prk0gj par. 5.10) +- Quantum volume +- Gate Set Tomography +- Process Tomography +- Study Qubit AC-Stark effect diff --git a/doc/source/getting-started/example.rst b/doc/source/getting-started/example.rst index a5c9e3d5da..2917c649a8 100644 --- a/doc/source/getting-started/example.rst +++ b/doc/source/getting-started/example.rst @@ -24,11 +24,9 @@ presented in :ref:`runcard`, we can use this runcard. power_level: high nshots: 1024 -More examples of runcards are available on `Github `_ . - Run the routine ^^^^^^^^^^^^^^^ .. code-block:: - qq auto example.yml -o resonator_spectroscopy_routine + qq run example.yml -o resonator_spectroscopy_routine diff --git a/doc/source/getting-started/interface.rst b/doc/source/getting-started/interface.rst index 74ee9eb294..2350dcc844 100644 --- a/doc/source/getting-started/interface.rst +++ b/doc/source/getting-started/interface.rst @@ -60,15 +60,15 @@ regarding the protocols executed. qq report -``qq auto`` +``qq run`` ^^^^^^^^^^^ -The previous commands are put together using ``qq auto`` which will perform data acquisition, post-processing and report generation. +The previous commands are put together using ``qq run`` which will perform data acquisition, post-processing and report generation. When executing multiple protocols they are executed following the actions specified in the runcard. .. code-block:: - qq auto -o + qq run -o ``qq update`` ^^^^^^^^^^^^^ diff --git a/doc/source/getting-started/qq_qibocal.svg b/doc/source/getting-started/qq_qibocal.svg index af9f0fa6bc..068c90e882 100644 --- a/doc/source/getting-started/qq_qibocal.svg +++ b/doc/source/getting-started/qq_qibocal.svg @@ -1,6 +1,12 @@ -
Qibocal actions
qq auto
qq acquire
qq fit
qq upload
qq report
qq compare
qq update
Update device platform
Compare two executions of the same routine
Collect results into a report
Share your results
Analyze your data
Acquire data for your protocols
Automated protocols execution
Main actions
Tools
diff --git a/doc/source/protocols/avoided_crossing.png b/doc/source/protocols/avoided_crossing.png new file mode 100644 index 0000000000..94b1b91961 Binary files /dev/null and b/doc/source/protocols/avoided_crossing.png differ diff --git a/doc/source/protocols/avoided_crossing.rst b/doc/source/protocols/avoided_crossing.rst new file mode 100644 index 0000000000..5ee12050de --- /dev/null +++ b/doc/source/protocols/avoided_crossing.rst @@ -0,0 +1,55 @@ +Avoided crossing +================ + +In the avoided crossing experiment the goal is to study the qubit-flux dependency +of a couple of qubits to precisely tune the interaction between them at specific +frequencies in order to calibrate the CZ and the iSWAP gates. + +In the avoided crossing experiment for CZ qubit gates, the interaction between +two qubits is controlled by tuning their energy levels such that the :math:`\ket{11}` +(both qubits in the excited state) and :math:`\ket{02}` (one qubit in the ground state and +the other in the second excited state) states come into resonance. +At this resonance point, the energy levels of these states experience an avoided +crossing, a key phenomenon that enables the controlled-Z (CZ) gate operation. +By observing the avoided crossing, one can confirm that the coupling between the +qubits is strong enough to facilitate the necessary interaction for the CZ gate. +Hence, precise tuning of these states is essential for achieving the correct gate +operation. + +In the avoided crossing experiment for iSWAP qubit gates, the key focus is on +the interaction between the :math:`\ket{10}` and :math:`\ket{01}` states. +When tuning the qubits' energy levels, these two states come into resonance, +creating an avoided crossing, which is the fundamental operation of +the iSWAP gate. + +In this protocol, for each qubit pair we execute a qubit flux dependency of the +01 and 02 transitions on the qubit with higher frequency and we fit the data to +find the flux-frequency relationship that we use to estimate the bias needed to +reach the CZ and iSWAP interaction points. + +Parameters +^^^^^^^^^^ + +.. autoclass:: + qibocal.protocols.flux_dependence.avoided_crossing.AvoidedCrossingParameters + :noindex: + +Example +^^^^^^^ + +It follows a runcard example of this experiment. + +.. code-block:: yaml + + - id: avoided crossing + operation: avoided_crossing + parameters: + bias_step: 0.01 + bias_width: 0.2 + drive_amplitude: 0.5 + freq_step: 500000 + freq_width: 100000000 + +The expected output is the following: + +.. image:: avoided_crossing.png diff --git a/doc/source/protocols/chevron.png b/doc/source/protocols/chevron.png new file mode 100644 index 0000000000..2f0c523197 Binary files /dev/null and b/doc/source/protocols/chevron.png differ diff --git a/doc/source/protocols/chevron.rst b/doc/source/protocols/chevron.rst new file mode 100644 index 0000000000..9565cad438 --- /dev/null +++ b/doc/source/protocols/chevron.rst @@ -0,0 +1,30 @@ +Chevron +======= + +Parameters +^^^^^^^^^^ + +.. autoclass:: + qibocal.protocols.two_qubit_interaction.chevron.chevron.ChevronParameters + :noindex: + +Example +^^^^^^^ + +Below is an example runcard for this experiment. + +.. code-block:: yaml + + - id: chevron + operation: chevron + parameters: + amplitude_max_factor: 1.1 + amplitude_min_factor: 0.9 + amplitude_step_factor: 0.01 + duration_max: 51 + duration_min: 4 + duration_step: 2 + +The expected output is the following: + +.. image:: chevron.png diff --git a/doc/source/protocols/coupler/chevron.png b/doc/source/protocols/coupler/chevron.png new file mode 100644 index 0000000000..8cd3900e3d Binary files /dev/null and b/doc/source/protocols/coupler/chevron.png differ diff --git a/doc/source/protocols/coupler/chevron.rst b/doc/source/protocols/coupler/chevron.rst new file mode 100644 index 0000000000..9c25792003 --- /dev/null +++ b/doc/source/protocols/coupler/chevron.rst @@ -0,0 +1,35 @@ +Coupler Chevron +=============== + +Parameters +^^^^^^^^^^ + +.. autoclass:: + qibocal.protocols.two_qubit_interaction.chevron.chevron.ChevronParameters + :noindex: + + +Example +^^^^^^^ + +Below is an example runcard for this experiment. + +.. code-block:: yaml + + - id: coupler chevron + operation: coupler_chevron + parameters: + amplitude_max_factor: 1.5 + amplitude_min_factor: 0.4 + amplitude_step_factor: 0.005 + duration_max: 100 + duration_min: 10 + duration_step: 2 + native: CZ + nshots: 256 + relaxation_time: 100000 + + +The expected output is the following: + +.. image:: chevron.png diff --git a/doc/source/protocols/dispersive_shift.rst b/doc/source/protocols/dispersive_shift.rst index d4a19e67c7..70f4c731ab 100644 --- a/doc/source/protocols/dispersive_shift.rst +++ b/doc/source/protocols/dispersive_shift.rst @@ -55,7 +55,7 @@ It follows an example of the experiment parameters. freq_width: 1000000 -After running `qq auto`, the experiment is executed and the result will looks like +After running `qq run`, the experiment is executed and the result will looks like the following picture. .. image:: dispersive_shift.png diff --git a/doc/source/protocols/flux/single.rst b/doc/source/protocols/flux/single.rst index 07ae5ca47d..9e1746722f 100644 --- a/doc/source/protocols/flux/single.rst +++ b/doc/source/protocols/flux/single.rst @@ -16,9 +16,8 @@ of GHz, which leads to several applications including quantum logical gates. The transmon frequency as a function of the external flux can be expressed as :cite:p:`Barrett_2023` -.. math:: - - f_q(\Phi) = \Bigg( f_q^{\text{max}} + \frac{E_C}{h} \Bigg) \sqrt[4]{d^2 + (1-d^2)\cos^2\Big( \pi \frac{\Phi}{\Phi_0}\Big)} - \frac{E_C}{h} \, +.. math:: f_q(\Phi) = \Bigg( f_q^{\text{max}} + \frac{E_C}{h} \Bigg) \sqrt[4]{d^2 + (1-d^2)\cos^2\Big( \pi \frac{\Phi}{\Phi_0}\Big)} - \frac{E_C}{h} \, + :label: transmon where :math:`f_{\text{max}} = ( \sqrt{8 E_C E_J} - E_C) / h` is the maximum qubit frequency, :math:`d` is the junctions asymmetry, :math:`E_C` is the charging energy, @@ -76,6 +75,14 @@ The expected output is the following: From the acquired data this protocol estimates the flux insensitive point "sweetspot", which corresponds to the flux value where the frequency is maximed, as well as the drive frequency and the diagonal crosstalk coefficient :math:`V_{ii}`. + +.. note:: + + From the cosinusoidal term in the transmon equation :math:numref:`transmon`, it is clear that the + sweetspot is not unique. + In this protocol, Qibocal returns the sweetspot that is closest to the bias + that is in the middle of the swept interval. + Both the sweetspot and the :math:`C_{ii}` can be understood by writing the full expression for the flux felt by qubit :math:`i` :cite:p:`Barrett_2023`: diff --git a/doc/source/protocols/index.rst b/doc/source/protocols/index.rst index 0a6ff4487a..565dc82937 100644 --- a/doc/source/protocols/index.rst +++ b/doc/source/protocols/index.rst @@ -27,4 +27,12 @@ In this section we introduce the basics of all protocols supported by ``qibocal` dispersive_shift allxy flipping + readout_mitigation_matrix + avoided_crossing + readout_optimization + standard_rb + chevron + virtual_z + state_tomographies + coupler/chevron references diff --git a/doc/source/protocols/qubit_spectroscopy/qubit_spectroscopy.rst b/doc/source/protocols/qubit_spectroscopy/qubit_spectroscopy.rst index 792577addc..b891ed095f 100644 --- a/doc/source/protocols/qubit_spectroscopy/qubit_spectroscopy.rst +++ b/doc/source/protocols/qubit_spectroscopy/qubit_spectroscopy.rst @@ -27,7 +27,7 @@ Parameters ^^^^^^^^^^ .. autoclass:: qibocal.protocols.qubit_spectroscopy.QubitSpectroscopyParameters - + :noindex: How to execute a qubit spectroscopy experiment ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -96,6 +96,7 @@ Parameters ^^^^^^^^^^ .. autoclass:: qibocal.protocols.qubit_spectroscopy_ef.QubitSpectroscopyEFParameters + :noindex: How to execute a qubit spectroscopy experiment ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/doc/source/protocols/rabi/rabi.rst b/doc/source/protocols/rabi/rabi.rst index 360d030939..5a3de5c1ee 100644 --- a/doc/source/protocols/rabi/rabi.rst +++ b/doc/source/protocols/rabi/rabi.rst @@ -60,7 +60,7 @@ It follows an example of the experiment parameters. To run properly this experiment it is important to set the `relaxation_time` higher than the qubit `T1`. -After running `qq auto`, the experiment is executed and the result will looks like +After running `qq run`, the experiment is executed and the result will looks like the following picture. .. image:: rabi_amplitude.png diff --git a/doc/source/protocols/ramsey/ramsey.rst b/doc/source/protocols/ramsey/ramsey.rst index ed35278deb..8a83130325 100644 --- a/doc/source/protocols/ramsey/ramsey.rst +++ b/doc/source/protocols/ramsey/ramsey.rst @@ -30,6 +30,7 @@ Parameters ^^^^^^^^^^ .. autoclass:: qibocal.protocols.ramsey.ramsey.RamseyParameters + :noindex: Example @@ -56,8 +57,8 @@ The expected output is the following: :math:`T_2` and :math:`\Delta \omega` are determined by fitting the output signal using the formula presented above. -If the protocols is successful the drive frequency will be updated. For updating :math:`T_2` -the user is invited to run ``T2 experiment``. +If the protocols is successful the drive frequency will be updated only if a non-zero +detuning is provided. :math:`T_2` is updated only in the case where detuning is not specified. Requirements ^^^^^^^^^^^^ @@ -80,6 +81,7 @@ Parameters ^^^^^^^^^^ .. autoclass:: qibocal.protocols.ramsey.ramsey_signal.RamseySignalParameters + :noindex: Example ^^^^^^^ @@ -99,6 +101,44 @@ Example Note that in this case error bars will not be provided. + +Measuring the ZZ coupling with a Ramsey experiment +--------------------------------------------------- + +By repeating the Ramsey experiment while putting one of the neighbor qubits in +state :math:`\ket{1}` we can have an estimate on the ZZ coupling :math:`\zeta`. +The ZZ coupling :math:`\zeta` is a residual interaction which leads to shifts in +the frequency of the qubit when one of the neighbor is in the excited state. +Given that through a Ramsey experiment we can measure carefully the frequency of the qubit, +by comparing the outcome of a standard Ramsey experiment with the outcome when one of the neighbor +qubit is excited we can infer the ZZ coupling term :math:`\zeta`. For superconducting platforms +without tunable couplers such terms is expected to be of the order of a few hundred kHz. + +Parameters +^^^^^^^^^^ + +.. autoclass:: qibocal.protocols.ramsey.ramsey_zz.RamseyZZParameters + :noindex: + + +Example +^^^^^^^ + +.. code-block:: yaml + + - id: ramsey zz + operation: ramsey_zz + parameters: + delay_between_pulses_end: 2000 + delay_between_pulses_start: 10 + delay_between_pulses_step: 50 + detuning: 500000 + nshots: 1024 + target_qubit: D1 + + +.. image:: ramsey_zz.png + Requirements ^^^^^^^^^^^^ diff --git a/doc/source/protocols/ramsey/ramsey_zz.png b/doc/source/protocols/ramsey/ramsey_zz.png new file mode 100644 index 0000000000..d9d91d4396 Binary files /dev/null and b/doc/source/protocols/ramsey/ramsey_zz.png differ diff --git a/doc/source/protocols/readout_amplitude.png b/doc/source/protocols/readout_amplitude.png new file mode 100644 index 0000000000..ba9b2337bc Binary files /dev/null and b/doc/source/protocols/readout_amplitude.png differ diff --git a/doc/source/protocols/readout_mitigation_matrix.png b/doc/source/protocols/readout_mitigation_matrix.png new file mode 100644 index 0000000000..5a71ee621e Binary files /dev/null and b/doc/source/protocols/readout_mitigation_matrix.png differ diff --git a/doc/source/protocols/readout_mitigation_matrix.rst b/doc/source/protocols/readout_mitigation_matrix.rst new file mode 100644 index 0000000000..b3e52b6e5a --- /dev/null +++ b/doc/source/protocols/readout_mitigation_matrix.rst @@ -0,0 +1,36 @@ +Readout mitigation matrix +========================= + +The idea behind this protocol is that we can correct the qubit readout errors +by applying a corrective linear transformation to the readout results, in formula + +.. math:: + O_{noisy} = M O_{ideal}, + +where :math:`O_{noisy}` is the readout probabilities on the noisy device, +:math:`O_{ideal}` is the expected one and :math:`M` is the readout mitigation matrix. +The matrix :math:`M^{-1}` can be used to correct the noisy readouts. + +This protocol evaluates the readout matrix by preparing the qubit(s) in the +computational base and measuring their states. + +Pramateters +^^^^^^^^^^^ + +.. autoclass:: qibocal.protocols.readout_mitigation_matrix.ReadoutMitigationMatrixParameters + :noindex: + +Example +^^^^^^^ + +.. code-block:: yaml + + - id: readout_mitigation_matrix + operation: readout_mitigation_matrix + parameters: + nshots: 1000 + pulses: true + +After the protocol execution, the result is the following + +.. image:: readout_mitigation_matrix.png diff --git a/doc/source/protocols/readout_optimization.rst b/doc/source/protocols/readout_optimization.rst new file mode 100644 index 0000000000..db388e3dc2 --- /dev/null +++ b/doc/source/protocols/readout_optimization.rst @@ -0,0 +1,32 @@ +Readout optimization +==================== + +Qibocal provides a protocol to improve the readout pulse amplitude by optimize +the assignment fidelity. + +Parameters +^^^^^^^^^^ + +.. autoclass:: qibocal.protocols.readout_optimization.resonator_amplitude.ResonatorAmplitudeParameters + :noindex: + + +Example +^^^^^^^ + +It follows an example runcard of the resonator amplitude routine with the plot +generated in the report. + +.. code-block:: yaml + + - id: resonator_amplitude + operation: resonator_amplitude + parameters: + amplitude_step: 0.0005 + amplitude_start: 0.001 + amplitude_stop: 0.005 + +As shown in the picture below, the protocol sweeps the readout amplitude and evaluates +the probability errors + +.. image:: readout_amplitude.png diff --git a/doc/source/protocols/standard_rb.png b/doc/source/protocols/standard_rb.png new file mode 100644 index 0000000000..9a6733f465 Binary files /dev/null and b/doc/source/protocols/standard_rb.png differ diff --git a/doc/source/protocols/standard_rb.rst b/doc/source/protocols/standard_rb.rst new file mode 100644 index 0000000000..c6bbf33438 --- /dev/null +++ b/doc/source/protocols/standard_rb.rst @@ -0,0 +1,85 @@ +Standard Randomize Benchmarking +=============================== + +An approach to obtain the average gate fidelity is to perform randomized +benchmarking :cite:p:`Emerson_2005`. +The key idea is that if we average the error process over the uniform space of +unitaries the result is a depolarizing channel that maps any pure state to the +maximally mixed state. +Such uniform space of unitaries is known as *Haar measure*. +It can be shown :cite:p:`Emerson_2005` that the average induced error is proportional +to the depolarization probability. +However, this approach is inefficient because we sample randomly from the Haar measure. +A simplification was proposed in :cite:p:`Knill2008` by restricting the unitaries +to the Clifford group, which consists of unitary rotations mapping the group +of Pauli operators in itself. +Among the advantages of such group are the fact of the number of Clifford +gates is finite given the Hilbert space and being a group we can easily found +the inverse within the group. +The generic procedure to perform a randomized benchmarking is the following: + +1. initialize the system in ground state +2. for each sequence length :math:`m` draw sequence of Clifford group elements +3. calculate inverse gate +4. measure sequence and inverse gate +5. repeat the process for multiple sequence of same length and varying the length + +The previous approach works because it has been shown :cite:p:`Nielsen_2002` that +randomization with Clifford gates provides again a depolarized noise channel + +.. math:: + :name: eq:1 + + \rho \rightarrow \frac{d}{2} I + ( 1 - d) \rho + +with depolarization probability :math:`d`. +If we follow the previous procedure and we measure the survival probability, i.e. +the probability of measuring the qubit in :math:`\ket{0}`, for +different sequence length :math:`m` we expect the following behavior + +.. math:: + :name: eq:2 + + F(m) = A p^m + B + +where :math:`1-p` is the rate of depolarization while :math:`A` and :math:`B` +capture state preparation and measurement errors. +Finally, we can extract the average error per Clifford as + +.. math:: + :name: eq:3 + + \epsilon_\text{Clifford} = \frac{1 - p}{1 - 2^{-n}} + +where :math:`n` is the number of qubits. The error per gate can be derived by dividing +the Clifford error by the physical gates per Clifford which usually is 1.875. +One of the main feature of RB is the possibility to estimate the gate fidelity +alone without taking into account both state preparation and measurement errors +which can be computed using the :math:`A` and :math:`B` terms in :ref:`Eq. 2 `. + +Parameters +^^^^^^^^^^ + + +.. autoclass:: + qibocal.protocols.randomized_benchmarking.standard_rb.StandardRBParameters + :noindex: + + +Example +^^^^^^^ + +It follows a runcard where we execute a standard RB. + +.. code-block:: yaml + + - id: standard rb + operation: standard_rb + parameters: + depths: [1,5,10,20,50,100] + niter: 20 + nshots: 100 + +The expected output is the following: + +.. image:: standard_rb.png diff --git a/doc/source/protocols/state_tomographies.rst b/doc/source/protocols/state_tomographies.rst new file mode 100644 index 0000000000..0c86193909 --- /dev/null +++ b/doc/source/protocols/state_tomographies.rst @@ -0,0 +1,40 @@ +State Tomographies +================== + +Parameters +^^^^^^^^^^ + +.. autoclass:: + qibocal.protocols.state_tomography.StateTomographyParameters + :noindex: + +Example +^^^^^^^ + +Below is an example runcard for this experiment. + +.. code-block:: yaml + + - id: state_tomography + operation: state_tomography + parameters: + nshots: 1024 + relaxation_time: 200000 + +The expected output is the following: + +.. image:: state_tomography.png + + +Qibocal also provides two qubit state tomography. + +.. code-block:: yaml + + - id: tomography + operation: two_qubit_state_tomography + parameters: + nshots: 5000 + +The report will look like the following. + +.. image:: two_state_tomography.png diff --git a/doc/source/protocols/state_tomography.png b/doc/source/protocols/state_tomography.png new file mode 100644 index 0000000000..72e3fd3aa7 Binary files /dev/null and b/doc/source/protocols/state_tomography.png differ diff --git a/doc/source/protocols/two_state_tomography.png b/doc/source/protocols/two_state_tomography.png new file mode 100644 index 0000000000..24ef16663b Binary files /dev/null and b/doc/source/protocols/two_state_tomography.png differ diff --git a/doc/source/protocols/virtual_z.png b/doc/source/protocols/virtual_z.png new file mode 100644 index 0000000000..91e4ec6551 Binary files /dev/null and b/doc/source/protocols/virtual_z.png differ diff --git a/doc/source/protocols/virtual_z.rst b/doc/source/protocols/virtual_z.rst new file mode 100644 index 0000000000..7539768117 --- /dev/null +++ b/doc/source/protocols/virtual_z.rst @@ -0,0 +1,29 @@ +Virtual Z +========= + +Parameters +^^^^^^^^^^ + +.. autoclass:: + qibocal.protocols.two_qubit_interaction.virtual_z_phases.VirtualZPhasesParameters + :noindex: + +Example +^^^^^^^ + +Below is an example runcard for this experiment. + +.. code-block:: yaml + + - id: cz + operation: cz_virtualz + parameters: + dt: 0 + flux_pulse_duration: 70 + theta_end: 6.5 + theta_start: 0 + theta_step: 0.5 + +The expected output is the following: + +.. image:: virtual_z.png diff --git a/doc/source/refs.bib b/doc/source/refs.bib index 7ef481d3d7..b971ff08df 100644 --- a/doc/source/refs.bib +++ b/doc/source/refs.bib @@ -150,3 +150,43 @@ @misc{pedicillo2023 archivePrefix={arXiv}, primaryClass={id='quant-ph' full_name='Quantum Physics' is_active=True alt_name=None in_archive='quant-ph' is_general=False description=None} } + +@article{Knill2008, + title={Randomized benchmarking of quantum gates}, + volume={77}, + ISSN={1094-1622}, + url={http://dx.doi.org/10.1103/PhysRevA.77.012307}, + DOI={10.1103/physreva.77.012307}, + number={1}, + journal={Physical Review A}, + publisher={American Physical Society (APS)}, + author={Knill, E. and Leibfried, D. and Reichle, R. and Britton, J. and Blakestad, R. B. and Jost, J. D. and Langer, C. and Ozeri, R. and Seidelin, S. and Wineland, D. J.}, + year={2008}, + month={jan}, +} + +@article{Emerson_2005, + title={Scalable noise estimation with random unitary operators}, + volume={7}, + ISSN={1741-3575}, + url={http://dx.doi.org/10.1088/1464-4266/7/10/021}, + DOI={10.1088/1464-4266/7/10/021}, + number={10}, + journal={Journal of Optics B: Quantum and Semiclassical Optics}, + publisher={IOP Publishing}, + author={Emerson, Joseph and Alicki, Robert and Życzkowski, Karol}, + year={2005}, + month=sep, pages={S347–S352} } + +@article{Nielsen_2002, + title={A simple formula for the average gate fidelity of a quantum dynamical operation}, + volume={303}, + ISSN={0375-9601}, + url={http://dx.doi.org/10.1016/S0375-9601(02)01272-0}, + DOI={10.1016/s0375-9601(02)01272-0}, + number={4}, + journal={Physics Letters A}, + publisher={Elsevier BV}, + author={Nielsen, Michael A}, + year={2002}, + month=oct, pages={249–252} } diff --git a/doc/source/tutorials/advanced.rst b/doc/source/tutorials/advanced.rst index 3b9a99ca47..45a43bdc17 100644 --- a/doc/source/tutorials/advanced.rst +++ b/doc/source/tutorials/advanced.rst @@ -9,72 +9,49 @@ Qibocal also allows executing protocols without the standard :ref:`interface `_ (see also :ref:`t1`). +The fastest way consists in using the `Executor` class in the following way .. code-block:: python - import pathlib - from qibolab import create_platform - from qibocal.auto.execute import Executor from qibocal.auto.mode import ExecutionMode - from qibocal.protocols import t1_signal - # allocate platform - platform = create_platform("....") + with Executor.open( + "myexec", # arbitrary name for executor + path="test_t1_signal", # path where the data will be stored + platform="dummy", # platform to be used + targets=[0], # qubits on which the experiment will be executed + ) as e: - #creare executor - executor = Executor.create( - platform=platform, - output=pathlib.Path("experiment_data") - ) + # your experiments go here The executor is responsible of running the routines on a platform and eventually store the history of multiple experiments. -``t1_signal``, that we import, is a :class:`qibocal.auto.operation.Routine` object which contains all the necessary -methods to execute the experiment. +The context manager `with` provides an easy way to connect and disconnect from the platform. In order to run an experiment the user needs to specify its parameters. The user can check which parameters need to be provided either by checking the documentation of the specific protocol or by simply inspecting ``protocol.parameters_type``. -For ``t1_signal`` we define the parameters in the following way: +To run a `t1_signal` experiment is necessary to use invoke the protocol inside the `with` statement .. code-block:: python - t1_params = { - "id": "t1_experiment", - "targets": [0], # we are defining here which qubits to analyze - "operation": "t1_signal", - "parameters": { - "delay_before_readout_start": 0, - "delay_before_readout_end": 20_000, - "delay_before_readout_step": 50, - }, - } - - -After defining the parameters, the user can perform the acquisition using -``executor.run_protocol`` which accepts the following parameters: - -* ``protocol`` (:class:`qibocal.auto.operation.Routine`): protocol -* ``parameters`` (Dict): parameters dictionary -* ``mode`` (:class:`qibocal.auto.mode.ExecutionMode`): can be ExecutionMode.ACQUIRE or ExecutionMode.FIT - -.. code-block:: python + output = e.t1_signal(delay_before_readout_start=0, + delay_before_readout_end=20_000, + delay_before_readout_step=50) - executor.run_protocol(t1_signal, t1_params, ExecutionMode.ACQUIRE) - executor.run_protocol(t1_signal, t1_params, ExecutionMode.FIT) -In this way we have first executed the acquisition part of the experiment and then performed the fit on the acquired data. +By default acquisition and fitting are performed. The user can now use the raw data acquired by the quantum processor to perform an arbitrary post-processing analysis. This is one of the main advantages of this API compared to the cli execution. -The history, that contains both the raw data (added with :attr:`qibocal.auto.mode.ExecutionMode.ACQUIRE`) and the fit data (added with :attr:`qibocal.auto.mode.ExecutionMode.FIT`) can be accessed: +Both the raw data and the fit data can be accessed from the history attribute of the `Executor`. .. code-block:: python - history = executor.history - t1_res = history["t1_experiment"] # id of the protocol + history = e.history + t1_res = history["t1_signal"][0] data = t1_res.data # raw data results = t1_res.results # fit data diff --git a/doc/source/tutorials/basic.rst b/doc/source/tutorials/basic.rst index 5f6d76784a..3f2fb1c4fc 100644 --- a/doc/source/tutorials/basic.rst +++ b/doc/source/tutorials/basic.rst @@ -3,8 +3,6 @@ Basic examples In this section we are going to explain briefly how to perform the calibration of single qubit devices. -All runcards that are going to be used are available -`here `_. Dummy guide for single qubit calibration ---------------------------------------- diff --git a/poetry.lock b/poetry.lock index deb03225ec..f3c4c42d5d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. [[package]] name = "alabaster" @@ -11,6 +11,25 @@ files = [ {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, ] +[[package]] +name = "alembic" +version = "1.14.0" +description = "A database migration tool for SQLAlchemy." +optional = false +python-versions = ">=3.8" +files = [ + {file = "alembic-1.14.0-py3-none-any.whl", hash = "sha256:99bd884ca390466db5e27ffccff1d179ec5c05c965cfefc0607e69f9e411cb25"}, + {file = "alembic-1.14.0.tar.gz", hash = "sha256:b00892b53b3642d0b8dbedba234dbf1924b69be83a9a769d5a624b01094e304b"}, +] + +[package.dependencies] +Mako = "*" +SQLAlchemy = ">=1.3.0" +typing-extensions = ">=4" + +[package.extras] +tz = ["backports.zoneinfo"] + [[package]] name = "annotated-types" version = "0.7.0" @@ -126,123 +145,138 @@ lxml = ["lxml"] [[package]] name = "blinker" -version = "1.8.2" +version = "1.9.0" description = "Fast, simple object-to-object and broadcast signaling" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "blinker-1.8.2-py3-none-any.whl", hash = "sha256:1779309f71bf239144b9399d06ae925637cf6634cf6bd131104184531bf67c01"}, - {file = "blinker-1.8.2.tar.gz", hash = "sha256:8f77b09d3bf7c795e969e9486f39c2c5e9c39d4ee07424be2bc594ece9642d83"}, + {file = "blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc"}, + {file = "blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf"}, ] [[package]] name = "certifi" -version = "2024.7.4" +version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] [[package]] @@ -259,17 +293,6 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} -[[package]] -name = "cloudpickle" -version = "3.0.0" -description = "Pickler class to extend the standard pickle.Pickler functionality" -optional = false -python-versions = ">=3.8" -files = [ - {file = "cloudpickle-3.0.0-py3-none-any.whl", hash = "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7"}, - {file = "cloudpickle-3.0.0.tar.gz", hash = "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882"}, -] - [[package]] name = "cma" version = "3.4.0" @@ -300,21 +323,21 @@ files = [ ] [[package]] -name = "coloredlogs" -version = "15.0.1" -description = "Colored terminal output for Python's logging module" -optional = true -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +name = "colorlog" +version = "6.9.0" +description = "Add colours to the output of Python's logging module." +optional = false +python-versions = ">=3.6" files = [ - {file = "coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934"}, - {file = "coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0"}, + {file = "colorlog-6.9.0-py3-none-any.whl", hash = "sha256:5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff"}, + {file = "colorlog-6.9.0.tar.gz", hash = "sha256:bfba54a1b93b94f54e1f4fe48395725a3d92fd2a4af702f6bd70946bdc0c6ac2"}, ] [package.dependencies] -humanfriendly = ">=9.1" +colorama = {version = "*", markers = "sys_platform == \"win32\""} [package.extras] -cron = ["capturer (>=2.4)"] +development = ["black", "flake8", "mypy", "pytest", "types-colorama"] [[package]] name = "commonmark" @@ -332,146 +355,157 @@ test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] [[package]] name = "contourpy" -version = "1.2.1" +version = "1.3.0" description = "Python library for calculating contours of 2D quadrilateral grids" optional = true python-versions = ">=3.9" files = [ - {file = "contourpy-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040"}, - {file = "contourpy-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd"}, - {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480"}, - {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9"}, - {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da"}, - {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b"}, - {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd"}, - {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619"}, - {file = "contourpy-1.2.1-cp310-cp310-win32.whl", hash = "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8"}, - {file = "contourpy-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9"}, - {file = "contourpy-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5"}, - {file = "contourpy-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72"}, - {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f"}, - {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965"}, - {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2"}, - {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df"}, - {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205"}, - {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8"}, - {file = "contourpy-1.2.1-cp311-cp311-win32.whl", hash = "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec"}, - {file = "contourpy-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922"}, - {file = "contourpy-1.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc"}, - {file = "contourpy-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e"}, - {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4"}, - {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7"}, - {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0"}, - {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b"}, - {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce"}, - {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4"}, - {file = "contourpy-1.2.1-cp312-cp312-win32.whl", hash = "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f"}, - {file = "contourpy-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce"}, - {file = "contourpy-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b"}, - {file = "contourpy-1.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f"}, - {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364"}, - {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe"}, - {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985"}, - {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445"}, - {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02"}, - {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083"}, - {file = "contourpy-1.2.1-cp39-cp39-win32.whl", hash = "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba"}, - {file = "contourpy-1.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9"}, - {file = "contourpy-1.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609"}, - {file = "contourpy-1.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3"}, - {file = "contourpy-1.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f"}, - {file = "contourpy-1.2.1.tar.gz", hash = "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c"}, + {file = "contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7"}, + {file = "contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92f8557cbb07415a4d6fa191f20fd9d2d9eb9c0b61d1b2f52a8926e43c6e9af7"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36f965570cff02b874773c49bfe85562b47030805d7d8360748f3eca570f4cab"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cacd81e2d4b6f89c9f8a5b69b86490152ff39afc58a95af002a398273e5ce589"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69375194457ad0fad3a839b9e29aa0b0ed53bb54db1bfb6c3ae43d111c31ce41"}, + {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a52040312b1a858b5e31ef28c2e865376a386c60c0e248370bbea2d3f3b760d"}, + {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3faeb2998e4fcb256542e8a926d08da08977f7f5e62cf733f3c211c2a5586223"}, + {file = "contourpy-1.3.0-cp310-cp310-win32.whl", hash = "sha256:36e0cff201bcb17a0a8ecc7f454fe078437fa6bda730e695a92f2d9932bd507f"}, + {file = "contourpy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:87ddffef1dbe5e669b5c2440b643d3fdd8622a348fe1983fad7a0f0ccb1cd67b"}, + {file = "contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad"}, + {file = "contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d"}, + {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c"}, + {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb"}, + {file = "contourpy-1.3.0-cp311-cp311-win32.whl", hash = "sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c"}, + {file = "contourpy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35"}, + {file = "contourpy-1.3.0-cp312-cp312-win32.whl", hash = "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb"}, + {file = "contourpy-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b"}, + {file = "contourpy-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3"}, + {file = "contourpy-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da"}, + {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14"}, + {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8"}, + {file = "contourpy-1.3.0-cp313-cp313-win32.whl", hash = "sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294"}, + {file = "contourpy-1.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087"}, + {file = "contourpy-1.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8"}, + {file = "contourpy-1.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6"}, + {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2"}, + {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927"}, + {file = "contourpy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a11077e395f67ffc2c44ec2418cfebed032cd6da3022a94fc227b6faf8e2acb8"}, + {file = "contourpy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e8134301d7e204c88ed7ab50028ba06c683000040ede1d617298611f9dc6240c"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e12968fdfd5bb45ffdf6192a590bd8ddd3ba9e58360b29683c6bb71a7b41edca"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fd2a0fc506eccaaa7595b7e1418951f213cf8255be2600f1ea1b61e46a60c55f"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfb5c62ce023dfc410d6059c936dcf96442ba40814aefbfa575425a3a7f19dc"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68a32389b06b82c2fdd68276148d7b9275b5f5cf13e5417e4252f6d1a34f72a2"}, + {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94e848a6b83da10898cbf1311a815f770acc9b6a3f2d646f330d57eb4e87592e"}, + {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d78ab28a03c854a873787a0a42254a0ccb3cb133c672f645c9f9c8f3ae9d0800"}, + {file = "contourpy-1.3.0-cp39-cp39-win32.whl", hash = "sha256:81cb5ed4952aae6014bc9d0421dec7c5835c9c8c31cdf51910b708f548cf58e5"}, + {file = "contourpy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:14e262f67bd7e6eb6880bc564dcda30b15e351a594657e55b7eec94b6ef72843"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:00ccd0dbaad6d804ab259820fa7cb0b8036bda0686ef844d24125d8287178ce0"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca947601224119117f7c19c9cdf6b3ab54c5726ef1d906aa4a69dfb6dd58102"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6ec93afeb848a0845a18989da3beca3eec2c0f852322efe21af1931147d12cb"}, + {file = "contourpy-1.3.0.tar.gz", hash = "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4"}, ] [package.dependencies] -numpy = ">=1.20" +numpy = ">=1.23" [package.extras] bokeh = ["bokeh", "selenium"] docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] -mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.8.0)", "types-Pillow"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.11.1)", "types-Pillow"] test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] -test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] +test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" -version = "7.6.1" +version = "7.6.8" description = "Code coverage measurement for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, - {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, - {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, - {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, - {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, - {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, - {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, - {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, - {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, - {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, - {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, - {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, - {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, - {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, - {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, - {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, - {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, - {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, - {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, - {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, - {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, - {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, - {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, - {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, - {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, - {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, - {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, - {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, - {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, - {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, + {file = "coverage-7.6.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b39e6011cd06822eb964d038d5dff5da5d98652b81f5ecd439277b32361a3a50"}, + {file = "coverage-7.6.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:63c19702db10ad79151a059d2d6336fe0c470f2e18d0d4d1a57f7f9713875dcf"}, + {file = "coverage-7.6.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3985b9be361d8fb6b2d1adc9924d01dec575a1d7453a14cccd73225cb79243ee"}, + {file = "coverage-7.6.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:644ec81edec0f4ad17d51c838a7d01e42811054543b76d4ba2c5d6af741ce2a6"}, + {file = "coverage-7.6.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f188a2402f8359cf0c4b1fe89eea40dc13b52e7b4fd4812450da9fcd210181d"}, + {file = "coverage-7.6.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e19122296822deafce89a0c5e8685704c067ae65d45e79718c92df7b3ec3d331"}, + {file = "coverage-7.6.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:13618bed0c38acc418896005732e565b317aa9e98d855a0e9f211a7ffc2d6638"}, + {file = "coverage-7.6.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:193e3bffca48ad74b8c764fb4492dd875038a2f9925530cb094db92bb5e47bed"}, + {file = "coverage-7.6.8-cp310-cp310-win32.whl", hash = "sha256:3988665ee376abce49613701336544041f2117de7b7fbfe91b93d8ff8b151c8e"}, + {file = "coverage-7.6.8-cp310-cp310-win_amd64.whl", hash = "sha256:f56f49b2553d7dd85fd86e029515a221e5c1f8cb3d9c38b470bc38bde7b8445a"}, + {file = "coverage-7.6.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:86cffe9c6dfcfe22e28027069725c7f57f4b868a3f86e81d1c62462764dc46d4"}, + {file = "coverage-7.6.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d82ab6816c3277dc962cfcdc85b1efa0e5f50fb2c449432deaf2398a2928ab94"}, + {file = "coverage-7.6.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13690e923a3932e4fad4c0ebfb9cb5988e03d9dcb4c5150b5fcbf58fd8bddfc4"}, + {file = "coverage-7.6.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4be32da0c3827ac9132bb488d331cb32e8d9638dd41a0557c5569d57cf22c9c1"}, + {file = "coverage-7.6.8-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44e6c85bbdc809383b509d732b06419fb4544dca29ebe18480379633623baafb"}, + {file = "coverage-7.6.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:768939f7c4353c0fac2f7c37897e10b1414b571fd85dd9fc49e6a87e37a2e0d8"}, + {file = "coverage-7.6.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e44961e36cb13c495806d4cac67640ac2866cb99044e210895b506c26ee63d3a"}, + {file = "coverage-7.6.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3ea8bb1ab9558374c0ab591783808511d135a833c3ca64a18ec927f20c4030f0"}, + {file = "coverage-7.6.8-cp311-cp311-win32.whl", hash = "sha256:629a1ba2115dce8bf75a5cce9f2486ae483cb89c0145795603d6554bdc83e801"}, + {file = "coverage-7.6.8-cp311-cp311-win_amd64.whl", hash = "sha256:fb9fc32399dca861584d96eccd6c980b69bbcd7c228d06fb74fe53e007aa8ef9"}, + {file = "coverage-7.6.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e683e6ecc587643f8cde8f5da6768e9d165cd31edf39ee90ed7034f9ca0eefee"}, + {file = "coverage-7.6.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1defe91d41ce1bd44b40fabf071e6a01a5aa14de4a31b986aa9dfd1b3e3e414a"}, + {file = "coverage-7.6.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7ad66e8e50225ebf4236368cc43c37f59d5e6728f15f6e258c8639fa0dd8e6d"}, + {file = "coverage-7.6.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fe47da3e4fda5f1abb5709c156eca207eacf8007304ce3019eb001e7a7204cb"}, + {file = "coverage-7.6.8-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:202a2d645c5a46b84992f55b0a3affe4f0ba6b4c611abec32ee88358db4bb649"}, + {file = "coverage-7.6.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4674f0daa1823c295845b6a740d98a840d7a1c11df00d1fd62614545c1583787"}, + {file = "coverage-7.6.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:74610105ebd6f33d7c10f8907afed696e79c59e3043c5f20eaa3a46fddf33b4c"}, + {file = "coverage-7.6.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37cda8712145917105e07aab96388ae76e787270ec04bcb9d5cc786d7cbb8443"}, + {file = "coverage-7.6.8-cp312-cp312-win32.whl", hash = "sha256:9e89d5c8509fbd6c03d0dd1972925b22f50db0792ce06324ba069f10787429ad"}, + {file = "coverage-7.6.8-cp312-cp312-win_amd64.whl", hash = "sha256:379c111d3558272a2cae3d8e57e6b6e6f4fe652905692d54bad5ea0ca37c5ad4"}, + {file = "coverage-7.6.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b0c69f4f724c64dfbfe79f5dfb503b42fe6127b8d479b2677f2b227478db2eb"}, + {file = "coverage-7.6.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c15b32a7aca8038ed7644f854bf17b663bc38e1671b5d6f43f9a2b2bd0c46f63"}, + {file = "coverage-7.6.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63068a11171e4276f6ece913bde059e77c713b48c3a848814a6537f35afb8365"}, + {file = "coverage-7.6.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f4548c5ead23ad13fb7a2c8ea541357474ec13c2b736feb02e19a3085fac002"}, + {file = "coverage-7.6.8-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b4b4299dd0d2c67caaaf286d58aef5e75b125b95615dda4542561a5a566a1e3"}, + {file = "coverage-7.6.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9ebfb2507751f7196995142f057d1324afdab56db1d9743aab7f50289abd022"}, + {file = "coverage-7.6.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c1b4474beee02ede1eef86c25ad4600a424fe36cff01a6103cb4533c6bf0169e"}, + {file = "coverage-7.6.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d9fd2547e6decdbf985d579cf3fc78e4c1d662b9b0ff7cc7862baaab71c9cc5b"}, + {file = "coverage-7.6.8-cp313-cp313-win32.whl", hash = "sha256:8aae5aea53cbfe024919715eca696b1a3201886ce83790537d1c3668459c7146"}, + {file = "coverage-7.6.8-cp313-cp313-win_amd64.whl", hash = "sha256:ae270e79f7e169ccfe23284ff5ea2d52a6f401dc01b337efb54b3783e2ce3f28"}, + {file = "coverage-7.6.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:de38add67a0af869b0d79c525d3e4588ac1ffa92f39116dbe0ed9753f26eba7d"}, + {file = "coverage-7.6.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b07c25d52b1c16ce5de088046cd2432b30f9ad5e224ff17c8f496d9cb7d1d451"}, + {file = "coverage-7.6.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62a66ff235e4c2e37ed3b6104d8b478d767ff73838d1222132a7a026aa548764"}, + {file = "coverage-7.6.8-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09b9f848b28081e7b975a3626e9081574a7b9196cde26604540582da60235fdf"}, + {file = "coverage-7.6.8-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:093896e530c38c8e9c996901858ac63f3d4171268db2c9c8b373a228f459bbc5"}, + {file = "coverage-7.6.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9a7b8ac36fd688c8361cbc7bf1cb5866977ece6e0b17c34aa0df58bda4fa18a4"}, + {file = "coverage-7.6.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:38c51297b35b3ed91670e1e4efb702b790002e3245a28c76e627478aa3c10d83"}, + {file = "coverage-7.6.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2e4e0f60cb4bd7396108823548e82fdab72d4d8a65e58e2c19bbbc2f1e2bfa4b"}, + {file = "coverage-7.6.8-cp313-cp313t-win32.whl", hash = "sha256:6535d996f6537ecb298b4e287a855f37deaf64ff007162ec0afb9ab8ba3b8b71"}, + {file = "coverage-7.6.8-cp313-cp313t-win_amd64.whl", hash = "sha256:c79c0685f142ca53256722a384540832420dff4ab15fec1863d7e5bc8691bdcc"}, + {file = "coverage-7.6.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3ac47fa29d8d41059ea3df65bd3ade92f97ee4910ed638e87075b8e8ce69599e"}, + {file = "coverage-7.6.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:24eda3a24a38157eee639ca9afe45eefa8d2420d49468819ac5f88b10de84f4c"}, + {file = "coverage-7.6.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4c81ed2820b9023a9a90717020315e63b17b18c274a332e3b6437d7ff70abe0"}, + {file = "coverage-7.6.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd55f8fc8fa494958772a2a7302b0354ab16e0b9272b3c3d83cdb5bec5bd1779"}, + {file = "coverage-7.6.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f39e2f3530ed1626c66e7493be7a8423b023ca852aacdc91fb30162c350d2a92"}, + {file = "coverage-7.6.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:716a78a342679cd1177bc8c2fe957e0ab91405bd43a17094324845200b2fddf4"}, + {file = "coverage-7.6.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:177f01eeaa3aee4a5ffb0d1439c5952b53d5010f86e9d2667963e632e30082cc"}, + {file = "coverage-7.6.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:912e95017ff51dc3d7b6e2be158dedc889d9a5cc3382445589ce554f1a34c0ea"}, + {file = "coverage-7.6.8-cp39-cp39-win32.whl", hash = "sha256:4db3ed6a907b555e57cc2e6f14dc3a4c2458cdad8919e40b5357ab9b6db6c43e"}, + {file = "coverage-7.6.8-cp39-cp39-win_amd64.whl", hash = "sha256:428ac484592f780e8cd7b6b14eb568f7c85460c92e2a37cb0c0e5186e1a0d076"}, + {file = "coverage-7.6.8-pp39.pp310-none-any.whl", hash = "sha256:5c52a036535d12590c32c49209e79cabaad9f9ad8aa4cbd875b68c4d67a9cbce"}, + {file = "coverage-7.6.8.tar.gz", hash = "sha256:8b2b8503edb06822c86d82fa64a4a5cb0760bb8f31f26e138ec743f422f37cfc"}, ] [package.dependencies] @@ -497,13 +531,13 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "dash" -version = "2.17.1" +version = "2.18.2" description = "A Python framework for building reactive web-apps. Developed by Plotly." optional = false python-versions = ">=3.8" files = [ - {file = "dash-2.17.1-py3-none-any.whl", hash = "sha256:3eefc9ac67003f93a06bc3e500cae0a6787c48e6c81f6f61514239ae2da414e4"}, - {file = "dash-2.17.1.tar.gz", hash = "sha256:ee2d9c319de5dcc1314085710b72cd5fa63ff994d913bf72979b7130daeea28e"}, + {file = "dash-2.18.2-py3-none-any.whl", hash = "sha256:0ce0479d1bc958e934630e2de7023b8a4558f23ce1f9f5a4b34b65eb3903a869"}, + {file = "dash-2.18.2.tar.gz", hash = "sha256:20e8404f73d0fe88ce2eae33c25bbc513cbe52f30d23a401fa5f24dbb44296c8"}, ] [package.dependencies] @@ -592,13 +626,13 @@ pygments = ["pygments (>=2.2.0)"] [[package]] name = "dill" -version = "0.3.8" +version = "0.3.9" description = "serialize all of Python" optional = false python-versions = ">=3.8" files = [ - {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, - {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, + {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, + {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, ] [package.extras] @@ -632,13 +666,13 @@ test = ["pytest (>=6)"] [[package]] name = "executing" -version = "2.0.1" +version = "2.1.0" description = "Get the currently executing AST node of a frame, and other information" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, - {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, + {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, + {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, ] [package.extras] @@ -661,19 +695,19 @@ pyrepl = ">=0.8.2" [[package]] name = "filelock" -version = "3.15.4" +version = "3.16.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, - {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, + {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, + {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] -typing = ["typing-extensions (>=4.8)"] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] +typing = ["typing-extensions (>=4.12.2)"] [[package]] name = "flask" @@ -698,66 +732,63 @@ Werkzeug = ">=3.0.0" async = ["asgiref (>=3.2)"] dotenv = ["python-dotenv"] -[[package]] -name = "flatbuffers" -version = "24.3.25" -description = "The FlatBuffers serialization format for Python" -optional = true -python-versions = "*" -files = [ - {file = "flatbuffers-24.3.25-py2.py3-none-any.whl", hash = "sha256:8dbdec58f935f3765e4f7f3cf635ac3a77f83568138d6a2311f524ec96364812"}, - {file = "flatbuffers-24.3.25.tar.gz", hash = "sha256:de2ec5b203f21441716617f38443e0a8ebf3d25bf0d9c0bb0ce68fa00ad546a4"}, -] - [[package]] name = "fonttools" -version = "4.53.1" +version = "4.55.0" description = "Tools to manipulate font files" optional = true python-versions = ">=3.8" files = [ - {file = "fonttools-4.53.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397"}, - {file = "fonttools-4.53.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3"}, - {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d"}, - {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0"}, - {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41"}, - {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f"}, - {file = "fonttools-4.53.1-cp310-cp310-win32.whl", hash = "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4"}, - {file = "fonttools-4.53.1-cp310-cp310-win_amd64.whl", hash = "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671"}, - {file = "fonttools-4.53.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1"}, - {file = "fonttools-4.53.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923"}, - {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719"}, - {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3"}, - {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb"}, - {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2"}, - {file = "fonttools-4.53.1-cp311-cp311-win32.whl", hash = "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88"}, - {file = "fonttools-4.53.1-cp311-cp311-win_amd64.whl", hash = "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02"}, - {file = "fonttools-4.53.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58"}, - {file = "fonttools-4.53.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8"}, - {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60"}, - {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f"}, - {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2"}, - {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f"}, - {file = "fonttools-4.53.1-cp312-cp312-win32.whl", hash = "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670"}, - {file = "fonttools-4.53.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab"}, - {file = "fonttools-4.53.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749"}, - {file = "fonttools-4.53.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2"}, - {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb"}, - {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f"}, - {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d"}, - {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169"}, - {file = "fonttools-4.53.1-cp38-cp38-win32.whl", hash = "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d"}, - {file = "fonttools-4.53.1-cp38-cp38-win_amd64.whl", hash = "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8"}, - {file = "fonttools-4.53.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a"}, - {file = "fonttools-4.53.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31"}, - {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c"}, - {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407"}, - {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb"}, - {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122"}, - {file = "fonttools-4.53.1-cp39-cp39-win32.whl", hash = "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb"}, - {file = "fonttools-4.53.1-cp39-cp39-win_amd64.whl", hash = "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb"}, - {file = "fonttools-4.53.1-py3-none-any.whl", hash = "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d"}, - {file = "fonttools-4.53.1.tar.gz", hash = "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4"}, + {file = "fonttools-4.55.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:51c029d4c0608a21a3d3d169dfc3fb776fde38f00b35ca11fdab63ba10a16f61"}, + {file = "fonttools-4.55.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bca35b4e411362feab28e576ea10f11268b1aeed883b9f22ed05675b1e06ac69"}, + {file = "fonttools-4.55.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ce4ba6981e10f7e0ccff6348e9775ce25ffadbee70c9fd1a3737e3e9f5fa74f"}, + {file = "fonttools-4.55.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31d00f9852a6051dac23294a4cf2df80ced85d1d173a61ba90a3d8f5abc63c60"}, + {file = "fonttools-4.55.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e198e494ca6e11f254bac37a680473a311a88cd40e58f9cc4dc4911dfb686ec6"}, + {file = "fonttools-4.55.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7208856f61770895e79732e1dcbe49d77bd5783adf73ae35f87fcc267df9db81"}, + {file = "fonttools-4.55.0-cp310-cp310-win32.whl", hash = "sha256:e7e6a352ff9e46e8ef8a3b1fe2c4478f8a553e1b5a479f2e899f9dc5f2055880"}, + {file = "fonttools-4.55.0-cp310-cp310-win_amd64.whl", hash = "sha256:636caaeefe586d7c84b5ee0734c1a5ab2dae619dc21c5cf336f304ddb8f6001b"}, + {file = "fonttools-4.55.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fa34aa175c91477485c44ddfbb51827d470011e558dfd5c7309eb31bef19ec51"}, + {file = "fonttools-4.55.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:37dbb3fdc2ef7302d3199fb12468481cbebaee849e4b04bc55b77c24e3c49189"}, + {file = "fonttools-4.55.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5263d8e7ef3c0ae87fbce7f3ec2f546dc898d44a337e95695af2cd5ea21a967"}, + {file = "fonttools-4.55.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f307f6b5bf9e86891213b293e538d292cd1677e06d9faaa4bf9c086ad5f132f6"}, + {file = "fonttools-4.55.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f0a4b52238e7b54f998d6a56b46a2c56b59c74d4f8a6747fb9d4042190f37cd3"}, + {file = "fonttools-4.55.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3e569711464f777a5d4ef522e781dc33f8095ab5efd7548958b36079a9f2f88c"}, + {file = "fonttools-4.55.0-cp311-cp311-win32.whl", hash = "sha256:2b3ab90ec0f7b76c983950ac601b58949f47aca14c3f21eed858b38d7ec42b05"}, + {file = "fonttools-4.55.0-cp311-cp311-win_amd64.whl", hash = "sha256:aa046f6a63bb2ad521004b2769095d4c9480c02c1efa7d7796b37826508980b6"}, + {file = "fonttools-4.55.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:838d2d8870f84fc785528a692e724f2379d5abd3fc9dad4d32f91cf99b41e4a7"}, + {file = "fonttools-4.55.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f46b863d74bab7bb0d395f3b68d3f52a03444964e67ce5c43ce43a75efce9246"}, + {file = "fonttools-4.55.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33b52a9cfe4e658e21b1f669f7309b4067910321757fec53802ca8f6eae96a5a"}, + {file = "fonttools-4.55.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:732a9a63d6ea4a81b1b25a1f2e5e143761b40c2e1b79bb2b68e4893f45139a40"}, + {file = "fonttools-4.55.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7dd91ac3fcb4c491bb4763b820bcab6c41c784111c24172616f02f4bc227c17d"}, + {file = "fonttools-4.55.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1f0e115281a32ff532118aa851ef497a1b7cda617f4621c1cdf81ace3e36fb0c"}, + {file = "fonttools-4.55.0-cp312-cp312-win32.whl", hash = "sha256:6c99b5205844f48a05cb58d4a8110a44d3038c67ed1d79eb733c4953c628b0f6"}, + {file = "fonttools-4.55.0-cp312-cp312-win_amd64.whl", hash = "sha256:f8c8c76037d05652510ae45be1cd8fb5dd2fd9afec92a25374ac82255993d57c"}, + {file = "fonttools-4.55.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8118dc571921dc9e4b288d9cb423ceaf886d195a2e5329cc427df82bba872cd9"}, + {file = "fonttools-4.55.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01124f2ca6c29fad4132d930da69158d3f49b2350e4a779e1efbe0e82bd63f6c"}, + {file = "fonttools-4.55.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81ffd58d2691f11f7c8438796e9f21c374828805d33e83ff4b76e4635633674c"}, + {file = "fonttools-4.55.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5435e5f1eb893c35c2bc2b9cd3c9596b0fcb0a59e7a14121562986dd4c47b8dd"}, + {file = "fonttools-4.55.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d12081729280c39d001edd0f4f06d696014c26e6e9a0a55488fabc37c28945e4"}, + {file = "fonttools-4.55.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a7ad1f1b98ab6cb927ab924a38a8649f1ffd7525c75fe5b594f5dab17af70e18"}, + {file = "fonttools-4.55.0-cp313-cp313-win32.whl", hash = "sha256:abe62987c37630dca69a104266277216de1023cf570c1643bb3a19a9509e7a1b"}, + {file = "fonttools-4.55.0-cp313-cp313-win_amd64.whl", hash = "sha256:2863555ba90b573e4201feaf87a7e71ca3b97c05aa4d63548a4b69ea16c9e998"}, + {file = "fonttools-4.55.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:00f7cf55ad58a57ba421b6a40945b85ac7cc73094fb4949c41171d3619a3a47e"}, + {file = "fonttools-4.55.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f27526042efd6f67bfb0cc2f1610fa20364396f8b1fc5edb9f45bb815fb090b2"}, + {file = "fonttools-4.55.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e67974326af6a8879dc2a4ec63ab2910a1c1a9680ccd63e4a690950fceddbe"}, + {file = "fonttools-4.55.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61dc0a13451143c5e987dec5254d9d428f3c2789a549a7cf4f815b63b310c1cc"}, + {file = "fonttools-4.55.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b2e526b325a903868c62155a6a7e24df53f6ce4c5c3160214d8fe1be2c41b478"}, + {file = "fonttools-4.55.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b7ef9068a1297714e6fefe5932c33b058aa1d45a2b8be32a4c6dee602ae22b5c"}, + {file = "fonttools-4.55.0-cp38-cp38-win32.whl", hash = "sha256:55718e8071be35dff098976bc249fc243b58efa263768c611be17fe55975d40a"}, + {file = "fonttools-4.55.0-cp38-cp38-win_amd64.whl", hash = "sha256:553bd4f8cc327f310c20158e345e8174c8eed49937fb047a8bda51daf2c353c8"}, + {file = "fonttools-4.55.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f901cef813f7c318b77d1c5c14cf7403bae5cb977cede023e22ba4316f0a8f6"}, + {file = "fonttools-4.55.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c9679fc0dd7e8a5351d321d8d29a498255e69387590a86b596a45659a39eb0d"}, + {file = "fonttools-4.55.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd2820a8b632f3307ebb0bf57948511c2208e34a4939cf978333bc0a3f11f838"}, + {file = "fonttools-4.55.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23bbbb49bec613a32ed1b43df0f2b172313cee690c2509f1af8fdedcf0a17438"}, + {file = "fonttools-4.55.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a656652e1f5d55b9728937a7e7d509b73d23109cddd4e89ee4f49bde03b736c6"}, + {file = "fonttools-4.55.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f50a1f455902208486fbca47ce33054208a4e437b38da49d6721ce2fef732fcf"}, + {file = "fonttools-4.55.0-cp39-cp39-win32.whl", hash = "sha256:161d1ac54c73d82a3cded44202d0218ab007fde8cf194a23d3dd83f7177a2f03"}, + {file = "fonttools-4.55.0-cp39-cp39-win_amd64.whl", hash = "sha256:ca7fd6987c68414fece41c96836e945e1f320cda56fc96ffdc16e54a44ec57a2"}, + {file = "fonttools-4.55.0-py3-none-any.whl", hash = "sha256:12db5888cd4dd3fcc9f0ee60c6edd3c7e1fd44b7dd0f31381ea03df68f8a153f"}, + {file = "fonttools-4.55.0.tar.gz", hash = "sha256:7636acc6ab733572d5e7eec922b254ead611f1cdad17be3f0be7418e8bfaca71"}, ] [package.extras] @@ -776,13 +807,13 @@ woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "fsspec" -version = "2024.6.1" +version = "2024.10.0" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2024.6.1-py3-none-any.whl", hash = "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e"}, - {file = "fsspec-2024.6.1.tar.gz", hash = "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49"}, + {file = "fsspec-2024.10.0-py3-none-any.whl", hash = "sha256:03b9a6785766a4de40368b88906366755e2819e758b83705c88cd7cb5fe81871"}, + {file = "fsspec-2024.10.0.tar.gz", hash = "sha256:eda2d8a4116d4f2429db8550f2457da57279247dd930bb12f821b58391359493"}, ] [package.extras] @@ -831,15 +862,90 @@ sphinx = ">=5.0,<7.0" sphinx-basic-ng = "*" [[package]] -name = "future" -version = "1.0.0" -description = "Clean single-source support for Python 3 and 2" +name = "greenlet" +version = "3.1.1" +description = "Lightweight in-process concurrent programming" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=3.7" files = [ - {file = "future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216"}, - {file = "future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05"}, -] + {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"}, + {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"}, + {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"}, + {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"}, + {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"}, + {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"}, + {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"}, + {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"}, + {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"}, + {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"}, + {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"}, + {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"}, + {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"}, + {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"}, + {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"}, + {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"}, + {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"}, +] + +[package.extras] +docs = ["Sphinx", "furo"] +test = ["objgraph", "psutil"] [[package]] name = "html5lib" @@ -864,13 +970,13 @@ lxml = ["lxml"] [[package]] name = "huggingface-hub" -version = "0.24.5" +version = "0.26.3" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.24.5-py3-none-any.whl", hash = "sha256:d93fb63b1f1a919a22ce91a14518974e81fc4610bf344dfe7572343ce8d3aced"}, - {file = "huggingface_hub-0.24.5.tar.gz", hash = "sha256:7b45d6744dd53ce9cbf9880957de00e9d10a9ae837f1c9b7255fc8fa4e8264f3"}, + {file = "huggingface_hub-0.26.3-py3-none-any.whl", hash = "sha256:e66aa99e569c2d5419240a9e553ad07245a5b1300350bfbc5a4945cf7432991b"}, + {file = "huggingface_hub-0.26.3.tar.gz", hash = "sha256:90e1fe62ffc26757a073aaad618422b899ccf9447c2bba8c902a90bef5b42e1d"}, ] [package.dependencies] @@ -883,71 +989,33 @@ tqdm = ">=4.42.1" typing-extensions = ">=3.7.4.3" [package.extras] -all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "libcst (==1.4.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] cli = ["InquirerPy (==0.3.4)"] -dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "libcst (==1.4.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] hf-transfer = ["hf-transfer (>=0.1.4)"] -inference = ["aiohttp", "minijinja (>=1.0)"] -quality = ["mypy (==1.5.1)", "ruff (>=0.5.0)"] +inference = ["aiohttp"] +quality = ["libcst (==1.4.0)", "mypy (==1.5.1)", "ruff (>=0.5.0)"] tensorflow = ["graphviz", "pydot", "tensorflow"] tensorflow-testing = ["keras (<3.0)", "tensorflow"] -testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] torch = ["safetensors[torch]", "torch"] typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] -[[package]] -name = "humanfriendly" -version = "10.0" -description = "Human friendly output for text interfaces using Python" -optional = true -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477"}, - {file = "humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc"}, -] - -[package.dependencies] -pyreadline3 = {version = "*", markers = "sys_platform == \"win32\" and python_version >= \"3.8\""} - -[[package]] -name = "hyperopt" -version = "0.2.7" -description = "Distributed Asynchronous Hyperparameter Optimization" -optional = false -python-versions = "*" -files = [ - {file = "hyperopt-0.2.7-py2.py3-none-any.whl", hash = "sha256:f3046d91fe4167dbf104365016596856b2524a609d22f047a066fc1ac796427c"}, - {file = "hyperopt-0.2.7.tar.gz", hash = "sha256:1bf89ae58050bbd32c7307199046117feee245c2fd9ab6255c7308522b7ca149"}, -] - -[package.dependencies] -cloudpickle = "*" -future = "*" -networkx = ">=2.2" -numpy = "*" -py4j = "*" -scipy = "*" -six = "*" -tqdm = "*" - -[package.extras] -atpe = ["lightgbm", "scikit-learn"] -dev = ["black", "nose", "pre-commit", "pytest"] -mongotrials = ["pymongo"] -sparktrials = ["pyspark"] - [[package]] name = "idna" -version = "3.7" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "imagesize" version = "1.4.1" @@ -961,40 +1029,48 @@ files = [ [[package]] name = "importlib-metadata" -version = "8.2.0" +version = "8.5.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-8.2.0-py3-none-any.whl", hash = "sha256:11901fa0c2f97919b288679932bb64febaeacf289d18ac84dd68cb2e74213369"}, - {file = "importlib_metadata-8.2.0.tar.gz", hash = "sha256:72e8d4399996132204f9a16dcc751af254a48f8d1b20b9ff0f98d4a8f901e73d"}, + {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, + {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, ] [package.dependencies] -zipp = ">=0.5" +zipp = ">=3.20" [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["pytest-mypy"] [[package]] name = "importlib-resources" -version = "6.4.0" +version = "6.4.5" description = "Read resources from Python packages" optional = true python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.4.0-py3-none-any.whl", hash = "sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c"}, - {file = "importlib_resources-6.4.0.tar.gz", hash = "sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145"}, + {file = "importlib_resources-6.4.5-py3-none-any.whl", hash = "sha256:ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717"}, + {file = "importlib_resources-6.4.5.tar.gz", hash = "sha256:980862a1d16c9e147a59603677fa2aa5fd82b87f223b6cb870695bcfce830065"}, ] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["jaraco.test (>=5.4)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["jaraco.test (>=5.4)", "pytest (>=6,!=8.1.*)", "zipp (>=3.17)"] +type = ["pytest-mypy"] [[package]] name = "iniconfig" @@ -1071,22 +1147,22 @@ files = [ [[package]] name = "jedi" -version = "0.19.1" +version = "0.19.2" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" files = [ - {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, - {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, + {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, + {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, ] [package.dependencies] -parso = ">=0.8.3,<0.9.0" +parso = ">=0.8.4,<0.9.0" [package.extras] docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] [[package]] name = "jinja2" @@ -1118,115 +1194,125 @@ files = [ [[package]] name = "kiwisolver" -version = "1.4.5" +version = "1.4.7" description = "A fast implementation of the Cassowary constraint solver" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, - {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, - {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, - {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, - {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, - {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, - {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, - {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, - {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, - {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, - {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, - {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5d5abf8f8ec1f4e22882273c423e16cae834c36856cac348cfbfa68e01c40f3a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aeb3531b196ef6f11776c21674dba836aeea9d5bd1cf630f869e3d90b16cfade"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08471d4d86cbaec61f86b217dd938a83d85e03785f51121e791a6e6689a3be95"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bbfcb7165ce3d54a3dfbe731e470f65739c4c1f85bb1018ee912bae139e263b"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d34eb8494bea691a1a450141ebb5385e4b69d38bb8403b5146ad279f4b30fa3"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9242795d174daa40105c1d86aba618e8eab7bf96ba8c3ee614da8302a9f95503"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8e045731a5416357638d1700927529e2b8ab304811671f665b225f8bf8d8f933"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4322872d5772cae7369f8351da1edf255a604ea7087fe295411397d0cfd9655e"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e1631290ee9271dffe3062d2634c3ecac02c83890ada077d225e081aca8aab89"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:edcfc407e4eb17e037bca59be0e85a2031a2ac87e4fed26d3e9df88b4165f92d"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4d05d81ecb47d11e7f8932bd8b61b720bf0b41199358f3f5e36d38e28f0532c5"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win32.whl", hash = "sha256:b38ac83d5f04b15e515fd86f312479d950d05ce2368d5413d46c088dda7de90a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:d83db7cde68459fc803052a55ace60bea2bae361fc3b7a6d5da07e11954e4b09"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bfa1acfa0c54932d5607e19a2c24646fb4c1ae2694437789129cf099789a3b00"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:eee3ea935c3d227d49b4eb85660ff631556841f6e567f0f7bda972df6c2c9935"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f3160309af4396e0ed04db259c3ccbfdc3621b5559b5453075e5de555e1f3a1b"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a17f6a29cf8935e587cc8a4dbfc8368c55edc645283db0ce9801016f83526c2d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10849fb2c1ecbfae45a693c070e0320a91b35dd4bcf58172c023b994283a124d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ac542bf38a8a4be2dc6b15248d36315ccc65f0743f7b1a76688ffb6b5129a5c2"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0"}, + {file = "kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60"}, ] [[package]] @@ -1288,153 +1374,149 @@ files = [ [[package]] name = "lxml" -version = "5.2.2" +version = "5.3.0" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.6" files = [ - {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:364d03207f3e603922d0d3932ef363d55bbf48e3647395765f9bfcbdf6d23632"}, - {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:50127c186f191b8917ea2fb8b206fbebe87fd414a6084d15568c27d0a21d60db"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74e4f025ef3db1c6da4460dd27c118d8cd136d0391da4e387a15e48e5c975147"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981a06a3076997adf7c743dcd0d7a0415582661e2517c7d961493572e909aa1d"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aef5474d913d3b05e613906ba4090433c515e13ea49c837aca18bde190853dff"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e275ea572389e41e8b039ac076a46cb87ee6b8542df3fff26f5baab43713bca"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5b65529bb2f21ac7861a0e94fdbf5dc0daab41497d18223b46ee8515e5ad297"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bcc98f911f10278d1daf14b87d65325851a1d29153caaf146877ec37031d5f36"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:b47633251727c8fe279f34025844b3b3a3e40cd1b198356d003aa146258d13a2"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:fbc9d316552f9ef7bba39f4edfad4a734d3d6f93341232a9dddadec4f15d425f"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:13e69be35391ce72712184f69000cda04fc89689429179bc4c0ae5f0b7a8c21b"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3b6a30a9ab040b3f545b697cb3adbf3696c05a3a68aad172e3fd7ca73ab3c835"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a233bb68625a85126ac9f1fc66d24337d6e8a0f9207b688eec2e7c880f012ec0"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:dfa7c241073d8f2b8e8dbc7803c434f57dbb83ae2a3d7892dd068d99e96efe2c"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a7aca7964ac4bb07680d5c9d63b9d7028cace3e2d43175cb50bba8c5ad33316"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ae4073a60ab98529ab8a72ebf429f2a8cc612619a8c04e08bed27450d52103c0"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ffb2be176fed4457e445fe540617f0252a72a8bc56208fd65a690fdb1f57660b"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e290d79a4107d7d794634ce3e985b9ae4f920380a813717adf61804904dc4393"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:96e85aa09274955bb6bd483eaf5b12abadade01010478154b0ec70284c1b1526"}, - {file = "lxml-5.2.2-cp310-cp310-win32.whl", hash = "sha256:f956196ef61369f1685d14dad80611488d8dc1ef00be57c0c5a03064005b0f30"}, - {file = "lxml-5.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:875a3f90d7eb5c5d77e529080d95140eacb3c6d13ad5b616ee8095447b1d22e7"}, - {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45f9494613160d0405682f9eee781c7e6d1bf45f819654eb249f8f46a2c22545"}, - {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d28cb356f119a437cc58a13f8135ab8a4c8ece18159eb9194b0d269ec4e28083"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:657a972f46bbefdbba2d4f14413c0d079f9ae243bd68193cb5061b9732fa54c1"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b9ea10063efb77a965a8d5f4182806fbf59ed068b3c3fd6f30d2ac7bee734"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07542787f86112d46d07d4f3c4e7c760282011b354d012dc4141cc12a68cef5f"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:303f540ad2dddd35b92415b74b900c749ec2010e703ab3bfd6660979d01fd4ed"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:1d8a701774dfc42a2f0b8ccdfe7dbc140500d1049e0632a611985d943fcf12df"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:56793b7a1a091a7c286b5f4aa1fe4ae5d1446fe742d00cdf2ffb1077865db10d"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eb00b549b13bd6d884c863554566095bf6fa9c3cecb2e7b399c4bc7904cb33b5"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a2569a1f15ae6c8c64108a2cd2b4a858fc1e13d25846be0666fc144715e32ab"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:8cf85a6e40ff1f37fe0f25719aadf443686b1ac7652593dc53c7ef9b8492b115"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d237ba6664b8e60fd90b8549a149a74fcc675272e0e95539a00522e4ca688b04"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0b3f5016e00ae7630a4b83d0868fca1e3d494c78a75b1c7252606a3a1c5fc2ad"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23441e2b5339bc54dc949e9e675fa35efe858108404ef9aa92f0456929ef6fe8"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2fb0ba3e8566548d6c8e7dd82a8229ff47bd8fb8c2da237607ac8e5a1b8312e5"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:79d1fb9252e7e2cfe4de6e9a6610c7cbb99b9708e2c3e29057f487de5a9eaefa"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6dcc3d17eac1df7859ae01202e9bb11ffa8c98949dcbeb1069c8b9a75917e01b"}, - {file = "lxml-5.2.2-cp311-cp311-win32.whl", hash = "sha256:4c30a2f83677876465f44c018830f608fa3c6a8a466eb223535035fbc16f3438"}, - {file = "lxml-5.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:49095a38eb333aaf44c06052fd2ec3b8f23e19747ca7ec6f6c954ffea6dbf7be"}, - {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7429e7faa1a60cad26ae4227f4dd0459efde239e494c7312624ce228e04f6391"}, - {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:50ccb5d355961c0f12f6cf24b7187dbabd5433f29e15147a67995474f27d1776"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc911208b18842a3a57266d8e51fc3cfaccee90a5351b92079beed912a7914c2"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33ce9e786753743159799fdf8e92a5da351158c4bfb6f2db0bf31e7892a1feb5"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec87c44f619380878bd49ca109669c9f221d9ae6883a5bcb3616785fa8f94c97"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08ea0f606808354eb8f2dfaac095963cb25d9d28e27edcc375d7b30ab01abbf6"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75a9632f1d4f698b2e6e2e1ada40e71f369b15d69baddb8968dcc8e683839b18"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74da9f97daec6928567b48c90ea2c82a106b2d500f397eeb8941e47d30b1ca85"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:0969e92af09c5687d769731e3f39ed62427cc72176cebb54b7a9d52cc4fa3b73"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:9164361769b6ca7769079f4d426a41df6164879f7f3568be9086e15baca61466"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d26a618ae1766279f2660aca0081b2220aca6bd1aa06b2cf73f07383faf48927"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab67ed772c584b7ef2379797bf14b82df9aa5f7438c5b9a09624dd834c1c1aaf"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3d1e35572a56941b32c239774d7e9ad724074d37f90c7a7d499ab98761bd80cf"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:8268cbcd48c5375f46e000adb1390572c98879eb4f77910c6053d25cc3ac2c67"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e282aedd63c639c07c3857097fc0e236f984ceb4089a8b284da1c526491e3f3d"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfdc2bfe69e9adf0df4915949c22a25b39d175d599bf98e7ddf620a13678585"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4aefd911793b5d2d7a921233a54c90329bf3d4a6817dc465f12ffdfe4fc7b8fe"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8b8df03a9e995b6211dafa63b32f9d405881518ff1ddd775db4e7b98fb545e1c"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f11ae142f3a322d44513de1018b50f474f8f736bc3cd91d969f464b5bfef8836"}, - {file = "lxml-5.2.2-cp312-cp312-win32.whl", hash = "sha256:16a8326e51fcdffc886294c1e70b11ddccec836516a343f9ed0f82aac043c24a"}, - {file = "lxml-5.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:bbc4b80af581e18568ff07f6395c02114d05f4865c2812a1f02f2eaecf0bfd48"}, - {file = "lxml-5.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e3d9d13603410b72787579769469af730c38f2f25505573a5888a94b62b920f8"}, - {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38b67afb0a06b8575948641c1d6d68e41b83a3abeae2ca9eed2ac59892b36706"}, - {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c689d0d5381f56de7bd6966a4541bff6e08bf8d3871bbd89a0c6ab18aa699573"}, - {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:cf2a978c795b54c539f47964ec05e35c05bd045db5ca1e8366988c7f2fe6b3ce"}, - {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:739e36ef7412b2bd940f75b278749106e6d025e40027c0b94a17ef7968d55d56"}, - {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d8bbcd21769594dbba9c37d3c819e2d5847656ca99c747ddb31ac1701d0c0ed9"}, - {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:2304d3c93f2258ccf2cf7a6ba8c761d76ef84948d87bf9664e14d203da2cd264"}, - {file = "lxml-5.2.2-cp36-cp36m-win32.whl", hash = "sha256:02437fb7308386867c8b7b0e5bc4cd4b04548b1c5d089ffb8e7b31009b961dc3"}, - {file = "lxml-5.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196"}, - {file = "lxml-5.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b"}, - {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8"}, - {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6"}, - {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716"}, - {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c"}, - {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905"}, - {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184"}, - {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6"}, - {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f"}, - {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61"}, - {file = "lxml-5.2.2-cp37-cp37m-win32.whl", hash = "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f"}, - {file = "lxml-5.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40"}, - {file = "lxml-5.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ed07b3062b055d7a7f9d6557a251cc655eed0b3152b76de619516621c56f5d3"}, - {file = "lxml-5.2.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f60fdd125d85bf9c279ffb8e94c78c51b3b6a37711464e1f5f31078b45002421"}, - {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a7e24cb69ee5f32e003f50e016d5fde438010c1022c96738b04fc2423e61706"}, - {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23cfafd56887eaed93d07bc4547abd5e09d837a002b791e9767765492a75883f"}, - {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:19b4e485cd07b7d83e3fe3b72132e7df70bfac22b14fe4bf7a23822c3a35bff5"}, - {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7ce7ad8abebe737ad6143d9d3bf94b88b93365ea30a5b81f6877ec9c0dee0a48"}, - {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e49b052b768bb74f58c7dda4e0bdf7b79d43a9204ca584ffe1fb48a6f3c84c66"}, - {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d14a0d029a4e176795cef99c056d58067c06195e0c7e2dbb293bf95c08f772a3"}, - {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:be49ad33819d7dcc28a309b86d4ed98e1a65f3075c6acd3cd4fe32103235222b"}, - {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a6d17e0370d2516d5bb9062c7b4cb731cff921fc875644c3d751ad857ba9c5b1"}, - {file = "lxml-5.2.2-cp38-cp38-win32.whl", hash = "sha256:5b8c041b6265e08eac8a724b74b655404070b636a8dd6d7a13c3adc07882ef30"}, - {file = "lxml-5.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:f61efaf4bed1cc0860e567d2ecb2363974d414f7f1f124b1df368bbf183453a6"}, - {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fb91819461b1b56d06fa4bcf86617fac795f6a99d12239fb0c68dbeba41a0a30"}, - {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d4ed0c7cbecde7194cd3228c044e86bf73e30a23505af852857c09c24e77ec5d"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54401c77a63cc7d6dc4b4e173bb484f28a5607f3df71484709fe037c92d4f0ed"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:625e3ef310e7fa3a761d48ca7ea1f9d8718a32b1542e727d584d82f4453d5eeb"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:519895c99c815a1a24a926d5b60627ce5ea48e9f639a5cd328bda0515ea0f10c"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7079d5eb1c1315a858bbf180000757db8ad904a89476653232db835c3114001"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:343ab62e9ca78094f2306aefed67dcfad61c4683f87eee48ff2fd74902447726"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:cd9e78285da6c9ba2d5c769628f43ef66d96ac3085e59b10ad4f3707980710d3"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:546cf886f6242dff9ec206331209db9c8e1643ae642dea5fdbecae2453cb50fd"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:02f6a8eb6512fdc2fd4ca10a49c341c4e109aa6e9448cc4859af5b949622715a"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:339ee4a4704bc724757cd5dd9dc8cf4d00980f5d3e6e06d5847c1b594ace68ab"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0a028b61a2e357ace98b1615fc03f76eb517cc028993964fe08ad514b1e8892d"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f90e552ecbad426eab352e7b2933091f2be77115bb16f09f78404861c8322981"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d83e2d94b69bf31ead2fa45f0acdef0757fa0458a129734f59f67f3d2eb7ef32"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a02d3c48f9bb1e10c7788d92c0c7db6f2002d024ab6e74d6f45ae33e3d0288a3"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6d68ce8e7b2075390e8ac1e1d3a99e8b6372c694bbe612632606d1d546794207"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:453d037e09a5176d92ec0fd282e934ed26d806331a8b70ab431a81e2fbabf56d"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:3b019d4ee84b683342af793b56bb35034bd749e4cbdd3d33f7d1107790f8c472"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb3942960f0beb9f46e2a71a3aca220d1ca32feb5a398656be934320804c0df9"}, - {file = "lxml-5.2.2-cp39-cp39-win32.whl", hash = "sha256:ac6540c9fff6e3813d29d0403ee7a81897f1d8ecc09a8ff84d2eea70ede1cdbf"}, - {file = "lxml-5.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:610b5c77428a50269f38a534057444c249976433f40f53e3b47e68349cca1425"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b537bd04d7ccd7c6350cdaaaad911f6312cbd61e6e6045542f781c7f8b2e99d2"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4820c02195d6dfb7b8508ff276752f6b2ff8b64ae5d13ebe02e7667e035000b9"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a09f6184f17a80897172863a655467da2b11151ec98ba8d7af89f17bf63dae"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:76acba4c66c47d27c8365e7c10b3d8016a7da83d3191d053a58382311a8bf4e1"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b128092c927eaf485928cec0c28f6b8bead277e28acf56800e972aa2c2abd7a2"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ae791f6bd43305aade8c0e22f816b34f3b72b6c820477aab4d18473a37e8090b"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a2f6a1bc2460e643785a2cde17293bd7a8f990884b822f7bca47bee0a82fc66b"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e8d351ff44c1638cb6e980623d517abd9f580d2e53bfcd18d8941c052a5a009"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bec4bd9133420c5c52d562469c754f27c5c9e36ee06abc169612c959bd7dbb07"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:55ce6b6d803890bd3cc89975fca9de1dff39729b43b73cb15ddd933b8bc20484"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ab6a358d1286498d80fe67bd3d69fcbc7d1359b45b41e74c4a26964ca99c3f8"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:06668e39e1f3c065349c51ac27ae430719d7806c026fec462e5693b08b95696b"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9cd5323344d8ebb9fb5e96da5de5ad4ebab993bbf51674259dbe9d7a18049525"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89feb82ca055af0fe797a2323ec9043b26bc371365847dbe83c7fd2e2f181c34"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e481bba1e11ba585fb06db666bfc23dbe181dbafc7b25776156120bf12e0d5a6"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d6c6ea6a11ca0ff9cd0390b885984ed31157c168565702959c25e2191674a14"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3d98de734abee23e61f6b8c2e08a88453ada7d6486dc7cdc82922a03968928db"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:69ab77a1373f1e7563e0fb5a29a8440367dec051da6c7405333699d07444f511"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:34e17913c431f5ae01d8658dbf792fdc457073dcdfbb31dc0cc6ab256e664a8d"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05f8757b03208c3f50097761be2dea0aba02e94f0dc7023ed73a7bb14ff11eb0"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a520b4f9974b0a0a6ed73c2154de57cdfd0c8800f4f15ab2b73238ffed0b36e"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5e097646944b66207023bc3c634827de858aebc226d5d4d6d16f0b77566ea182"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b5e4ef22ff25bfd4ede5f8fb30f7b24446345f3e79d9b7455aef2836437bc38a"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff69a9a0b4b17d78170c73abe2ab12084bdf1691550c5629ad1fe7849433f324"}, - {file = "lxml-5.2.2.tar.gz", hash = "sha256:bb2dc4898180bea79863d5487e5f9c7c34297414bad54bcd0f0852aee9cfdb87"}, + {file = "lxml-5.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dd36439be765e2dde7660212b5275641edbc813e7b24668831a5c8ac91180656"}, + {file = "lxml-5.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ae5fe5c4b525aa82b8076c1a59d642c17b6e8739ecf852522c6321852178119d"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:501d0d7e26b4d261fca8132854d845e4988097611ba2531408ec91cf3fd9d20a"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66442c2546446944437df74379e9cf9e9db353e61301d1a0e26482f43f0dd8"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e41506fec7a7f9405b14aa2d5c8abbb4dbbd09d88f9496958b6d00cb4d45330"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7d4a670107d75dfe5ad080bed6c341d18c4442f9378c9f58e5851e86eb79965"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41ce1f1e2c7755abfc7e759dc34d7d05fd221723ff822947132dc934d122fe22"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:44264ecae91b30e5633013fb66f6ddd05c006d3e0e884f75ce0b4755b3e3847b"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:3c174dc350d3ec52deb77f2faf05c439331d6ed5e702fc247ccb4e6b62d884b7"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:2dfab5fa6a28a0b60a20638dc48e6343c02ea9933e3279ccb132f555a62323d8"}, + {file = "lxml-5.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b1c8c20847b9f34e98080da785bb2336ea982e7f913eed5809e5a3c872900f32"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2c86bf781b12ba417f64f3422cfc302523ac9cd1d8ae8c0f92a1c66e56ef2e86"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c162b216070f280fa7da844531169be0baf9ccb17263cf5a8bf876fcd3117fa5"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:36aef61a1678cb778097b4a6eeae96a69875d51d1e8f4d4b491ab3cfb54b5a03"}, + {file = "lxml-5.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f65e5120863c2b266dbcc927b306c5b78e502c71edf3295dfcb9501ec96e5fc7"}, + {file = "lxml-5.3.0-cp310-cp310-win32.whl", hash = "sha256:ef0c1fe22171dd7c7c27147f2e9c3e86f8bdf473fed75f16b0c2e84a5030ce80"}, + {file = "lxml-5.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:052d99051e77a4f3e8482c65014cf6372e61b0a6f4fe9edb98503bb5364cfee3"}, + {file = "lxml-5.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74bcb423462233bc5d6066e4e98b0264e7c1bed7541fff2f4e34fe6b21563c8b"}, + {file = "lxml-5.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a3d819eb6f9b8677f57f9664265d0a10dd6551d227afb4af2b9cd7bdc2ccbf18"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b8f5db71b28b8c404956ddf79575ea77aa8b1538e8b2ef9ec877945b3f46442"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3406b63232fc7e9b8783ab0b765d7c59e7c59ff96759d8ef9632fca27c7ee4"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ecdd78ab768f844c7a1d4a03595038c166b609f6395e25af9b0f3f26ae1230f"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168f2dfcfdedf611eb285efac1516c8454c8c99caf271dccda8943576b67552e"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa617107a410245b8660028a7483b68e7914304a6d4882b5ff3d2d3eb5948d8c"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:69959bd3167b993e6e710b99051265654133a98f20cec1d9b493b931942e9c16"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:bd96517ef76c8654446fc3db9242d019a1bb5fe8b751ba414765d59f99210b79"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:ab6dd83b970dc97c2d10bc71aa925b84788c7c05de30241b9e96f9b6d9ea3080"}, + {file = "lxml-5.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eec1bb8cdbba2925bedc887bc0609a80e599c75b12d87ae42ac23fd199445654"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a7095eeec6f89111d03dabfe5883a1fd54da319c94e0fb104ee8f23616b572d"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6f651ebd0b21ec65dfca93aa629610a0dbc13dbc13554f19b0113da2e61a4763"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f422a209d2455c56849442ae42f25dbaaba1c6c3f501d58761c619c7836642ec"}, + {file = "lxml-5.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:62f7fdb0d1ed2065451f086519865b4c90aa19aed51081979ecd05a21eb4d1be"}, + {file = "lxml-5.3.0-cp311-cp311-win32.whl", hash = "sha256:c6379f35350b655fd817cd0d6cbeef7f265f3ae5fedb1caae2eb442bbeae9ab9"}, + {file = "lxml-5.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c52100e2c2dbb0649b90467935c4b0de5528833c76a35ea1a2691ec9f1ee7a1"}, + {file = "lxml-5.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e99f5507401436fdcc85036a2e7dc2e28d962550afe1cbfc07c40e454256a859"}, + {file = "lxml-5.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:384aacddf2e5813a36495233b64cb96b1949da72bef933918ba5c84e06af8f0e"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a216bf6afaf97c263b56371434e47e2c652d215788396f60477540298218f"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65ab5685d56914b9a2a34d67dd5488b83213d680b0c5d10b47f81da5a16b0b0e"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aac0bbd3e8dd2d9c45ceb82249e8bdd3ac99131a32b4d35c8af3cc9db1657179"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b369d3db3c22ed14c75ccd5af429086f166a19627e84a8fdade3f8f31426e52a"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24037349665434f375645fa9d1f5304800cec574d0310f618490c871fd902b3"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:62d172f358f33a26d6b41b28c170c63886742f5b6772a42b59b4f0fa10526cb1"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:c1f794c02903c2824fccce5b20c339a1a14b114e83b306ff11b597c5f71a1c8d"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:5d6a6972b93c426ace71e0be9a6f4b2cfae9b1baed2eed2006076a746692288c"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:3879cc6ce938ff4eb4900d901ed63555c778731a96365e53fadb36437a131a99"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:74068c601baff6ff021c70f0935b0c7bc528baa8ea210c202e03757c68c5a4ff"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ecd4ad8453ac17bc7ba3868371bffb46f628161ad0eefbd0a855d2c8c32dd81a"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7e2f58095acc211eb9d8b5771bf04df9ff37d6b87618d1cbf85f92399c98dae8"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e63601ad5cd8f860aa99d109889b5ac34de571c7ee902d6812d5d9ddcc77fa7d"}, + {file = "lxml-5.3.0-cp312-cp312-win32.whl", hash = "sha256:17e8d968d04a37c50ad9c456a286b525d78c4a1c15dd53aa46c1d8e06bf6fa30"}, + {file = "lxml-5.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:c1a69e58a6bb2de65902051d57fde951febad631a20a64572677a1052690482f"}, + {file = "lxml-5.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c72e9563347c7395910de6a3100a4840a75a6f60e05af5e58566868d5eb2d6a"}, + {file = "lxml-5.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e92ce66cd919d18d14b3856906a61d3f6b6a8500e0794142338da644260595cd"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d04f064bebdfef9240478f7a779e8c5dc32b8b7b0b2fc6a62e39b928d428e51"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c2fb570d7823c2bbaf8b419ba6e5662137f8166e364a8b2b91051a1fb40ab8b"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c120f43553ec759f8de1fee2f4794452b0946773299d44c36bfe18e83caf002"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:562e7494778a69086f0312ec9689f6b6ac1c6b65670ed7d0267e49f57ffa08c4"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:423b121f7e6fa514ba0c7918e56955a1d4470ed35faa03e3d9f0e3baa4c7e492"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:c00f323cc00576df6165cc9d21a4c21285fa6b9989c5c39830c3903dc4303ef3"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:1fdc9fae8dd4c763e8a31e7630afef517eab9f5d5d31a278df087f307bf601f4"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:658f2aa69d31e09699705949b5fc4719cbecbd4a97f9656a232e7d6c7be1a367"}, + {file = "lxml-5.3.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1473427aff3d66a3fa2199004c3e601e6c4500ab86696edffdbc84954c72d832"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a87de7dd873bf9a792bf1e58b1c3887b9264036629a5bf2d2e6579fe8e73edff"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0d7b36afa46c97875303a94e8f3ad932bf78bace9e18e603f2085b652422edcd"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:cf120cce539453ae086eacc0130a324e7026113510efa83ab42ef3fcfccac7fb"}, + {file = "lxml-5.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:df5c7333167b9674aa8ae1d4008fa4bc17a313cc490b2cca27838bbdcc6bb15b"}, + {file = "lxml-5.3.0-cp313-cp313-win32.whl", hash = "sha256:c802e1c2ed9f0c06a65bc4ed0189d000ada8049312cfeab6ca635e39c9608957"}, + {file = "lxml-5.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d"}, + {file = "lxml-5.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8f0de2d390af441fe8b2c12626d103540b5d850d585b18fcada58d972b74a74e"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1afe0a8c353746e610bd9031a630a95bcfb1a720684c3f2b36c4710a0a96528f"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56b9861a71575f5795bde89256e7467ece3d339c9b43141dbdd54544566b3b94"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:9fb81d2824dff4f2e297a276297e9031f46d2682cafc484f49de182aa5e5df99"}, + {file = "lxml-5.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2c226a06ecb8cdef28845ae976da407917542c5e6e75dcac7cc33eb04aaeb237"}, + {file = "lxml-5.3.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:7d3d1ca42870cdb6d0d29939630dbe48fa511c203724820fc0fd507b2fb46577"}, + {file = "lxml-5.3.0-cp36-cp36m-win32.whl", hash = "sha256:094cb601ba9f55296774c2d57ad68730daa0b13dc260e1f941b4d13678239e70"}, + {file = "lxml-5.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:eafa2c8658f4e560b098fe9fc54539f86528651f61849b22111a9b107d18910c"}, + {file = "lxml-5.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cb83f8a875b3d9b458cada4f880fa498646874ba4011dc974e071a0a84a1b033"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25f1b69d41656b05885aa185f5fdf822cb01a586d1b32739633679699f220391"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23e0553b8055600b3bf4a00b255ec5c92e1e4aebf8c2c09334f8368e8bd174d6"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ada35dd21dc6c039259596b358caab6b13f4db4d4a7f8665764d616daf9cc1d"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:81b4e48da4c69313192d8c8d4311e5d818b8be1afe68ee20f6385d0e96fc9512"}, + {file = "lxml-5.3.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:2bc9fd5ca4729af796f9f59cd8ff160fe06a474da40aca03fcc79655ddee1a8b"}, + {file = "lxml-5.3.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:07da23d7ee08577760f0a71d67a861019103e4812c87e2fab26b039054594cc5"}, + {file = "lxml-5.3.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:ea2e2f6f801696ad7de8aec061044d6c8c0dd4037608c7cab38a9a4d316bfb11"}, + {file = "lxml-5.3.0-cp37-cp37m-win32.whl", hash = "sha256:5c54afdcbb0182d06836cc3d1be921e540be3ebdf8b8a51ee3ef987537455f84"}, + {file = "lxml-5.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:f2901429da1e645ce548bf9171784c0f74f0718c3f6150ce166be39e4dd66c3e"}, + {file = "lxml-5.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c56a1d43b2f9ee4786e4658c7903f05da35b923fb53c11025712562d5cc02753"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ee8c39582d2652dcd516d1b879451500f8db3fe3607ce45d7c5957ab2596040"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fdf3a3059611f7585a78ee10399a15566356116a4288380921a4b598d807a22"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:146173654d79eb1fc97498b4280c1d3e1e5d58c398fa530905c9ea50ea849b22"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0a7056921edbdd7560746f4221dca89bb7a3fe457d3d74267995253f46343f15"}, + {file = "lxml-5.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:9e4b47ac0f5e749cfc618efdf4726269441014ae1d5583e047b452a32e221920"}, + {file = "lxml-5.3.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f914c03e6a31deb632e2daa881fe198461f4d06e57ac3d0e05bbcab8eae01945"}, + {file = "lxml-5.3.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:213261f168c5e1d9b7535a67e68b1f59f92398dd17a56d934550837143f79c42"}, + {file = "lxml-5.3.0-cp38-cp38-win32.whl", hash = "sha256:218c1b2e17a710e363855594230f44060e2025b05c80d1f0661258142b2add2e"}, + {file = "lxml-5.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:315f9542011b2c4e1d280e4a20ddcca1761993dda3afc7a73b01235f8641e903"}, + {file = "lxml-5.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1ffc23010330c2ab67fac02781df60998ca8fe759e8efde6f8b756a20599c5de"}, + {file = "lxml-5.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2b3778cb38212f52fac9fe913017deea2fdf4eb1a4f8e4cfc6b009a13a6d3fcc"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b0c7a688944891086ba192e21c5229dea54382f4836a209ff8d0a660fac06be"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:747a3d3e98e24597981ca0be0fd922aebd471fa99d0043a3842d00cdcad7ad6a"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86a6b24b19eaebc448dc56b87c4865527855145d851f9fc3891673ff97950540"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b11a5d918a6216e521c715b02749240fb07ae5a1fefd4b7bf12f833bc8b4fe70"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68b87753c784d6acb8a25b05cb526c3406913c9d988d51f80adecc2b0775d6aa"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:109fa6fede314cc50eed29e6e56c540075e63d922455346f11e4d7a036d2b8cf"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:02ced472497b8362c8e902ade23e3300479f4f43e45f4105c85ef43b8db85229"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:6b038cc86b285e4f9fea2ba5ee76e89f21ed1ea898e287dc277a25884f3a7dfe"}, + {file = "lxml-5.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:7437237c6a66b7ca341e868cda48be24b8701862757426852c9b3186de1da8a2"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7f41026c1d64043a36fda21d64c5026762d53a77043e73e94b71f0521939cc71"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:482c2f67761868f0108b1743098640fbb2a28a8e15bf3f47ada9fa59d9fe08c3"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:1483fd3358963cc5c1c9b122c80606a3a79ee0875bcac0204149fa09d6ff2727"}, + {file = "lxml-5.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2dec2d1130a9cda5b904696cec33b2cfb451304ba9081eeda7f90f724097300a"}, + {file = "lxml-5.3.0-cp39-cp39-win32.whl", hash = "sha256:a0eabd0a81625049c5df745209dc7fcef6e2aea7793e5f003ba363610aa0a3ff"}, + {file = "lxml-5.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:89e043f1d9d341c52bf2af6d02e6adde62e0a46e6755d5eb60dc6e4f0b8aeca2"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7b1cd427cb0d5f7393c31b7496419da594fe600e6fdc4b105a54f82405e6626c"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51806cfe0279e06ed8500ce19479d757db42a30fd509940b1701be9c86a5ff9a"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee70d08fd60c9565ba8190f41a46a54096afa0eeb8f76bd66f2c25d3b1b83005"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:8dc2c0395bea8254d8daebc76dcf8eb3a95ec2a46fa6fae5eaccee366bfe02ce"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6ba0d3dcac281aad8a0e5b14c7ed6f9fa89c8612b47939fc94f80b16e2e9bc83"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6e91cf736959057f7aac7adfc83481e03615a8e8dd5758aa1d95ea69e8931dba"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:94d6c3782907b5e40e21cadf94b13b0842ac421192f26b84c45f13f3c9d5dc27"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c300306673aa0f3ed5ed9372b21867690a17dba38c68c44b287437c362ce486b"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d9b952e07aed35fe2e1a7ad26e929595412db48535921c5013edc8aa4a35ce"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:01220dca0d066d1349bd6a1726856a78f7929f3878f7e2ee83c296c69495309e"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:2d9b8d9177afaef80c53c0a9e30fa252ff3036fb1c6494d427c066a4ce6a282f"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:20094fc3f21ea0a8669dc4c61ed7fa8263bd37d97d93b90f28fc613371e7a875"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ace2c2326a319a0bb8a8b0e5b570c764962e95818de9f259ce814ee666603f19"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92e67a0be1639c251d21e35fe74df6bcc40cba445c2cda7c4a967656733249e2"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd5350b55f9fecddc51385463a4f67a5da829bc741e38cf689f38ec9023f54ab"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c1fefd7e3d00921c44dc9ca80a775af49698bbfd92ea84498e56acffd4c5469"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:71a8dd38fbd2f2319136d4ae855a7078c69c9a38ae06e0c17c73fd70fc6caad8"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:97acf1e1fd66ab53dacd2c35b319d7e548380c2e9e8c54525c6e76d21b1ae3b1"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:68934b242c51eb02907c5b81d138cb977b2129a0a75a8f8b60b01cb8586c7b21"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b710bc2b8292966b23a6a0121f7a6c51d45d2347edcc75f016ac123b8054d3f2"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18feb4b93302091b1541221196a2155aa296c363fd233814fa11e181adebc52f"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3eb44520c4724c2e1a57c0af33a379eee41792595023f367ba3952a2d96c2aab"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:609251a0ca4770e5a8768ff902aa02bf636339c5a93f9349b48eb1f606f7f3e9"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:516f491c834eb320d6c843156440fe7fc0d50b33e44387fcec5b02f0bc118a4c"}, + {file = "lxml-5.3.0.tar.gz", hash = "sha256:4e109ca30d1edec1ac60cdbe341905dc3b8f55b16855e03a54aaf59e51ec8c6f"}, ] [package.extras] @@ -1442,17 +1524,36 @@ cssselect = ["cssselect (>=0.7)"] html-clean = ["lxml-html-clean"] html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=3.0.10)"] +source = ["Cython (>=3.0.11)"] + +[[package]] +name = "mako" +version = "1.3.6" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Mako-1.3.6-py3-none-any.whl", hash = "sha256:a91198468092a2f1a0de86ca92690fb0cfc43ca90ee17e15d93662b4c04b241a"}, + {file = "mako-1.3.6.tar.gz", hash = "sha256:9ec3a1583713479fae654f83ed9fa8c9a4c16b7bb0daba0e6bbebff50c0d983d"}, +] + +[package.dependencies] +MarkupSafe = ">=0.9.2" + +[package.extras] +babel = ["Babel"] +lingua = ["lingua"] +testing = ["pytest"] [[package]] name = "markdown" -version = "3.6" +version = "3.7" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "Markdown-3.6-py3-none-any.whl", hash = "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f"}, - {file = "Markdown-3.6.tar.gz", hash = "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224"}, + {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, + {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, ] [package.dependencies] @@ -1464,109 +1565,121 @@ testing = ["coverage", "pyyaml"] [[package]] name = "markupsafe" -version = "2.1.5" +version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, ] [[package]] name = "matplotlib" -version = "3.9.1.post1" +version = "3.9.2" description = "Python plotting package" optional = true python-versions = ">=3.9" files = [ - {file = "matplotlib-3.9.1.post1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3779ad3e8b72df22b8a622c5796bbcfabfa0069b835412e3c1dec8ee3de92d0c"}, - {file = "matplotlib-3.9.1.post1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec400340f8628e8e2260d679078d4e9b478699f386e5cc8094e80a1cb0039c7c"}, - {file = "matplotlib-3.9.1.post1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82c18791b8862ea095081f745b81f896b011c5a5091678fb33204fef641476af"}, - {file = "matplotlib-3.9.1.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:621a628389c09a6b9f609a238af8e66acecece1cfa12febc5fe4195114ba7446"}, - {file = "matplotlib-3.9.1.post1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9a54734ca761ebb27cd4f0b6c2ede696ab6861052d7d7e7b8f7a6782665115f5"}, - {file = "matplotlib-3.9.1.post1-cp310-cp310-win_amd64.whl", hash = "sha256:0721f93db92311bb514e446842e2b21c004541dcca0281afa495053e017c5458"}, - {file = "matplotlib-3.9.1.post1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b08b46058fe2a31ecb81ef6aa3611f41d871f6a8280e9057cb4016cb3d8e894a"}, - {file = "matplotlib-3.9.1.post1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:22b344e84fcc574f561b5731f89a7625db8ef80cdbb0026a8ea855a33e3429d1"}, - {file = "matplotlib-3.9.1.post1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b49fee26d64aefa9f061b575f0f7b5fc4663e51f87375c7239efa3d30d908fa"}, - {file = "matplotlib-3.9.1.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89eb7e89e2b57856533c5c98f018aa3254fa3789fcd86d5f80077b9034a54c9a"}, - {file = "matplotlib-3.9.1.post1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c06e742bade41fda6176d4c9c78c9ea016e176cd338e62a1686384cb1eb8de41"}, - {file = "matplotlib-3.9.1.post1-cp311-cp311-win_amd64.whl", hash = "sha256:c44edab5b849e0fc1f1c9d6e13eaa35ef65925f7be45be891d9784709ad95561"}, - {file = "matplotlib-3.9.1.post1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:bf28b09986aee06393e808e661c3466be9c21eff443c9bc881bce04bfbb0c500"}, - {file = "matplotlib-3.9.1.post1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:92aeb8c439d4831510d8b9d5e39f31c16c7f37873879767c26b147cef61e54cd"}, - {file = "matplotlib-3.9.1.post1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f15798b0691b45c80d3320358a88ce5a9d6f518b28575b3ea3ed31b4bd95d009"}, - {file = "matplotlib-3.9.1.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d59fc6096da7b9c1df275f9afc3fef5cbf634c21df9e5f844cba3dd8deb1847d"}, - {file = "matplotlib-3.9.1.post1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ab986817a32a70ce22302438691e7df4c6ee4a844d47289db9d583d873491e0b"}, - {file = "matplotlib-3.9.1.post1-cp312-cp312-win_amd64.whl", hash = "sha256:0d78e7d2d86c4472da105d39aba9b754ed3dfeaeaa4ac7206b82706e0a5362fa"}, - {file = "matplotlib-3.9.1.post1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:bd07eba6431b4dc9253cce6374a28c415e1d3a7dc9f8aba028ea7592f06fe172"}, - {file = "matplotlib-3.9.1.post1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ca230cc4482010d646827bd2c6d140c98c361e769ae7d954ebf6fff2a226f5b1"}, - {file = "matplotlib-3.9.1.post1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ace27c0fdeded399cbc43f22ffa76e0f0752358f5b33106ec7197534df08725a"}, - {file = "matplotlib-3.9.1.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a4f3aeb7ba14c497dc6f021a076c48c2e5fbdf3da1e7264a5d649683e284a2f"}, - {file = "matplotlib-3.9.1.post1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:23f96fbd4ff4cfa9b8a6b685a65e7eb3c2ced724a8d965995ec5c9c2b1f7daf5"}, - {file = "matplotlib-3.9.1.post1-cp39-cp39-win_amd64.whl", hash = "sha256:2808b95452b4ffa14bfb7c7edffc5350743c31bda495f0d63d10fdd9bc69e895"}, - {file = "matplotlib-3.9.1.post1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ffc91239f73b4179dec256b01299d46d0ffa9d27d98494bc1476a651b7821cbe"}, - {file = "matplotlib-3.9.1.post1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f965ebca9fd4feaaca45937c4849d92b70653057497181100fcd1e18161e5f29"}, - {file = "matplotlib-3.9.1.post1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801ee9323fd7b2da0d405aebbf98d1da77ea430bbbbbec6834c0b3af15e5db44"}, - {file = "matplotlib-3.9.1.post1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:50113e9b43ceb285739f35d43db36aa752fb8154325b35d134ff6e177452f9ec"}, - {file = "matplotlib-3.9.1.post1.tar.gz", hash = "sha256:c91e585c65092c975a44dc9d4239ba8c594ba3c193d7c478b6d178c4ef61f406"}, + {file = "matplotlib-3.9.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9d78bbc0cbc891ad55b4f39a48c22182e9bdaea7fc0e5dbd364f49f729ca1bbb"}, + {file = "matplotlib-3.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c375cc72229614632c87355366bdf2570c2dac01ac66b8ad048d2dabadf2d0d4"}, + {file = "matplotlib-3.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d94ff717eb2bd0b58fe66380bd8b14ac35f48a98e7c6765117fe67fb7684e64"}, + {file = "matplotlib-3.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab68d50c06938ef28681073327795c5db99bb4666214d2d5f880ed11aeaded66"}, + {file = "matplotlib-3.9.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:65aacf95b62272d568044531e41de26285d54aec8cb859031f511f84bd8b495a"}, + {file = "matplotlib-3.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:3fd595f34aa8a55b7fc8bf9ebea8aa665a84c82d275190a61118d33fbc82ccae"}, + {file = "matplotlib-3.9.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d8dd059447824eec055e829258ab092b56bb0579fc3164fa09c64f3acd478772"}, + {file = "matplotlib-3.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c797dac8bb9c7a3fd3382b16fe8f215b4cf0f22adccea36f1545a6d7be310b41"}, + {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d719465db13267bcef19ea8954a971db03b9f48b4647e3860e4bc8e6ed86610f"}, + {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447"}, + {file = "matplotlib-3.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7741f26a58a240f43bee74965c4882b6c93df3e7eb3de160126d8c8f53a6ae6e"}, + {file = "matplotlib-3.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:ae82a14dab96fbfad7965403c643cafe6515e386de723e498cf3eeb1e0b70cc7"}, + {file = "matplotlib-3.9.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ac43031375a65c3196bee99f6001e7fa5bdfb00ddf43379d3c0609bdca042df9"}, + {file = "matplotlib-3.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be0fc24a5e4531ae4d8e858a1a548c1fe33b176bb13eff7f9d0d38ce5112a27d"}, + {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf81de2926c2db243c9b2cbc3917619a0fc85796c6ba4e58f541df814bbf83c7"}, + {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6ee45bc4245533111ced13f1f2cace1e7f89d1c793390392a80c139d6cf0e6c"}, + {file = "matplotlib-3.9.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:306c8dfc73239f0e72ac50e5a9cf19cc4e8e331dd0c54f5e69ca8758550f1e1e"}, + {file = "matplotlib-3.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:5413401594cfaff0052f9d8b1aafc6d305b4bd7c4331dccd18f561ff7e1d3bd3"}, + {file = "matplotlib-3.9.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:18128cc08f0d3cfff10b76baa2f296fc28c4607368a8402de61bb3f2eb33c7d9"}, + {file = "matplotlib-3.9.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4876d7d40219e8ae8bb70f9263bcbe5714415acfdf781086601211335e24f8aa"}, + {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d9f07a80deab4bb0b82858a9e9ad53d1382fd122be8cde11080f4e7dfedb38b"}, + {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7c0410f181a531ec4e93bbc27692f2c71a15c2da16766f5ba9761e7ae518413"}, + {file = "matplotlib-3.9.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:909645cce2dc28b735674ce0931a4ac94e12f5b13f6bb0b5a5e65e7cea2c192b"}, + {file = "matplotlib-3.9.2-cp313-cp313-win_amd64.whl", hash = "sha256:f32c7410c7f246838a77d6d1eff0c0f87f3cb0e7c4247aebea71a6d5a68cab49"}, + {file = "matplotlib-3.9.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:37e51dd1c2db16ede9cfd7b5cabdfc818b2c6397c83f8b10e0e797501c963a03"}, + {file = "matplotlib-3.9.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b82c5045cebcecd8496a4d694d43f9cc84aeeb49fe2133e036b207abe73f4d30"}, + {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f053c40f94bc51bc03832a41b4f153d83f2062d88c72b5e79997072594e97e51"}, + {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbe196377a8248972f5cede786d4c5508ed5f5ca4a1e09b44bda889958b33f8c"}, + {file = "matplotlib-3.9.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5816b1e1fe8c192cbc013f8f3e3368ac56fbecf02fb41b8f8559303f24c5015e"}, + {file = "matplotlib-3.9.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:cef2a73d06601437be399908cf13aee74e86932a5ccc6ccdf173408ebc5f6bb2"}, + {file = "matplotlib-3.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e0830e188029c14e891fadd99702fd90d317df294c3298aad682739c5533721a"}, + {file = "matplotlib-3.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ba9c1299c920964e8d3857ba27173b4dbb51ca4bab47ffc2c2ba0eb5e2cbc5"}, + {file = "matplotlib-3.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cd93b91ab47a3616b4d3c42b52f8363b88ca021e340804c6ab2536344fad9ca"}, + {file = "matplotlib-3.9.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6d1ce5ed2aefcdce11904fc5bbea7d9c21fff3d5f543841edf3dea84451a09ea"}, + {file = "matplotlib-3.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:b2696efdc08648536efd4e1601b5fd491fd47f4db97a5fbfd175549a7365c1b2"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d52a3b618cb1cbb769ce2ee1dcdb333c3ab6e823944e9a2d36e37253815f9556"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:039082812cacd6c6bec8e17a9c1e6baca230d4116d522e81e1f63a74d01d2e21"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6758baae2ed64f2331d4fd19be38b7b4eae3ecec210049a26b6a4f3ae1c85dcc"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:050598c2b29e0b9832cde72bcf97627bf00262adbc4a54e2b856426bb2ef0697"}, + {file = "matplotlib-3.9.2.tar.gz", hash = "sha256:96ab43906269ca64a6366934106fa01534454a69e471b7bf3d79083981aaab92"}, ] [package.dependencies] @@ -1711,107 +1824,6 @@ files = [ {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] -[[package]] -name = "onnx" -version = "1.16.1" -description = "Open Neural Network Exchange" -optional = true -python-versions = ">=3.8" -files = [ - {file = "onnx-1.16.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:bb2d392e5b7060082c2fb38eb5c44f67eb34ff5f0681bd6f45beff9abc6f7094"}, - {file = "onnx-1.16.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15abf94a7868eed6db15a8b5024ba570c891cae77ca4d0e7258dabdad76980df"}, - {file = "onnx-1.16.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6251910e554f811fdd070164b0bc76d76b067b95576cb9dad4d52ae64fe014b5"}, - {file = "onnx-1.16.1-cp310-cp310-win32.whl", hash = "sha256:c11e3b15eee46cd20767e505cc3ba97457ef5ac93c3e459cdfb77943ff8fe9a7"}, - {file = "onnx-1.16.1-cp310-cp310-win_amd64.whl", hash = "sha256:b3d10405706807ec2ef493b2a78519fa0264cf190363e89478585aac1179b596"}, - {file = "onnx-1.16.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:006ba5059c85ce43e89a1486cc0276d0f1a8ec9c6efd1a9334fd3fa0f6e33b64"}, - {file = "onnx-1.16.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1521ea7cd3497ecaf57d3b5e72d637ca5ebca632122a0806a9df99bedbeecdf8"}, - {file = "onnx-1.16.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45cf20421aeac03872bea5fd6ebf92abe15c4d1461a2572eb839add5059e2a09"}, - {file = "onnx-1.16.1-cp311-cp311-win32.whl", hash = "sha256:f98e275b4f46a617a9c527e60c02531eae03cf67a04c26db8a1c20acee539533"}, - {file = "onnx-1.16.1-cp311-cp311-win_amd64.whl", hash = "sha256:95aa20aa65a9035d7543e81713e8b0f611e213fc02171959ef4ee09311d1bf28"}, - {file = "onnx-1.16.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:32e11d39bee04f927fab09f74c46cf76584094462311bab1aca9ccdae6ed3366"}, - {file = "onnx-1.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8884bf53b552873c0c9b072cb8625e7d4e8f3cc0529191632d24e3de58a3b93a"}, - {file = "onnx-1.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:595b2830093f81361961295f7b0ebb6000423bcd04123d516d081c306002e387"}, - {file = "onnx-1.16.1-cp312-cp312-win32.whl", hash = "sha256:2fde4dd5bc278b3fc8148f460bce8807b2874c66f48529df9444cdbc9ecf456b"}, - {file = "onnx-1.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:e69ad8c110d8c37d759cad019d498fdf3fd24e0bfaeb960e52fed0469a5d2974"}, - {file = "onnx-1.16.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:0fc189195a40b5862fb77d97410c89823197fe19c1088ce150444eec72f200c1"}, - {file = "onnx-1.16.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:496ba17b16a74711081772e1b03f3207959972e351298e51abdc600051027a22"}, - {file = "onnx-1.16.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3faf239b48418b3ea6fe73bd4d86807b903d0b2ebd20b8b8c84f83741b0f18"}, - {file = "onnx-1.16.1-cp38-cp38-win32.whl", hash = "sha256:18b22143836838591f6551b089196e69f60c47fabce52b4b72b4cb37522645aa"}, - {file = "onnx-1.16.1-cp38-cp38-win_amd64.whl", hash = "sha256:8c2b70d602acfb90056fbdc60ef26f4658f964591212a4e9dbbda922ff43061b"}, - {file = "onnx-1.16.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:2bed6fe05905b073206cabbb4463c58050cf8d544192303c09927b229f93ac14"}, - {file = "onnx-1.16.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5798414332534a41404a7ff83677d49ced01d70160e1541484cce647f2295051"}, - {file = "onnx-1.16.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa7518d6d27f357261a4014079dec364cad6fef827d0b3fe1d3ff59939a68394"}, - {file = "onnx-1.16.1-cp39-cp39-win32.whl", hash = "sha256:67f372db4fe8fe61e00b762af5b0833aa72b5baa37e7e2f47d8668964ebff411"}, - {file = "onnx-1.16.1-cp39-cp39-win_amd64.whl", hash = "sha256:1c059fea6229c44d2d39c8f6e2f2f0d676d587c97f4c854c86f3e7bc97e0b31c"}, - {file = "onnx-1.16.1.tar.gz", hash = "sha256:8299193f0f2a3849bfc069641aa8e4f93696602da8d165632af8ee48ec7556b6"}, -] - -[package.dependencies] -numpy = ">=1.20" -protobuf = ">=3.20.2" - -[package.extras] -reference = ["Pillow", "google-re2"] - -[[package]] -name = "onnxconverter-common" -version = "1.13.0" -description = "ONNX Converter and Optimization Tools" -optional = true -python-versions = "*" -files = [ - {file = "onnxconverter-common-1.13.0.tar.gz", hash = "sha256:03db8a6033a3d6590f22df3f64234079caa826375d1fcb0b37b8123c06bf598c"}, - {file = "onnxconverter_common-1.13.0-py2.py3-none-any.whl", hash = "sha256:5ee1c025ef6c3b4abaede8425bc6b393248941a6cf8c21563d0d0e3f04634a0a"}, -] - -[package.dependencies] -numpy = "*" -onnx = "*" -packaging = "*" -protobuf = "*" - -[[package]] -name = "onnxruntime" -version = "1.18.1" -description = "ONNX Runtime is a runtime accelerator for Machine Learning models" -optional = true -python-versions = "*" -files = [ - {file = "onnxruntime-1.18.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:29ef7683312393d4ba04252f1b287d964bd67d5e6048b94d2da3643986c74d80"}, - {file = "onnxruntime-1.18.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc706eb1df06ddf55776e15a30519fb15dda7697f987a2bbda4962845e3cec05"}, - {file = "onnxruntime-1.18.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7de69f5ced2a263531923fa68bbec52a56e793b802fcd81a03487b5e292bc3a"}, - {file = "onnxruntime-1.18.1-cp310-cp310-win32.whl", hash = "sha256:221e5b16173926e6c7de2cd437764492aa12b6811f45abd37024e7cf2ae5d7e3"}, - {file = "onnxruntime-1.18.1-cp310-cp310-win_amd64.whl", hash = "sha256:75211b619275199c861ee94d317243b8a0fcde6032e5a80e1aa9ded8ab4c6060"}, - {file = "onnxruntime-1.18.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:f26582882f2dc581b809cfa41a125ba71ad9e715738ec6402418df356969774a"}, - {file = "onnxruntime-1.18.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef36f3a8b768506d02be349ac303fd95d92813ba3ba70304d40c3cd5c25d6a4c"}, - {file = "onnxruntime-1.18.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:170e711393e0618efa8ed27b59b9de0ee2383bd2a1f93622a97006a5ad48e434"}, - {file = "onnxruntime-1.18.1-cp311-cp311-win32.whl", hash = "sha256:9b6a33419b6949ea34e0dc009bc4470e550155b6da644571ecace4b198b0d88f"}, - {file = "onnxruntime-1.18.1-cp311-cp311-win_amd64.whl", hash = "sha256:5c1380a9f1b7788da742c759b6a02ba771fe1ce620519b2b07309decbd1a2fe1"}, - {file = "onnxruntime-1.18.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:31bd57a55e3f983b598675dfc7e5d6f0877b70ec9864b3cc3c3e1923d0a01919"}, - {file = "onnxruntime-1.18.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9e03c4ba9f734500691a4d7d5b381cd71ee2f3ce80a1154ac8f7aed99d1ecaa"}, - {file = "onnxruntime-1.18.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:781aa9873640f5df24524f96f6070b8c550c66cb6af35710fd9f92a20b4bfbf6"}, - {file = "onnxruntime-1.18.1-cp312-cp312-win32.whl", hash = "sha256:3a2d9ab6254ca62adbb448222e630dc6883210f718065063518c8f93a32432be"}, - {file = "onnxruntime-1.18.1-cp312-cp312-win_amd64.whl", hash = "sha256:ad93c560b1c38c27c0275ffd15cd7f45b3ad3fc96653c09ce2931179982ff204"}, - {file = "onnxruntime-1.18.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:3b55dc9d3c67626388958a3eb7ad87eb7c70f75cb0f7ff4908d27b8b42f2475c"}, - {file = "onnxruntime-1.18.1-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f80dbcfb6763cc0177a31168b29b4bd7662545b99a19e211de8c734b657e0669"}, - {file = "onnxruntime-1.18.1-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f1ff2c61a16d6c8631796c54139bafea41ee7736077a0fc64ee8ae59432f5c58"}, - {file = "onnxruntime-1.18.1-cp38-cp38-win32.whl", hash = "sha256:219855bd272fe0c667b850bf1a1a5a02499269a70d59c48e6f27f9c8bcb25d02"}, - {file = "onnxruntime-1.18.1-cp38-cp38-win_amd64.whl", hash = "sha256:afdf16aa607eb9a2c60d5ca2d5abf9f448e90c345b6b94c3ed14f4fb7e6a2d07"}, - {file = "onnxruntime-1.18.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:128df253ade673e60cea0955ec9d0e89617443a6d9ce47c2d79eb3f72a3be3de"}, - {file = "onnxruntime-1.18.1-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9839491e77e5c5a175cab3621e184d5a88925ee297ff4c311b68897197f4cde9"}, - {file = "onnxruntime-1.18.1-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ad3187c1faff3ac15f7f0e7373ef4788c582cafa655a80fdbb33eaec88976c66"}, - {file = "onnxruntime-1.18.1-cp39-cp39-win32.whl", hash = "sha256:34657c78aa4e0b5145f9188b550ded3af626651b15017bf43d280d7e23dbf195"}, - {file = "onnxruntime-1.18.1-cp39-cp39-win_amd64.whl", hash = "sha256:9c14fd97c3ddfa97da5feef595e2c73f14c2d0ec1d4ecbea99c8d96603c89589"}, -] - -[package.dependencies] -coloredlogs = "*" -flatbuffers = "*" -numpy = ">=1.21.6,<2.0" -packaging = "*" -protobuf = "*" -sympy = "*" - [[package]] name = "openqasm3" version = "1.0.0" @@ -1832,53 +1844,93 @@ all = ["antlr4-python3-runtime (>=4.7,<4.14)", "importlib-metadata", "pytest (>= parser = ["antlr4-python3-runtime (>=4.7,<4.14)", "importlib-metadata"] tests = ["pytest (>=6.0)", "pyyaml"] +[[package]] +name = "optuna" +version = "4.1.0" +description = "A hyperparameter optimization framework" +optional = false +python-versions = ">=3.8" +files = [ + {file = "optuna-4.1.0-py3-none-any.whl", hash = "sha256:1763856b01c9238594d9d21db92611aac9980e9a6300bd658a7c6464712c704e"}, + {file = "optuna-4.1.0.tar.gz", hash = "sha256:b364e87a2038f9946c5e2770c130597538aac528b4a82c1cab5267f337ea7679"}, +] + +[package.dependencies] +alembic = ">=1.5.0" +colorlog = "*" +numpy = "*" +packaging = ">=20.0" +PyYAML = "*" +sqlalchemy = ">=1.4.2" +tqdm = "*" + +[package.extras] +benchmark = ["asv (>=0.5.0)", "cma", "virtualenv"] +checking = ["black", "blackdoc", "flake8", "isort", "mypy", "mypy-boto3-s3", "types-PyYAML", "types-redis", "types-setuptools", "types-tqdm", "typing-extensions (>=3.10.0.0)"] +document = ["ase", "cmaes (>=0.10.0)", "fvcore", "kaleido", "lightgbm", "matplotlib (!=3.6.0)", "pandas", "pillow", "plotly (>=4.9.0)", "scikit-learn", "sphinx", "sphinx-copybutton", "sphinx-gallery", "sphinx-rtd-theme (>=1.2.0)", "torch", "torchvision"] +optional = ["boto3", "cmaes (>=0.10.0)", "google-cloud-storage", "matplotlib (!=3.6.0)", "pandas", "plotly (>=4.9.0)", "redis", "scikit-learn (>=0.24.2)", "scipy", "torch"] +test = ["coverage", "fakeredis[lua]", "kaleido", "moto", "pytest", "scipy (>=1.9.2)", "torch"] + [[package]] name = "packaging" -version = "24.1" +version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] [[package]] name = "pandas" -version = "2.2.2" +version = "2.2.3" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.9" files = [ - {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, - {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, - {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, - {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, - {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, - {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"}, - {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"}, - {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, - {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, - {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, - {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, - {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, - {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, - {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, - {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, - {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, - {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, - {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, - {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, - {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, - {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, - {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, - {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, - {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, - {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, - {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, - {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"}, - {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"}, - {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, + {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"}, + {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"}, + {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"}, + {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"}, + {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"}, + {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"}, + {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"}, + {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"}, ] [package.dependencies] @@ -1969,95 +2021,90 @@ ptyprocess = ">=0.5" [[package]] name = "pillow" -version = "10.4.0" +version = "11.0.0" description = "Python Imaging Library (Fork)" optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, - {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, - {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, - {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, - {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, - {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, - {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, - {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, - {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, - {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, - {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, - {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, - {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, - {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, - {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, - {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, - {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, - {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, - {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, - {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, - {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, - {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, - {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, - {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, - {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, - {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, - {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, - {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, - {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, - {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, - {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, - {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, - {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, - {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, - {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, - {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, - {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, - {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, - {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, - {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, - {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, - {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, - {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, - {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, - {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, -] - -[package.extras] -docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] + {file = "pillow-11.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6619654954dc4936fcff82db8eb6401d3159ec6be81e33c6000dfd76ae189947"}, + {file = "pillow-11.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3c5ac4bed7519088103d9450a1107f76308ecf91d6dabc8a33a2fcfb18d0fba"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a65149d8ada1055029fcb665452b2814fe7d7082fcb0c5bed6db851cb69b2086"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88a58d8ac0cc0e7f3a014509f0455248a76629ca9b604eca7dc5927cc593c5e9"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c26845094b1af3c91852745ae78e3ea47abf3dbcd1cf962f16b9a5fbe3ee8488"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:1a61b54f87ab5786b8479f81c4b11f4d61702830354520837f8cc791ebba0f5f"}, + {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:674629ff60030d144b7bca2b8330225a9b11c482ed408813924619c6f302fdbb"}, + {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:598b4e238f13276e0008299bd2482003f48158e2b11826862b1eb2ad7c768b97"}, + {file = "pillow-11.0.0-cp310-cp310-win32.whl", hash = "sha256:9a0f748eaa434a41fccf8e1ee7a3eed68af1b690e75328fd7a60af123c193b50"}, + {file = "pillow-11.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:a5629742881bcbc1f42e840af185fd4d83a5edeb96475a575f4da50d6ede337c"}, + {file = "pillow-11.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:ee217c198f2e41f184f3869f3e485557296d505b5195c513b2bfe0062dc537f1"}, + {file = "pillow-11.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc"}, + {file = "pillow-11.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8b2351c85d855293a299038e1f89db92a2f35e8d2f783489c6f0b2b5f3fe8a3"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f4dba50cfa56f910241eb7f883c20f1e7b1d8f7d91c750cd0b318bad443f4d5"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa"}, + {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b4fd7bd29610a83a8c9b564d457cf5bd92b4e11e79a4ee4716a63c959699b306"}, + {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cb929ca942d0ec4fac404cbf520ee6cac37bf35be479b970c4ffadf2b6a1cad9"}, + {file = "pillow-11.0.0-cp311-cp311-win32.whl", hash = "sha256:006bcdd307cc47ba43e924099a038cbf9591062e6c50e570819743f5607404f5"}, + {file = "pillow-11.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291"}, + {file = "pillow-11.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:16095692a253047fe3ec028e951fa4221a1f3ed3d80c397e83541a3037ff67c9"}, + {file = "pillow-11.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923"}, + {file = "pillow-11.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7"}, + {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6"}, + {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc"}, + {file = "pillow-11.0.0-cp312-cp312-win32.whl", hash = "sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6"}, + {file = "pillow-11.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47"}, + {file = "pillow-11.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25"}, + {file = "pillow-11.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699"}, + {file = "pillow-11.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa"}, + {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f"}, + {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb"}, + {file = "pillow-11.0.0-cp313-cp313-win32.whl", hash = "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798"}, + {file = "pillow-11.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de"}, + {file = "pillow-11.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84"}, + {file = "pillow-11.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b"}, + {file = "pillow-11.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003"}, + {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2"}, + {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a"}, + {file = "pillow-11.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8"}, + {file = "pillow-11.0.0-cp313-cp313t-win32.whl", hash = "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8"}, + {file = "pillow-11.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904"}, + {file = "pillow-11.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3"}, + {file = "pillow-11.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2e46773dc9f35a1dd28bd6981332fd7f27bec001a918a72a79b4133cf5291dba"}, + {file = "pillow-11.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2679d2258b7f1192b378e2893a8a0a0ca472234d4c2c0e6bdd3380e8dfa21b6a"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda2616eb2313cbb3eebbe51f19362eb434b18e3bb599466a1ffa76a033fb916"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ec184af98a121fb2da42642dea8a29ec80fc3efbaefb86d8fdd2606619045d"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:8594f42df584e5b4bb9281799698403f7af489fba84c34d53d1c4bfb71b7c4e7"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:c12b5ae868897c7338519c03049a806af85b9b8c237b7d675b8c5e089e4a618e"}, + {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:70fbbdacd1d271b77b7721fe3cdd2d537bbbd75d29e6300c672ec6bb38d9672f"}, + {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5178952973e588b3f1360868847334e9e3bf49d19e169bbbdfaf8398002419ae"}, + {file = "pillow-11.0.0-cp39-cp39-win32.whl", hash = "sha256:8c676b587da5673d3c75bd67dd2a8cdfeb282ca38a30f37950511766b26858c4"}, + {file = "pillow-11.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:94f3e1780abb45062287b4614a5bc0874519c86a777d4a7ad34978e86428b8dd"}, + {file = "pillow-11.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:290f2cc809f9da7d6d622550bbf4c1e57518212da51b6a30fe8e0a270a5b78bd"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1187739620f2b365de756ce086fdb3604573337cc28a0d3ac4a01ab6b2d2a6d2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fbbcb7b57dc9c794843e3d1258c0fbf0f48656d46ffe9e09b63bbd6e8cd5d0a2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d203af30149ae339ad1b4f710d9844ed8796e97fda23ffbc4cc472968a47d0b"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21a0d3b115009ebb8ac3d2ebec5c2982cc693da935f4ab7bb5c8ebe2f47d36f2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:73853108f56df97baf2bb8b522f3578221e56f646ba345a372c78326710d3830"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e58876c91f97b0952eb766123bfef372792ab3f4e3e1f1a2267834c2ab131734"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:224aaa38177597bb179f3ec87eeefcce8e4f85e608025e9cfac60de237ba6316"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5bd2d3bdb846d757055910f0a59792d33b555800813c3b39ada1829c372ccb06"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:375b8dd15a1f5d2feafff536d47e22f69625c1aa92f12b339ec0b2ca40263273"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:daffdf51ee5db69a82dd127eabecce20729e21f7a3680cf7cbb23f0829189790"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7326a1787e3c7b0429659e0a944725e1b03eeaa10edd945a86dead1913383944"}, + {file = "pillow-11.0.0.tar.gz", hash = "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] @@ -2066,29 +2113,29 @@ xmp = ["defusedxml"] [[package]] name = "platformdirs" -version = "4.2.2" +version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "plotly" -version = "5.23.0" +version = "5.24.1" description = "An open-source, interactive data visualization library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "plotly-5.23.0-py3-none-any.whl", hash = "sha256:76cbe78f75eddc10c56f5a4ee3e7ccaade7c0a57465546f02098c0caed6c2d1a"}, - {file = "plotly-5.23.0.tar.gz", hash = "sha256:89e57d003a116303a34de6700862391367dd564222ab71f8531df70279fc0193"}, + {file = "plotly-5.24.1-py3-none-any.whl", hash = "sha256:f67073a1e637eb0dc3e46324d9d51e2fe76e9727c892dde64ddf1e1b51f29089"}, + {file = "plotly-5.24.1.tar.gz", hash = "sha256:dbc8ac8339d248a4bcc36e08a5659bacfe1b079390b8953533f4eb22169b4bae"}, ] [package.dependencies] @@ -2112,38 +2159,18 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "prompt-toolkit" -version = "3.0.47" +version = "3.0.48" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, - {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, + {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, + {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, ] [package.dependencies] wcwidth = "*" -[[package]] -name = "protobuf" -version = "5.27.3" -description = "" -optional = true -python-versions = ">=3.8" -files = [ - {file = "protobuf-5.27.3-cp310-abi3-win32.whl", hash = "sha256:dcb307cd4ef8fec0cf52cb9105a03d06fbb5275ce6d84a6ae33bc6cf84e0a07b"}, - {file = "protobuf-5.27.3-cp310-abi3-win_amd64.whl", hash = "sha256:16ddf3f8c6c41e1e803da7abea17b1793a97ef079a912e42351eabb19b2cffe7"}, - {file = "protobuf-5.27.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:68248c60d53f6168f565a8c76dc58ba4fa2ade31c2d1ebdae6d80f969cdc2d4f"}, - {file = "protobuf-5.27.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:b8a994fb3d1c11156e7d1e427186662b64694a62b55936b2b9348f0a7c6625ce"}, - {file = "protobuf-5.27.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:a55c48f2a2092d8e213bd143474df33a6ae751b781dd1d1f4d953c128a415b25"}, - {file = "protobuf-5.27.3-cp38-cp38-win32.whl", hash = "sha256:043853dcb55cc262bf2e116215ad43fa0859caab79bb0b2d31b708f128ece035"}, - {file = "protobuf-5.27.3-cp38-cp38-win_amd64.whl", hash = "sha256:c2a105c24f08b1e53d6c7ffe69cb09d0031512f0b72f812dd4005b8112dbe91e"}, - {file = "protobuf-5.27.3-cp39-cp39-win32.whl", hash = "sha256:c84eee2c71ed83704f1afbf1a85c3171eab0fd1ade3b399b3fad0884cbcca8bf"}, - {file = "protobuf-5.27.3-cp39-cp39-win_amd64.whl", hash = "sha256:af7c0b7cfbbb649ad26132e53faa348580f844d9ca46fd3ec7ca48a1ea5db8a1"}, - {file = "protobuf-5.27.3-py3-none-any.whl", hash = "sha256:8572c6533e544ebf6899c360e91d6bcbbee2549251643d32c52cf8a5de295ba5"}, - {file = "protobuf-5.27.3.tar.gz", hash = "sha256:82460903e640f2b7e34ee81a947fdaad89de796d324bcbc38ff5430bcdead82c"}, -] - [[package]] name = "ptyprocess" version = "0.7.0" @@ -2169,17 +2196,6 @@ files = [ [package.extras] tests = ["pytest"] -[[package]] -name = "py4j" -version = "0.10.9.7" -description = "Enables Python programs to dynamically access arbitrary Java objects" -optional = false -python-versions = "*" -files = [ - {file = "py4j-0.10.9.7-py2.py3-none-any.whl", hash = "sha256:85defdfd2b2376eb3abf5ca6474b51ab7e0de341c75a02f46dc9b5976f5a5c1b"}, - {file = "py4j-0.10.9.7.tar.gz", hash = "sha256:0b6e5315bb3ada5cf62ac651d107bb2ebc02def3dee9d9548e3baac644ea8dbb"}, -] - [[package]] name = "pybtex" version = "0.24.0" @@ -2216,119 +2232,131 @@ pybtex = ">=0.16" [[package]] name = "pydantic" -version = "2.8.2" +version = "2.10.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, - {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, + {file = "pydantic-2.10.2-py3-none-any.whl", hash = "sha256:cfb96e45951117c3024e6b67b25cdc33a3cb7b2fa62e239f7af1378358a1d99e"}, + {file = "pydantic-2.10.2.tar.gz", hash = "sha256:2bc2d7f17232e0841cbba4641e65ba1eb6fafb3a08de3a091ff3ce14a197c4fa"}, ] [package.dependencies] -annotated-types = ">=0.4.0" -pydantic-core = "2.20.1" -typing-extensions = {version = ">=4.6.1", markers = "python_version < \"3.13\""} +annotated-types = ">=0.6.0" +pydantic-core = "2.27.1" +typing-extensions = ">=4.12.2" [package.extras] email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.20.1" +version = "2.27.1" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, - {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, - {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, - {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, - {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, - {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, - {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, - {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, - {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, - {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, - {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, - {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, - {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, - {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, - {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, - {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, - {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, - {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, - {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, - {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, - {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, - {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, - {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, - {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, - {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, - {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, - {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, - {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, - {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, - {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, - {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, + {file = "pydantic_core-2.27.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:71a5e35c75c021aaf400ac048dacc855f000bdfed91614b4a726f7432f1f3d6a"}, + {file = "pydantic_core-2.27.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f82d068a2d6ecfc6e054726080af69a6764a10015467d7d7b9f66d6ed5afa23b"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:121ceb0e822f79163dd4699e4c54f5ad38b157084d97b34de8b232bcaad70278"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4603137322c18eaf2e06a4495f426aa8d8388940f3c457e7548145011bb68e05"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a33cd6ad9017bbeaa9ed78a2e0752c5e250eafb9534f308e7a5f7849b0b1bfb4"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15cc53a3179ba0fcefe1e3ae50beb2784dede4003ad2dfd24f81bba4b23a454f"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45d9c5eb9273aa50999ad6adc6be5e0ecea7e09dbd0d31bd0c65a55a2592ca08"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8bf7b66ce12a2ac52d16f776b31d16d91033150266eb796967a7e4621707e4f6"}, + {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:655d7dd86f26cb15ce8a431036f66ce0318648f8853d709b4167786ec2fa4807"}, + {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:5556470f1a2157031e676f776c2bc20acd34c1990ca5f7e56f1ebf938b9ab57c"}, + {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f69ed81ab24d5a3bd93861c8c4436f54afdf8e8cc421562b0c7504cf3be58206"}, + {file = "pydantic_core-2.27.1-cp310-none-win32.whl", hash = "sha256:f5a823165e6d04ccea61a9f0576f345f8ce40ed533013580e087bd4d7442b52c"}, + {file = "pydantic_core-2.27.1-cp310-none-win_amd64.whl", hash = "sha256:57866a76e0b3823e0b56692d1a0bf722bffb324839bb5b7226a7dbd6c9a40b17"}, + {file = "pydantic_core-2.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac3b20653bdbe160febbea8aa6c079d3df19310d50ac314911ed8cc4eb7f8cb8"}, + {file = "pydantic_core-2.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a5a8e19d7c707c4cadb8c18f5f60c843052ae83c20fa7d44f41594c644a1d330"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f7059ca8d64fea7f238994c97d91f75965216bcbe5f695bb44f354893f11d52"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bed0f8a0eeea9fb72937ba118f9db0cb7e90773462af7962d382445f3005e5a4"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3cb37038123447cf0f3ea4c74751f6a9d7afef0eb71aa07bf5f652b5e6a132c"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84286494f6c5d05243456e04223d5a9417d7f443c3b76065e75001beb26f88de"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acc07b2cfc5b835444b44a9956846b578d27beeacd4b52e45489e93276241025"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4fefee876e07a6e9aad7a8c8c9f85b0cdbe7df52b8a9552307b09050f7512c7e"}, + {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:258c57abf1188926c774a4c94dd29237e77eda19462e5bb901d88adcab6af919"}, + {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:35c14ac45fcfdf7167ca76cc80b2001205a8d5d16d80524e13508371fb8cdd9c"}, + {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d1b26e1dff225c31897696cab7d4f0a315d4c0d9e8666dbffdb28216f3b17fdc"}, + {file = "pydantic_core-2.27.1-cp311-none-win32.whl", hash = "sha256:2cdf7d86886bc6982354862204ae3b2f7f96f21a3eb0ba5ca0ac42c7b38598b9"}, + {file = "pydantic_core-2.27.1-cp311-none-win_amd64.whl", hash = "sha256:3af385b0cee8df3746c3f406f38bcbfdc9041b5c2d5ce3e5fc6637256e60bbc5"}, + {file = "pydantic_core-2.27.1-cp311-none-win_arm64.whl", hash = "sha256:81f2ec23ddc1b476ff96563f2e8d723830b06dceae348ce02914a37cb4e74b89"}, + {file = "pydantic_core-2.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9cbd94fc661d2bab2bc702cddd2d3370bbdcc4cd0f8f57488a81bcce90c7a54f"}, + {file = "pydantic_core-2.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f8c4718cd44ec1580e180cb739713ecda2bdee1341084c1467802a417fe0f02"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15aae984e46de8d376df515f00450d1522077254ef6b7ce189b38ecee7c9677c"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ba5e3963344ff25fc8c40da90f44b0afca8cfd89d12964feb79ac1411a260ac"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:992cea5f4f3b29d6b4f7f1726ed8ee46c8331c6b4eed6db5b40134c6fe1768bb"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0325336f348dbee6550d129b1627cb8f5351a9dc91aad141ffb96d4937bd9529"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7597c07fbd11515f654d6ece3d0e4e5093edc30a436c63142d9a4b8e22f19c35"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3bbd5d8cc692616d5ef6fbbbd50dbec142c7e6ad9beb66b78a96e9c16729b089"}, + {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:dc61505e73298a84a2f317255fcc72b710b72980f3a1f670447a21efc88f8381"}, + {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:e1f735dc43da318cad19b4173dd1ffce1d84aafd6c9b782b3abc04a0d5a6f5bb"}, + {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f4e5658dbffe8843a0f12366a4c2d1c316dbe09bb4dfbdc9d2d9cd6031de8aae"}, + {file = "pydantic_core-2.27.1-cp312-none-win32.whl", hash = "sha256:672ebbe820bb37988c4d136eca2652ee114992d5d41c7e4858cdd90ea94ffe5c"}, + {file = "pydantic_core-2.27.1-cp312-none-win_amd64.whl", hash = "sha256:66ff044fd0bb1768688aecbe28b6190f6e799349221fb0de0e6f4048eca14c16"}, + {file = "pydantic_core-2.27.1-cp312-none-win_arm64.whl", hash = "sha256:9a3b0793b1bbfd4146304e23d90045f2a9b5fd5823aa682665fbdaf2a6c28f3e"}, + {file = "pydantic_core-2.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f216dbce0e60e4d03e0c4353c7023b202d95cbaeff12e5fd2e82ea0a66905073"}, + {file = "pydantic_core-2.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a2e02889071850bbfd36b56fd6bc98945e23670773bc7a76657e90e6b6603c08"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b0e23f119b2b456d07ca91b307ae167cc3f6c846a7b169fca5326e32fdc6cf"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:764be71193f87d460a03f1f7385a82e226639732214b402f9aa61f0d025f0737"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c00666a3bd2f84920a4e94434f5974d7bbc57e461318d6bb34ce9cdbbc1f6b2"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ccaa88b24eebc0f849ce0a4d09e8a408ec5a94afff395eb69baf868f5183107"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c65af9088ac534313e1963443d0ec360bb2b9cba6c2909478d22c2e363d98a51"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:206b5cf6f0c513baffaeae7bd817717140770c74528f3e4c3e1cec7871ddd61a"}, + {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:062f60e512fc7fff8b8a9d680ff0ddaaef0193dba9fa83e679c0c5f5fbd018bc"}, + {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:a0697803ed7d4af5e4c1adf1670af078f8fcab7a86350e969f454daf598c4960"}, + {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:58ca98a950171f3151c603aeea9303ef6c235f692fe555e883591103da709b23"}, + {file = "pydantic_core-2.27.1-cp313-none-win32.whl", hash = "sha256:8065914ff79f7eab1599bd80406681f0ad08f8e47c880f17b416c9f8f7a26d05"}, + {file = "pydantic_core-2.27.1-cp313-none-win_amd64.whl", hash = "sha256:ba630d5e3db74c79300d9a5bdaaf6200172b107f263c98a0539eeecb857b2337"}, + {file = "pydantic_core-2.27.1-cp313-none-win_arm64.whl", hash = "sha256:45cf8588c066860b623cd11c4ba687f8d7175d5f7ef65f7129df8a394c502de5"}, + {file = "pydantic_core-2.27.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:5897bec80a09b4084aee23f9b73a9477a46c3304ad1d2d07acca19723fb1de62"}, + {file = "pydantic_core-2.27.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d0165ab2914379bd56908c02294ed8405c252250668ebcb438a55494c69f44ab"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b9af86e1d8e4cfc82c2022bfaa6f459381a50b94a29e95dcdda8442d6d83864"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f6c8a66741c5f5447e047ab0ba7a1c61d1e95580d64bce852e3df1f895c4067"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a42d6a8156ff78981f8aa56eb6394114e0dedb217cf8b729f438f643608cbcd"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64c65f40b4cd8b0e049a8edde07e38b476da7e3aaebe63287c899d2cff253fa5"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdcf339322a3fae5cbd504edcefddd5a50d9ee00d968696846f089b4432cf78"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bf99c8404f008750c846cb4ac4667b798a9f7de673ff719d705d9b2d6de49c5f"}, + {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8f1edcea27918d748c7e5e4d917297b2a0ab80cad10f86631e488b7cddf76a36"}, + {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:159cac0a3d096f79ab6a44d77a961917219707e2a130739c64d4dd46281f5c2a"}, + {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:029d9757eb621cc6e1848fa0b0310310de7301057f623985698ed7ebb014391b"}, + {file = "pydantic_core-2.27.1-cp38-none-win32.whl", hash = "sha256:a28af0695a45f7060e6f9b7092558a928a28553366519f64083c63a44f70e618"}, + {file = "pydantic_core-2.27.1-cp38-none-win_amd64.whl", hash = "sha256:2d4567c850905d5eaaed2f7a404e61012a51caf288292e016360aa2b96ff38d4"}, + {file = "pydantic_core-2.27.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e9386266798d64eeb19dd3677051f5705bf873e98e15897ddb7d76f477131967"}, + {file = "pydantic_core-2.27.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4228b5b646caa73f119b1ae756216b59cc6e2267201c27d3912b592c5e323b60"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3dfe500de26c52abe0477dde16192ac39c98f05bf2d80e76102d394bd13854"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aee66be87825cdf72ac64cb03ad4c15ffef4143dbf5c113f64a5ff4f81477bf9"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b748c44bb9f53031c8cbc99a8a061bc181c1000c60a30f55393b6e9c45cc5bd"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ca038c7f6a0afd0b2448941b6ef9d5e1949e999f9e5517692eb6da58e9d44be"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e0bd57539da59a3e4671b90a502da9a28c72322a4f17866ba3ac63a82c4498e"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ac6c2c45c847bbf8f91930d88716a0fb924b51e0c6dad329b793d670ec5db792"}, + {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b94d4ba43739bbe8b0ce4262bcc3b7b9f31459ad120fb595627eaeb7f9b9ca01"}, + {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:00e6424f4b26fe82d44577b4c842d7df97c20be6439e8e685d0d715feceb9fb9"}, + {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:38de0a70160dd97540335b7ad3a74571b24f1dc3ed33f815f0880682e6880131"}, + {file = "pydantic_core-2.27.1-cp39-none-win32.whl", hash = "sha256:7ccebf51efc61634f6c2344da73e366c75e735960b5654b63d7e6f69a5885fa3"}, + {file = "pydantic_core-2.27.1-cp39-none-win_amd64.whl", hash = "sha256:a57847b090d7892f123726202b7daa20df6694cbd583b67a592e856bff603d6c"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3fa80ac2bd5856580e242dbc202db873c60a01b20309c8319b5c5986fbe53ce6"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d950caa237bb1954f1b8c9227b5065ba6875ac9771bb8ec790d956a699b78676"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e4216e64d203e39c62df627aa882f02a2438d18a5f21d7f721621f7a5d3611d"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02a3d637bd387c41d46b002f0e49c52642281edacd2740e5a42f7017feea3f2c"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:161c27ccce13b6b0c8689418da3885d3220ed2eae2ea5e9b2f7f3d48f1d52c27"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:19910754e4cc9c63bc1c7f6d73aa1cfee82f42007e407c0f413695c2f7ed777f"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:e173486019cc283dc9778315fa29a363579372fe67045e971e89b6365cc035ed"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:af52d26579b308921b73b956153066481f064875140ccd1dfd4e77db89dbb12f"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:981fb88516bd1ae8b0cbbd2034678a39dedc98752f264ac9bc5839d3923fa04c"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5fde892e6c697ce3e30c61b239330fc5d569a71fefd4eb6512fc6caec9dd9e2f"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:816f5aa087094099fff7edabb5e01cc370eb21aa1a1d44fe2d2aefdfb5599b31"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c10c309e18e443ddb108f0ef64e8729363adbfd92d6d57beec680f6261556f3"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98476c98b02c8e9b2eec76ac4156fd006628b1b2d0ef27e548ffa978393fd154"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c3027001c28434e7ca5a6e1e527487051136aa81803ac812be51802150d880dd"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:7699b1df36a48169cdebda7ab5a2bac265204003f153b4bd17276153d997670a"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1c39b07d90be6b48968ddc8c19e7585052088fd7ec8d568bb31ff64c70ae3c97"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:46ccfe3032b3915586e469d4972973f893c0a2bb65669194a5bdea9bacc088c2"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:62ba45e21cf6571d7f716d903b5b7b6d2617e2d5d67c0923dc47b9d41369f840"}, + {file = "pydantic_core-2.27.1.tar.gz", hash = "sha256:62a763352879b84aa31058fc931884055fd75089cccbd9d58bb6afd01141b235"}, ] [package.dependencies] @@ -2393,13 +2421,13 @@ testutils = ["gitpython (>3)"] [[package]] name = "pyparsing" -version = "3.1.2" +version = "3.2.0" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = true -python-versions = ">=3.6.8" +python-versions = ">=3.9" files = [ - {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, - {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, + {file = "pyparsing-3.2.0-py3-none-any.whl", hash = "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84"}, + {file = "pyparsing-3.2.0.tar.gz", hash = "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"}, ] [package.extras] @@ -2415,17 +2443,6 @@ files = [ {file = "pyreadline-2.1.zip", hash = "sha256:4530592fc2e85b25b1a9f79664433da09237c1a270e4d78ea5aa3a2c7229e2d1"}, ] -[[package]] -name = "pyreadline3" -version = "3.4.1" -description = "A python implementation of GNU readline." -optional = true -python-versions = "*" -files = [ - {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"}, - {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, -] - [[package]] name = "pyrepl" version = "0.9.0" @@ -2493,6 +2510,23 @@ pytest = ">=7.3.1" [package.extras] test = ["coverage (>=7.2.7)", "pytest-mock (>=3.10)"] +[[package]] +name = "pytest-mock" +version = "3.14.0" +description = "Thin-wrapper around the mock package for easier use with pytest" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, + {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, +] + +[package.dependencies] +pytest = ">=6.2.5" + +[package.extras] +dev = ["pre-commit", "pytest-asyncio", "tox"] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -2509,13 +2543,13 @@ six = ">=1.5" [[package]] name = "pytz" -version = "2024.1" +version = "2024.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, - {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, + {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, + {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, ] [[package]] @@ -2582,40 +2616,39 @@ files = [ [[package]] name = "qibo" -version = "0.2.7" +version = "0.2.13" description = "A framework for quantum computing with hardware acceleration." optional = false -python-versions = "<3.12,>=3.9" +python-versions = "<3.13,>=3.9" files = [ - {file = "qibo-0.2.7-py3-none-any.whl", hash = "sha256:20e42ad27f7a9795f84565ab5645e3b24d4af62a0a8c6de5110b5ae6894b35a2"}, - {file = "qibo-0.2.7.tar.gz", hash = "sha256:a57e98a3eccfc3c43c4a697448a4618c9a158f72645d5c93b0b2bdd3ace882ef"}, + {file = "qibo-0.2.13-py3-none-any.whl", hash = "sha256:2c67234fdbdd7bfceed4df0fe8d3d9bede9354c4e18b2c061098b002c665e0f3"}, + {file = "qibo-0.2.13.tar.gz", hash = "sha256:3a815f2262b4d38d57127653df83dbbcbe7e941e8fb9a53c8a107f303b270dc4"}, ] [package.dependencies] cma = ">=3.3.0,<4.0.0" -hyperopt = ">=0.2.7,<0.3.0" joblib = ">=1.2.0,<2.0.0" networkx = ">=3.2.1,<4.0.0" numpy = ">=1.26.4,<2.0.0" openqasm3 = {version = ">=0.5.0", extras = ["parser"]} +optuna = ">=4.0.0,<5.0.0" scipy = ">=1.10.1,<2.0.0" sympy = ">=1.11.1,<2.0.0" tabulate = ">=0.9.0,<0.10.0" [package.extras] -qinfo = ["cvxpy (>=1.4.2,<2.0.0)"] -tensorflow = ["tensorflow (>=2.14.1,<2.16)"] -torch = ["torch (>=2.1.1,<3.0.0)"] +qulacs = ["qulacs (>=0.6.4,<0.7.0)"] +torch = ["torch (>=2.1.1,<2.4)"] [[package]] name = "qibolab" -version = "0.1.8" +version = "0.1.10" description = "Quantum hardware module and drivers for Qibo" optional = false python-versions = "<3.12,>=3.9" files = [ - {file = "qibolab-0.1.8-py3-none-any.whl", hash = "sha256:101271a379e6148f9a61258639da38bf87b0a80bddefa21823b1561204a3d8ed"}, - {file = "qibolab-0.1.8.tar.gz", hash = "sha256:a49fef8442404f4c4116d0d308a4840aff2ff00fc985bf81c76ede13b33e41b0"}, + {file = "qibolab-0.1.10-py3-none-any.whl", hash = "sha256:f0ca402148acd3f97aab22440d2f9c0a93774b28216a3d2e3ad14d5a912a4476"}, + {file = "qibolab-0.1.10.tar.gz", hash = "sha256:2541ded6ce3d7071c4c5be6714266e23b5c86c5e3dde1657c82382246f05b81a"}, ] [package.dependencies] @@ -2686,32 +2719,32 @@ six = ">=1.7.0" [[package]] name = "scikit-learn" -version = "1.5.1" +version = "1.5.2" description = "A set of python modules for machine learning and data mining" optional = false python-versions = ">=3.9" files = [ - {file = "scikit_learn-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:781586c414f8cc58e71da4f3d7af311e0505a683e112f2f62919e3019abd3745"}, - {file = "scikit_learn-1.5.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5b213bc29cc30a89a3130393b0e39c847a15d769d6e59539cd86b75d276b1a7"}, - {file = "scikit_learn-1.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ff4ba34c2abff5ec59c803ed1d97d61b036f659a17f55be102679e88f926fac"}, - {file = "scikit_learn-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:161808750c267b77b4a9603cf9c93579c7a74ba8486b1336034c2f1579546d21"}, - {file = "scikit_learn-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:10e49170691514a94bb2e03787aa921b82dbc507a4ea1f20fd95557862c98dc1"}, - {file = "scikit_learn-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:154297ee43c0b83af12464adeab378dee2d0a700ccd03979e2b821e7dd7cc1c2"}, - {file = "scikit_learn-1.5.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b5e865e9bd59396220de49cb4a57b17016256637c61b4c5cc81aaf16bc123bbe"}, - {file = "scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:909144d50f367a513cee6090873ae582dba019cb3fca063b38054fa42704c3a4"}, - {file = "scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:689b6f74b2c880276e365fe84fe4f1befd6a774f016339c65655eaff12e10cbf"}, - {file = "scikit_learn-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:9a07f90846313a7639af6a019d849ff72baadfa4c74c778821ae0fad07b7275b"}, - {file = "scikit_learn-1.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5944ce1faada31c55fb2ba20a5346b88e36811aab504ccafb9f0339e9f780395"}, - {file = "scikit_learn-1.5.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0828673c5b520e879f2af6a9e99eee0eefea69a2188be1ca68a6121b809055c1"}, - {file = "scikit_learn-1.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:508907e5f81390e16d754e8815f7497e52139162fd69c4fdbd2dfa5d6cc88915"}, - {file = "scikit_learn-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97625f217c5c0c5d0505fa2af28ae424bd37949bb2f16ace3ff5f2f81fb4498b"}, - {file = "scikit_learn-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:da3f404e9e284d2b0a157e1b56b6566a34eb2798205cba35a211df3296ab7a74"}, - {file = "scikit_learn-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:88e0672c7ac21eb149d409c74cc29f1d611d5158175846e7a9c2427bd12b3956"}, - {file = "scikit_learn-1.5.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:7b073a27797a283187a4ef4ee149959defc350b46cbf63a84d8514fe16b69855"}, - {file = "scikit_learn-1.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b59e3e62d2be870e5c74af4e793293753565c7383ae82943b83383fdcf5cc5c1"}, - {file = "scikit_learn-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd8d3a19d4bd6dc5a7d4f358c8c3a60934dc058f363c34c0ac1e9e12a31421d"}, - {file = "scikit_learn-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:5f57428de0c900a98389c4a433d4a3cf89de979b3aa24d1c1d251802aa15e44d"}, - {file = "scikit_learn-1.5.1.tar.gz", hash = "sha256:0ea5d40c0e3951df445721927448755d3fe1d80833b0b7308ebff5d2a45e6414"}, + {file = "scikit_learn-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:299406827fb9a4f862626d0fe6c122f5f87f8910b86fe5daa4c32dcd742139b6"}, + {file = "scikit_learn-1.5.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:2d4cad1119c77930b235579ad0dc25e65c917e756fe80cab96aa3b9428bd3fb0"}, + {file = "scikit_learn-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c412ccc2ad9bf3755915e3908e677b367ebc8d010acbb3f182814524f2e5540"}, + {file = "scikit_learn-1.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a686885a4b3818d9e62904d91b57fa757fc2bed3e465c8b177be652f4dd37c8"}, + {file = "scikit_learn-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:c15b1ca23d7c5f33cc2cb0a0d6aaacf893792271cddff0edbd6a40e8319bc113"}, + {file = "scikit_learn-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03b6158efa3faaf1feea3faa884c840ebd61b6484167c711548fce208ea09445"}, + {file = "scikit_learn-1.5.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1ff45e26928d3b4eb767a8f14a9a6efbf1cbff7c05d1fb0f95f211a89fd4f5de"}, + {file = "scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f763897fe92d0e903aa4847b0aec0e68cadfff77e8a0687cabd946c89d17e675"}, + {file = "scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8b0ccd4a902836493e026c03256e8b206656f91fbcc4fde28c57a5b752561f1"}, + {file = "scikit_learn-1.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:6c16d84a0d45e4894832b3c4d0bf73050939e21b99b01b6fd59cbb0cf39163b6"}, + {file = "scikit_learn-1.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f932a02c3f4956dfb981391ab24bda1dbd90fe3d628e4b42caef3e041c67707a"}, + {file = "scikit_learn-1.5.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3b923d119d65b7bd555c73be5423bf06c0105678ce7e1f558cb4b40b0a5502b1"}, + {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f60021ec1574e56632be2a36b946f8143bf4e5e6af4a06d85281adc22938e0dd"}, + {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:394397841449853c2290a32050382edaec3da89e35b3e03d6cc966aebc6a8ae6"}, + {file = "scikit_learn-1.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:57cc1786cfd6bd118220a92ede80270132aa353647684efa385a74244a41e3b1"}, + {file = "scikit_learn-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:757c7d514ddb00ae249832fe87100d9c73c6ea91423802872d9e74970a0e40b9"}, + {file = "scikit_learn-1.5.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:52788f48b5d8bca5c0736c175fa6bdaab2ef00a8f536cda698db61bd89c551c1"}, + {file = "scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:643964678f4b5fbdc95cbf8aec638acc7aa70f5f79ee2cdad1eec3df4ba6ead8"}, + {file = "scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca64b3089a6d9b9363cd3546f8978229dcbb737aceb2c12144ee3f70f95684b7"}, + {file = "scikit_learn-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:3bed4909ba187aca80580fe2ef370d9180dcf18e621a27c4cf2ef10d279a7efe"}, + {file = "scikit_learn-1.5.2.tar.gz", hash = "sha256:b4237ed7b3fdd0a4882792e68ef2545d5baa50aca3bb45aa7df468138ad8f94d"}, ] [package.dependencies] @@ -2723,11 +2756,11 @@ threadpoolctl = ">=3.1.0" [package.extras] benchmark = ["matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "pandas (>=1.1.5)"] build = ["cython (>=3.0.10)", "meson-python (>=0.16.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] -docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-gallery (>=0.16.0)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-design (>=0.6.0)", "sphinx-gallery (>=0.16.0)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)"] examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] install = ["joblib (>=1.2.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)", "threadpoolctl (>=3.1.0)"] maintenance = ["conda-lock (==2.5.6)"] -tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.2.1)", "scikit-image (>=0.17.2)"] +tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.2.1)", "scikit-image (>=0.17.2)"] [[package]] name = "scipy" @@ -2794,19 +2827,23 @@ stats = ["scipy (>=1.3)", "statsmodels (>=0.10)"] [[package]] name = "setuptools" -version = "72.1.0" +version = "75.6.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "setuptools-72.1.0-py3-none-any.whl", hash = "sha256:5a03e1860cf56bb6ef48ce186b0e557fdba433237481a9a625176c2831be15d1"}, - {file = "setuptools-72.1.0.tar.gz", hash = "sha256:8d243eff56d095e5817f796ede6ae32941278f542e0f941867cc05ae52b162ec"}, + {file = "setuptools-75.6.0-py3-none-any.whl", hash = "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d"}, + {file = "setuptools-75.6.0.tar.gz", hash = "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6"}, ] [package.extras] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "ordered-set (>=3.1.1)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.11.*)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.7.0)"] +core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (>=1.12,<1.14)", "pytest-mypy"] [[package]] name = "six" @@ -2819,22 +2856,6 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -[[package]] -name = "skl2onnx" -version = "1.17.0" -description = "Convert scikit-learn models to ONNX" -optional = true -python-versions = "*" -files = [ - {file = "skl2onnx-1.17.0-py2.py3-none-any.whl", hash = "sha256:27942fc2743efe9dff56380001da4685812d0f5b1b0b9c1a032e80d059d6779a"}, - {file = "skl2onnx-1.17.0.tar.gz", hash = "sha256:7127dc84e470f489f68094ccfff9a5a815b609f700d43e708e6f658a33b06403"}, -] - -[package.dependencies] -onnx = ">=1.2.1" -onnxconverter-common = ">=1.7.0" -scikit-learn = ">=1.1" - [[package]] name = "skops" version = "0.10.0" @@ -2870,13 +2891,13 @@ files = [ [[package]] name = "soupsieve" -version = "2.5" +version = "2.6" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.8" files = [ - {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, - {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, ] [[package]] @@ -3075,6 +3096,101 @@ lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] standalone = ["Sphinx (>=5)"] test = ["pytest"] +[[package]] +name = "sqlalchemy" +version = "2.0.36" +description = "Database Abstraction Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:59b8f3adb3971929a3e660337f5dacc5942c2cdb760afcabb2614ffbda9f9f72"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37350015056a553e442ff672c2d20e6f4b6d0b2495691fa239d8aa18bb3bc908"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8318f4776c85abc3f40ab185e388bee7a6ea99e7fa3a30686580b209eaa35c08"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c245b1fbade9c35e5bd3b64270ab49ce990369018289ecfde3f9c318411aaa07"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:69f93723edbca7342624d09f6704e7126b152eaed3cdbb634cb657a54332a3c5"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f9511d8dd4a6e9271d07d150fb2f81874a3c8c95e11ff9af3a2dfc35fe42ee44"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-win32.whl", hash = "sha256:c3f3631693003d8e585d4200730616b78fafd5a01ef8b698f6967da5c605b3fa"}, + {file = "SQLAlchemy-2.0.36-cp310-cp310-win_amd64.whl", hash = "sha256:a86bfab2ef46d63300c0f06936bd6e6c0105faa11d509083ba8f2f9d237fb5b5"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fd3a55deef00f689ce931d4d1b23fa9f04c880a48ee97af488fd215cf24e2a6c"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f5e9cd989b45b73bd359f693b935364f7e1f79486e29015813c338450aa5a71"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ddd9db6e59c44875211bc4c7953a9f6638b937b0a88ae6d09eb46cced54eff"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2519f3a5d0517fc159afab1015e54bb81b4406c278749779be57a569d8d1bb0d"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59b1ee96617135f6e1d6f275bbe988f419c5178016f3d41d3c0abb0c819f75bb"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:39769a115f730d683b0eb7b694db9789267bcd027326cccc3125e862eb03bfd8"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-win32.whl", hash = "sha256:66bffbad8d6271bb1cc2f9a4ea4f86f80fe5e2e3e501a5ae2a3dc6a76e604e6f"}, + {file = "SQLAlchemy-2.0.36-cp311-cp311-win_amd64.whl", hash = "sha256:23623166bfefe1487d81b698c423f8678e80df8b54614c2bf4b4cfcd7c711959"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7b64e6ec3f02c35647be6b4851008b26cff592a95ecb13b6788a54ef80bbdd4"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:46331b00096a6db1fdc052d55b101dbbfc99155a548e20a0e4a8e5e4d1362855"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdf3386a801ea5aba17c6410dd1dc8d39cf454ca2565541b5ac42a84e1e28f53"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9dfa18ff2a67b09b372d5db8743c27966abf0e5344c555d86cc7199f7ad83a"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:90812a8933df713fdf748b355527e3af257a11e415b613dd794512461eb8a686"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1bc330d9d29c7f06f003ab10e1eaced295e87940405afe1b110f2eb93a233588"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-win32.whl", hash = "sha256:79d2e78abc26d871875b419e1fd3c0bca31a1cb0043277d0d850014599626c2e"}, + {file = "SQLAlchemy-2.0.36-cp312-cp312-win_amd64.whl", hash = "sha256:b544ad1935a8541d177cb402948b94e871067656b3a0b9e91dbec136b06a2ff5"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b5cc79df7f4bc3d11e4b542596c03826063092611e481fcf1c9dfee3c94355ef"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3c01117dd36800f2ecaa238c65365b7b16497adc1522bf84906e5710ee9ba0e8"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bc633f4ee4b4c46e7adcb3a9b5ec083bf1d9a97c1d3854b92749d935de40b9b"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e46ed38affdfc95d2c958de328d037d87801cfcbea6d421000859e9789e61c2"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b2985c0b06e989c043f1dc09d4fe89e1616aadd35392aea2844f0458a989eacf"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a121d62ebe7d26fec9155f83f8be5189ef1405f5973ea4874a26fab9f1e262c"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-win32.whl", hash = "sha256:0572f4bd6f94752167adfd7c1bed84f4b240ee6203a95e05d1e208d488d0d436"}, + {file = "SQLAlchemy-2.0.36-cp313-cp313-win_amd64.whl", hash = "sha256:8c78ac40bde930c60e0f78b3cd184c580f89456dd87fc08f9e3ee3ce8765ce88"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:be9812b766cad94a25bc63bec11f88c4ad3629a0cec1cd5d4ba48dc23860486b"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aae840ebbd6cdd41af1c14590e5741665e5272d2fee999306673a1bb1fdb4d"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4557e1f11c5f653ebfdd924f3f9d5ebfc718283b0b9beebaa5dd6b77ec290971"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:07b441f7d03b9a66299ce7ccf3ef2900abc81c0db434f42a5694a37bd73870f2"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:28120ef39c92c2dd60f2721af9328479516844c6b550b077ca450c7d7dc68575"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-win32.whl", hash = "sha256:b81ee3d84803fd42d0b154cb6892ae57ea6b7c55d8359a02379965706c7efe6c"}, + {file = "SQLAlchemy-2.0.36-cp37-cp37m-win_amd64.whl", hash = "sha256:f942a799516184c855e1a32fbc7b29d7e571b52612647866d4ec1c3242578fcb"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3d6718667da04294d7df1670d70eeddd414f313738d20a6f1d1f379e3139a545"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:72c28b84b174ce8af8504ca28ae9347d317f9dba3999e5981a3cd441f3712e24"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b11d0cfdd2b095e7b0686cf5fabeb9c67fae5b06d265d8180715b8cfa86522e3"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e32092c47011d113dc01ab3e1d3ce9f006a47223b18422c5c0d150af13a00687"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6a440293d802d3011028e14e4226da1434b373cbaf4a4bbb63f845761a708346"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c54a1e53a0c308a8e8a7dffb59097bff7facda27c70c286f005327f21b2bd6b1"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-win32.whl", hash = "sha256:1e0d612a17581b6616ff03c8e3d5eff7452f34655c901f75d62bd86449d9750e"}, + {file = "SQLAlchemy-2.0.36-cp38-cp38-win_amd64.whl", hash = "sha256:8958b10490125124463095bbdadda5aa22ec799f91958e410438ad6c97a7b793"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc022184d3e5cacc9579e41805a681187650e170eb2fd70e28b86192a479dcaa"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b817d41d692bf286abc181f8af476c4fbef3fd05e798777492618378448ee689"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4e46a888b54be23d03a89be510f24a7652fe6ff660787b96cd0e57a4ebcb46d"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4ae3005ed83f5967f961fd091f2f8c5329161f69ce8480aa8168b2d7fe37f06"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:03e08af7a5f9386a43919eda9de33ffda16b44eb11f3b313e6822243770e9763"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3dbb986bad3ed5ceaf090200eba750b5245150bd97d3e67343a3cfed06feecf7"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-win32.whl", hash = "sha256:9fe53b404f24789b5ea9003fc25b9a3988feddebd7e7b369c8fac27ad6f52f28"}, + {file = "SQLAlchemy-2.0.36-cp39-cp39-win_amd64.whl", hash = "sha256:af148a33ff0349f53512a049c6406923e4e02bf2f26c5fb285f143faf4f0e46a"}, + {file = "SQLAlchemy-2.0.36-py3-none-any.whl", hash = "sha256:fddbe92b4760c6f5d48162aef14824add991aeda8ddadb3c31d56eb15ca69f8e"}, + {file = "sqlalchemy-2.0.36.tar.gz", hash = "sha256:7f2767680b6d2398aea7082e45a774b2b0767b5c8d8ffb9c8b683088ea9b29c5"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +typing-extensions = ">=4.6.0" + +[package.extras] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx_oracle (>=8)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3_binary"] + [[package]] name = "stack-data" version = "0.6.3" @@ -3096,13 +3212,13 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "sympy" -version = "1.13.1" +version = "1.13.3" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" files = [ - {file = "sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8"}, - {file = "sympy-1.13.1.tar.gz", hash = "sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f"}, + {file = "sympy-1.13.3-py3-none-any.whl", hash = "sha256:54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73"}, + {file = "sympy-1.13.3.tar.gz", hash = "sha256:b27fd2c6530e0ab39e275fc9b683895367e51d5da91baa8d3d64db2565fec4d9"}, ] [package.dependencies] @@ -3153,42 +3269,73 @@ files = [ [[package]] name = "tomli" -version = "2.0.1" +version = "2.2.1" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] [[package]] name = "tomlkit" -version = "0.13.0" +version = "0.13.2" description = "Style preserving TOML library" optional = false python-versions = ">=3.8" files = [ - {file = "tomlkit-0.13.0-py3-none-any.whl", hash = "sha256:7075d3042d03b80f603482d69bf0c8f345c2b30e41699fd8883227f89972b264"}, - {file = "tomlkit-0.13.0.tar.gz", hash = "sha256:08ad192699734149f5b97b45f1f18dad7eb1b6d16bc72ad0c2335772650d7b72"}, + {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, + {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, ] [[package]] name = "tqdm" -version = "4.66.5" +version = "4.67.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, - {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] +discord = ["requests"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] @@ -3221,24 +3368,24 @@ files = [ [[package]] name = "tzdata" -version = "2024.1" +version = "2024.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, ] [[package]] name = "urllib3" -version = "2.2.2" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] @@ -3271,13 +3418,13 @@ files = [ [[package]] name = "werkzeug" -version = "3.0.3" +version = "3.0.6" description = "The comprehensive WSGI web application library." optional = false python-versions = ">=3.8" files = [ - {file = "werkzeug-3.0.3-py3-none-any.whl", hash = "sha256:fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8"}, - {file = "werkzeug-3.0.3.tar.gz", hash = "sha256:097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18"}, + {file = "werkzeug-3.0.6-py3-none-any.whl", hash = "sha256:1bc0c2310d2fbb07b1dd1105eba2f7af72f322e1e455f2f93c993bee8c8a5f17"}, + {file = "werkzeug-3.0.6.tar.gz", hash = "sha256:a8dd59d4de28ca70471a34cba79bed5f7ef2e036a76b3ab0835474246eb41f8d"}, ] [package.dependencies] @@ -3305,103 +3452,102 @@ test = ["pytest"] [[package]] name = "wrapt" -version = "1.16.0" +version = "1.17.0" description = "Module for decorators, wrappers and monkey patching." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, - {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, - {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, - {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, - {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, - {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, - {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, - {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, - {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, - {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, - {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, - {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, - {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, - {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, - {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, - {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, - {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, - {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, + {file = "wrapt-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a0c23b8319848426f305f9cb0c98a6e32ee68a36264f45948ccf8e7d2b941f8"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1ca5f060e205f72bec57faae5bd817a1560fcfc4af03f414b08fa29106b7e2d"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e185ec6060e301a7e5f8461c86fb3640a7beb1a0f0208ffde7a65ec4074931df"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb90765dd91aed05b53cd7a87bd7f5c188fcd95960914bae0d32c5e7f899719d"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:879591c2b5ab0a7184258274c42a126b74a2c3d5a329df16d69f9cee07bba6ea"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fce6fee67c318fdfb7f285c29a82d84782ae2579c0e1b385b7f36c6e8074fffb"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0698d3a86f68abc894d537887b9bbf84d29bcfbc759e23f4644be27acf6da301"}, + {file = "wrapt-1.17.0-cp310-cp310-win32.whl", hash = "sha256:69d093792dc34a9c4c8a70e4973a3361c7a7578e9cd86961b2bbf38ca71e4e22"}, + {file = "wrapt-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:f28b29dc158ca5d6ac396c8e0a2ef45c4e97bb7e65522bfc04c989e6fe814575"}, + {file = "wrapt-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:74bf625b1b4caaa7bad51d9003f8b07a468a704e0644a700e936c357c17dd45a"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f2a28eb35cf99d5f5bd12f5dd44a0f41d206db226535b37b0c60e9da162c3ed"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81b1289e99cf4bad07c23393ab447e5e96db0ab50974a280f7954b071d41b489"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2939cd4a2a52ca32bc0b359015718472d7f6de870760342e7ba295be9ebaf9"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a9653131bda68a1f029c52157fd81e11f07d485df55410401f745007bd6d339"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4e4b4385363de9052dac1a67bfb535c376f3d19c238b5f36bddc95efae15e12d"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bdf62d25234290db1837875d4dceb2151e4ea7f9fff2ed41c0fde23ed542eb5b"}, + {file = "wrapt-1.17.0-cp311-cp311-win32.whl", hash = "sha256:5d8fd17635b262448ab8f99230fe4dac991af1dabdbb92f7a70a6afac8a7e346"}, + {file = "wrapt-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:92a3d214d5e53cb1db8b015f30d544bc9d3f7179a05feb8f16df713cecc2620a"}, + {file = "wrapt-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:89fc28495896097622c3fc238915c79365dd0ede02f9a82ce436b13bd0ab7569"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875d240fdbdbe9e11f9831901fb8719da0bd4e6131f83aa9f69b96d18fae7504"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ed16d95fd142e9c72b6c10b06514ad30e846a0d0917ab406186541fe68b451"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b956061b8db634120b58f668592a772e87e2e78bc1f6a906cfcaa0cc7991c1"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:daba396199399ccabafbfc509037ac635a6bc18510ad1add8fd16d4739cdd106"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4d63f4d446e10ad19ed01188d6c1e1bb134cde8c18b0aa2acfd973d41fcc5ada"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8a5e7cc39a45fc430af1aefc4d77ee6bad72c5bcdb1322cfde852c15192b8bd4"}, + {file = "wrapt-1.17.0-cp312-cp312-win32.whl", hash = "sha256:0a0a1a1ec28b641f2a3a2c35cbe86c00051c04fffcfcc577ffcdd707df3f8635"}, + {file = "wrapt-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:3c34f6896a01b84bab196f7119770fd8466c8ae3dfa73c59c0bb281e7b588ce7"}, + {file = "wrapt-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:714c12485aa52efbc0fc0ade1e9ab3a70343db82627f90f2ecbc898fdf0bb181"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da427d311782324a376cacb47c1a4adc43f99fd9d996ffc1b3e8529c4074d393"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba1739fb38441a27a676f4de4123d3e858e494fac05868b7a281c0a383c098f4"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e711fc1acc7468463bc084d1b68561e40d1eaa135d8c509a65dd534403d83d7b"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:140ea00c87fafc42739bd74a94a5a9003f8e72c27c47cd4f61d8e05e6dec8721"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:73a96fd11d2b2e77d623a7f26e004cc31f131a365add1ce1ce9a19e55a1eef90"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0b48554952f0f387984da81ccfa73b62e52817a4386d070c75e4db7d43a28c4a"}, + {file = "wrapt-1.17.0-cp313-cp313-win32.whl", hash = "sha256:498fec8da10e3e62edd1e7368f4b24aa362ac0ad931e678332d1b209aec93045"}, + {file = "wrapt-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd136bb85f4568fffca995bd3c8d52080b1e5b225dbf1c2b17b66b4c5fa02838"}, + {file = "wrapt-1.17.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:17fcf043d0b4724858f25b8826c36e08f9fb2e475410bece0ec44a22d533da9b"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a557d97f12813dc5e18dad9fa765ae44ddd56a672bb5de4825527c847d6379"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0229b247b0fc7dee0d36176cbb79dbaf2a9eb7ecc50ec3121f40ef443155fb1d"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8425cfce27b8b20c9b89d77fb50e368d8306a90bf2b6eef2cdf5cd5083adf83f"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c900108df470060174108012de06d45f514aa4ec21a191e7ab42988ff42a86c"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4e547b447073fc0dbfcbff15154c1be8823d10dab4ad401bdb1575e3fdedff1b"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:914f66f3b6fc7b915d46c1cc424bc2441841083de01b90f9e81109c9759e43ab"}, + {file = "wrapt-1.17.0-cp313-cp313t-win32.whl", hash = "sha256:a4192b45dff127c7d69b3bdfb4d3e47b64179a0b9900b6351859f3001397dabf"}, + {file = "wrapt-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:4f643df3d4419ea3f856c5c3f40fec1d65ea2e89ec812c83f7767c8730f9827a"}, + {file = "wrapt-1.17.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:69c40d4655e078ede067a7095544bcec5a963566e17503e75a3a3e0fe2803b13"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f495b6754358979379f84534f8dd7a43ff8cff2558dcdea4a148a6e713a758f"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:baa7ef4e0886a6f482e00d1d5bcd37c201b383f1d314643dfb0367169f94f04c"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fc931382e56627ec4acb01e09ce66e5c03c384ca52606111cee50d931a342d"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8f8909cdb9f1b237786c09a810e24ee5e15ef17019f7cecb207ce205b9b5fcce"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ad47b095f0bdc5585bced35bd088cbfe4177236c7df9984b3cc46b391cc60627"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:948a9bd0fb2c5120457b07e59c8d7210cbc8703243225dbd78f4dfc13c8d2d1f"}, + {file = "wrapt-1.17.0-cp38-cp38-win32.whl", hash = "sha256:5ae271862b2142f4bc687bdbfcc942e2473a89999a54231aa1c2c676e28f29ea"}, + {file = "wrapt-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:f335579a1b485c834849e9075191c9898e0731af45705c2ebf70e0cd5d58beed"}, + {file = "wrapt-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d751300b94e35b6016d4b1e7d0e7bbc3b5e1751e2405ef908316c2a9024008a1"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7264cbb4a18dc4acfd73b63e4bcfec9c9802614572025bdd44d0721983fc1d9c"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33539c6f5b96cf0b1105a0ff4cf5db9332e773bb521cc804a90e58dc49b10578"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c30970bdee1cad6a8da2044febd824ef6dc4cc0b19e39af3085c763fdec7de33"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bc7f729a72b16ee21795a943f85c6244971724819819a41ddbaeb691b2dd85ad"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6ff02a91c4fc9b6a94e1c9c20f62ea06a7e375f42fe57587f004d1078ac86ca9"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2dfb7cff84e72e7bf975b06b4989477873dcf160b2fd89959c629535df53d4e0"}, + {file = "wrapt-1.17.0-cp39-cp39-win32.whl", hash = "sha256:2399408ac33ffd5b200480ee858baa58d77dd30e0dd0cab6a8a9547135f30a88"}, + {file = "wrapt-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:4f763a29ee6a20c529496a20a7bcb16a73de27f5da6a843249c7047daf135977"}, + {file = "wrapt-1.17.0-py3-none-any.whl", hash = "sha256:d2c63b93548eda58abf5188e505ffed0229bf675f7c3090f8e36ad55b8cbc371"}, + {file = "wrapt-1.17.0.tar.gz", hash = "sha256:16187aa2317c731170a88ef35e8937ae0f533c402872c1ee5e6d079fcf320801"}, ] [[package]] name = "zipp" -version = "3.19.2" +version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, - {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, + {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, + {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, ] [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] [extras] -classify = ["matplotlib", "onnxruntime", "seaborn", "skl2onnx"] +classify = ["matplotlib", "seaborn"] viz = ["pydot"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "878af869bce716692424a4ff967715148795b05aecfddedeab83ae0418a649d4" +content-hash = "3f6e1ecfcf93e08b5989930a4a5c2e68dfa8a22160a7783812b2524f9f8ed1ac" diff --git a/pyproject.toml b/pyproject.toml index 55dfbde1c9..518bb66b09 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "qibocal" -version = "0.0.12" +version = "0.1.3" description = "Qibo's quantum calibration, characterization and validation module." authors = ["The Qibo team"] license = "Apache License 2.0" @@ -18,7 +18,7 @@ classifiers = [ [tool.poetry.dependencies] python = ">=3.9,<3.12" qibolab = "^0.1.8" -qibo = "^0.2.6" +qibo = "^0.2.12" numpy = "^1.26.4" scipy = "^1.10.1" pandas = { version = "^2.2.2", extras = ["html"] } @@ -28,15 +28,10 @@ jinja2 = "^3.1.2" plotly = "^5.22.0" dash = "^2.6.0" skops = "^0.10.0" -scikit-learn = "^1.2.1" matplotlib = { version = "^3.7.0", optional = true } seaborn = { version = "^0.12.2", optional = true } pydot = { version = "^1.4.2", optional = true } -skl2onnx = { version = "^1.14.0", optional = true } pyyaml = "^6.0" -onnxruntime = { version = "^1.14.1", optional = true } -# TODO: drop this when https://github.com/onnx/onnx/issues/6267 is solved -onnx = { version = "<1.16.2", optional = true } [tool.poetry.group.test] optional = true @@ -46,6 +41,7 @@ pylint = "^2.17" pytest = "^7.1.2" pytest-cov = "^3.0.0" pytest-env = "^0.8.1" +pytest-mock = "^3.14.0" [tool.poetry.group.docs] optional = true @@ -68,7 +64,7 @@ devtools = "^0.10.0" [tool.poetry.extras] -classify = ["matplotlib", "seaborn", "skl2onnx", "onnxruntime"] +classify = ["matplotlib", "seaborn", "skl2onnx"] viz = ["pydot"] [build-system] diff --git a/runcards/README.md b/runcards/README.md deleted file mode 100644 index 73e467ad0b..0000000000 --- a/runcards/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Runcards - -The following folder contains a demo [runcard](actions_qq.yml) which contains all the protocols currently implemented with arbitrary parameters. diff --git a/runcards/actions_qq.yml b/runcards/actions_qq.yml deleted file mode 100644 index a58c652f29..0000000000 --- a/runcards/actions_qq.yml +++ /dev/null @@ -1,425 +0,0 @@ -platform: dummy - -targets: [0,1] - - -actions: - -# - id: resoantor_amplitude -# operation: resonator_amplitude -# parameters: -# amplitude_step: 0.1 -# amplitude_stop: 0.5 - - # - id: resonator_spectroscopy high power - # operation: resonator_spectroscopy - # parameters: - # freq_width: 10_000_000 - # freq_step: 500_000 - # amplitude: 0.4 - # power_level: high - # nshots: 1024 - # relaxation_time: 0 - - # - id: resonator punchout - # operation: resonator_punchout - # parameters: - # freq_width: 5_000_000 - # freq_step: 1_000_000 - # min_amp_factor: 0.02 - # max_amp_factor: 2.4 - # step_amp_factor: 0.1 - # nshots: 10 - # relaxation_time: 50 - - # - id: resonator_punchout_attenuation - # operation: resonator_punchout_attenuation - # parameters: - # freq_width: 10_000_000 - # freq_step: 500_000 - # min_att: 4 - # max_att: 60 - # step_att: 4 - # nshots: 1000 - # relaxation_time: 0 - - # - id: resonator_spectroscopy low power - # operation: resonator_spectroscopy - # parameters: - # freq_width: 10_000_000 - # freq_step: 1_000_000 - # # amplitude: 0.2 - # power_level: low - # nshots: 1024 - # relaxation_time: 50 - # # attenuation: 20 - - # - id: resonator flux dependence - # operation: resonator_flux - # parameters: - # freq_width: 10_000_000 - # freq_step: 500_000 - # bias_width: 0.8 - # bias_step: 0.1 - # nshots: 1024 - # relaxation_time: 0 - - # - id: qubit spectroscopy - # operation: qubit_spectroscopy - # parameters: - # drive_amplitude: 0.005 - # drive_duration: 2000 - # freq_width: 10_000_000 - # freq_step: 100_000 - # nshots: 1024 - # relaxation_time: 0 - - # - id: qubit flux dependence - # operation: qubit_flux - # parameters: - # freq_width: 10_000_000 - # freq_step: 1_000_000 - # bias_width: 0.8 #0.1 - # bias_step: 0.1 # 0.001 - # drive_amplitude: 0.005 - # nshots: 1000 - # relaxation_time: 0 - - # - id: rabi - # operation: rabi_amplitude - # parameters: - # min_amp_factor: 0.0 - # max_amp_factor: 2.0 - # step_amp_factor: 0.02 - # pulse_length: 40 - # relaxation_time: 100_000 - # nshots: 1024 - - # - id: rabi length - # operation: rabi_length - # parameters: - # pulse_duration_start: 4 - # pulse_duration_end: 84 - # pulse_duration_step: 8 - # pulse_amplitude: 0.5 - # relaxation_time: 100_000 - # nshots: 1024 - - # - id: t1 - # operation: t1 - # parameters: - # delay_before_readout_start: 16 - # delay_before_readout_end: 2000 - # delay_before_readout_step: 20 - - # - id: ramsey - # operation: ramsey - # parameters: - # delay_between_pulses_start: 16 # must be a multiple of 4 incl 0 - # delay_between_pulses_end: 1000 - # delay_between_pulses_step: 4 # must be a multiple of 4 - - # - id: ramsey detuned - # operation: ramsey - # parameters: - # detuning: 1_000_000 - # delay_between_pulses_start: 4 # must be a multiple of 4 incl 0 - # delay_between_pulses_end: 200 - # delay_between_pulses_step: 4 # must be a multiple of 4 - - # - id: single shot classification - # operation: single_shot_classification - # parameters: - # nshots: 1024 - # classifiers_list: ["qblox_fit", "naive_bayes"] - - # - id: allXY - # operation: allxy - # parameters: - # beta_param: null - - # - id: drag_pulse_tuning - # operation: allxy_drag_pulse_tuning - # parameters: - # beta_start: -0.2 - # beta_end: 0.2 - # beta_step: 0.1 - - # - id: drag_pulse_tuning - # operation: drag_pulse_tuning - # parameters: - # beta_start: -0.5 - # beta_end: 0.5 - # beta_step: 0.05 - - # - id: allXY 2 #Ideally this should be repeated with the correct beta - # operation: allxy - # parameters: - # beta_param: null - - # - id: spin_echo - # operation: spin_echo - # parameters: - # delay_between_pulses_start: 4 - # delay_between_pulses_end: 10000 - # delay_between_pulses_step: 200 - - # - id: flipping - # operation: flipping - # parameters: - # nflips_max: 20 - # nflips_step: 1 - -# - id: qubit flux dependence -# operation: qubit_flux -# parameters: -# freq_width: 10_000_000 -# freq_step: 1_000_000 -# bias_width: 0.8 -# bias_step: 0.1 -# drive_amplitude: 0.005 -# nshots: 10 - -# - id: qubit flux dependence tracking -# operation: qubit_flux_tracking -# parameters: -# freq_width: 150_000_000 -# freq_step: 500_000 -# bias_width: 0.2 -# bias_step: 0.005 -# nshots: 1024 -# relaxation_time: 2000 -# transition: "01" - - -# - id: rabi -# operation: rabi_amplitude -# parameters: -# min_amp_factor: 0.0 -# max_amp_factor: 4.0 -# step_amp_factor: 0.1 -# pulse_length: 30 -# nshots: 1024 - - -# - id: rabi length -# operation: rabi_length -# parameters: -# pulse_duration_start: 4 -# pulse_duration_end: 84 -# pulse_duration_step: 8 -# pulse_amplitude: 0.5 -# nshots: 1024 - - -# - id: rabi length sequences -# operation: rabi_length_sequences -# parameters: -# pulse_duration_start: 4 -# pulse_duration_end: 84 -# pulse_duration_step: 8 -# pulse_amplitude: 0.5 -# nshots: 1024 - - -# - id: t1 -# operation: t1 -# parameters: -# delay_before_readout_start: 0 -# delay_before_readout_end: 20_000 -# delay_before_readout_step: 2000 -# nshots: 1024 - - -# - id: t1 sequences -# operation: t1_sequences -# parameters: -# delay_before_readout_start: 0 -# delay_before_readout_end: 20_000 -# delay_before_readout_step: 2000 -# nshots: 10 - - -# - id: t2 -# operation: t2 -# parameters: -# delay_between_pulses_start: 16 -# delay_between_pulses_end: 20000 -# delay_between_pulses_step: 100 -# nshots: 10 - - -# - id: t2 sequences -# operation: t2_sequences -# parameters: -# delay_between_pulses_start: 16 -# delay_between_pulses_end: 20000 -# delay_between_pulses_step: 100 -# nshots: 1024 - - -# - id: ramsey_detuned -# operation: ramsey -# parameters: -# delay_between_pulses_start: 0 # must be a multiple of 4 incl 0 -# delay_between_pulses_end: 5000 -# delay_between_pulses_step: 500 # must be a multiple of 4 -# detuning: 1_000_000 -# nshots: 10 - - -# - id: ramsey detuned sequences -# operation: ramsey_sequences -# parameters: -# delay_between_pulses_start: 0 # must be a multiple of 4 incl 0 -# delay_between_pulses_end: 5000 -# delay_between_pulses_step: 500 # must be a multiple of 4 -# detuning: 1_000_000 -# nshots: 1024 - - -# - id: ramsey -# operation: ramsey -# parameters: -# delay_between_pulses_start: 0 # must be a multiple of 4 incl 0 -# delay_between_pulses_end: 5000 -# delay_between_pulses_step: 500 # must be a multiple of 4 -# nshots: 1024 - - -# - id: single shot classification -# operation: single_shot_classification -# parameters: -# nshots: 2000 -# classifiers_list: ["qubit_fit", "naive_bayes", "qblox_fit"] -# savedir: results - - -# - id: allXY -# operation: allxy -# parameters: -# beta_param: null -# nshots: 10 - - -# - id: allxy_drag_pulse_tuning -# operation: allxy_drag_pulse_tuning -# parameters: -# beta_start: 0 -# beta_end: 0.02 -# beta_step: 0.01 -# nshots: 10 - - -# - id: drag_pulse_tuning -# operation: drag_pulse_tuning -# parameters: -# beta_start: 0 -# beta_end: 0.02 -# beta_step: 0.01 -# nshots: 10 - - -# - id: spin_echo -# operation: spin_echo -# parameters: -# delay_between_pulses_start: 0 -# delay_between_pulses_end: 20000 -# delay_between_pulses_step: 2000 -# nshots: 10 - - -# - id: flipping -# operation: flipping -# parameters: -# nflips_max: 5 -# nflips_step: 1 -# nshots: 10 - - -# - id: dispersive shift -# operation: dispersive_shift -# parameters: -# freq_width: 10_000_000 -# freq_step: 100_000 -# nshots: 10 - - -# - id: standard rb no error -# operation: standard_rb -# parameters: -# depths: -# start: 1 -# stop: 10 -# step: 2 -# niter: 2 -# nshots: 50 -# uncertainties: None - - -# - id: standard rb -# operation: standard_rb -# targets: [1] -# parameters: -# depths: [1, 2, 3, 5] -# niter: 5 -# nshots: 50 -# noise_model: PauliErrorOnAll - - -# - id: standard rb inhomogeneous -# operation: standard_rb -# targets: [0, 1, 3] -# parameters: -# depths: [1, 3, 3, 5] -# niter: 5 -# nshots: 50 -# uncertainties: std -# noise_model: PauliErrorOnX -# noise_params: [0.01, 0.01, 0.01] - - -# - id: CHSH with pulses -# operation: chsh_pulses -# targets: [[0,1],[1,2],[0,3]] -# parameters: -# nshots: 1000 -# ntheta: 10 -# bell_states: [0,1,2,3] -# apply_error_mitigation: True - - -# - id: CHSH with natives -# operation: chsh_circuits -# targets: [[0,1],[1,2]] -# parameters: -# nshots: 1000 -# ntheta: 10 -# bell_states: [0,1,2,3] -# native: True -# apply_error_mitigation: True - - -# - id: CHSH with circuits -# operation: chsh_circuits -# targets: [[0,1],[1,2]] -# parameters: -# nshots: 1000 -# ntheta: 10 -# bell_states: [0,1,2,3] - - -# - id: readout_mitigation_matrix pulses -# operation: readout_mitigation_matrix -# targets: [[0,1,2],[1,2]] -# parameters: -# nshots: 100 -# pulses: True - - -# - id: readout_mitigation_matrix circuits -# operation: readout_mitigation_matrix -# targets: [[0,1,2],[1,2]] -# parameters: -# nshots: 100 -# pulses: False diff --git a/runcards/benchmarks/routines_benchmarks.yml b/runcards/benchmarks/routines_benchmarks.yml deleted file mode 100644 index b79df28796..0000000000 --- a/runcards/benchmarks/routines_benchmarks.yml +++ /dev/null @@ -1,104 +0,0 @@ -platform: dummy - -qubits: [0] - -actions: - - - id: resonator spectroscopy high power - - operation: resonator_spectroscopy - - parameters: - freq_width: 10_000_000 - freq_step: 500_000 - amplitude: 0.4 - power_level: high - relaxation_time: 5_000 - - - id: resonator punchout - - operation: resonator_punchout - - parameters: - freq_width: 20_000_000 - freq_step: 2_000_000 - min_amp_factor: 0.02 - max_amp_factor: 2.4 - step_amp_factor: 0.1 - relaxation_time: 5_000 - - - id: resonator spectroscopy low power - - operation: resonator_spectroscopy - - parameters: - freq_width: 100_000_000 - freq_step: 1_000_000 - amplitude: 0.5 - power_level: low - relaxation_time: 5_000 - - - id: qubit spectroscopy - - operation: qubit_spectroscopy - - parameters: - drive_amplitude: 0.1 - drive_duration: 5000 - freq_width: 30_000_000 - freq_step: 100_000 - relaxation_time: 5_000 - - - id: rabi amplitude - - operation: rabi_amplitude - - parameters: - min_amp_factor: 0.0 - max_amp_factor: 1.5 - step_amp_factor: 0.02 - pulse_length: 40 - - - id: ramsey detuned - - operation: ramsey - - parameters: - delay_between_pulses_start: 0 - delay_between_pulses_end: 30_000 - delay_between_pulses_step: 1_000 - detuning: 333_333 - - - id: t1 - - operation: t1 - - parameters: - delay_before_readout_start: 0 - delay_before_readout_end: 200_000 - delay_before_readout_step: 5_000 - - - id: ramsey - - operation: ramsey - - parameters: - delay_between_pulses_start: 16 - delay_between_pulses_end: 65_000 - delay_between_pulses_step: 2_000 - - - id: single shot classification - - - operation: single_shot_classification - parameters: - nshots: 5_000 - - - id: standard rb - - operation: standard_rb - parameters: - depths: [10, 20, 30, 40] - niter: 50 - nshots: 128 - seed: 420 diff --git a/runcards/benchmarks/scaling_benchmarks.yml b/runcards/benchmarks/scaling_benchmarks.yml deleted file mode 100644 index 0a3308513e..0000000000 --- a/runcards/benchmarks/scaling_benchmarks.yml +++ /dev/null @@ -1,284 +0,0 @@ -platform: dummy - -qubits: [0] - -actions: - -# 1D Sweepers -# RO Frequency - - # - id: resonator spectroscopy 1 - # # ideal 0.0184 - - # operation: resonator_spectroscopy - - # parameters: - # freq_width: 10_000 - # freq_step: 10_000 - # amplitude: 0.1 - # power_level: low - # relaxation_time: 5_000 - # nshots: 1000 - - # - id: resonator spectroscopy 10 - # # ideal 0.1013 - - # operation: resonator_spectroscopy - - # parameters: - # freq_width: 100_000_000 - # freq_step: 10_000_000 - # amplitude: 0.1 - # power_level: low - # relaxation_time: 5_000 - # nshots: 1000 - - # - id: resonator spectroscopy 100 - # # ideal 0.93 - - # operation: resonator_spectroscopy - - # parameters: - # freq_width: 100_000_000 - # freq_step: 1_000_000 - # amplitude: 0.1 - # power_level: low - # relaxation_time: 5_000 - # nshots: 1000 - - # - id: resonator spectroscopy 1000 - # # ideal 9.22 - - # operation: resonator_spectroscopy - # parameters: - # freq_width: 100_000_000 - # freq_step: 100_000 - # amplitude: 0.1 - # power_level: low - # relaxation_time: 5_000 - # nshots: 1000 - -# Drive Frequency - -# - id: qubit spectroscopy 1 -# # ideal 0.0286 - -# operation: qubit_spectroscopy - -# parameters: -# drive_amplitude: 0.001 -# drive_duration: 5000 -# freq_width: 30_000_000 -# freq_step: 30_000_000 -# relaxation_time: 5_000 -# nshots: 1000 - -# - id: qubit spectroscopy 10 -# # ideal 0.157 - -# operation: qubit_spectroscopy - -# parameters: -# drive_amplitude: 0.001 -# drive_duration: 5000 -# freq_width: 30_000_000 -# freq_step: 3_000_000 -# relaxation_time: 5_000 -# nshots: 1000 - -# - id: qubit spectroscopy 100 -# # ideal 1.44 - -# operation: qubit_spectroscopy - -# parameters: -# drive_amplitude: 0.001 -# drive_duration: 5000 -# freq_width: 30_000_000 -# freq_step: 300_000 -# relaxation_time: 5_000 -# nshots: 1000 - -# - id: qubit spectroscopy 1000 -# # ideal 14.35 - -# operation: qubit_spectroscopy -# parameters: -# drive_amplitude: 0.001 -# drive_duration: 5000 -# freq_width: 30_000_000 -# freq_step: 30_000 -# relaxation_time: 5_000 -# nshots: 1000 - -# Pulse amplitude - -# - id: rabi amplitude 1 - -# operation: rabi_amplitude - -# parameters: -# min_amp_factor: 0 -# max_amp_factor: 1.1 -# step_amp_factor: 1.0 -# pulse_length: 40 -# relaxation_time: 5_000 -# nshots: 1000 - -# - id: rabi amplitude 10 - -# operation: rabi_amplitude - -# parameters: -# min_amp_factor: 0.0 -# max_amp_factor: 1.0000 -# step_amp_factor: 0.1 -# pulse_length: 40 -# relaxation_time: 5_000 -# nshots: 1000 - -# - id: rabi amplitude 100 - -# operation: rabi_amplitude - -# parameters: -# min_amp_factor: 0.0 -# max_amp_factor: 1.0000 -# step_amp_factor: 0.01 -# pulse_length: 40 -# relaxation_time: 5_000 -# nshots: 1000 - -# - id: rabi amplitude 1000 - -# operation: rabi_amplitude -# parameters: -# min_amp_factor: 0.0 -# max_amp_factor: 1.0000 -# step_amp_factor: 0.001 -# pulse_length: 40 -# relaxation_time: 5_000 -# nshots: 1000 - -# Pulse duration - -# - id: rabi lenght 1 - -# operation: rabi_length - -# parameters: -# pulse_duration_start: 20 -# pulse_duration_end: 120 -# pulse_duration_step: 100 -# pulse_amplitude: 0.001 -# relaxation_time: 5_000 -# nshots: 1000 - -# - id: rabi lenght 10 - -# operation: rabi_length - -# parameters: -# pulse_duration_start: 20 -# pulse_duration_end: 120 -# pulse_duration_step: 10 -# pulse_amplitude: 0.001 -# relaxation_time: 5_000 -# nshots: 1000 - -# - id: rabi lenght 100 - -# operation: rabi_length - -# parameters: -# pulse_duration_start: 20 -# pulse_duration_end: 120 -# pulse_duration_step: 1 -# pulse_amplitude: 0.001 -# relaxation_time: 5_000 -# nshots: 1000 - -# - id: rabi lenght 1000 - -# operation: rabi_length -# parameters: -# pulse_duration_start: 20 -# pulse_duration_end: 1020 -# pulse_duration_step: 1 -# pulse_amplitude: 0.001 -# relaxation_time: 5_000 -# nshots: 1000 - -# Pulse start - -# - id: t1 1 - -# operation: t1 - -# parameters: -# delay_before_readout_start: 0 -# delay_before_readout_end: 3_00 -# delay_before_readout_step: 3_00 -# relaxation_time: 5_000 -# nshots: 1000 - -# - id: t1 10 - -# operation: t1 - -# parameters: -# delay_before_readout_start: 0 -# delay_before_readout_end: 30_00 -# delay_before_readout_step: 3_00 -# relaxation_time: 5_000 -# nshots: 1000 - -# - id: t1 100 - -# operation: t1 - -# parameters: -# delay_before_readout_start: 0 -# delay_before_readout_end: 300_00 -# delay_before_readout_step: 3_00 -# relaxation_time: 5_000 -# nshots: 1000 - -# - id: t1 1000 - -# operation: t1 -# parameters: -# delay_before_readout_start: 0 -# delay_before_readout_end: 300_00 -# delay_before_readout_step: 30 -# relaxation_time: 5_000 -# nshots: 1000 - -# Circuits - - - id: standard rb 1 - operation: standard_rb - qubits: [0] - parameters: - depths: [10] - niter: 1 - nshots: 128 - seed: 420 - - - id: standard rb 10 - operation: standard_rb - qubits: [0] - parameters: - depths: [10] - niter: 10 - nshots: 128 - seed: 420 - - - id: standard rb 100 - operation: standard_rb - qubits: [0] - parameters: - depths: [10] - niter: 100 - nshots: 128 - seed: 420 diff --git a/runcards/calibration_tutorial/classification.yaml b/runcards/calibration_tutorial/classification.yaml deleted file mode 100644 index b6d423651c..0000000000 --- a/runcards/calibration_tutorial/classification.yaml +++ /dev/null @@ -1,10 +0,0 @@ -platform: qw11q - -targets: [D1] - -actions: - - id: single shot classification 1 - - operation: single_shot_classification - parameters: - nshots: 5000 diff --git a/runcards/calibration_tutorial/ef.yml b/runcards/calibration_tutorial/ef.yml deleted file mode 100644 index c419a1947c..0000000000 --- a/runcards/calibration_tutorial/ef.yml +++ /dev/null @@ -1,13 +0,0 @@ -targets: [D4] - -actions: - - id: qubit spectroscopy - - operation: qubit_spectroscopy_ef - parameters: - drive_amplitude: 0.09 - drive_duration: 4000 - freq_width: 20_000_000 - freq_step: 100_000 - nshots: 1024 - relaxation_time: 50_000 diff --git a/runcards/calibration_tutorial/flipping.yaml b/runcards/calibration_tutorial/flipping.yaml deleted file mode 100644 index e6c283e4bc..0000000000 --- a/runcards/calibration_tutorial/flipping.yaml +++ /dev/null @@ -1,11 +0,0 @@ -platform: qw11q - -targets: [D1] - -actions: - - id: flipping - - operation: flipping - parameters: - nflips_max: 20 - nflips_step: 1 diff --git a/runcards/calibration_tutorial/qubit_flux_dependence.yaml b/runcards/calibration_tutorial/qubit_flux_dependence.yaml deleted file mode 100644 index 0150d00a6b..0000000000 --- a/runcards/calibration_tutorial/qubit_flux_dependence.yaml +++ /dev/null @@ -1,39 +0,0 @@ -platform: qw11q - -targets: [D1] - -actions: - - - id: resonator_spectroscopy high power - operation: resonator_spectroscopy - parameters: - freq_width: 10_000_000 - freq_step: 100_000 - amplitude: 0.002 - fit_function: s21 - power_level: high - nshots: 1024 - relaxation_time: 100000 - - # - id: qubit flux dependence - - # operation: qubit_flux - # parameters: - # bias_step: 0.002 - # bias_width: 0.1 - # drive_amplitude: 0.001 - # drive_duration: 4000 - # freq_step: 500000 - # freq_width: 10000000 - # nshots: 1024 - # relaxation_time: 20_000 - - - id: resonator flux dependence - operation: resonator_flux - parameters: - bias_step: 0.05 - bias_width: 0.5 - freq_step: 100_000 - freq_width: 10_000_000 - nshots: 1024 - relaxation_time: 20000 diff --git a/runcards/calibration_tutorial/qubit_spectroscopy.yaml b/runcards/calibration_tutorial/qubit_spectroscopy.yaml deleted file mode 100644 index e92ff4df76..0000000000 --- a/runcards/calibration_tutorial/qubit_spectroscopy.yaml +++ /dev/null @@ -1,42 +0,0 @@ -platform: qw11q - -targets: [D1] - -actions: - - - id: resonator_spectroscopy high power - operation: resonator_spectroscopy - parameters: - freq_width: 10_000_000 - freq_step: 100_000 - amplitude: 0.002 - fit_function: s21 - power_level: high - nshots: 1024 - relaxation_time: 100000 - - # - id: qubit spectroscopy 01 - - # operation: qubit_spectroscopy - # parameters: - # drive_amplitude: 0.01 - # drive_duration: 4000 - # freq_width: 100_000_000 - # freq_step: 100_000 - # nshots: 1024 - # relaxation_time: 5000 - - - - id: qubit spectroscopy 01 - - operation: qubit_power_spectroscopy - parameters: - amplitude: 0.01 - min_amp_factor: 0.1 - max_amp_factor: 2 - step_amp_factor: 0.1 - duration: 4000 - freq_width: 300_000_000 - freq_step: 500_000 - nshots: 1024 - relaxation_time: 5000 diff --git a/runcards/calibration_tutorial/rabi.yaml b/runcards/calibration_tutorial/rabi.yaml deleted file mode 100644 index c4f24962d9..0000000000 --- a/runcards/calibration_tutorial/rabi.yaml +++ /dev/null @@ -1,51 +0,0 @@ -platform: qw11q - -targets: [D1] - -actions: - - # - id: resonator_spectroscopy high power - # operation: resonator_spectroscopy - # parameters: - # freq_width: 10_000_000 - # freq_step: 100_000 - # amplitude: 0.002 - # fit_function: s21 - # power_level: high - # nshots: 1024 - # relaxation_time: 100000 - - # - id: rabi - - # operation: rabi_amplitude_signal - # parameters: - # min_amp_factor: 0 - # max_amp_factor: 2 - # step_amp_factor: 0.1 - # pulse_length: 40 - # relaxation_time: 100_000 - # nshots: 1024 - - - # - id: rabi - - # operation: rabi_length_signal - # parameters: - # pulse_duration_start: 20 - # pulse_duration_end: 40 - # pulse_duration_step: 1 - # pulse_amplitude: 0.06 - # relaxation_time: 100_000 - # nshots: 1024 - - - id: rabi amplitude frequency - operation: rabi_amplitude_frequency_signal - parameters: - min_amp_factor: 0.0 - max_amp_factor: 2 - step_amp_factor: 0.1 - min_freq: -50_000_000 - max_freq: 50_000_000 - step_freq: 1_000_000 - pulse_length: 40 - nshots: 1024 diff --git a/runcards/calibration_tutorial/ramsey.yaml b/runcards/calibration_tutorial/ramsey.yaml deleted file mode 100644 index 5b24940272..0000000000 --- a/runcards/calibration_tutorial/ramsey.yaml +++ /dev/null @@ -1,27 +0,0 @@ -platform: qw11q - -targets: [D1] - -actions: - - id: ramsey detuned - - operation: ramsey - parameters: - delay_between_pulses_end: 1000 - delay_between_pulses_start: 10 - delay_between_pulses_step: 20 - detuning: 3_000_000 - nshots: 1024 - relaxation_time: 200000 - - - - id: t2 - - operation: t2 - parameters: - delay_between_pulses_end: 50_000 - delay_between_pulses_start: 10 - delay_between_pulses_step: 1000 - # detuning: 3_000_000 - nshots: 1024 - relaxation_time: 200000 diff --git a/runcards/calibration_tutorial/rb.yaml b/runcards/calibration_tutorial/rb.yaml deleted file mode 100644 index 35bbd15b8e..0000000000 --- a/runcards/calibration_tutorial/rb.yaml +++ /dev/null @@ -1,11 +0,0 @@ -platform: qw11q - -targets: [D1] - -actions: - - id: standard rb - operation: standard_rb - parameters: - depths: [1, 5, 10, 20] - niter: 20 - nshots: 100 diff --git a/runcards/calibration_tutorial/readout_characterization.yaml b/runcards/calibration_tutorial/readout_characterization.yaml deleted file mode 100644 index fcf682d92e..0000000000 --- a/runcards/calibration_tutorial/readout_characterization.yaml +++ /dev/null @@ -1,10 +0,0 @@ -platform: - -qubits: [0] - -actions: - - id: readout characterization - - operation: readout_characterization - parameters: - nshots: 5000 diff --git a/runcards/calibration_tutorial/readout_optimization.yaml b/runcards/calibration_tutorial/readout_optimization.yaml deleted file mode 100644 index fa35c94ac1..0000000000 --- a/runcards/calibration_tutorial/readout_optimization.yaml +++ /dev/null @@ -1,20 +0,0 @@ -platform: qw11q - -targets: [D1] - -actions: - # - id: dispersive_shift - - # operation: dispersive_shift - # parameters: - # freq_width: 10_000_000 - # freq_step: 100_000 - - - - id: resonator_amplitude - - operation: resonator_amplitude - parameters: - amplitude_step: 0.0005 - amplitude_start: 0.001 - amplitude_stop: 0.005 diff --git a/runcards/calibration_tutorial/resonator_punchout.yaml b/runcards/calibration_tutorial/resonator_punchout.yaml deleted file mode 100644 index eea540224d..0000000000 --- a/runcards/calibration_tutorial/resonator_punchout.yaml +++ /dev/null @@ -1,17 +0,0 @@ -platform: qw11q - -targets: [D1] - -actions: - - id: resonator punchout - - operation: resonator_punchout - parameters: - freq_width: 10_000_000 - freq_step: 100_000 - amplitude: 0.05 - min_amp_factor: 0.1 - max_amp_factor: 1 - step_amp_factor: 0.01 - nshots: 2048 - relaxation_time: 5000 diff --git a/runcards/calibration_tutorial/resonator_spectroscopy_high.yaml b/runcards/calibration_tutorial/resonator_spectroscopy_high.yaml deleted file mode 100644 index 9df5cdc3a9..0000000000 --- a/runcards/calibration_tutorial/resonator_spectroscopy_high.yaml +++ /dev/null @@ -1,15 +0,0 @@ -platform: qw11q - -targets: [D1] - -actions: - - - id: resonator_spectroscopy high power - operation: resonator_spectroscopy - parameters: - freq_width: 10_000_000 - freq_step: 100_000 - amplitude: 0.2 - power_level: high - nshots: 1024 - relaxation_time: 100000 diff --git a/runcards/calibration_tutorial/resonator_spectroscopy_low.yaml b/runcards/calibration_tutorial/resonator_spectroscopy_low.yaml deleted file mode 100644 index 60b679fb15..0000000000 --- a/runcards/calibration_tutorial/resonator_spectroscopy_low.yaml +++ /dev/null @@ -1,16 +0,0 @@ -platform: qw11q - -targets: [D1] - -actions: - - - id: resonator_spectroscopy high power - operation: resonator_spectroscopy - parameters: - freq_width: 8_000_000 - freq_step: 50_000 - amplitude: 0.001 - fit_function: s21 - power_level: high - nshots: 1024 - relaxation_time: 100000 diff --git a/runcards/calibration_tutorial/t1.yaml b/runcards/calibration_tutorial/t1.yaml deleted file mode 100644 index d7bb943272..0000000000 --- a/runcards/calibration_tutorial/t1.yaml +++ /dev/null @@ -1,15 +0,0 @@ -platform: qw11q - -targets: [D1] - -actions: - - - id: t1 - - operation: t1 - parameters: - delay_before_readout_end: 100_000 - delay_before_readout_start: 10 - delay_before_readout_step: 1000 - nshots: 1024 - relaxation_time: 300000 diff --git a/runcards/calibration_tutorial/validation.yaml b/runcards/calibration_tutorial/validation.yaml deleted file mode 100644 index fe3541e89d..0000000000 --- a/runcards/calibration_tutorial/validation.yaml +++ /dev/null @@ -1,28 +0,0 @@ -platform: qw11q - -targets: [D1] - -actions: - # - id: all_xy - - # operation: allxy - # parameters: - # nshots: 1024 - # relaxation_time: 200000 - - - # - id: state_tomography - - # operation: state_tomography - # parameters: - # nshots: 1024 - # relaxation_time: 200000 - - - - id: readout - - operation: readout_characterization - parameters: - nshots: 5000 - delay: 1000 - relaxation_time: 200000 diff --git a/runcards/monitor.yml b/runcards/monitor.yml deleted file mode 100644 index 7fbb7b13a5..0000000000 --- a/runcards/monitor.yml +++ /dev/null @@ -1,30 +0,0 @@ - -actions: - - - id: t1 - operation: t1_signal - parameters: - delay_before_readout_start: 50 - delay_before_readout_end: 100000 - delay_before_readout_step: 2500 - nshots: 1024 - - - id: t2 - operation: t2_signal - parameters: - delay_between_pulses_start: 50 - delay_between_pulses_end: 100000 - delay_between_pulses_step: 2500 - nshots: 1024 - - - id: readout characterization - operation: readout_characterization - parameters: - nshots: 5000 - - # - id: standard rb - # operation: standard_rb - # parameters: - # depths: [10, 100, 150, 200, 250, 300] - # niter: 8 - # nshots: 256 diff --git a/src/qibocal/auto/execute.py b/src/qibocal/auto/execute.py index 018354892c..a7fa2a9b9f 100644 --- a/src/qibocal/auto/execute.py +++ b/src/qibocal/auto/execute.py @@ -104,11 +104,7 @@ def create(cls, name: str, platform: Union[Platform, str, None] = None): platform = ( platform if isinstance(platform, Platform) - else create_platform( - platform - if platform is not None - else os.environ.get("QIBO_PLATFORM", "dummy") - ) + else create_platform(platform if platform is not None else "dummy") ) return cls( name=name, diff --git a/src/qibocal/auto/runcard.py b/src/qibocal/auto/runcard.py index 409306de63..ec56c2aa22 100644 --- a/src/qibocal/auto/runcard.py +++ b/src/qibocal/auto/runcard.py @@ -1,6 +1,5 @@ """Specify runcard layout, handles (de)serialization.""" -import os from dataclasses import asdict from pathlib import Path from typing import Any, Optional, Union @@ -33,7 +32,7 @@ class Runcard: """ backend: str = "qibolab" """Qibo backend.""" - platform: str = os.environ.get("QIBO_PLATFORM", "dummy") + platform: str = "dummy" """Qibolab platform.""" update: bool = True diff --git a/src/qibocal/auto/serialize.py b/src/qibocal/auto/serialize.py index 6058e322e7..8389481fb1 100644 --- a/src/qibocal/auto/serialize.py +++ b/src/qibocal/auto/serialize.py @@ -22,6 +22,11 @@ def serialize(raw: dict): def load(key): """Evaluate key converting string of lists to tuples.""" raw_load = json.loads(key) - if isinstance(raw_load, list): - return tuple(raw_load) - return raw_load + + def to_tuple(raw): + if isinstance(raw, list): + return tuple([to_tuple(item) for item in raw]) + else: + return raw + + return to_tuple(raw_load) diff --git a/src/qibocal/auto/task.py b/src/qibocal/auto/task.py index 33a0386804..c8a07d9fc7 100644 --- a/src/qibocal/auto/task.py +++ b/src/qibocal/auto/task.py @@ -1,11 +1,13 @@ """Action execution tracker.""" import copy +import json from dataclasses import asdict, dataclass from pathlib import Path from typing import Any, NewType, Optional, Union import yaml +from qibo import Circuit from qibolab.platform import Platform from qibolab.qubits import QubitId, QubitPairId @@ -21,6 +23,7 @@ """Elements to be calibrated by a single protocol.""" SINGLE_ACTION = "action.yml" +CIRCUIT = "circuit.json" @dataclass @@ -40,6 +43,12 @@ class Action: def dump(self, path: Path): """Dump single action to yaml.""" + if self.parameters is not None: + for param, value in self.parameters.items(): + if type(value) is Circuit: + circuit_path = path / CIRCUIT + circuit_path.write_text(json.dumps(value.raw)) + self.parameters[param] = str(circuit_path) (path / SINGLE_ACTION).write_text(yaml.safe_dump(asdict(self))) @classmethod diff --git a/src/qibocal/auto/transpile.py b/src/qibocal/auto/transpile.py index 63f09464d0..6a34f942bd 100644 --- a/src/qibocal/auto/transpile.py +++ b/src/qibocal/auto/transpile.py @@ -1,11 +1,18 @@ from typing import Optional -from qibo import Circuit -from qibo.backends.abstract import Backend +from qibo import Circuit, gates +from qibo.backends import Backend from qibo.transpiler.pipeline import Passes from qibo.transpiler.unroller import NativeGates, Unroller +from qibolab.compilers.compiler import Compiler +from qibolab.pulses import PulseSequence from qibolab.qubits import QubitId +REPLACEMENTS = { + "RX": "GPI2", + "MZ": "M", +} + def transpile_circuits( circuits: list[Circuit], @@ -28,20 +35,18 @@ def transpile_circuits( are all string or all integers. """ transpiled_circuits = [] - - qubits = list(backend.platform.qubits) + platform = backend.platform + qubits = list(platform.qubits) if isinstance(qubit_maps[0][0], str): for i, qubit_map in enumerate(qubit_maps): qubit_map = map(lambda x: qubits.index(x), qubit_map) qubit_maps[i] = list(qubit_map) - if backend.name == "qibolab": - platform_nqubits = backend.platform.nqubits - for circuit, qubit_map in zip(circuits, qubit_maps): - new_circuit = pad_circuit(platform_nqubits, circuit, qubit_map) - transpiled_circ, _ = transpiler(new_circuit) - transpiled_circuits.append(transpiled_circ) - else: - transpiled_circuits = circuits + platform_nqubits = platform.nqubits + for circuit, qubit_map in zip(circuits, qubit_maps): + new_circuit = pad_circuit(platform_nqubits, circuit, qubit_map) + transpiled_circ, _ = transpiler(new_circuit) + transpiled_circuits.append(transpiled_circ) + return transpiled_circuits @@ -104,15 +109,65 @@ def execute_transpiled_circuit( ) -def dummy_transpiler(backend) -> Optional[Passes]: +def natives(platform): + """ + Return the list of native gates defined in the `platform`. + This function assumes the native gates to be the same for each + qubit and pair. + """ + pair = next(iter(platform.pairs.values())) + qubit = next(iter(platform.qubits.values())) + two_qubit_natives = list(pair.native_gates.raw) + single_qubit_natives = list(qubit.native_gates.raw) + # Solve Qibo-Qibolab mismatch + single_qubit_natives.append("RZ") + single_qubit_natives.append("Z") + single_qubit_natives.remove("RX12") + new_single_natives = [REPLACEMENTS.get(i, i) for i in single_qubit_natives] + return new_single_natives + two_qubit_natives + + +def create_rule(native): + def rule(qubits_ids, platform, parameters=None): + if len(qubits_ids[1]) == 1: + native_gate = platform.qubits[tuple(qubits_ids[1])].native_gates + else: + native_gate = platform.pairs[tuple(qubits_ids[1])].native_gates + pulses = getattr(native_gate, native).pulses + return PulseSequence(pulses), {} + + return rule + + +def set_compiler(backend, natives_): + """ + Set the compiler to execute the native gates defined by the platform. + """ + compiler = backend.compiler + rules = {} + for native in natives_: + gate = getattr(gates, native) + if gate not in compiler.rules: + rules[gate] = create_rule(native) + else: + rules[gate] = compiler.rules[gate] + rules[gates.I] = compiler.rules[gates.I] + backend.compiler = Compiler(rules=rules) + + +def dummy_transpiler(backend: Backend) -> Passes: """ If the backend is `qibolab`, a transpiler with just an unroller is returned, - otherwise None. + otherwise `None`. This function overwrites the compiler defined in the + backend, taking into account the native gates defined in the`platform` (see + :func:`set_compiler`). """ - if backend.name == "qibolab": - unroller = Unroller(NativeGates.default()) - return Passes(connectivity=backend.platform.topology, passes=[unroller]) - return None + platform = backend.platform + native_gates = natives(platform) + set_compiler(backend, native_gates) + native_gates = [getattr(gates, x) for x in native_gates] + unroller = Unroller(NativeGates.from_gatelist(native_gates)) + return Passes(connectivity=platform.topology, passes=[unroller]) def pad_circuit(nqubits, circuit: Circuit, qubit_map: list[int]) -> Circuit: diff --git a/src/qibocal/cli/_base.py b/src/qibocal/cli/_base.py index 57fdb9da17..cf4aa28384 100644 --- a/src/qibocal/cli/_base.py +++ b/src/qibocal/cli/_base.py @@ -8,10 +8,10 @@ from ..auto.runcard import Runcard from .acquisition import acquire as acquisition -from .autocalibration import autocalibrate from .compare import compare_reports from .fit import fit as fitting from .report import report as reporting +from .run import protocols_execution from .update import update as updating from .upload import upload_report @@ -58,8 +58,8 @@ def command(): default=None, help="Name of the Qibo backend.,", ) -def auto(runcard, folder, force, update, platform, backend): - """Autocalibration. +def run(runcard, folder, force, update, platform, backend): + """Execute the qubit calibration. Arguments: @@ -72,7 +72,7 @@ def auto(runcard, folder, force, update, platform, backend): if backend is not None: runcard.backend = backend - autocalibrate(runcard, folder, force, update) + protocols_execution(runcard, folder, force, update) @command.command(context_settings=CONTEXT_SETTINGS) @@ -236,3 +236,48 @@ def upload(path, tag, author): ) def compare(report_1_path, report_2_path, folder, force): compare_reports(folder, report_1_path, report_2_path, force) + + +@command.command(context_settings=CONTEXT_SETTINGS, deprecated=True) +@click.argument( + "runcard", metavar="RUNCARD", type=click.Path(exists=True, path_type=pathlib.Path) +) +@click.option( + "folder", + "-o", + type=click.Path(path_type=pathlib.Path), + help="Output folder. If not provided a standard name will generated.", +) +@click.option( + "force", + "-f", + is_flag=True, + help="Use --force option to overwrite the output folder.", +) +@click.option( + "--update/--no-update", + default=True, + help="Use --no-update option to avoid updating iteratively the platform." + "With this option the new runcard will not be produced.", +) +@click.option( + "--platform", + default=None, + help="Name of the Qibolab platform.", +) +@click.option( + "--backend", + default=None, + help="Name of the Qibo backend.,", +) +def auto(runcard, folder, force, update, platform, backend): + """Execute the qubit calibration. + + Arguments: + + - RUNCARD: runcard with declarative inputs. + """ + click.echo( + "Warning: This command is deprecated and may be removed in a future version. Please use 'qq run' instead. ", + err=True, + ) diff --git a/src/qibocal/cli/autocalibration.py b/src/qibocal/cli/run.py similarity index 94% rename from src/qibocal/cli/autocalibration.py rename to src/qibocal/cli/run.py index 6e46863696..5edc9e46f8 100644 --- a/src/qibocal/cli/autocalibration.py +++ b/src/qibocal/cli/run.py @@ -9,7 +9,7 @@ from .report import report -def autocalibrate(runcard: Runcard, folder: Path, force, update): +def protocols_execution(runcard: Runcard, folder: Path, force, update): """Autocalibration. Arguments: diff --git a/src/qibocal/cli/upload.py b/src/qibocal/cli/upload.py index 84dbcc228d..88e989f842 100644 --- a/src/qibocal/cli/upload.py +++ b/src/qibocal/cli/upload.py @@ -15,8 +15,8 @@ # options for report upload UPLOAD_HOST = ( - "qibocal@localhost" - if socket.gethostname() == "saadiyat" + "qibocal@saadiyat" + if socket.gethostname() in ("saadiyat", "dalma") else "qibocal@login.qrccluster.com" ) TARGET_DIR = "qibocal-reports/" diff --git a/src/qibocal/fitting/classifier/ada_boost.py b/src/qibocal/fitting/classifier/ada_boost.py deleted file mode 100644 index 6403185bf1..0000000000 --- a/src/qibocal/fitting/classifier/ada_boost.py +++ /dev/null @@ -1,42 +0,0 @@ -import numpy as np -from sklearn.ensemble import AdaBoostClassifier -from sklearn.model_selection import GridSearchCV, RepeatedStratifiedKFold - -from . import scikit_utils - - -def constructor(hyperpars): - r"""Return the model class. - - Args: - hyperparams: Model hyperparameters. - """ - return AdaBoostClassifier().set_params(**hyperpars) - - -def hyperopt(x_train, y_train, _path): - r"""Perform an hyperparameter optimization and return the hyperparameters. - - Args: - x_train: Training inputs. - y_train: Training outputs. - _path (path): Model save path. - - Returns: - Dictionary with model's hyperparameters. - """ - clf = AdaBoostClassifier() - cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1) - space = {} - space["n_estimators"] = np.linspace(10, 200, num=20).astype("int") - space["learning_rate"] = np.linspace(0.1, 1, num=10) - space["algorithm"] = ["SAMME", "SAMME.R"] - search = GridSearchCV(clf, space, scoring="accuracy", n_jobs=-1, cv=cv) - _ = search.fit(x_train, y_train) - - return search.best_params_ - - -normalize = scikit_utils.scikit_normalize -dump = scikit_utils.scikit_dump -predict_from_file = scikit_utils.scikit_predict diff --git a/src/qibocal/fitting/classifier/decision_tree.py b/src/qibocal/fitting/classifier/decision_tree.py deleted file mode 100644 index 41b80e46bc..0000000000 --- a/src/qibocal/fitting/classifier/decision_tree.py +++ /dev/null @@ -1,40 +0,0 @@ -from sklearn.model_selection import GridSearchCV, RepeatedStratifiedKFold -from sklearn.tree import DecisionTreeClassifier - -from . import scikit_utils - - -def constructor(hyperpars): - r"""Return the model class. - - Args: - hyperparams: Model hyperparameters. - """ - return DecisionTreeClassifier().set_params(**hyperpars) - - -def hyperopt(x_train, y_train, _path): - r"""Perform an hyperparameter optimization and return the hyperparameters. - - Args: - x_train: Training inputs. - y_train: Training outputs. - _path (path): Model save path. - - Returns: - Dictionary with model's hyperparameters. - """ - clf = DecisionTreeClassifier() - cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1) - space = {} - space["criterion"] = ["gini", "entropy", "log_loss"] - space["splitter"] = ["best", "random"] - search = GridSearchCV(clf, space, scoring="accuracy", n_jobs=-1, cv=cv) - _ = search.fit(x_train, y_train) - - return search.best_params_ - - -normalize = scikit_utils.scikit_normalize -dump = scikit_utils.scikit_dump -predict_from_file = scikit_utils.scikit_predict diff --git a/src/qibocal/fitting/classifier/gaussian_process.py b/src/qibocal/fitting/classifier/gaussian_process.py deleted file mode 100644 index 36f4ffe9f1..0000000000 --- a/src/qibocal/fitting/classifier/gaussian_process.py +++ /dev/null @@ -1,34 +0,0 @@ -from sklearn.gaussian_process import GaussianProcessClassifier -from sklearn.gaussian_process.kernels import RBF - -from . import scikit_utils - - -def constructor(hyperparams): - r"""Return the model class. - - Args: - hyperparams: Model hyperparameters. - """ - return GaussianProcessClassifier(1.0 * RBF(1.0)).set_params(**hyperparams) - - -def hyperopt(_x_train, _y_train, _path): - r"""Perform an hyperparameter optimization and return the hyperparameters. - - Args: - _x_train: Training inputs. - _y_train: Training outputs. - _path (path): Model save path. - - Returns: - Dictionary with model's hyperparameters. - """ - # Build the best model - model = GaussianProcessClassifier(1.0 * RBF(1.0)) - return model.get_params() - - -normalize = scikit_utils.scikit_normalize -dump = scikit_utils.scikit_dump -predict_from_file = scikit_utils.scikit_predict diff --git a/src/qibocal/fitting/classifier/linear_svm.py b/src/qibocal/fitting/classifier/linear_svm.py deleted file mode 100644 index 1a7f016490..0000000000 --- a/src/qibocal/fitting/classifier/linear_svm.py +++ /dev/null @@ -1,34 +0,0 @@ -from sklearn.svm import SVC - -from . import scikit_utils - -REG_PARAM = 0.025 - - -def constructor(hyperpars): - r"""Return the model class. - - Args: - hyperparams: Model hyperparameters. - """ - return SVC(kernel="linear", C=REG_PARAM).set_params(**hyperpars) - - -def hyperopt(_x_train, _y_train, _path): - r"""Perform an hyperparameter optimization and return the hyperparameters. - - Args: - _x_train: Training inputs. - _y_train: Training outputs. - _path (path): Model save path. - - Returns: - Dictionary with model's hyperparameters. - """ - model = SVC(kernel="linear", probability=True, C=REG_PARAM) - return model.get_params() - - -normalize = scikit_utils.scikit_normalize -dump = scikit_utils.scikit_dump -predict_from_file = scikit_utils.scikit_predict diff --git a/src/qibocal/fitting/classifier/naive_bayes.py b/src/qibocal/fitting/classifier/naive_bayes.py deleted file mode 100644 index 07af08b8b3..0000000000 --- a/src/qibocal/fitting/classifier/naive_bayes.py +++ /dev/null @@ -1,32 +0,0 @@ -from sklearn.naive_bayes import GaussianNB - -from . import scikit_utils - - -def constructor(hyperpars): - r"""Return the model class. - - Args: - hyperparams: Model hyperparameters. - """ - return GaussianNB().set_params(**hyperpars) - - -def hyperopt(_x_train, _y_train, _path): - r"""Perform an hyperparameter optimization and return the hyperparameters. - - Args: - _x_train: Training inputs. - _y_train: Training outputs. - _path (path): Model save path. - - Returns: - Dictionary with model's hyperparameters. - """ - model = GaussianNB() - return model.get_params() - - -normalize = scikit_utils.scikit_normalize -dump = scikit_utils.scikit_dump -predict_from_file = scikit_utils.scikit_predict diff --git a/src/qibocal/fitting/classifier/random_forest.py b/src/qibocal/fitting/classifier/random_forest.py deleted file mode 100644 index c3efe81de9..0000000000 --- a/src/qibocal/fitting/classifier/random_forest.py +++ /dev/null @@ -1,41 +0,0 @@ -import numpy as np -from sklearn.ensemble import RandomForestClassifier -from sklearn.model_selection import GridSearchCV, RepeatedStratifiedKFold - -from . import scikit_utils - - -def constructor(hyperpars): - r"""Return the model class. - - Args: - _hyperparams: Model hyperparameters. - """ - return RandomForestClassifier().set_params(**hyperpars) - - -def hyperopt(x_train, y_train, _path): - r"""Perform an hyperparameter optimization and return the hyperparameters. - - Args: - x_train: Training inputs. - y_train: Training outputs. - _path (path): Model save path. - - Returns: - Dictionary with model's hyperparameters. - """ - clf = RandomForestClassifier() - cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1) - space = {} - space["n_estimators"] = np.arange(10, 200, 10, dtype=int) - space["criterion"] = ["gini", "entropy", "log_loss"] - space["max_features"] = ["sqrt", "log2", None] - search = GridSearchCV(clf, space, scoring="accuracy", n_jobs=-1, cv=cv) - _ = search.fit(x_train, y_train.tolist()) - return search.best_params_ - - -normalize = scikit_utils.scikit_normalize -dump = scikit_utils.scikit_dump -predict_from_file = scikit_utils.scikit_predict diff --git a/src/qibocal/fitting/classifier/rbf_svm.py b/src/qibocal/fitting/classifier/rbf_svm.py deleted file mode 100644 index c78c89d59d..0000000000 --- a/src/qibocal/fitting/classifier/rbf_svm.py +++ /dev/null @@ -1,44 +0,0 @@ -import numpy as np -from sklearn.model_selection import GridSearchCV, RepeatedStratifiedKFold -from sklearn.svm import SVC - -from . import scikit_utils - -GAMMA = "auto" - - -def constructor(hyperpars): - r"""Return the model class. - - Args: - _hyperparams: Model hyperparameters. - """ - return SVC(gamma=GAMMA).set_params(**hyperpars) - - -def hyperopt(x_train, y_train, _path): - r"""Perform an hyperparameter optimization and return the hyperparameters. - - Args: - x_train: Training inputs. - y_train: Training outputs. - _path (path): Model save path. - - Returns: - Dictionary with model's hyperparameters. - """ - clf = SVC(gamma=GAMMA) - - cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1) - space = {} - space["C"] = np.linspace(0.01, 2, num=50) - space["degree"] = [2, 3, 4] - search = GridSearchCV(clf, space, scoring="accuracy", n_jobs=-1, cv=cv) - _ = search.fit(x_train, y_train.astype(np.int)) - - return search.best_params_ - - -normalize = scikit_utils.scikit_normalize -dump = scikit_utils.scikit_dump -predict_from_file = scikit_utils.scikit_predict diff --git a/src/qibocal/fitting/classifier/run.py b/src/qibocal/fitting/classifier/run.py index 02c466b53f..cf962085f8 100644 --- a/src/qibocal/fitting/classifier/run.py +++ b/src/qibocal/fitting/classifier/run.py @@ -14,27 +14,13 @@ from . import data CLS_MODULES = [ - "linear_svm", - "ada_boost", - "gaussian_process", - "naive_bayes", "qubit_fit", - "random_forest", - "rbf_svm", "qblox_fit", - "decision_tree", ] PRETTY_NAME = [ - "Linear SVM", - "Ada Boost", - "Gaussian Process", - "Naive Bayes", "Qubit Fit", - "Random Forest", - "RBF SVM", "Qblox Fit", - "Decision Tree", ] diff --git a/src/qibocal/fitting/classifier/scikit_utils.py b/src/qibocal/fitting/classifier/scikit_utils.py deleted file mode 100644 index 60d207f1c1..0000000000 --- a/src/qibocal/fitting/classifier/scikit_utils.py +++ /dev/null @@ -1,36 +0,0 @@ -from pathlib import Path - -import numpy as np -import onnxruntime as rt -from skl2onnx.common.data_types import FloatTensorType -from skl2onnx.convert import to_onnx -from sklearn.pipeline import make_pipeline -from sklearn.preprocessing import StandardScaler - - -def scikit_predict(loading_path: Path, input: np.typing.NDArray): - r"""This function loads the scikit model saved in `loading_path` - and returns the predictions of `input`. - """ - sess = rt.InferenceSession(loading_path) - input_name = sess.get_inputs()[0].name - return sess.run(None, {input_name: input.astype(np.float32)})[0] - - -def scikit_normalize(constructor): - r"""Returns a `Pipeline` with `StandardScaler` and the - `constructor`. - - Args: - - constructor: `sklearn` model. - """ - return make_pipeline(StandardScaler(), constructor) - - -def scikit_dump(model, path: Path): - r"""Dumps scikit `model` in `path`""" - initial_type = [("float_input", FloatTensorType([None, 2]))] - onx = to_onnx(model, initial_types=initial_type) - with open(path.with_suffix(".onnx"), "wb") as f: - f.write(onx.SerializeToString()) diff --git a/src/qibocal/protocols/__init__.py b/src/qibocal/protocols/__init__.py index 63ff0687ce..24ee92d287 100644 --- a/src/qibocal/protocols/__init__.py +++ b/src/qibocal/protocols/__init__.py @@ -1,6 +1,6 @@ +from enum import Enum + from .allxy.allxy import allxy -from .allxy.allxy_drag_pulse_tuning import allxy_drag_pulse_tuning -from .allxy.allxy_resonator_depletion_tuning import allxy_resonator_depletion_tuning from .classification import single_shot_classification from .coherence.spin_echo import spin_echo from .coherence.spin_echo_signal import spin_echo_signal @@ -27,26 +27,25 @@ from .flux_dependence.qubit_flux_tracking import qubit_flux_tracking from .flux_dependence.resonator_crosstalk import resonator_crosstalk from .flux_dependence.resonator_flux_dependence import resonator_flux -from .qubit_power_spectroscopy import qubit_power_spectroscopy from .qubit_spectroscopy import qubit_spectroscopy from .qubit_spectroscopy_ef import qubit_spectroscopy_ef +from .qubit_power_spectroscopy import qubit_power_spectroscopy from .qutrit_classification import qutrit_classification -from .rabi.amplitude import rabi_amplitude -from .rabi.amplitude_frequency import rabi_amplitude_frequency -from .rabi.amplitude_frequency_signal import rabi_amplitude_frequency_signal -from .rabi.amplitude_signal import rabi_amplitude_signal -from .rabi.ef import rabi_amplitude_ef -from .rabi.length import rabi_length -from .rabi.length_frequency import rabi_length_frequency -from .rabi.length_frequency_signal import rabi_length_frequency_signal -from .rabi.length_sequences import rabi_length_sequences -from .rabi.length_signal import rabi_length_signal +from .rabi import ( + rabi_amplitude, + rabi_amplitude_signal, + rabi_amplitude_frequency_signal, + rabi_amplitude_ef, + rabi_length, + rabi_length_sequences, + rabi_length_signal, +) from .ramsey.ramsey import ramsey from .ramsey.ramsey_signal import ramsey_signal +from .ramsey.ramsey_zz import ramsey_zz from .randomized_benchmarking.filtered_rb import filtered_rb from .randomized_benchmarking.standard_rb import standard_rb from .randomized_benchmarking.standard_rb_2q import standard_rb_2q -from .randomized_benchmarking.standard_rb_2q_inter import standard_rb_2q_inter from .readout_characterization import readout_characterization from .readout_mitigation_matrix import readout_mitigation_matrix from .readout_optimization.resonator_amplitude import resonator_amplitude @@ -63,7 +62,6 @@ calibrate_state_discrimination, ) from .signal_experiments.time_of_flight_readout import time_of_flight_readout -from .state_tomography import state_tomography from .two_qubit_interaction import ( chevron, chevron_signal, @@ -71,8 +69,21 @@ chsh_pulses, correct_virtual_z_phases, correct_virtual_z_phases_signal, + mermin, optimize_two_qubit_gate, ) +from .two_qubit_interaction import ( + cross_resonance_length, + cross_resonance_length_sequences, + cross_resonance_amplitude, + cross_resonance_chevron_length, + cross_resonance_chevron_frequency, + cross_resonance_chevron_amplitude_frequency, + cross_resonance_chevron_coupler, + cross_resonance_cnot_length, + cross_resonance_cnot, +) +from .state_tomography import state_tomography from .two_qubit_state_tomography import two_qubit_state_tomography __all__ = [ @@ -113,6 +124,7 @@ "rabi_amplitude_ef", "rabi_length_sequences", "rabi_length_signal", + "rabi_jeff", "ramsey", "ramsey_signal", "filtered_rb", @@ -148,4 +160,15 @@ "standard_rb_2q", "standard_rb_2q_inter", "optimize_two_qubit_gate", + "mermin", + "ramsey_zz", + "cross_resonance_length", + "cross_resonance_length_sequences", + "cross_resonance_amplitude", + "cross_resonance_chevron_length", + "cross_resonance_chevron_frequency", + "cross_resonance_chevron_amplitude_frequency", + "cross_resonance_chevron_coupler", + "cross_resonance_cnot_length", + "cross_resonance_cnot", ] diff --git a/src/qibocal/protocols/characterization/randomized_benchmarking/utils.py b/src/qibocal/protocols/characterization/randomized_benchmarking/utils.py new file mode 100644 index 0000000000..8f5eb262de --- /dev/null +++ b/src/qibocal/protocols/characterization/randomized_benchmarking/utils.py @@ -0,0 +1,362 @@ +import json +import pathlib +from numbers import Number +from typing import Optional, Union + +import numpy as np +from qibo import gates +from qibo.models import Circuit + +from qibocal.protocols.characterization.utils import significant_digit + +SINGLE_QUBIT_CLIFFORDS = { + # Virtual gates + 0: gates.I, + 1: lambda q: gates.U3(q, 0, np.pi / 2, np.pi / 2), # Z, + 2: lambda q: gates.U3(q, 0, np.pi / 2, 0), # gates.RZ(q, np.pi / 2), + 3: lambda q: gates.U3(q, 0, -np.pi / 2, 0), # gates.RZ(q, -np.pi / 2), + # pi rotations + 4: lambda q: gates.U3(q, np.pi, 0, np.pi), # X, + 5: lambda q: gates.U3(q, np.pi, 0, 0), # Y, + # pi/2 rotations + 6: lambda q: gates.U3(q, np.pi / 2, -np.pi / 2, np.pi / 2), # Rx(pi/2) + 7: lambda q: gates.U3(q, -np.pi / 2, -np.pi / 2, np.pi / 2), # -Rx(pi/2) + 8: lambda q: gates.U3(q, np.pi / 2, 0, 0), # Ry(pi/2) + 9: lambda q: gates.U3(q, -np.pi / 2, 0, 0), # -Ry(pi/2) + # 2pi/3 rotations + 10: lambda q: gates.U3(q, np.pi / 2, -np.pi / 2, 0), # Rx(pi/2)Ry(pi/2) + 11: lambda q: gates.U3(q, np.pi / 2, -np.pi / 2, np.pi), # Rx(pi/2)Ry(-pi/2) + 12: lambda q: gates.U3(q, np.pi / 2, np.pi / 2, 0), # Rx(-pi/2)Ry(pi/2) + 13: lambda q: gates.U3(q, np.pi / 2, np.pi / 2, -np.pi), # Rx(-pi/2)Ry(-pi/2) + 14: lambda q: gates.U3(q, np.pi / 2, 0, np.pi / 2), # Ry(pi/2)Rx(pi/2) + 15: lambda q: gates.U3(q, np.pi / 2, 0, -np.pi / 2), # Ry(pi/2)Rx(-pi/2) + 16: lambda q: gates.U3(q, np.pi / 2, -np.pi, np.pi / 2), # Ry(-pi/2)Rx(pi/2) + 17: lambda q: gates.U3(q, np.pi / 2, np.pi, -np.pi / 2), # Ry(-pi/2)Rx(-pi/2) + # Hadamard-like + 18: lambda q: gates.U3(q, np.pi / 2, -np.pi, 0), # X Ry(pi/2) + 19: lambda q: gates.U3(q, np.pi / 2, 0, np.pi), # X Ry(-pi/2) + 20: lambda q: gates.U3(q, np.pi / 2, np.pi / 2, np.pi / 2), # Y Rx(pi/2) + 21: lambda q: gates.U3(q, np.pi / 2, -np.pi / 2, -np.pi / 2), # Y Rx(pi/2) + 22: lambda q: gates.U3(q, np.pi, -np.pi / 4, np.pi / 4), # Rx(pi/2)Ry(pi/2)Rx(pi/2) + 23: lambda q: gates.U3( + q, np.pi, np.pi / 4, -np.pi / 4 + ), # Rx(-pi/2)Ry(pi/2)Rx(-pi/2) +} + +SINGLE_QUBIT_CLIFFORDS_NAMES = { + # Virtual gates + "": gates.I, + # Check the Z + "minusX,minusY": lambda q: gates.U3(q, 0, np.pi / 2, np.pi / 2), # Z, gp:exp(iπ) + "sqrtX,sqrtMinusY,sqrtMinusX": lambda q: gates.U3( + q, 0, -np.pi / 2, 0 + ), # La U3 esta bien el nombre no ? # gates.RZ(q, np.pi / 2), gp:exp(iπ/4) + "sqrtX,sqrtY,sqrtMinusX": lambda q: gates.U3( + q, 0, np.pi / 2, 0 + ), # gates.U3(q, 0, -np.pi / 2, 0), # Esta bien gates.RZ(q, -np.pi / 2), gp:exp(iπ/4) + # pi rotations + # 'X': lambda q: gates.U3(q, np.pi, 0, np.pi), # X, + # 'Y': lambda q: gates.U3(q, np.pi, 0, 0), # Y, + # pi rotations (For the minus exp(iπ) global phase) (Check the phase from qiskit) RX(π)=−iX; RY(π)=−iY + "minusX": lambda q: gates.U3(q, np.pi, -np.pi, 0), # X, gp:exp(iπ) + "minusY": lambda q: gates.U3(q, np.pi, 0, 0), # Y, gp:exp(iπ) + # pi/2 rotations (Check the minus) RX(π/2)=−exp(i π/4)SX + "sqrtX": lambda q: gates.U3(q, np.pi / 2, -np.pi / 2, np.pi / 2), # Rx(pi/2) gp: + "sqrtMinusX": lambda q: gates.U3( + q, -np.pi / 2, -np.pi / 2, np.pi / 2 + ), # Rx(-pi/2) gp: + "sqrtY": lambda q: gates.U3(q, np.pi / 2, 0, 0), # Ry(pi/2) gp: + "sqrtMinusY": lambda q: gates.U3(q, -np.pi / 2, 0, 0), # Ry(-pi/2) gp: + # 2pi/3 rotations Check the gp + "sqrtX,sqrtY": lambda q: gates.U3( + q, np.pi / 2, -np.pi / 2, 0 + ), # Rx(pi/2)Ry(pi/2) gp: + "sqrtX,sqrtMinusY": lambda q: gates.U3( + q, np.pi / 2, -np.pi / 2, np.pi + ), # Rx(pi/2)Ry(-pi/2) gp: + "sqrtMinusX,sqrtY": lambda q: gates.U3( + q, np.pi / 2, np.pi / 2, 0 + ), # Rx(-pi/2)Ry(pi/2) gp: + "sqrtMinusX,sqrtMinusY": lambda q: gates.U3( + q, np.pi / 2, np.pi / 2, -np.pi + ), # Rx(-pi/2)Ry(-pi/2) gp: + "sqrtY,sqrtX": lambda q: gates.U3( + q, np.pi / 2, 0, np.pi / 2 + ), # Ry(pi/2)Rx(pi/2) gp: + "sqrtY,sqrtMinusX": lambda q: gates.U3( + q, np.pi / 2, 0, -np.pi / 2 + ), # Ry(pi/2)Rx(-pi/2) gp: + "sqrtMinusY,sqrtX": lambda q: gates.U3( + q, np.pi / 2, -np.pi, np.pi / 2 + ), # Ry(-pi/2)Rx(pi/2) gp: + "sqrtMinusY,sqrtMinusX": lambda q: gates.U3( + q, np.pi / 2, np.pi, -np.pi / 2 + ), # Ry(-pi/2)Rx(-pi/2) gp: + # Hadamard-like Check the gp + "minusX,sqrtY": lambda q: gates.U3(q, np.pi / 2, -np.pi, 0), # X Ry(pi/2) gp: + "minusX,sqrtMinusY": lambda q: gates.U3(q, np.pi / 2, 0, np.pi), # X Ry(-pi/2) gp: + "minusY,sqrtX": lambda q: gates.U3( + q, np.pi / 2, np.pi / 2, np.pi / 2 + ), # Y Rx(pi/2) gp: + "minusY,sqrtMinusX": lambda q: gates.U3( + q, np.pi / 2, -np.pi / 2, -np.pi / 2 + ), # Y Rx(-pi/2) gp: + "sqrtX,sqrtY,sqrtX": lambda q: gates.U3( + q, np.pi, -np.pi / 4, np.pi / 4 + ), # Rx(pi/2)Ry(pi/2)Rx(pi/2) gp: + "sqrtX,sqrtMinusY,sqrtX": lambda q: gates.U3( + q, np.pi, np.pi / 4, -np.pi / 4 + ), # Rx(-pi/2)Ry(pi/2)Rx(-pi/2) gp: +} + + +def random_clifford(random_index_gen): + """Generates random Clifford operator. + + Args: + qubits (int or list or ndarray): if ``int``, the number of qubits for the Clifford. + If ``list`` or ``ndarray``, indexes of the qubits for the Clifford to act on. + seed (int or ``numpy.random.Generator``, optional): Either a generator of + random numbers or a fixed seed to initialize a generator. If ``None``, + initializes a generator with a random seed. Default is ``None``. + + Returns: + (list of :class:`qibo.gates.Gate`): Random Clifford operator(s). + """ + + random_index = int(random_index_gen(SINGLE_QUBIT_CLIFFORDS)) + clifford_gate = SINGLE_QUBIT_CLIFFORDS[random_index](0) + + return clifford_gate, random_index + + +# TODO: Expand when more entangling gates are calibrated +def find_cliffords(cz_list): + clifford_list = [] + clifford = [] + for gate in cz_list: + if gate == "CZ": + clifford.append(gate) + clifford_list.append(clifford) + clifford = [] + continue + clifford.append(gate) + clifford_list.append(clifford) + return clifford_list + + +def separator(clifford): + # Separate values containing 1 + values_with_1 = [value for value in clifford if "1" in value] + values_with_1 = ",".join(values_with_1) + + # Separate values containing 2 + values_with_2 = [value for value in clifford if "2" in value] + values_with_2 = ",".join(values_with_2) + + # Check if CZ + value_with_CZ = [value for value in clifford if "CZ" in value] + value_with_CZ = len(value_with_CZ) == 1 + + values_with_1 = values_with_1.replace("1", "") + values_with_2 = values_with_2.replace("2", "") + return values_with_1, values_with_2, value_with_CZ + + +def clifford2gates(clifford): + gate_list = clifford.split(",") + + clifford_list = find_cliffords(gate_list) + + clifford_gate = [] + for clifford in clifford_list: + values_with_1, values_with_2, value_with_CZ = separator(clifford) + clifford_gate.append(SINGLE_QUBIT_CLIFFORDS_NAMES[values_with_1](0)) + clifford_gate.append(SINGLE_QUBIT_CLIFFORDS_NAMES[values_with_2](1)) + if value_with_CZ: + clifford_gate.append(gates.CZ(0, 1)) + + return clifford_gate + + +def random_2q_clifford(random_index_gen, two_qubit_cliffords): + """Generates random two qubit Clifford operator. + + Args: + qubits (int or list or ndarray): if ``int``, the number of qubits for the Clifford. + If ``list`` or ``ndarray``, indexes of the qubits for the Clifford to act on. + seed (int or ``numpy.random.Generator``, optional): Either a generator of + random numbers or a fixed seed to initialize a generator. If ``None``, + initializes a generator with a random seed. Default is ``None``. + + Returns: + (list of :class:`qibo.gates.Gate`): Random Clifford operator(s). + """ + + random_index = int(random_index_gen(two_qubit_cliffords)) + clifford = two_qubit_cliffords[str(random_index)] + clifford_gate = clifford2gates(clifford) + + return clifford_gate, random_index + + +def clifford_to_matrix(clifford): + clifford_gate = clifford2gates(clifford) + + qubits_str = ["q0", "q1"] + + new_circuit = Circuit(2, wire_names=qubits_str) + for gate in clifford_gate: + new_circuit.add(gate) + + unitary = new_circuit.unitary() + + return unitary + + +def generate_inv_dict_cliffords_file(two_qubit_cliffords, output_file): + """ + Generate an inverse dictionary of clifford matrices and save it to a npz file. + + Parameters: + two_qubit_cliffords (dict): A dictionary of two-qubit cliffords. + output_file (str): The path to the output npz file. + """ + clifford_matrices = {} + for i, clifford in enumerate(two_qubit_cliffords.values()): + clifford = two_qubit_cliffords[str(i)] + + unitary = clifford_to_matrix(clifford) + unitary = unitary.round(3) + unitary += 0.0 + 0.0j + + clifford_matrices[i] = unitary + + clifford_matrices_inv_np = {} + # Convert the arrays to strings and store them as keys in the new dictionary + for key, value in clifford_matrices.items(): + key_str = np.array2string(value, separator=",") + clifford_matrices_inv_np[key_str] = key + + if output_file is not None: + np.savez(output_file, **clifford_matrices_inv_np) + + return clifford_matrices_inv_np + + +def number_to_str( + value: Number, + uncertainty: Optional[Union[Number, list, tuple, np.ndarray]] = None, + precision: Optional[int] = None, +): + """Converts a number into a string. + + Args: + value (Number): the number to display + uncertainty (Number or list or tuple or np.ndarray, optional): number or 2-element + interval with the low and high uncertainties of ``value``. Defaults to ``None``. + precision (int, optional): nonnegative number of floating points of the displayed value. + If ``None``, defaults to the second significant digit of ``uncertainty`` + or ``3`` if ``uncertainty`` is ``None``. Defaults to ``None``. + + Returns: + str: The number expressed as a string, with the uncertainty if given. + """ + + # If uncertainty is not given, return the value with precision + if uncertainty is None: + precision = precision if precision is not None else 3 + return f"{value:.{precision}f}" + + if isinstance(uncertainty, Number): + if precision is None: + precision = (significant_digit(uncertainty) + 1) or 3 + return f"{value:.{precision}f} \u00B1 {uncertainty:.{precision}f}" + + # If any uncertainty is None, return the value with precision + if any(u is None for u in uncertainty): + return f"{value:.{precision if precision is not None else 3}f}" + + # If precision is None, get the first significant digit of the uncertainty + if precision is None: + precision = max(significant_digit(u) + 1 for u in uncertainty) or 3 + + # Check if both uncertainties are equal up to precision + if np.round(uncertainty[0], precision) == np.round(uncertainty[1], precision): + return f"{value:.{precision}f} \u00B1 {uncertainty[0]:.{precision}f}" + + return f"{value:.{precision}f} +{uncertainty[1]:.{precision}f} / -{uncertainty[0]:.{precision}f}" + + +def data_uncertainties(data, method=None, data_median=None, homogeneous=True): + """Compute the uncertainties of the median (or specified) values. + + Args: + data (list or np.ndarray): 2d array with rows containing data points + from which the median value is extracted. + method (float, optional): method of computing the method. + If it is `None`, computes the standard deviation, otherwise it + computes the corresponding confidence interval using ``np.percentile``. + Defaults to ``None``. + data_median (list or np.ndarray, optional): 1d array for computing the errors from the + confidence interval. If ``None``, the median values are computed from ``data``. + homogeneous (bool): if ``True``, assumes that all rows in ``data`` are of the same size + and returns ``np.ndarray``. Default is ``True``. + + Returns: + np.ndarray: uncertainties of the data. + """ + if method is None: + return np.std(data, axis=1) if homogeneous else [np.std(row) for row in data] + + percentiles = [ + (100 - method) / 2, + (100 + method) / 2, + ] + percentile_interval = np.percentile(data, percentiles, axis=1) + + uncertainties = np.abs(np.vstack([data_median, data_median]) - percentile_interval) + + return uncertainties + + +def clifford_to_pulses(clifford): + gate_list = clifford.split(",") + + clifford_list = find_cliffords(gate_list) + + pulses = 0 + for clifford in clifford_list: + values_with_1, values_with_2, value_with_CZ = separator(clifford) + + if SINGLE_QUBIT_CLIFFORDS_NAMES[values_with_1](0).name != "id": + pulses += 2 # This assumes a U3 transpiled into 2 pulses + if SINGLE_QUBIT_CLIFFORDS_NAMES[values_with_2](1).name != "id": + pulses += 2 # This assumes a U3 transpiled into 2 pulses + if value_with_CZ: + pulses += 1 # This assumes a CZ without parking so 1 pulse + + return pulses + + +def calculate_pulses_clifford(two_qubit_cliffords): + pulses = 0 + for i, clifford in enumerate(two_qubit_cliffords.values()): + clifford = two_qubit_cliffords[str(i)] + pulses += clifford_to_pulses(clifford) + + pulses_per_clifford = pulses / len(two_qubit_cliffords) + return pulses_per_clifford + + +def load_inverse_cliffords(file_inv): + path = pathlib.Path(__file__).parent / file_inv + clifford_matrices_inv = np.load(path) + return clifford_matrices_inv + + +def load_cliffords(file): + path = pathlib.Path(__file__).parent / "2qubitCliffs.json" + with open(path) as file: + two_qubit_cliffords = json.load(file) + return two_qubit_cliffords diff --git a/src/qibocal/protocols/classification.py b/src/qibocal/protocols/classification.py index 9898adfc2b..6731e08a08 100644 --- a/src/qibocal/protocols/classification.py +++ b/src/qibocal/protocols/classification.py @@ -149,13 +149,7 @@ def _acquisition( Args: nshots (int): number of times the pulse sequence will be repeated. classifiers (list): list of classifiers, the available ones are: - - linear_svm - - ada_boost - - gaussian_process - - naive_bayes - qubit_fit - - random_forest - - rbf_svm - qblox_fit. The default value is `["qubit_fit"]`. savedir (str): Dumping folder of the classification results. @@ -170,7 +164,7 @@ def _acquisition( parameters: nshots: 5000 savedir: "single_shot" - classifiers_list: ["qubit_fit","naive_bayes", "linear_svm"] + classifiers_list: ["qubit_fit"] """ diff --git a/src/qibocal/protocols/coherence/utils.py b/src/qibocal/protocols/coherence/utils.py index 8e28cee021..099293daf8 100644 --- a/src/qibocal/protocols/coherence/utils.py +++ b/src/qibocal/protocols/coherence/utils.py @@ -77,7 +77,7 @@ def exponential_fit(data, zeno=False): ] fitted_parameters[qubit] = popt pcovs[qubit] = pcov.tolist() - decay[qubit] = [popt[2], np.sqrt(pcov[2, 2]) * (x_max - x_min)] + decay[qubit] = (popt[2], np.sqrt(pcov[2, 2]) * (x_max - x_min)) except Exception as e: log.warning(f"Exponential decay fit failed for qubit {qubit} due to {e}") @@ -129,15 +129,15 @@ def exponential_fit_probability(data, zeno=False): pcovs[qubit] = pcov.tolist() fitted_parameters[qubit] = popt dec = popt[2] - decay[qubit] = [dec, np.sqrt(pcov[2, 2]) * (x_max - x_min)] - chi2[qubit] = [ + decay[qubit] = (dec, np.sqrt(pcov[2, 2]) * (x_max - x_min)) + chi2[qubit] = ( chi2_reduced( data[qubit].prob, exp_decay(data[qubit].wait, *fitted_parameters[qubit]), data[qubit].error, ), np.sqrt(2 / len(data[qubit].prob)), - ] + ) except Exception as e: log.warning(f"Exponential decay fit failed for qubit {qubit} due to {e}") diff --git a/src/qibocal/protocols/couplers/coupler_chevron.py b/src/qibocal/protocols/couplers/coupler_chevron.py index 2a5195dd22..dc69a71a9e 100644 --- a/src/qibocal/protocols/couplers/coupler_chevron.py +++ b/src/qibocal/protocols/couplers/coupler_chevron.py @@ -1,10 +1,7 @@ -from dataclasses import dataclass -from typing import Optional - import numpy as np from qibolab import AcquisitionType, AveragingMode, ExecutionParameters from qibolab.platform import Platform -from qibolab.pulses import PulseSequence +from qibolab.pulses import PulseSequence, PulseType from qibolab.qubits import QubitPairId from qibolab.sweeper import Parameter, Sweeper, SweeperType @@ -18,25 +15,8 @@ from ..two_qubit_interaction.utils import order_pair -@dataclass -class ChevronCouplersParameters(ChevronParameters): - - native_gate: Optional[str] = "CZ" - """Native gate to implement, CZ or iSWAP.""" - - """ChevronCouplers protocol parameters. - - Amplitude and duration are referred to the coupler pulse. - """ - - -@dataclass -class ChevronCouplersData(ChevronData): - """Data structure for chevron couplers protocol.""" - - -def _aquisition( - params: ChevronCouplersParameters, +def _acquisition( + params: ChevronParameters, platform: Platform, targets: list[QubitPairId], ) -> ChevronData: @@ -50,7 +30,7 @@ def _aquisition( targets (list): List of pairs to use sequentially. Returns: - ChevronCouplersData: Acquisition data. + ChevronData: Acquisition data. """ # define the parameter to sweep and its range: delta_amplitude_range = np.arange( @@ -62,16 +42,14 @@ def _aquisition( params.duration_min, params.duration_max, params.duration_step ) - # create a DataUnits object to store the results, data = ChevronData() - # sort high and low frequency qubit for pair in targets: sequence = PulseSequence() ordered_pair = order_pair(pair, platform) - # initialize in system in 11(CZ) or 10(iSWAP) state - if params.native_gate == "CZ": + # initialize system to state 11(CZ) or 10(iSWAP) + if params.native == "CZ": initialize_lowfreq = platform.create_RX_pulse(ordered_pair[0], start=0) sequence.add(initialize_lowfreq) @@ -79,12 +57,12 @@ def _aquisition( sequence.add(initialize_highfreq) - if params.native_gate == "CZ": + if params.native == "CZ": native_gate, _ = platform.create_CZ_pulse_sequence( (ordered_pair[1], ordered_pair[0]), start=sequence.finish + params.dt, ) - elif params.native_gate == "iSWAP": + elif params.native == "iSWAP": native_gate, _ = platform.create_iSWAP_pulse_sequence( (ordered_pair[1], ordered_pair[0]), start=sequence.finish + params.dt, @@ -103,56 +81,61 @@ def _aquisition( sequence += ro_pulse1 + ro_pulse2 + coupler_flux_pulses = [p for p in native_gate.coupler_pulses(*pair)] + assert ( + len(coupler_flux_pulses) == 1 + ), f"coupler_chevron expects exactly one coupler flux pulse, but {len(coupler_flux_pulses)} are present." + qubit_flux_pulses = [ + p for p in native_gate.get_qubit_pulses(*pair) if p.type is PulseType.FLUX + ] + assert all( + len(list(filter(lambda x: x.qubit == q, qubit_flux_pulses))) < 2 + for q in pair + ), f"coupler_chevron expects no more than 1 flux pulse for each qubit, but more are present for the pair {pair}" sweeper_amplitude = Sweeper( Parameter.amplitude, delta_amplitude_range, - pulses=[p for p in native_gate.coupler_pulses(*pair)][:1], + pulses=coupler_flux_pulses, type=SweeperType.FACTOR, ) sweeper_duration = Sweeper( Parameter.duration, delta_duration_range, - pulses=[p for p in native_gate.coupler_pulses(*pair)], + pulses=coupler_flux_pulses + qubit_flux_pulses, ) - # repeat the experiment as many times as defined by nshots results = platform.sweep( sequence, ExecutionParameters( nshots=params.nshots, - acquisition_type=AcquisitionType.INTEGRATION, + acquisition_type=AcquisitionType.DISCRIMINATION, averaging_mode=AveragingMode.CYCLIC, ), sweeper_duration, sweeper_amplitude, ) - # TODO: Explore probabilities instead of magnitude data.register_qubit( ordered_pair[0], ordered_pair[1], delta_duration_range, delta_amplitude_range * data.native_amplitude[ordered_pair], - results[ordered_pair[0]].magnitude, - results[ordered_pair[1]].magnitude, + results[ordered_pair[0]].probability(state=1), + results[ordered_pair[1]].probability(state=1), ) + data.label = "Probability of state |1>" return data -@dataclass -class ChevronCouplersResults(Results): - """Empty fitting outputs for chevron couplers is not implemented in this case.""" - - -def _fit(data: ChevronCouplersData) -> ChevronCouplersResults: - """ "Results for ChevronCouplers.""" - return ChevronCouplersResults() +def _fit(data: ChevronData) -> Results: + """Results for ChevronCouplers.""" + return Results() -def plot(data: ChevronCouplersData, fit: ChevronCouplersResults, target): +def plot(data: ChevronData, fit: Results, target): return _plot(data, None, target) -coupler_chevron = Routine(_aquisition, _fit, plot, two_qubit_gates=True) +coupler_chevron = Routine(_acquisition, _fit, plot, two_qubit_gates=True) """Coupler cz/swap flux routine.""" diff --git a/src/qibocal/protocols/dispersive_shift.py b/src/qibocal/protocols/dispersive_shift.py index 19d6ff05fe..302f50d5fc 100644 --- a/src/qibocal/protocols/dispersive_shift.py +++ b/src/qibocal/protocols/dispersive_shift.py @@ -1,4 +1,4 @@ -from dataclasses import asdict, dataclass, field +from dataclasses import dataclass, field import numpy as np import numpy.typing as npt @@ -20,6 +20,7 @@ table_html, ) +MHZ_TO_GHZ = 1e-3 @dataclass class DispersiveShiftParameters(Parameters): @@ -29,30 +30,27 @@ class DispersiveShiftParameters(Parameters): """Width [Hz] for frequency sweep relative to the readout frequency [Hz].""" freq_step: int """Frequency step for sweep [Hz].""" + electrical_delay: float = 0.00 + """Electrical delay in us (rad/MHz).""" @dataclass class DispersiveShiftResults(Results): """Dispersive shift outputs.""" - frequency_state_zero: dict[QubitId, float] - """State zero frequency.""" - frequency_state_one: dict[QubitId, float] - """State one frequency.""" - fitted_parameters_state_zero: dict[QubitId, list[float]] - """Fitted parameters state zero.""" - fitted_parameters_state_one: dict[QubitId, list[float]] - """Fitted parameters state one.""" + frequencies: dict[QubitId, list[float]] + """Qubit peak frequencies.""" + fitted_parameters: dict[QubitId, list[list[float]]] + """Fitted parameters. The first element is the resonator frequency when the + qubit is in the ground state, the second one when the qubit is in the first excited + state.""" best_freq: dict[QubitId, float] """Readout frequency that maximizes the distance of ground and excited states in iq-plane""" - @property - def state_zero(self): - return {key: value for key, value in asdict(self).items() if "zero" in key} - - @property - def state_one(self): - return {key: value for key, value in asdict(self).items() if "one" in key} + def chi(self, target: QubitId) -> float: + "Evaluate the dispersive shift" + freq = self.frequencies[target] + return (freq[0] - freq[1]) / 2 DispersiveShiftType = np.dtype( @@ -73,6 +71,8 @@ class DispersiveShiftData(Data): resonator_type: str """Resonator type.""" + electrical_delay: float = 0.00 + """Electrical delay in us (rad/MHz).""" data: dict[tuple[QubitId, int], npt.NDArray[DispersiveShiftType]] = field( default_factory=dict ) @@ -117,7 +117,8 @@ def _acquisition( ) # create a DataUnits objects to store the results - data = DispersiveShiftData(resonator_type=platform.resonator_type) + data = DispersiveShiftData(resonator_type=platform.resonator_type, + electrical_delay=params.electrical_delay) sweeper = Sweeper( Parameter.frequency, delta_frequency_range, @@ -167,44 +168,44 @@ def _fit(data: DispersiveShiftData) -> DispersiveShiftResults: qubits = data.qubits iq_couples = [[], []] # axis 0: states, axis 1: qubit - frequency_0 = {} - frequency_1 = {} + res_frequencies = {} best_freqs = {} - fitted_parameters_0 = {} - fitted_parameters_1 = {} + fitted_parameters = {} - for i in range(2): - for qubit in qubits: + for qubit in qubits: + freq = [] + fit_params = [] + for i in range(2): data_i = data[qubit, i] fit_result = lorentzian_fit( data_i, resonator_type=data.resonator_type, fit="resonator" ) - if fit_result is not None: - if i == 0: - frequency_0[qubit], fitted_parameters_0[qubit], _ = fit_result - else: - frequency_1[qubit], fitted_parameters_1[qubit], _ = fit_result + if fit_result is None: + freq = fit_params = None + break + + freq.append(fit_result[0]) + fit_params.append(fit_result[1]) + + res_frequencies[qubit] = freq + fitted_parameters[qubit] = fit_params + for idx, qubit in enumerate(qubits): + for i in range(2): + data_i = data[qubit, i] i_measures = data_i.i q_measures = data_i.q - iq_couples[i].append(np.stack((i_measures, q_measures), axis=-1)) - # for each qubit find the iq couple of 0-1 states that maximize the distance - iq_couples = np.array(iq_couples) - for idx, qubit in enumerate(qubits): frequencies = data[qubit, 0].freq - max_index = np.argmax( np.linalg.norm(iq_couples[0][idx] - iq_couples[1][idx], axis=-1) ) best_freqs[qubit] = frequencies[max_index] return DispersiveShiftResults( - frequency_state_zero=frequency_0, - frequency_state_one=frequency_1, - fitted_parameters_state_one=fitted_parameters_1, - fitted_parameters_state_zero=fitted_parameters_0, + frequencies=res_frequencies, + fitted_parameters=fitted_parameters, best_freq=best_freqs, ) @@ -222,25 +223,22 @@ def _plot(data: DispersiveShiftData, target: QubitId, fit: DispersiveShiftResult "phase [rad]", ), ) - # iterate over multiple data folders fitting_report = "" data_0 = data[target, 0] data_1 = data[target, 1] - fit_data_0 = fit.state_zero if fit is not None else None - fit_data_1 = fit.state_one if fit is not None else None - for i, label, q_data, data_fit in list( + for i, label, q_data in list( zip( (0, 1), ("State 0", "State 1"), (data_0, data_1), - (fit_data_0, fit_data_1), ) ): opacity = 1 frequencies = q_data.freq * HZ_TO_GHZ + delta_frequency_range = frequencies - frequencies[len(frequencies) // 2] fig.add_trace( go.Scatter( x=frequencies, @@ -253,10 +251,13 @@ def _plot(data: DispersiveShiftData, target: QubitId, fit: DispersiveShiftResult row=1, col=1, ) + phase = np.unwrap(q_data.phase) - ( + delta_frequency_range * data.electrical_delay/ (2 * np.pi*MHZ_TO_GHZ) + ) fig.add_trace( go.Scatter( x=frequencies, - y=q_data.phase, + y=phase, opacity=opacity, showlegend=False, legendgroup=f"{label}", @@ -264,79 +265,73 @@ def _plot(data: DispersiveShiftData, target: QubitId, fit: DispersiveShiftResult row=1, col=2, ) - if fit is not None: - freqrange = np.linspace( - min(frequencies), - max(frequencies), - 2 * len(q_data), - ) - params = data_fit[ - ( - "fitted_parameters_state_zero" - if i == 0 - else "fitted_parameters_state_one" - ) - ][target] - fig.add_trace( - go.Scatter( - x=freqrange, - y=lorentzian(freqrange, *params), - name=f"{label} Fit", - line=go.scatter.Line(dash="dot"), - ), + fig.add_vline( + x=fit.best_freq[target] * HZ_TO_GHZ, + line=dict(color="orange", width=3, dash="dash"), row=1, col=1, ) + table_entries = [ + "Best Frequency [Hz]", + ] + table_values = np.round( + [ + fit.best_freq[target], + ] + ) - if fit is not None: - fig.add_trace( - go.Scatter( - x=[ - fit.best_freq[target] * HZ_TO_GHZ, - fit.best_freq[target] * HZ_TO_GHZ, - ], - y=[ - np.min(np.concatenate((data_0.signal, data_1.signal))), - np.max(np.concatenate((data_0.signal, data_1.signal))), - ], - mode="lines", - line=go.scatter.Line(color="orange", width=3, dash="dash"), - name="Best frequency", - ), - row=1, - col=1, - ) + if fit.frequencies[target] is not None: + freqrange = np.linspace( + min(frequencies), + max(frequencies), + 2 * len(q_data), + ) + params = fit.fitted_parameters[target][i] + fig.add_trace( + go.Scatter( + x=freqrange, + y=lorentzian(freqrange, *params), + name=f"{label} Fit", + line=go.scatter.Line(dash="dot"), + ), + row=1, + col=1, + ) - fig.add_vline( - x=fit.best_freq[target] * HZ_TO_GHZ, - line=dict(color="orange", width=3, dash="dash"), - row=1, - col=1, - ) - fitting_report = table_html( - table_dict( - target, - [ + fig.add_trace( + go.Scatter( + x=[ + fit.best_freq[target] * HZ_TO_GHZ, + fit.best_freq[target] * HZ_TO_GHZ, + ], + y=[ + np.min(np.concatenate((data_0.signal, data_1.signal))), + np.max(np.concatenate((data_0.signal, data_1.signal))), + ], + mode="lines", + line=go.scatter.Line(color="orange", width=3, dash="dash"), + name="Best frequency", + ), + row=1, + col=1, + ) + table_entries = [ "State Zero Frequency [Hz]", "State One Frequency [Hz]", "Chi [Hz]", "Best Frequency [Hz]", - ], - np.round( + ] + table_values = np.round( [ - fit_data_0["frequency_state_zero"][target], - fit_data_1["frequency_state_one"][target], - ( - fit_data_0["frequency_state_zero"][target] - - fit_data_1["frequency_state_one"][target] - ) - / 2, + fit.frequencies[target][0], + fit.frequencies[target][1], + fit.chi(target), fit.best_freq[target], ] - ), - ) - ) + ) + + fitting_report = table_html(table_dict(target, table_entries, table_values)) fig.update_layout( showlegend=True, xaxis_title="Frequency [GHz]", @@ -352,6 +347,10 @@ def _plot(data: DispersiveShiftData, target: QubitId, fit: DispersiveShiftResult def _update(results: DispersiveShiftResults, platform: Platform, target: QubitId): update.readout_frequency(results.best_freq[target], platform, target) + if results.frequencies[target] is not None: + delta = platform.qubits[target].drive_frequency - results.frequencies[target][0] + g = np.sqrt(np.abs(results.chi(target) * delta)) + update.coupling(g, platform, target) dispersive_shift = Routine(_acquisition, _fit, _plot, _update) diff --git a/src/qibocal/protocols/flux_dependence/qubit_flux_dependence.py b/src/qibocal/protocols/flux_dependence/qubit_flux_dependence.py index e87983f05e..d784eb35a7 100644 --- a/src/qibocal/protocols/flux_dependence/qubit_flux_dependence.py +++ b/src/qibocal/protocols/flux_dependence/qubit_flux_dependence.py @@ -165,9 +165,14 @@ def _acquisition( def _fit(data: QubitFluxData) -> QubitFluxResults: """ - Post-processing for QubitFlux Experiment. See arxiv:0703002 - Fit frequency as a function of current for the flux qubit spectroscopy - data (QubitFluxData): data object with information on the feature response at each current point. + Post-processing for QubitFlux Experiment. See `arXiv:0703002 `_. + Fit frequency as a function of current for the flux qubit spectroscopy data. + All possible sweetspots :math:`x` are evaluated by the function + :math:`x p_1 + p_2 = k`, for integers :math:`k`, where :math:`p_1` and :math:`p_2` + are respectively the normalization and the offset, as defined in + :mod:`qibocal.protocols.flux_dependence.utils.transmon_frequency`. + The code returns the sweetspot that is closest to the bias + in the middle of the swept interval. """ qubits = data.qubits @@ -178,12 +183,15 @@ def _fit(data: QubitFluxData) -> QubitFluxResults: for qubit in qubits: qubit_data = data[qubit] - biases = qubit_data.bias - frequencies = qubit_data.freq + interval_biases = qubit_data.bias + interval_frequencies = qubit_data.freq signal = qubit_data.signal frequencies, biases = extract_feature( - frequencies, biases, signal, "max" if data.resonator_type == "2D" else "min" + interval_frequencies, + interval_biases, + signal, + "max" if data.resonator_type == "2D" else "min", ) def fit_function(x, w_max, normalization, offset): @@ -218,10 +226,10 @@ def fit_function(x, w_max, normalization, offset): "charging_energy": data.charging_energy[qubit] * HZ_TO_GHZ, } frequency[qubit] = popt[0] * GHZ_TO_HZ - # solution to x*popt[1] + popt[2] = k - # such that x is close to 0 - # to avoid errors due to periodicity - sweetspot[qubit] = (np.round(popt[2]) - popt[2]) / popt[1] + middle_bias = (np.max(interval_biases) + np.min(interval_biases)) / 2 + sweetspot[qubit] = ( + np.round(popt[1] * middle_bias + popt[2]) - popt[2] + ) / popt[1] matrix_element[qubit] = popt[1] except ValueError as e: log.error( @@ -249,6 +257,7 @@ def _plot(data: QubitFluxData, fit: QubitFluxResults, target: QubitId): fit_function=utils.transmon_frequency, ) if fit is not None: + fitting_report = table_html( table_dict( target, diff --git a/src/qibocal/protocols/flux_dependence/resonator_crosstalk.py b/src/qibocal/protocols/flux_dependence/resonator_crosstalk.py index 8933f796b4..790d61a55b 100644 --- a/src/qibocal/protocols/flux_dependence/resonator_crosstalk.py +++ b/src/qibocal/protocols/flux_dependence/resonator_crosstalk.py @@ -10,10 +10,9 @@ from qibolab.sweeper import Parameter, Sweeper, SweeperType from scipy.optimize import curve_fit -from qibocal import update -from qibocal.auto.operation import Routine -from qibocal.config import log - +from ... import update +from ...auto.operation import Routine +from ...config import log from ..utils import HZ_TO_GHZ, extract_feature, table_dict, table_html from . import utils from .resonator_flux_dependence import ( @@ -71,6 +70,10 @@ class ResCrosstalkData(ResonatorFluxData): """Readout resonator frequency for each qubit.""" matrix_element: dict[QubitId, float] = field(default_factory=dict) """Diagonal crosstalk matrix element.""" + offset: dict[QubitId, float] = field(default_factory=dict) + """Diagonal offset.""" + asymmetry: dict[QubitId, float] = field(default_factory=dict) + """Diagonal asymmetry.""" data: dict[tuple[QubitId, QubitId], npt.NDArray[ResFluxType]] = field( default_factory=dict ) @@ -87,13 +90,12 @@ def register_qubit(self, qubit, flux_qubit, freq, bias, signal, phase): self.data[qubit, flux_qubit] = ar @property - def diagonal(self) -> Optional[ResonatorFluxData]: + def diagonal(self) -> ResonatorFluxData: + """Returns diagonal data acquired.""" instance = ResonatorFluxData( resonator_type=self.resonator_type, qubit_frequency=self.qubit_frequency, - offset=self.offset, bare_resonator_frequency=self.bare_resonator_frequency, - matrix_element=self.matrix_element, charging_energy=self.charging_energy, ) for qubit in self.qubits: @@ -104,32 +106,20 @@ def diagonal(self) -> Optional[ResonatorFluxData]: f"Diagonal acquisition not found for qubit {qubit}. Runcard values will be used to perform the off-diagonal fit." ) - if len(instance.data) > 0: - return instance - return ResonatorFluxData( - resonator_type=self.resonator_type, - qubit_frequency=self.qubit_frequency, - offset=self.offset, - bare_resonator_frequency=self.bare_resonator_frequency, - matrix_element=self.matrix_element, - charging_energy=self.charging_energy, - ) + return instance def _acquisition( params: ResCrosstalkParameters, platform: Platform, targets: list[QubitId] ) -> ResCrosstalkData: """Data acquisition for ResonatorFlux experiment.""" - # create a sequence of pulses for the experiment: - # MZ - - # taking advantage of multiplexing, apply the same set of gates to all qubits in parallel sequence = PulseSequence() ro_pulses = {} bare_resonator_frequency = {} resonator_frequency = {} qubit_frequency = {} coupling = {} + asymmetry = {} charging_energy = {} bias_point = {} offset = {} @@ -140,6 +130,7 @@ def _acquisition( qubit, platform.qubits[qubit].sweetspot ) coupling[qubit] = platform.qubits[qubit].g + asymmetry[qubit] = platform.qubits[qubit].asymmetry matrix_element[qubit] = platform.qubits[qubit].crosstalk_matrix[qubit] offset[qubit] = -platform.qubits[qubit].sweetspot * matrix_element[qubit] bare_resonator_frequency[qubit] = platform.qubits[ @@ -147,7 +138,6 @@ def _acquisition( ].bare_resonator_frequency qubit_frequency[qubit] = platform.qubits[qubit].drive_frequency resonator_frequency[qubit] = platform.qubits[qubit].readout_frequency - ro_pulses[qubit] = platform.create_qubit_readout_pulse(qubit, start=0) sequence.add(ro_pulses[qubit]) @@ -185,6 +175,7 @@ def _acquisition( resonator_type=platform.resonator_type, qubit_frequency=qubit_frequency, offset=offset, + asymmetry=asymmetry, resonator_frequency=resonator_frequency, charging_energy=charging_energy, bias_point=bias_point, @@ -201,6 +192,7 @@ def _acquisition( for qubit in targets: if qubit in params.bias_point: platform.qubits[qubit].flux.offset = params.bias_point[qubit] + for flux_qubit, bias_sweeper, sequence in zip(flux_qubits, sweepers, sequences): results = platform.sweep(sequence, options, bias_sweeper, freq_sweeper) # retrieve the results for every qubit @@ -222,34 +214,44 @@ def _acquisition( def _fit(data: ResCrosstalkData) -> ResCrosstalkResults: - crosstalk_matrix = {qubit: {} for qubit in data.qubit_frequency} - fitted_parameters = {} + """ "PostProcessing for resonator crosstalk protocol.""" + + # perform first fit where corresponding qubit is moved diagonal = diagonal_fit(data.diagonal) + fitted_parameters = {} + crosstalk_matrix = {qubit: {} for qubit in data.qubit_frequency} + offset = {} coupling = {} - bare_resonator_frequency = {} + matrix_element = {} + asymmetry = {} resonator_frequency = {} resonator_frequency_bias_point = {} + for qubit in data.qubits: + + # retrieve parameters from diagonal fit if performed condition = qubit in diagonal coupling[qubit] = ( diagonal.coupling[qubit] if condition else data.coupling[qubit] ) - - bare_resonator_frequency[qubit] = ( - diagonal.bare_resonator_freq[qubit] - if condition - else data.bare_resonator_frequency[qubit] + asymmetry[qubit] = ( + diagonal.asymmetry[qubit] if condition else data.asymmetry[qubit] + ) + matrix_element[qubit] = ( + diagonal.matrix_element[qubit] if condition else data.matrix_element[qubit] ) resonator_frequency[qubit] = ( - diagonal.resonator_freq[qubit] + diagonal.frequency[qubit] if condition else data.resonator_frequency[qubit] + ) + offset[qubit] = ( + diagonal.fitted_parameters[qubit]["offset"] if condition - else data.resonator_frequency[qubit] + else data.offset[qubit] ) for target_flux_qubit, qubit_data in data.data.items(): target_qubit, flux_qubit = target_flux_qubit - frequencies, biases = extract_feature( qubit_data.freq, qubit_data.bias, @@ -257,36 +259,37 @@ def _fit(data: ResCrosstalkData) -> ResCrosstalkResults: "min" if data.resonator_type == "2D" else "max", ) + # fit valid only for non-diagonal case + # (the diagonal case was handled before) if target_qubit != flux_qubit: - resonator_frequency_bias_point[target_qubit] = ( utils.transmon_readout_frequency( xi=data.bias_point[target_qubit], xj=0, - d=0, + d=asymmetry[target_qubit], w_max=data.qubit_frequency[target_qubit] * HZ_TO_GHZ, offset=data.offset[target_qubit], - normalization=data.matrix_element[target_qubit], + normalization=matrix_element[target_qubit], charging_energy=data.charging_energy[target_qubit] * HZ_TO_GHZ, g=coupling[target_qubit], - resonator_freq=bare_resonator_frequency[target_qubit] * HZ_TO_GHZ, + resonator_freq=data.bare_resonator_frequency[target_qubit] + * HZ_TO_GHZ, crosstalk_element=1, ) ) - # fit function needs to be defined here to pass correct parameters - # at runtime - def fit_function(x, crosstalk_element, offset): + def fit_function(x, crosstalk_element): return utils.transmon_readout_frequency( xi=data.bias_point[target_qubit], xj=x, d=0, w_max=data.qubit_frequency[target_qubit] * HZ_TO_GHZ, - offset=offset, + offset=offset[target_qubit], normalization=data.matrix_element[target_qubit], charging_energy=data.charging_energy[target_qubit] * HZ_TO_GHZ, g=coupling[target_qubit], - resonator_freq=bare_resonator_frequency[target_qubit] * HZ_TO_GHZ, + resonator_freq=data.bare_resonator_frequency[target_qubit] + * HZ_TO_GHZ, crosstalk_element=crosstalk_element, ) @@ -295,23 +298,24 @@ def fit_function(x, crosstalk_element, offset): fit_function, biases, frequencies * HZ_TO_GHZ, - bounds=((-np.inf, -1), (np.inf, 1)), + bounds=(-1, 1), ) fitted_parameters[target_qubit, flux_qubit] = dict( xi=data.bias_point[qubit], - d=0, + d=asymmetry[qubit], w_max=data.qubit_frequency[target_qubit] * HZ_TO_GHZ, - offset=popt[1], + offset=offset[qubit], normalization=data.matrix_element[target_qubit], charging_energy=data.charging_energy[target_qubit] * HZ_TO_GHZ, g=coupling[target_qubit], - resonator_freq=bare_resonator_frequency[target_qubit] * HZ_TO_GHZ, + resonator_freq=data.bare_resonator_frequency[target_qubit] + * HZ_TO_GHZ, crosstalk_element=float(popt[0]), ) crosstalk_matrix[target_qubit][flux_qubit] = ( popt[0] * data.matrix_element[target_qubit] ) - except ValueError as e: + except (ValueError, RuntimeError) as e: log.error( f"Off-diagonal flux fit failed for qubit {flux_qubit} due to {e}." ) @@ -319,12 +323,11 @@ def fit_function(x, crosstalk_element, offset): fitted_parameters[target_qubit, flux_qubit] = diagonal.fitted_parameters[ target_qubit ] - # TODO: to be fixed - crosstalk_matrix[target_qubit][flux_qubit] = data.matrix_element[qubit] + crosstalk_matrix[target_qubit][flux_qubit] = matrix_element[qubit] return ResCrosstalkResults( - resonator_freq=resonator_frequency, - bare_resonator_freq=bare_resonator_frequency, + frequency=resonator_frequency, + asymmetry=asymmetry, resonator_frequency_bias_point=resonator_frequency_bias_point, coupling=coupling, crosstalk_matrix=crosstalk_matrix, @@ -341,19 +344,14 @@ def _plot(data: ResCrosstalkData, fit: ResCrosstalkResults, target: QubitId): labels = [ "Resonator Frequency at Sweetspot [Hz]", "Coupling g [MHz]", - "Resonaor Frequency at Bias point [Hz]", - "Bare Resonator Frequency [Hz]", - "Chi [MHz]", + "Asymmetry d", + "Resonator Frequency at Bias point [Hz]", ] values = [ - np.round(fit.resonator_freq[target], 4), + np.round(fit.frequency[target], 4), np.round(fit.coupling[target] * 1e3, 2), + np.round(fit.asymmetry[target], 2), np.round(fit.resonator_frequency_bias_point[target], 4), - np.round(fit.bare_resonator_freq[target], 4), - np.round( - (fit.bare_resonator_freq[target] - fit.resonator_freq[target]) * 1e-6, - 2, - ), ] for flux_qubit in fit.crosstalk_matrix[target]: if flux_qubit != target: diff --git a/src/qibocal/protocols/flux_dependence/resonator_flux_dependence.py b/src/qibocal/protocols/flux_dependence/resonator_flux_dependence.py index 415a15238a..f560409dec 100644 --- a/src/qibocal/protocols/flux_dependence/resonator_flux_dependence.py +++ b/src/qibocal/protocols/flux_dependence/resonator_flux_dependence.py @@ -10,10 +10,9 @@ from qibolab.sweeper import Parameter, Sweeper, SweeperType from scipy.optimize import curve_fit -from qibocal import update -from qibocal.auto.operation import Data, Parameters, Results, Routine -from qibocal.config import log - +from ... import update +from ...auto.operation import Data, Parameters, Results, Routine +from ...config import log from ..utils import GHZ_TO_HZ, HZ_TO_GHZ, extract_feature, table_dict, table_html from . import utils @@ -30,16 +29,24 @@ class ResonatorFluxParameters(Parameters): """Width for bias sweep [V].""" bias_step: Optional[float] = None """Bias step for sweep [a.u.].""" + phase_delay: float = None + """Phase delay correction in rad/MHz (us). By default no correction is performed.""" @dataclass class ResonatorFluxResults(Results): """ResonatoFlux outputs.""" - resonator_freq: dict[QubitId, float] = field(default_factory=dict) - bare_resonator_freq: dict[QubitId, float] = field(default_factory=dict) + frequency: dict[QubitId, float] = field(default_factory=dict) + """Readout frequency.""" coupling: dict[QubitId, float] = field(default_factory=dict) """Qubit-resonator coupling.""" + asymmetry: dict[QubitId, float] = field(default_factory=dict) + """Asymmetry between junctions.""" + sweetspot: dict[QubitId, float] = field(default_factory=dict) + """Sweetspot for each qubit.""" + matrix_element: dict[QubitId, float] = field(default_factory=dict) + """Sweetspot for each qubit.""" fitted_parameters: dict[QubitId, float] = field(default_factory=dict) @@ -62,12 +69,10 @@ class ResonatorFluxData(Data): """Resonator type.""" qubit_frequency: dict[QubitId, float] = field(default_factory=dict) """Qubit frequencies.""" - offset: dict[QubitId, float] = field(default_factory=dict) - """Qubit bias offset.""" bare_resonator_frequency: dict[QubitId, int] = field(default_factory=dict) """Qubit bare resonator frequency power provided by the user.""" - matrix_element: dict[QubitId, float] = field(default_factory=dict) charging_energy: dict[QubitId, float] = field(default_factory=dict) + """Qubit charging energy in Hz.""" data: dict[QubitId, npt.NDArray[ResFluxType]] = field(default_factory=dict) """Raw data acquired.""" @@ -83,24 +88,17 @@ def _acquisition( params: ResonatorFluxParameters, platform: Platform, targets: list[QubitId] ) -> ResonatorFluxData: """Data acquisition for ResonatorFlux experiment.""" - # create a sequence of pulses for the experiment: - # MZ - # taking advantage of multiplexing, apply the same set of gates to all qubits in parallel sequence = PulseSequence() ro_pulses = {} qubit_frequency = {} bare_resonator_frequency = {} - offset = {} - matrix_element = {} charging_energy = {} for qubit in targets: qubit_frequency[qubit] = platform.qubits[qubit].drive_frequency bare_resonator_frequency[qubit] = platform.qubits[ qubit ].bare_resonator_frequency - matrix_element[qubit] = platform.qubits[qubit].crosstalk_matrix[qubit] - offset[qubit] = -platform.qubits[qubit].sweetspot * matrix_element[qubit] charging_energy[qubit] = -platform.qubits[qubit].anharmonicity ro_pulses[qubit] = platform.create_qubit_readout_pulse(qubit, start=0) sequence.add(ro_pulses[qubit]) @@ -131,8 +129,6 @@ def _acquisition( data = ResonatorFluxData( resonator_type=platform.resonator_type, qubit_frequency=qubit_frequency, - offset=offset, - matrix_element=matrix_element, bare_resonator_frequency=bare_resonator_frequency, charging_energy=charging_energy, ) @@ -148,77 +144,100 @@ def _acquisition( for qubit in targets: result = results[ro_pulses[qubit].serial] sweetspot = platform.qubits[qubit].sweetspot + + frequency =delta_frequency_range + ro_pulses[qubit].frequency + + if params.phase_delay is not None: + phase = result.average.phase + phase = np.unwrap(phase)-(frequency-frequency[0])*1e-6*params.phase_delay + else: + phase = result.average.phase + data.register_qubit( qubit, signal=result.magnitude, - phase=result.phase, - freq=delta_frequency_range + ro_pulses[qubit].frequency, + phase=phase, + freq=frequency, bias=delta_bias_range + sweetspot, ) return data def _fit(data: ResonatorFluxData) -> ResonatorFluxResults: - """ - Post-processing for QubitFlux Experiment. See arxiv:0703002 - Fit frequency as a function of current for the flux qubit spectroscopy - data (QubitFluxData): data object with information on the feature response at each current point. + """PostProcessing for resonator_flux protocol. + + After applying a mask on the 2D data, the signal is fitted using + the expected frequency vs flux behavior. + The fitting procedure requires the knowledge of the bare resonator frequency, + the charging energy Ec and the maximum qubit frequency which is assumed to be + the frequency at which the qubit is placed. + The protocol aims at extracting the sweetspot, the flux coefficient, the coupling, + the asymmetry and the dressed resonator frequency. """ - qubits = data.qubits coupling = {} resonator_freq = {} - bare_resonator_freq = {} + asymmetry = {} fitted_parameters = {} - for qubit in qubits: + sweetspot = {} + matrix_element = {} + + for qubit in data.qubits: qubit_data = data[qubit] biases = qubit_data.bias frequencies = qubit_data.freq signal = qubit_data.signal + + # extract signal from 2D plot based on SNR mask frequencies, biases = extract_feature( frequencies, biases, signal, "min" if data.resonator_type == "2D" else "max" ) - def fit_function(x, g, resonator_freq): + # define fit function + def fit_function( + x: float, g: float, d: float, offset: float, normalization: float + ): + """Fit function for resonator flux dependence.""" return utils.transmon_readout_frequency( xi=x, w_max=data.qubit_frequency[qubit] * HZ_TO_GHZ, xj=0, - d=0, - normalization=data.matrix_element[qubit], - offset=data.offset[qubit], + d=d, + normalization=normalization, + offset=offset, crosstalk_element=1, charging_energy=data.charging_energy[qubit] * HZ_TO_GHZ, - resonator_freq=resonator_freq, + resonator_freq=data.bare_resonator_frequency[qubit] * HZ_TO_GHZ, g=g, ) try: - popt, perr = curve_fit( + popt, _ = curve_fit( fit_function, biases, frequencies * HZ_TO_GHZ, bounds=( - [0, data.bare_resonator_frequency[qubit] * HZ_TO_GHZ - 0.2], - [0.5, data.bare_resonator_frequency[qubit] * HZ_TO_GHZ + 0.2], + [0, 0, -1, 0.5], + [0.5, 1, 1, +1], ), maxfev=100000, ) fitted_parameters[qubit] = { "w_max": data.qubit_frequency[qubit] * HZ_TO_GHZ, "xj": 0, - "d": 0, - "normalization": data.matrix_element[qubit], - "offset": data.offset[qubit], + "d": popt[1], + "normalization": popt[3], + "offset": popt[2], "crosstalk_element": 1, "charging_energy": data.charging_energy[qubit] * HZ_TO_GHZ, - "resonator_freq": popt[1], + "resonator_freq": data.bare_resonator_frequency[qubit] * HZ_TO_GHZ, "g": popt[0], } - sweetspot = -data.offset[qubit] / data.matrix_element[qubit] - resonator_freq[qubit] = fit_function(sweetspot, *popt) * GHZ_TO_HZ + matrix_element[qubit] = popt[3] + sweetspot[qubit] = (np.round(popt[2]) - popt[2]) / popt[3] + resonator_freq[qubit] = fit_function(sweetspot[qubit], *popt) * GHZ_TO_HZ coupling[qubit] = popt[0] - bare_resonator_freq[qubit] = popt[1] * GHZ_TO_HZ + asymmetry[qubit] = popt[1] except ValueError as e: log.error( f"Error in resonator_flux protocol fit: {e} " @@ -226,11 +245,12 @@ def fit_function(x, g, resonator_freq): "Lowering the value of `threshold` in `extract_*_feature`" "should fix the problem." ) - return ResonatorFluxResults( - resonator_freq=resonator_freq, - bare_resonator_freq=bare_resonator_freq, + frequency=resonator_freq, coupling=coupling, + matrix_element=matrix_element, + sweetspot=sweetspot, + asymmetry=asymmetry, fitted_parameters=fitted_parameters, ) @@ -247,16 +267,20 @@ def _plot(data: ResonatorFluxData, fit: ResonatorFluxResults, target: QubitId): target, [ "Coupling g [MHz]", - "Bare resonator freq [Hz]", "Dressed resonator freq [Hz]", + "Asymmetry", + "Sweetspot [V]", + "Flux dependence [V]^-1", "Chi [MHz]", ], [ np.round(fit.coupling[target] * 1e3, 2), - np.round(fit.bare_resonator_freq[target], 6), - np.round(fit.resonator_freq[target], 6), + np.round(fit.frequency[target], 6), + np.round(fit.asymmetry[target], 3), + np.round(fit.sweetspot[target], 4), + np.round(fit.matrix_element[target], 4), np.round( - (fit.bare_resonator_freq[target] - fit.resonator_freq[target]) + (data.bare_resonator_frequency[target] - fit.frequency[target]) * 1e-6, 2, ), @@ -268,10 +292,11 @@ def _plot(data: ResonatorFluxData, fit: ResonatorFluxResults, target: QubitId): def _update(results: ResonatorFluxResults, platform: Platform, qubit: QubitId): - pass - update.bare_resonator_frequency(results.bare_resonator_freq[qubit], platform, qubit) - update.readout_frequency(results.resonator_freq[qubit], platform, qubit) + update.readout_frequency(results.frequency[qubit], platform, qubit) update.coupling(results.coupling[qubit], platform, qubit) + update.asymmetry(results.coupling[qubit], platform, qubit) + update.sweetspot(results.sweetspot[qubit], platform, qubit) + update.crosstalk_matrix(results.matrix_element[qubit], platform, qubit, qubit) resonator_flux = Routine(_acquisition, _fit, _plot, _update) diff --git a/src/qibocal/protocols/flux_dependence/utils.py b/src/qibocal/protocols/flux_dependence/utils.py index 673a712755..5e56f7733a 100644 --- a/src/qibocal/protocols/flux_dependence/utils.py +++ b/src/qibocal/protocols/flux_dependence/utils.py @@ -71,6 +71,26 @@ def flux_dependence_plot(data, fit, qubit, fit_function=None): row=1, col=1, ) + fig.add_trace( + go.Scatter( + x=[ + fit.frequency[qubit] * HZ_TO_GHZ, + ], + y=[ + fit.sweetspot[qubit], + ], + mode="markers", + marker=dict( + size=8, + color="black", + symbol="cross", + ), + name=f"Sweetspot", + showlegend=True, + ), + row=1, + col=1, + ) fig.update_xaxes( title_text=f"Frequency [GHz]", @@ -205,11 +225,10 @@ def G_f_d(xi, xj, offset, d, crosstalk_element, normalization): xi (float): bias of target qubit xj (float): bias of neighbor qubit offset (float): phase_offset [V]. - matrix_element(float): diagonal crosstalk matrix element - crosstalk_element(float): off-diagonal crosstalk matrix element d (float): asymmetry between the two junctions of the transmon. Typically denoted as :math:`d`. :math:`d = (E_J^1 - E_J^2) / (E_J^1 + E_J^2)`. - normalization (float): Normalize diagonal element to 1 + crosstalk_element(float): off-diagonal crosstalk matrix element + normalization(float): diagonal crosstalk matrix element Returns: (float) """ @@ -237,11 +256,11 @@ def transmon_frequency( xi (float): bias of target qubit xj (float): bias of neighbor qubit w_max (float): maximum frequency :math:`w_{max} = \sqrt{8 E_j E_c} - sweetspot (float): sweetspot [V]. - matrix_element(float): diagonal crosstalk matrix element - crosstalk_element(float): off-diagonal crosstalk matrix element d (float): asymmetry between the two junctions of the transmon. Typically denoted as :math:`d`. :math:`d = (E_J^1 - E_J^2) / (E_J^1 + E_J^2)`. + normalization(float): diagonal crosstalk matrix element + offset (float): phase_offset [V]. + crosstalk_element(float): off-diagonal crosstalk matrix element charging_energy (float): Ec / h (GHz) Returns: @@ -279,13 +298,14 @@ def transmon_readout_frequency( xi (float): bias of target qubit xj (float): bias of neighbor qubit w_max (float): maximum frequency :math:`w_{max} = \sqrt{8 E_j E_c} - sweetspot (float): sweetspot [V]. - matrix_element(float): diagonal crosstalk matrix element - crosstalk_element(float): off-diagonal crosstalk matrix element d (float): asymmetry between the two junctions of the transmon. Typically denoted as :math:`d`. :math:`d = (E_J^1 - E_J^2) / (E_J^1 + E_J^2)`. + normalization(float): diagonal crosstalk matrix element + offset (float): phase_offset [V]. + crosstalk_element(float): off-diagonal crosstalk matrix element resonator_freq (float): bare resonator frequency [GHz] g (float): readout coupling. + charging_energy (float): Ec / h (GHz) Returns: (float): resonator frequency as a function of bias. diff --git a/src/qibocal/protocols/qutrit_classification.py b/src/qibocal/protocols/qutrit_classification.py index c7a450667a..fdb3fecaa0 100644 --- a/src/qibocal/protocols/qutrit_classification.py +++ b/src/qibocal/protocols/qutrit_classification.py @@ -1,21 +1,18 @@ from dataclasses import dataclass, field from typing import Optional -import numpy as np from qibolab import AcquisitionType, ExecutionParameters from qibolab.platform import Platform from qibolab.pulses import PulseSequence from qibolab.qubits import QubitId -from qibocal.auto.operation import Routine -from qibocal.fitting.classifier import run +from qibocal.auto.operation import Results, Routine from qibocal.protocols.classification import ( ClassificationType, SingleShotClassificationData, SingleShotClassificationParameters, - SingleShotClassificationResults, ) -from qibocal.protocols.utils import MESH_SIZE, evaluate_grid, plot_results +from qibocal.protocols.utils import plot_results COLUMNWIDTH = 600 LEGEND_FONT_SIZE = 20 @@ -28,11 +25,6 @@ class QutritClassificationParameters(SingleShotClassificationParameters): """SingleShotClassification runcard inputs.""" - classifiers_list: Optional[list[str]] = field( - default_factory=lambda: [DEFAULT_CLASSIFIER] - ) - """List of models to classify the qubit states""" - @dataclass class QutritClassificationData(SingleShotClassificationData): @@ -42,6 +34,11 @@ class QutritClassificationData(SingleShotClassificationData): """List of models to classify the qubit states""" +@dataclass +class QutritClassificationResults(Results): + """Qutrit classification results""" + + def _acquisition( params: QutritClassificationParameters, platform: Platform, @@ -114,58 +111,14 @@ def _acquisition( return data -def _fit(data: QutritClassificationData) -> SingleShotClassificationResults: - qubits = data.qubits - - benchmark_tables = {} - models_dict = {} - y_tests = {} - x_tests = {} - hpars = {} - y_test_predict = {} - grid_preds_dict = {} - for qubit in qubits: - qubit_data = data.data[qubit] - benchmark_table, y_test, x_test, models, names, hpars_list = run.train_qubit( - data, qubit - ) - benchmark_tables[qubit] = benchmark_table.values.tolist() - models_dict[qubit] = models - y_tests[qubit] = y_test.tolist() - x_tests[qubit] = x_test.tolist() - hpars[qubit] = {} - y_preds = [] - grid_preds = [] - - grid = evaluate_grid(qubit_data) - for i, model_name in enumerate(names): - hpars[qubit][model_name] = hpars_list[i] - try: - y_preds.append(models[i].predict_proba(x_test)[:, 1].tolist()) - except AttributeError: - y_preds.append(models[i].predict(x_test).tolist()) - grid_preds.append( - np.round(np.reshape(models[i].predict(grid), (MESH_SIZE, MESH_SIZE))) - .astype(np.int64) - .tolist() - ) - y_test_predict[qubit] = y_preds - grid_preds_dict[qubit] = grid_preds - return SingleShotClassificationResults( - benchmark_table=benchmark_tables, - names=names, - classifiers_hpars=hpars, - models=models_dict, - savedir=data.savedir, - y_preds=y_test_predict, - grid_preds=grid_preds_dict, - ) +def _fit(data: QutritClassificationData) -> QutritClassificationResults: + return QutritClassificationResults() def _plot( data: QutritClassificationData, target: QubitId, - fit: SingleShotClassificationResults, + fit: QutritClassificationResults, ): figures = plot_results(data, target, 3, fit) fitting_report = "" diff --git a/src/qibocal/protocols/rabi/__init__.py b/src/qibocal/protocols/rabi/__init__.py index e69de29bb2..e51735f06c 100644 --- a/src/qibocal/protocols/rabi/__init__.py +++ b/src/qibocal/protocols/rabi/__init__.py @@ -0,0 +1,7 @@ +from .amplitude import rabi_amplitude +from .amplitude_signal import rabi_amplitude_signal +from .amplitude_frequency_signal import rabi_amplitude_frequency_signal +from .ef import rabi_amplitude_ef +from .length import rabi_length +from .length_sequences import rabi_length_sequences +from .length_signal import rabi_length_signal \ No newline at end of file diff --git a/src/qibocal/protocols/rabi/amplitude_frequency.py b/src/qibocal/protocols/rabi/amplitude_frequency.py index 39b6be4c48..1de63c3f25 100644 --- a/src/qibocal/protocols/rabi/amplitude_frequency.py +++ b/src/qibocal/protocols/rabi/amplitude_frequency.py @@ -161,7 +161,7 @@ def _fit(data: RabiAmplitudeFreqData) -> RabiAmplitudeFrequencyResults: x = (amps - x_min) / (x_max - x_min) y = (y - y_min) / (y_max - y_min) - period = fallback_period(guess_period(amps, y)) + period = fallback_period(guess_period(x, y)) pguess = [0.5, 0.5, period, 0] try: diff --git a/src/qibocal/protocols/rabi/amplitude_frequency_signal.py b/src/qibocal/protocols/rabi/amplitude_frequency_signal.py index b077927ecb..5bd24ed6e2 100644 --- a/src/qibocal/protocols/rabi/amplitude_frequency_signal.py +++ b/src/qibocal/protocols/rabi/amplitude_frequency_signal.py @@ -185,7 +185,7 @@ def _fit(data: RabiAmplitudeFreqSignalData) -> RabiAmplitudeFrequencySignalResul x = (amps - x_min) / (x_max - x_min) y = (y - y_min) / (y_max - y_min) - period = fallback_period(guess_period(amps, y)) + period = fallback_period(guess_period(x, y)) pguess = [0.5, 0.5, period, 0] try: diff --git a/src/qibocal/protocols/rabi/length_frequency.py b/src/qibocal/protocols/rabi/length_frequency.py index ea8b1fe6f6..28ac4715c1 100644 --- a/src/qibocal/protocols/rabi/length_frequency.py +++ b/src/qibocal/protocols/rabi/length_frequency.py @@ -155,7 +155,7 @@ def _fit(data: RabiLengthFreqData) -> RabiLengthFrequencyResults: x = (durations - x_min) / (x_max - x_min) y = (y - y_min) / (y_max - y_min) - period = fallback_period(guess_period(durations, y)) + period = fallback_period(guess_period(x, y)) pguess = [0, np.sign(y[0]) * 0.5, period, 0, 0] try: diff --git a/src/qibocal/protocols/rabi/length_frequency_signal.py b/src/qibocal/protocols/rabi/length_frequency_signal.py index 109ee40e4c..abf73caa3f 100644 --- a/src/qibocal/protocols/rabi/length_frequency_signal.py +++ b/src/qibocal/protocols/rabi/length_frequency_signal.py @@ -179,7 +179,7 @@ def _fit(data: RabiLengthFreqSignalData) -> RabiLengthFrequencySignalResults: x = (durations - x_min) / (x_max - x_min) y = (y - y_min) / (y_max - y_min) - period = fallback_period(guess_period(durations, y)) + period = fallback_period(guess_period(x, y)) pguess = [0, np.sign(y[0]) * 0.5, period, 0, 0] try: diff --git a/src/qibocal/protocols/rabi/length_signal.py b/src/qibocal/protocols/rabi/length_signal.py index fc139197d7..55ddc30faf 100644 --- a/src/qibocal/protocols/rabi/length_signal.py +++ b/src/qibocal/protocols/rabi/length_signal.py @@ -53,7 +53,8 @@ class RabiLengthSignalData(Data): """RabiLength acquisition outputs.""" amplitudes: dict[QubitId, float] = field(default_factory=dict) - """Pulse durations provided by the user.""" + """Pulse amplitudes provided by the user.""" + data: dict[QubitId, npt.NDArray[RabiLenSignalType]] = field(default_factory=dict) """Raw data acquired.""" diff --git a/src/qibocal/protocols/rabi/utils.py b/src/qibocal/protocols/rabi/utils.py index d31a406797..3e1bd3e925 100644 --- a/src/qibocal/protocols/rabi/utils.py +++ b/src/qibocal/protocols/rabi/utils.py @@ -246,7 +246,7 @@ def sequence_amplitude( def sequence_length( - targets: list[QubitId], params: Parameters, platform: Platform + targets: list[QubitId], params: Parameters, platform: Platform, start: int = 0, ) -> tuple[PulseSequence, dict, dict, dict]: """Return sequence for rabi length.""" sequence = PulseSequence() @@ -255,7 +255,7 @@ def sequence_length( amplitudes = {} for qubit in targets: qd_pulses[qubit] = platform.create_qubit_drive_pulse( - qubit, start=0, duration=params.pulse_duration_start + qubit, start=start, duration=params.pulse_duration_start ) if params.pulse_amplitude is not None: qd_pulses[qubit].amplitude = params.pulse_amplitude diff --git a/src/qibocal/protocols/ramsey/ramsey.py b/src/qibocal/protocols/ramsey/ramsey.py index cf33eb2f77..c74d42b564 100644 --- a/src/qibocal/protocols/ramsey/ramsey.py +++ b/src/qibocal/protocols/ramsey/ramsey.py @@ -13,14 +13,14 @@ from qibocal.auto.operation import Routine from qibocal.config import log -from ..utils import GHZ_TO_HZ, chi2_reduced, table_dict, table_html +from ..utils import chi2_reduced, table_dict, table_html from .ramsey_signal import ( RamseySignalData, RamseySignalParameters, RamseySignalResults, _update, ) -from .utils import fitting, ramsey_fit, ramsey_sequence +from .utils import fitting, process_fit, ramsey_fit, ramsey_sequence COLORBAND = "rgba(0,100,80,0.2)" COLORBAND_LINE = "rgba(255,255,255,0)" @@ -191,28 +191,14 @@ def _fit(data: RamseyData) -> RamseyResults: probs = qubit_data["prob"] try: popt, perr = fitting(waits, probs, qubit_data.errors) + ( + freq_measure[qubit], + t2_measure[qubit], + delta_phys_measure[qubit], + delta_fitting_measure[qubit], + popts[qubit], + ) = process_fit(popt, perr, qubit_freq, data.detuning) - delta_fitting = popt[2] / (2 * np.pi) - sign = np.sign(data.detuning) if data.detuning != 0 else 1 - delta_phys = int(sign * (delta_fitting * GHZ_TO_HZ - np.abs(data.detuning))) - corrected_qubit_frequency = int(qubit_freq - delta_phys) - t2 = 1 / popt[4] - # TODO: check error formula - freq_measure[qubit] = ( - corrected_qubit_frequency, - perr[2] * GHZ_TO_HZ / (2 * np.pi), - ) - t2_measure[qubit] = (t2, perr[4] * (t2**2)) - popts[qubit] = popt - # TODO: check error formula - delta_phys_measure[qubit] = ( - -delta_phys, - perr[2] * GHZ_TO_HZ / (2 * np.pi), - ) - delta_fitting_measure[qubit] = ( - -delta_fitting * GHZ_TO_HZ, - perr[2] * GHZ_TO_HZ / (2 * np.pi), - ) chi2[qubit] = ( chi2_reduced( probs, @@ -224,6 +210,7 @@ def _fit(data: RamseyData) -> RamseyResults: except Exception as e: log.warning(f"Ramsey fitting failed for qubit {qubit} due to {e}.") return RamseyResults( + detuning=data.detuning, frequency=freq_measure, t2=t2_measure, delta_phys=delta_phys_measure, diff --git a/src/qibocal/protocols/ramsey/ramsey_signal.py b/src/qibocal/protocols/ramsey/ramsey_signal.py index b6f3aa6d34..07bb695c45 100644 --- a/src/qibocal/protocols/ramsey/ramsey_signal.py +++ b/src/qibocal/protocols/ramsey/ramsey_signal.py @@ -14,8 +14,8 @@ from qibocal.auto.operation import Data, Parameters, Results, Routine from qibocal.config import log -from ..utils import GHZ_TO_HZ, table_dict, table_html -from .utils import fitting, ramsey_fit, ramsey_sequence +from ..utils import table_dict, table_html +from .utils import fitting, process_fit, ramsey_fit, ramsey_sequence @dataclass @@ -28,7 +28,7 @@ class RamseySignalParameters(Parameters): """Final delay between RX(pi/2) pulses in ns.""" delay_between_pulses_step: int """Step delay between RX(pi/2) pulses in ns.""" - detuning: Optional[int] = 0 + detuning: Optional[int] = None """Frequency detuning [Hz] (optional). If 0 standard Ramsey experiment is performed.""" unrolling: bool = False @@ -40,6 +40,8 @@ class RamseySignalParameters(Parameters): class RamseySignalResults(Results): """Ramsey outputs.""" + detuning: float + """Qubit frequency detuning.""" frequency: dict[QubitId, Union[float, list[float]]] """Drive frequency [GHz] for each qubit.""" t2: dict[QubitId, Union[float, list[float]]] @@ -61,7 +63,7 @@ class RamseySignalResults(Results): class RamseySignalData(Data): """Ramsey acquisition outputs.""" - detuning: int + detuning: Optional[int] = None """Frequency detuning [Hz].""" qubit_freqs: dict[QubitId, float] = field(default_factory=dict) """Qubit freqs for each qubit.""" @@ -194,29 +196,18 @@ def _fit(data: RamseySignalData) -> RamseySignalResults: signal = qubit_data["signal"] try: popt, perr = fitting(waits, signal) - delta_fitting = popt[2] / (2 * np.pi) - sign = np.sign(data.detuning) if data.detuning != 0 else 1 - delta_phys = int(sign * (delta_fitting * GHZ_TO_HZ - np.abs(data.detuning))) - corrected_qubit_frequency = int(qubit_freq - delta_phys) - t2 = 1 / popt[4] - freq_measure[qubit] = [ - corrected_qubit_frequency, - perr[2] * GHZ_TO_HZ / (2 * np.pi), - ] - t2_measure[qubit] = [t2, perr[4] * (t2**2)] - popts[qubit] = popt - delta_phys_measure[qubit] = [ - -delta_phys, - perr[2] * GHZ_TO_HZ / (2 * np.pi), - ] - delta_fitting_measure[qubit] = [ - -delta_fitting * GHZ_TO_HZ, - perr[2] * GHZ_TO_HZ / (2 * np.pi), - ] + ( + freq_measure[qubit], + t2_measure[qubit], + delta_phys_measure[qubit], + delta_fitting_measure[qubit], + popts[qubit], + ) = process_fit(popt, perr, qubit_freq, data.detuning) except Exception as e: log.warning(f"Ramsey fitting failed for qubit {qubit} due to {e}.") return RamseySignalResults( + detuning=data.detuning, frequency=freq_measure, t2=t2_measure, delta_phys=delta_phys_measure, @@ -295,7 +286,10 @@ def _plot(data: RamseySignalData, target: QubitId, fit: RamseySignalResults = No def _update(results: RamseySignalResults, platform: Platform, target: QubitId): - update.drive_frequency(results.frequency[target][0], platform, target) + if results.detuning is not None: + update.drive_frequency(results.frequency[target][0], platform, target) + else: + update.t2(results.t2[target][0], platform, target) ramsey_signal = Routine(_acquisition, _fit, _plot, _update) diff --git a/src/qibocal/protocols/ramsey/ramsey_zz.py b/src/qibocal/protocols/ramsey/ramsey_zz.py new file mode 100644 index 0000000000..90ebe871d6 --- /dev/null +++ b/src/qibocal/protocols/ramsey/ramsey_zz.py @@ -0,0 +1,303 @@ +from dataclasses import dataclass, field, fields +from typing import Optional + +import numpy as np +import numpy.typing as npt +import plotly.graph_objects as go +from qibolab import AcquisitionType, AveragingMode, ExecutionParameters +from qibolab.platform import Platform +from qibolab.pulses import PulseSequence +from qibolab.qubits import QubitId +from qibolab.sweeper import Parameter, Sweeper, SweeperType + +from ...auto.operation import Routine +from ...config import log +from ..utils import table_dict, table_html +from .ramsey import ( + COLORBAND, + COLORBAND_LINE, + RamseySignalData, + RamseySignalParameters, + RamseySignalResults, + RamseyType, + _update, +) +from .utils import fitting, process_fit, ramsey_fit, ramsey_sequence + + +@dataclass +class RamseyZZParameters(RamseySignalParameters): + """RamseyZZ runcard inputs.""" + + target_qubit: Optional[QubitId] = None + """Target qubit that will be excited.""" + + +@dataclass +class RamseyZZResults(RamseySignalResults): + """RamseyZZ outputs.""" + + def __contains__(self, qubit: QubitId): + # TODO: to be improved + return all( + list(getattr(self, field.name))[0][0] == qubit + for field in fields(self) + if isinstance(getattr(self, field.name), dict) + ) + + +@dataclass +class RamseyZZData(RamseySignalData): + """RamseyZZ acquisition outputs.""" + + target_qubit: Optional[QubitId] = None + """Qubit that will be excited.""" + data: dict[tuple[QubitId, str], npt.NDArray[RamseyType]] = field( + default_factory=dict + ) + """Raw data acquired.""" + + +def _acquisition( + params: RamseyZZParameters, + platform: Platform, + targets: list[QubitId], +) -> RamseyZZData: + """Data acquisition for RamseyZZ Experiment. + + Standard Ramsey experiment repeated twice. + In the second execution one qubit is brought to the excited state. + """ + + waits = np.arange( + params.delay_between_pulses_start, + params.delay_between_pulses_end, + params.delay_between_pulses_step, + ) + + options = ExecutionParameters( + nshots=params.nshots, + relaxation_time=params.relaxation_time, + acquisition_type=AcquisitionType.DISCRIMINATION, + averaging_mode=AveragingMode.SINGLESHOT, + ) + + data = RamseyZZData( + detuning=params.detuning, + qubit_freqs={ + qubit: platform.qubits[qubit].native_gates.RX.frequency for qubit in targets + }, + target_qubit=params.target_qubit, + ) + + for setup in ["I", "X"]: + if not params.unrolling: + sequence = PulseSequence() + for qubit in targets: + sequence += ramsey_sequence( + platform=platform, + qubit=qubit, + detuning=params.detuning, + target_qubit=params.target_qubit if setup == "X" else None, + ) + + sweeper = Sweeper( + Parameter.start, + waits, + [sequence.get_qubit_pulses(qubit).qd_pulses[-1] for qubit in targets], + type=SweeperType.ABSOLUTE, + ) + + # execute the sweep + results = platform.sweep( + sequence, + options, + sweeper, + ) + + for qubit in targets: + probs = results[qubit].probability(state=1) + errors = [np.sqrt(prob * (1 - prob) / params.nshots) for prob in probs] + + else: + sequences, all_ro_pulses = [], [] + probs, errors = [], [] + for wait in waits: + sequence = PulseSequence() + for qubit in targets: + sequence += ramsey_sequence( + platform=platform, + qubit=qubit, + wait=wait, + detuning=params.detuning, + target_qubit=params.target_qubit if setup == "X" else None, + ) + + sequences.append(sequence) + all_ro_pulses.append(sequence.ro_pulses) + + results = platform.execute_pulse_sequences(sequences, options) + + for wait, ro_pulses in zip(waits, all_ro_pulses): + for qubit in targets: + prob = results[ro_pulses[qubit].serial][0].probability(state=1) + probs.append(prob) + errors.append(np.sqrt(prob * (1 - prob) / params.nshots)) + + for qubit in targets: + data.register_qubit( + RamseyType, + (qubit, setup), + dict( + wait=waits, + prob=probs, + errors=errors, + ), + ) + + return data + + +def _fit(data: RamseyZZData) -> RamseyZZResults: + """Fitting procedure for RamseyZZ protocol. + + Standard Ramsey fitting procedure is applied for both version of + the experiment. + + """ + waits = data.waits + popts = {} + freq_measure = {} + t2_measure = {} + delta_phys_measure = {} + delta_fitting_measure = {} + for qubit in data.qubits: + for setup in ["I", "X"]: + qubit_data = data[qubit, setup] + qubit_freq = data.qubit_freqs[qubit] + probs = qubit_data["prob"] + try: + popt, perr = fitting(waits, probs, qubit_data.errors) + ( + freq_measure[qubit, setup], + t2_measure[qubit, setup], + delta_phys_measure[qubit, setup], + delta_fitting_measure[qubit, setup], + popts[qubit, setup], + ) = process_fit(popt, perr, qubit_freq, data.detuning) + except Exception as e: + log.warning(f"Ramsey fitting failed for qubit {qubit} due to {e}.") + return RamseyZZResults( + detuning=data.detuning, + frequency=freq_measure, + t2=t2_measure, + delta_phys=delta_phys_measure, + delta_fitting=delta_fitting_measure, + fitted_parameters=popts, + ) + + +def _plot(data: RamseyZZData, target: QubitId, fit: RamseyZZResults = None): + """Plotting function for Ramsey Experiment.""" + + figures = [] + fitting_report = "" + + waits = data[target, "I"].wait + probs_I = data.data[target, "I"].prob + probs_X = data.data[target, "X"].prob + + error_bars_I = data.data[target, "I"].errors + error_bars_X = data.data[target, "X"].errors + fig = go.Figure( + [ + go.Scatter( + x=waits, + y=probs_I, + opacity=1, + name="I", + showlegend=True, + legendgroup="I ", + mode="lines", + ), + go.Scatter( + x=np.concatenate((waits, waits[::-1])), + y=np.concatenate( + (probs_I + error_bars_I, (probs_I - error_bars_I)[::-1]) + ), + fill="toself", + fillcolor=COLORBAND, + line=dict(color=COLORBAND_LINE), + showlegend=True, + name="Errors I", + ), + go.Scatter( + x=waits, + y=probs_X, + opacity=1, + name="X", + showlegend=True, + legendgroup="X", + mode="lines", + ), + go.Scatter( + x=np.concatenate((waits, waits[::-1])), + y=np.concatenate( + (probs_X + error_bars_X, (probs_X - error_bars_X)[::-1]) + ), + fill="toself", + fillcolor=COLORBAND, + line=dict(color=COLORBAND_LINE), + showlegend=True, + name="Errors X", + ), + ] + ) + + if fit is not None: + fig.add_trace( + go.Scatter( + x=waits, + y=ramsey_fit(waits, *fit.fitted_parameters[target, "I"]), + name="Fit I", + line=go.scatter.Line(dash="dot"), + ) + ) + + fig.add_trace( + go.Scatter( + x=waits, + y=ramsey_fit(waits, *fit.fitted_parameters[target, "X"]), + name="Fit X", + line=go.scatter.Line(dash="dot"), + ) + ) + fitting_report = table_html( + table_dict( + data.target_qubit, + [ + "ZZ [kHz]", + ], + [ + np.round( + (fit.frequency[target, "X"][0] - fit.frequency[target, "I"][0]) + * 1e-3, + 0, + ), + ], + ) + ) + + fig.update_layout( + showlegend=True, + xaxis_title="Time [ns]", + yaxis_title="Excited state probability", + ) + + figures.append(fig) + + return figures, fitting_report + + +ramsey_zz = Routine(_acquisition, _fit, _plot, _update) +"""Ramsey Routine object.""" diff --git a/src/qibocal/protocols/ramsey/utils.py b/src/qibocal/protocols/ramsey/utils.py index d3c3e95e33..f24eff7513 100644 --- a/src/qibocal/protocols/ramsey/utils.py +++ b/src/qibocal/protocols/ramsey/utils.py @@ -6,7 +6,7 @@ from qibolab.qubits import QubitId from scipy.optimize import curve_fit -from qibocal.protocols.utils import fallback_period, guess_period +from qibocal.protocols.utils import GHZ_TO_HZ, fallback_period, guess_period POPT_EXCEPTION = [0, 0, 0, 0, 1] """Fit parameters output to handle exceptions""" @@ -21,8 +21,9 @@ def ramsey_sequence( platform: Platform, qubit: QubitId, - wait: Optional[int] = 0, + wait: int = 0, detuning: Optional[int] = 0, + target_qubit: Optional[QubitId] = None, ): """Pulse sequence used in Ramsey (detuned) experiments. @@ -41,13 +42,17 @@ def ramsey_sequence( ) # apply detuning: - first_pi_half_pulse.frequency += detuning - second_pi_half_pulse.frequency += detuning + if detuning is not None: + first_pi_half_pulse.frequency += detuning + second_pi_half_pulse.frequency += detuning readout_pulse = platform.create_qubit_readout_pulse( qubit, start=second_pi_half_pulse.finish ) sequence.add(first_pi_half_pulse, second_pi_half_pulse, readout_pulse) + if target_qubit is not None: + x_pulse_target_qubit = platform.create_RX_pulse(target_qubit, start=0) + sequence.add(x_pulse_target_qubit) return sequence @@ -110,3 +115,35 @@ def fitting(x: list, y: list, errors: list = None) -> list: perr[4] / delta_x, ] return popt, perr + + +def process_fit( + popt: list[float], perr: list[float], qubit_frequency: float, detuning: float +): + """Processing Ramsey fitting results.""" + + delta_fitting = popt[2] / (2 * np.pi) + if detuning is not None: + sign = np.sign(detuning) + delta_phys = int(sign * (delta_fitting * GHZ_TO_HZ - np.abs(detuning))) + else: + delta_phys = int(delta_fitting * GHZ_TO_HZ) + + corrected_qubit_frequency = int(qubit_frequency - delta_phys) + t2 = 1 / popt[4] + new_frequency = [ + corrected_qubit_frequency, + perr[2] * GHZ_TO_HZ / (2 * np.pi), + ] + t2 = [t2, perr[4] * (t2**2)] + + delta_phys_measure = [ + -delta_phys, + perr[2] * GHZ_TO_HZ / (2 * np.pi), + ] + delta_fitting_measure = [ + -delta_fitting * GHZ_TO_HZ, + perr[2] * GHZ_TO_HZ / (2 * np.pi), + ] + + return new_frequency, t2, delta_phys_measure, delta_fitting_measure, popt diff --git a/src/qibocal/protocols/randomized_benchmarking/circuit_tools.py b/src/qibocal/protocols/randomized_benchmarking/circuit_tools.py new file mode 100644 index 0000000000..f0b5a0cb24 --- /dev/null +++ b/src/qibocal/protocols/randomized_benchmarking/circuit_tools.py @@ -0,0 +1,168 @@ +"""Collection of function to generate qibo circuits.""" + +import pathlib +from typing import Callable + +import numpy as np +from qibo import gates +from qibo.config import raise_error +from qibo.gates.abstract import Gate +from qibo.models import Circuit + +from qibocal.protocols.characterization.randomized_benchmarking.utils import ( + SINGLE_QUBIT_CLIFFORDS_NAMES, + find_cliffords, + generate_inv_dict_cliffords_file, + separator, +) + +GLOBAL_PHASES = [ + 1 + 0j, + -1 + 0j, + 0 + 1j, + 0 - 1j, + 0.707 + 0.707j, + -0.707 + 0.707j, + 0.707 - 0.707j, + -0.707 - 0.707j, +] + + +def layer_circuit(rb_gen: Callable, depth: int, qubit) -> tuple[Circuit, dict]: + """Creates a circuit of `depth` layers from a generator `layer_gen` yielding `Circuit` or `Gate` + and a dictionary with random indexes used to select the clifford gates. + + Args: + layer_gen (Callable): Should return gates or a full circuit specifying a layer. + depth (int): Number of layers. + + Returns: + Circuit: with `depth` many layers. + """ + + full_circuit = None + random_indexes = [] + # Build each layer, there will be depth many in the final circuit. + qubits_str = [str(qubit)] + + for _ in range(depth): + # Generate a layer. + new_layer, random_index = rb_gen.layer_gen() + # Ensure new_layer is a circuit + if isinstance(new_layer, Gate): + new_circuit = Circuit(1) + new_circuit.add(new_layer) + random_indexes.append(random_index) + + # We are only using this for the RB we have right now + elif all(isinstance(gate, Gate) for gate in new_layer): + new_circuit = Circuit(1, wire_names=qubits_str) + new_circuit.add(new_layer) + random_indexes.append(random_index) + + elif isinstance(new_layer, Circuit): + new_circuit = new_layer + else: + raise_error( + TypeError, + f"layer_gen must return type Circuit or Gate, but it is type {type(new_layer)}.", + ) + if full_circuit is None: # instantiate in first loop + full_circuit = Circuit(new_circuit.nqubits) + full_circuit = full_circuit + new_circuit + return full_circuit, random_indexes + + +def layer_2q_circuit(rb_gen: Callable, depth: int, qubits) -> tuple[Circuit, dict]: + """Creates a circuit of `depth` layers from a generator `layer_gen` yielding `Circuit` or `Gate` + and a dictionary with random indexes used to select the clifford gates. + + Args: + layer_gen (Callable): Should return gates or a full circuit specifying a layer. + depth (int): Number of layers. + + Returns: + Circuit: with `depth` many layers. + """ + + full_circuit = None + random_indexes = [] + # Build each layer, there will be depth many in the final circuit. + for _ in range(depth): + # Generate a layer. + new_layer, random_index = rb_gen.layer_gen() + new_circuit = Circuit(2) + for gate in new_layer: + new_circuit.add(gate) + random_indexes.append(random_index) + + if full_circuit is None: # instantiate in first loop + full_circuit = Circuit(new_circuit.nqubits) + full_circuit = full_circuit + new_circuit + return full_circuit, random_indexes + + +def add_inverse_layer(circuit: Circuit, single_qubit=True): + """Adds an inverse gate/inverse gates at the end of a circuit (in place). + + Args: + circuit (Circuit): circuit + """ + + if circuit.depth > 0: + circuit.add(gates.Unitary(circuit.unitary(), *range(circuit.nqubits)).dagger()) + + +def add_inverse_2q_layer(circuit: Circuit, two_qubit_cliffords, file_inv): + """Adds an inverse gate/inverse gates at the end of a circuit (in place). + + Args: + circuit (Circuit): circuit + """ + + path = pathlib.Path(__file__).parent / file_inv + if file_inv is None and not path.is_file(): + clifford_matrices_inv = generate_inv_dict_cliffords_file( + two_qubit_cliffords, file_inv + ) + else: + clifford_matrices_inv = np.load(path) + + if circuit.depth > 0: + clifford = circuit.unitary() + + cliffords = [clifford * global_phase for global_phase in GLOBAL_PHASES] + cliffords_inv = [np.linalg.inv(clifford).round(3) for clifford in cliffords] + + for clifford_inv in cliffords_inv: + clifford_inv += 0.0 + 0.0j + clifford_inv_str = np.array2string(clifford_inv, separator=",") + if clifford_inv_str in clifford_matrices_inv.files: + index_inv = clifford_matrices_inv[clifford_inv_str] + + clifford = two_qubit_cliffords[str(index_inv)] + + gate_list = clifford.split(",") + + clifford_list = find_cliffords(gate_list) + + clifford_gate = [] + for clifford in clifford_list: + values_with_1, values_with_2, value_with_CZ = separator(clifford) + clifford_gate.append(SINGLE_QUBIT_CLIFFORDS_NAMES[values_with_1](0)) + clifford_gate.append(SINGLE_QUBIT_CLIFFORDS_NAMES[values_with_2](1)) + if value_with_CZ: + clifford_gate.append(gates.CZ(0, 1)) + + for gate in clifford_gate: + circuit.add(gate) + + +def add_measurement_layer(circuit: Circuit): + """Adds a measurement layer at the end of the circuit. + + Args: + circuit (Circuit): Measurement gates added in place to end of this circuit. + """ + + circuit.add(gates.M(*range(circuit.nqubits))) diff --git a/src/qibocal/protocols/randomized_benchmarking/noisemodels.py b/src/qibocal/protocols/randomized_benchmarking/noisemodels.py deleted file mode 100644 index 4c9672aeaa..0000000000 --- a/src/qibocal/protocols/randomized_benchmarking/noisemodels.py +++ /dev/null @@ -1,52 +0,0 @@ -""" Custom error models are build here for making it possible to pass -strings describing the error model via runcards in qibocal. -They inherit from the qibo noise NoiseModel module and are prebuild. -""" - -from typing import Optional - -import numpy as np -from qibo import gates -from qibo.noise import NoiseModel, PauliError - -from qibocal.config import raise_error - - -class PauliErrorOnAll(NoiseModel): - """Builds a noise model with pauli flips - acting on all gates in a Circuit. - If no initial parameters for px, py, pz are given, random values - are drawn (in sum not bigger than 1). - """ - - def __init__(self, probabilities: Optional[list] = None) -> None: - super().__init__() - # Check if number of arguments is 0 or 1 and if it's equal to None - if not probabilities: - # Assign random values to params. - self.params = np.random.uniform(0, 0.25, size=3).round(3) - elif len(probabilities) == 3: - self.params = np.array(probabilities) - else: - # Raise ValueError if given paramters are wrong. - raise_error( - ValueError, - f"Wrong number of error parameters, 3 != {len(probabilities)}.", - ) - self.build() - - def build(self): - # Add PauliError to gates.Gate - self.add(PauliError(list(zip(["X", "Y", "Z"], self.params)))) - - -class PauliErrorOnX(PauliErrorOnAll): - """Builds a noise model with pauli flips acting on X gates. - Inherited from ``PauliErrorOnAll`` but the ``build`` method is - overwritten to act on X gates. - If no initial parameters for px, py, pz are given, random values - are drawn (in sum not bigger than 1). - """ - - def build(self): - self.add(PauliError(list(zip(["X", "Y", "Z"], self.params))), gates.X) diff --git a/src/qibocal/protocols/randomized_benchmarking/standard_rb.py b/src/qibocal/protocols/randomized_benchmarking/standard_rb.py index 0788afabfd..c001b07a51 100644 --- a/src/qibocal/protocols/randomized_benchmarking/standard_rb.py +++ b/src/qibocal/protocols/randomized_benchmarking/standard_rb.py @@ -1,4 +1,4 @@ -from dataclasses import dataclass, field +from dataclasses import dataclass from typing import Iterable, Optional, TypedDict, Union import numpy as np @@ -6,16 +6,17 @@ from qibolab.platform import Platform from qibolab.qubits import QubitId -from qibocal.auto.operation import Parameters, Routine +from qibocal.auto.operation import Parameters, Results, Routine from ..utils import table_dict, table_html -from .fitting import exp1B_func -from .utils import RBData, StandardRBResult, fit, number_to_str, rb_acquisition +from .fitting import exp1B_func, fit_exp1B_func +from .utils import RBData, data_uncertainties, number_to_str, rb_acquisition + +NPULSES_PER_CLIFFORD = 23 * 2 / 24 # 1.875 class Depthsdict(TypedDict): - """Dictionary used to build a list of depths as ``range(start, stop, - step)``.""" + """dictionary used to build a list of depths as ``range(start, stop, step)``.""" start: int stop: int @@ -27,39 +28,23 @@ class StandardRBParameters(Parameters): """Standard Randomized Benchmarking runcard inputs.""" depths: Union[list, Depthsdict] - """A list of depths/sequence lengths. - - If a dictionary is given the list will be build. - """ + """A list of depths/sequence lengths. If a dictionary is given the list will be build.""" niter: int """Sets how many iterations over the same depth value.""" uncertainties: Optional[float] = None - """Method of computing the error bars of the signal and uncertainties of - the fit. - - If ``None``, - it computes the standard deviation. Otherwise it computes the corresponding confidence interval. Defaults `None`. - """ + """Method of computing the error bars of the signal and uncertainties of the fit. If ``None``, + it computes the standard deviation. Otherwise it computes the corresponding confidence interval. Defaults `None`.""" unrolling: bool = False - """If ``True`` it uses sequence unrolling to deploy multiple circuits in a - single instrument call. - - Defaults to ``False``. - """ + """If ``True`` it uses sequence unrolling to deploy multiple circuits in a single instrument call. + Defaults to ``False``.""" seed: Optional[int] = None """A fixed seed to initialize ``np.random.Generator``. If ``None``, uses a random seed. Defaults is ``None``. """ - noise_model: Optional[str] = None - """For simulation purposes, string has to match what is in - :mod:`qibocal.protocols.randomized_benchmarking.noisemodels`""" - noise_params: Optional[list] = field(default_factory=list) - """With this the noise model will be initialized, if not given random - values will be used.""" nshots: int = 10 - """Just to add the default value.""" + """Just to add the default value""" def __post_init__(self): if isinstance(self.depths, dict): @@ -68,6 +53,94 @@ def __post_init__(self): ) +@dataclass +class StandardRBResult(Results): + """Standard RB outputs.""" + + fidelity: dict[QubitId, float] + """The overall fidelity of this qubit.""" + pulse_fidelity: dict[QubitId, float] + """The pulse fidelity of the gates acting on this qubit.""" + fit_parameters: dict[QubitId, tuple[float, float, float]] + """Raw fitting parameters.""" + fit_uncertainties: dict[QubitId, tuple[float, float, float]] + """Fitting parameters uncertainties.""" + error_bars: dict[QubitId, Optional[Union[float, list[float]]]] = None + """Error bars for y.""" + + # FIXME: fix this after https://github.com/qiboteam/qibocal/pull/597 + def __contains__(self, qubit: QubitId): + return True + + +class RB_Generator: + """ + This class generates random single qubit cliffords for randomized benchmarking. + """ + + def __init__(self, seed): + self.seed = seed + self.local_state = ( + np.random.default_rng(seed) + if seed is None or isinstance(seed, int) + else seed + ) + + def random_index(self, gate_list): + """ + Generates a random index within the range of the given gate list. + + Parameters: + - gate_list (list): List of gates. + + Returns: + - int: Random index. + """ + return self.local_state.integers(0, len(gate_list), 1) + + def layer_gen(self): + """ + Returns: + - Gate: Random single-qubit clifford . + """ + return random_clifford(self.random_index) + + +def random_circuits( + depth: int, + targets: list[QubitId], + niter, + rb_gen, + noise_model=None, +) -> Iterable: + """Returns single-qubit random self-inverting Clifford circuits. + + Args: + params (StandardRBParameters): Parameters of the RB protocol. + targets (list[QubitId]): + list of qubits the circuit is executed on. + nqubits (int, optional): Number of qubits of the resulting circuits. + If ``None``, sets ``len(qubits)``. Defaults to ``None``. + + Returns: + Iterable: The iterator of circuits. + """ + + circuits = [] + indexes = defaultdict(list) + for _ in range(niter): + for target in targets: + circuit, random_index = layer_circuit(rb_gen, depth, target) + add_inverse_layer(circuit) + add_measurement_layer(circuit) + if noise_model is not None: + circuit = noise_model.apply(circuit) + circuits.append(circuit) + indexes[target].append(random_index) + + return circuits, indexes + + def _acquisition( params: StandardRBParameters, platform: Platform, @@ -88,12 +161,12 @@ def _acquisition( RBData: The depths, samples and ground state probability of each experiment in the scan. """ - return rb_acquisition(params, platform, targets) + return rb_acquisition(params, targets) def _fit(data: RBData) -> StandardRBResult: - """Takes a data frame, extracts the depths and the signal and fits it with - an exponential function y = Ap^x+B. + """Takes a data frame, extracts the depths and the signal and fits it with an + exponential function y = Ap^x+B. Args: data (RBData): Data from the data acquisition stage. @@ -101,14 +174,49 @@ def _fit(data: RBData) -> StandardRBResult: Returns: StandardRBResult: Aggregated and processed data. """ - return fit(data.qubits, data) + qubits = data.qubits + + fidelity, pulse_fidelity = {}, {} + popts, perrs = {}, {} + error_barss = {} + for qubit in qubits: + # Extract depths and probabilities + x = data.depths + probs = data.extract_probabilities(qubit) + samples_mean = np.mean(probs, axis=1) + # TODO: Should we use the median or the mean? + median = np.median(probs, axis=1) + + error_bars = data_uncertainties( + probs, + method=data.uncertainties, + data_median=median, + ) + + sigma = ( + np.max(error_bars, axis=0) if data.uncertainties is not None else error_bars + ) + + popt, perr = fit_exp1B_func(x, samples_mean, sigma=sigma, bounds=[0, 1]) + # Compute the fidelities + infidelity = (1 - popt[1]) / 2 + fidelity[qubit] = 1 - infidelity + pulse_fidelity[qubit] = 1 - infidelity / NPULSES_PER_CLIFFORD + + # conversion from np.array to list/tuple + error_bars = error_bars.tolist() + error_barss[qubit] = error_bars + perrs[qubit] = perr + popts[qubit] = popt + + return StandardRBResult(fidelity, pulse_fidelity, popts, perrs, error_barss) def _plot( data: RBData, fit: StandardRBResult, target: QubitId ) -> tuple[list[go.Figure], str]: - """Builds the table for the qq pipe, calls the plot function of the result - object and returns the figure es list. + """Builds the table for the qq pipe, calls the plot function of the result object + and returns the figure es list. Args: data (RBData): Data object used for the table. @@ -118,8 +226,7 @@ def _plot( Returns: tuple[list[go.Figure], str]: """ - if isinstance(target, list): - target = tuple(target) + qubit = target fig = go.Figure() fitting_report = "" @@ -193,11 +300,10 @@ def _plot( name="error bars", ) ) - if fit is not None: fitting_report = table_html( table_dict( - str(qubit), + qubit, ["niter", "nshots", "uncertainties", "fidelity", "pulse_fidelity"], [ data.niter, @@ -210,7 +316,7 @@ def _plot( number_to_str( fit.pulse_fidelity[qubit], np.array(fit.fit_uncertainties[qubit][1]) - / (2 * data.npulses_per_clifford), + / (2 * NPULSES_PER_CLIFFORD), ), ], ) diff --git a/src/qibocal/protocols/randomized_benchmarking/standard_rb_2q.py b/src/qibocal/protocols/randomized_benchmarking/standard_rb_2q.py index 79cb260b91..d76aa59ec7 100644 --- a/src/qibocal/protocols/randomized_benchmarking/standard_rb_2q.py +++ b/src/qibocal/protocols/randomized_benchmarking/standard_rb_2q.py @@ -32,7 +32,7 @@ def _acquisition( ) -> RB2QData: """Data acquisition for two qubit Standard Randomized Benchmarking.""" - return twoq_rb_acquisition(params, platform, targets) + return twoq_rb_acquisition(params, targets) def _fit(data: RB2QData) -> StandardRBResult: diff --git a/src/qibocal/protocols/randomized_benchmarking/utils.py b/src/qibocal/protocols/randomized_benchmarking/utils.py index 381056e8fc..ef85ba8295 100644 --- a/src/qibocal/protocols/randomized_benchmarking/utils.py +++ b/src/qibocal/protocols/randomized_benchmarking/utils.py @@ -7,8 +7,7 @@ import numpy as np import numpy.typing as npt from qibo import gates -from qibo.backends import GlobalBackend -from qibo.config import raise_error +from qibo.backends import construct_backend from qibo.models import Circuit from qibolab.platform import Platform from qibolab.qubits import QubitId, QubitPairId @@ -19,8 +18,6 @@ execute_transpiled_circuit, execute_transpiled_circuits, ) -from qibocal.config import raise_error -from qibocal.protocols.randomized_benchmarking import noisemodels from qibocal.protocols.randomized_benchmarking.dict_utils import ( SINGLE_QUBIT_CLIFFORDS_NAMES, calculate_pulses_clifford, @@ -118,7 +115,6 @@ def random_circuits( targets: list[Union[QubitId, QubitPairId]], niter, rb_gen, - noise_model=None, inverse_layer=True, single_qubit=True, file_inv=pathlib.Path(), @@ -134,8 +130,6 @@ def random_circuits( if inverse_layer: add_inverse_layer(circuit, rb_gen, single_qubit, file_inv) add_measurement_layer(circuit) - if noise_model is not None: - circuit = noise_model.apply(circuit) circuits.append(circuit) indexes[target].append(random_index) @@ -169,7 +163,7 @@ def number_to_str( if isinstance(uncertainty, Number): if precision is None: precision = (significant_digit(uncertainty) + 1) or 3 - return f"{value:.{precision}f} \u00B1 {uncertainty:.{precision}f}" + return f"{value:.{precision}f} \u00b1 {uncertainty:.{precision}f}" # If any uncertainty is None, return the value with precision if any(u is None for u in uncertainty): @@ -181,7 +175,7 @@ def number_to_str( # Check if both uncertainties are equal up to precision if np.round(uncertainty[0], precision) == np.round(uncertainty[1], precision): - return f"{value:.{precision}f} \u00B1 {uncertainty[0]:.{precision}f}" + return f"{value:.{precision}f} \u00b1 {uncertainty[0]:.{precision}f}" return f"{value:.{precision}f} +{uncertainty[1]:.{precision}f} / -{uncertainty[0]:.{precision}f}" @@ -341,7 +335,7 @@ def setup( interleave: Optional[str] = None, ): """ - Set up the randomized benchmarking experiment backend, noise model and data class. + Set up the randomized benchmarking experiment backend and data class. Args: params (Parameters): The parameters for the experiment. @@ -349,22 +343,9 @@ def setup( interleave: (str, optional): The type of interleaving to apply. Defaults to None. Returns: - tuple: A tuple containing the experiment data, noise model, and backend. + tuple: A tuple containing the experiment data and backend. """ - - backend = GlobalBackend() - backend.platform = platform - # For simulations, a noise model can be added. - noise_model = None - if params.noise_model is not None: - if backend.name == "qibolab": - raise_error( - ValueError, - "Backend qibolab (%s) does not perform noise models simulation. ", - ) - - noise_model = getattr(noisemodels, params.noise_model)(params.noise_params) - params.noise_params = noise_model.params.tolist() + backend = construct_backend(backend="qibolab", platform=platform) # Set up the scan (here an iterator of circuits of random clifford gates with an inverse). if single_qubit: cls = RBData @@ -380,12 +361,10 @@ def setup( niter=params.niter, ) - return data, noise_model, backend + return data, backend -def get_circuits( - params, targets, add_inverse_layer, interleave, noise_model, single_qubit=True -): +def get_circuits(params, targets, add_inverse_layer, interleave, single_qubit=True): """ Generate randomized benchmarking circuits. @@ -394,7 +373,6 @@ def get_circuits( targets (list): List of target qubit IDs. add_inverse_layer (bool): Flag indicating whether to add an inverse layer to the circuits. interleave (str): String indicating whether to interleave the circuits with the given gate. - noise_model (str): Noise model string. single_qubit (bool, optional): Flag indicating whether to generate single qubit circuits. Returns: @@ -421,7 +399,6 @@ def get_circuits( qubits_ids, params.niter, rb_gen, - noise_model, add_inverse_layer, single_qubit, inv_file, @@ -455,6 +432,7 @@ def execute_circuits(circuits, targets, params, backend, single_qubit=True): """ # Execute the circuits + platform = backend.platform transpiler = dummy_transpiler(backend) qubit_maps = ( [[i] for i in targets] * (len(params.depths) * params.niter) @@ -503,9 +481,9 @@ def rb_acquisition( Returns: RBData: The depths, samples, and ground state probability of each experiment in the scan. """ - data, noise_model, backend = setup(params, platform, single_qubit=True) + data, backend = setup(params, platform, single_qubit=True) circuits, indexes, npulses_per_clifford = get_circuits( - params, targets, add_inverse_layer, interleave, noise_model, single_qubit=True + params, targets, add_inverse_layer, interleave, single_qubit=True ) executed_circuits = execute_circuits(circuits, targets, params, backend) @@ -549,10 +527,10 @@ def twoq_rb_acquisition( Returns: RB2QData: The acquired data for two qubit randomized benchmarking. """ - - data, noise_model, backend = setup(params, platform, single_qubit=False) + targets = [tuple(pair) if isinstance(pair, list) else pair for pair in targets] + data, backend = setup(params, platform, single_qubit=False) circuits, indexes, npulses_per_clifford = get_circuits( - params, targets, add_inverse_layer, interleave, noise_model, single_qubit=False + params, targets, add_inverse_layer, interleave, single_qubit=False ) executed_circuits = execute_circuits( circuits, targets, params, backend, single_qubit=False @@ -585,7 +563,7 @@ def twoq_rb_acquisition( def layer_circuit( rb_gen: Callable, depth: int, target, interleave: str = None -) -> tuple[Circuit, dict]: +) -> tuple[Circuit, list]: """Creates a circuit of `depth` layers from a generator `layer_gen` yielding `Circuit` or `Gate` and a dictionary with random indexes used to select the clifford gates. @@ -601,14 +579,14 @@ def layer_circuit( random_indexes = [] if isinstance(target, (str, int)): nqubits = 1 - rb_gen_layer = rb_gen.layer_gen_single_qubit() + rb_gen_layer = rb_gen.layer_gen_single_qubit elif isinstance(target, Tuple): # Tuple for qubit pair nqubits = 2 - rb_gen_layer = rb_gen.layer_gen_two_qubit() + rb_gen_layer = rb_gen.layer_gen_two_qubit # Build each layer, there will be depth many in the final circuit. for _ in range(depth): # Generate a layer. - new_layer, random_index = rb_gen_layer + new_layer, random_index = rb_gen_layer() random_indexes.append(random_index) new_circuit = Circuit(nqubits) if nqubits == 1: diff --git a/src/qibocal/protocols/readout_mitigation_matrix.py b/src/qibocal/protocols/readout_mitigation_matrix.py index 61397e4f55..9d12b3f7e7 100644 --- a/src/qibocal/protocols/readout_mitigation_matrix.py +++ b/src/qibocal/protocols/readout_mitigation_matrix.py @@ -5,26 +5,20 @@ import numpy.typing as npt import plotly.express as px from qibo import gates -from qibo.backends import GlobalBackend +from qibo.backends import construct_backend from qibo.models import Circuit -from qibolab import ExecutionParameters from qibolab.platform import Platform -from qibolab.pulses import PulseSequence from qibolab.qubits import QubitId from qibocal.auto.operation import Data, Parameters, Results, Routine from qibocal.auto.transpile import dummy_transpiler, execute_transpiled_circuit from qibocal.config import log -from .utils import calculate_frequencies - @dataclass class ReadoutMitigationMatrixParameters(Parameters): """ReadoutMitigationMatrix matrix inputs.""" - pulses: Optional[bool] = True - """Get readout mitigation matrix using pulses. If False gates will be used.""" nshots: Optional[int] = None """Number of shots.""" relaxation_time: Optional[int] = None @@ -37,10 +31,14 @@ class ReadoutMitigationMatrixResults(Results): field(default_factory=dict) ) """Readout mitigation matrices (inverse of measurement matrix).""" - measurement_matrix: dict[tuple[QubitId, ...], npt.NDArray[np.float64]] = field( - default_factory=dict - ) - """Matrix containing measurement matrices for each state.""" + + +ReadoutMitigationMatrixType = np.dtype( + [ + ("state", int), + ("frequency", np.float64), + ] +) @dataclass @@ -54,40 +52,6 @@ class ReadoutMitigationMatrixData(Data): data: dict = field(default_factory=dict) """Raw data acquited.""" - def add(self, qubits, state, freqs): - for result_state, freq in freqs.items(): - self.data[ - qubits - + ( - state, - result_state, - ) - ] = freq - - for basis in [format(i, f"0{len(qubits)}b") for i in range(2 ** len(qubits))]: - if ( - qubits - + ( - state, - basis, - ) - not in self.data - ): - self.data[ - qubits - + ( - state, - basis, - ) - ] = 0 - - def __getitem__(self, qubits): - return { - index: value - for index, value in self.data.items() - if qubits == list(index[: len(index) - 2]) - } - def _acquisition( params: ReadoutMitigationMatrixParameters, @@ -97,83 +61,59 @@ def _acquisition( data = ReadoutMitigationMatrixData( nshots=params.nshots, qubit_list=[list(qq) for qq in targets] ) - backend = GlobalBackend() - backend.platform = platform + backend = construct_backend("qibolab", platform=platform) transpiler = dummy_transpiler(backend) qubit_map = [i for i in range(platform.nqubits)] for qubits in targets: nqubits = len(qubits) for i in range(2**nqubits): state = format(i, f"0{nqubits}b") - if params.pulses: - sequence = PulseSequence() - for q, bit in enumerate(state): - if bit == "1": - sequence.add( - platform.create_RX_pulse( - qubits[q], start=0, relative_phase=0 - ) - ) - measurement_start = sequence.finish - for q in range(len(state)): - MZ_pulse = platform.create_MZ_pulse( - qubits[q], start=measurement_start - ) - sequence.add(MZ_pulse) - results = platform.execute_pulse_sequence( - sequence, ExecutionParameters(nshots=params.nshots) - ) - data.add( - tuple(qubits), state, calculate_frequencies(results, tuple(qubits)) - ) - else: - c = Circuit( - platform.nqubits, - wire_names=[str(i) for i in range(platform.nqubits)], + c = Circuit( + nqubits, + ) + for q, bit in enumerate(state): + if bit == "1": + c.add(gates.X(q)) + c.add(gates.M(*range(nqubits))) + _, results = execute_transpiled_circuit( + c, qubits, backend, nshots=params.nshots, transpiler=transpiler + ) + frequencies = np.zeros(2 ** len(qubits)) + for i, freq in results.frequencies().items(): + frequencies[int(i, 2)] = freq + for freq in frequencies: + data.register_qubit( + ReadoutMitigationMatrixType, + (qubits), + dict( + state=np.array([int(state, 2)]), + frequency=freq, + ), ) - for q, bit in enumerate(state): - if bit == "1": - c.add(gates.X(qubits[q])) - c.add(gates.M(qubits[q])) - _, results = execute_transpiled_circuit( - c, qubit_map, backend, nshots=params.nshots, transpiler=transpiler - ) - data.add(tuple(qubits), state, dict(results.frequencies())) return data def _fit(data: ReadoutMitigationMatrixData) -> ReadoutMitigationMatrixResults: """Post processing for readout mitigation matrix protocol.""" readout_mitigation_matrix = {} - measurement_matrix = {} - for qubit in data.qubit_list: - qubit_data = data[qubit] - matrix = np.zeros((2 ** len(qubit), 2 ** len(qubit))) - computational_basis = [ - format(i, f"0{len(qubit)}b") for i in range(2 ** len(qubit)) - ] - for state in computational_basis: - column = np.zeros(2 ** len(qubit)) - qubit_state_data = { - index: value - for index, value in qubit_data.items() - if index[-2] == state - } - for index, value in qubit_state_data.items(): - column[(int(index[-1], 2))] = value / data.nshots - matrix[:, int(state, 2)] = np.flip(column) - - measurement_matrix[tuple(qubit)] = matrix.tolist() + for qubits in data.qubit_list: + qubit_data = data.data[tuple(qubits)] + mitigation_matrix = [] + for state in range(2 ** len(qubits)): + mitigation_matrix.append(qubit_data[qubit_data.state == state].frequency) + mitigation_matrix = np.vstack(mitigation_matrix) / data.nshots try: - readout_mitigation_matrix[tuple(qubit)] = np.linalg.inv(matrix).tolist() + readout_mitigation_matrix[tuple(qubits)] = np.linalg.inv( + mitigation_matrix + ).tolist() except np.linalg.LinAlgError as e: log.warning(f"ReadoutMitigationMatrix: the fitting was not succesful. {e}") - - return ReadoutMitigationMatrixResults( + res = ReadoutMitigationMatrixResults( readout_mitigation_matrix=readout_mitigation_matrix, - measurement_matrix=measurement_matrix, ) + return res + def _plot( data: ReadoutMitigationMatrixData, @@ -184,25 +124,30 @@ def _plot( fitting_report = "" figs = [] if fit is not None: - computational_basis = [ - format(i, f"0{len(target)}b") for i in range(2 ** len(target)) - ] - z = fit.measurement_matrix[tuple(target)] - - fig = px.imshow( - z, - x=computational_basis, - y=computational_basis[::-1], - text_auto=True, - labels={ - "x": "Prepeared States", - "y": "Measured States", - "color": "Probabilities", - }, - width=700, - height=700, - ) - figs.append(fig) + if tuple(target) in fit.readout_mitigation_matrix: + computational_basis = [ + format(i, f"0{len(target)}b") for i in range(2 ** len(target)) + ] + # use pinv since it should be already invertibile + # however when casting to list we could lose precision + measurement_matrix = np.linalg.pinv( + fit.readout_mitigation_matrix[tuple(target)] + ) + z = measurement_matrix + fig = px.imshow( + z, + x=computational_basis, + y=computational_basis, + text_auto=True, + labels={ + "x": "Prepeared States", + "y": "Measured States", + "color": "Probabilities", + }, + width=700, + height=700, + ) + figs.append(fig) return figs, fitting_report diff --git a/src/qibocal/protocols/readout_optimization/resonator_amplitude.py b/src/qibocal/protocols/readout_optimization/resonator_amplitude.py index 6826d2757a..631286f3f5 100644 --- a/src/qibocal/protocols/readout_optimization/resonator_amplitude.py +++ b/src/qibocal/protocols/readout_optimization/resonator_amplitude.py @@ -14,6 +14,7 @@ from qibocal.auto.operation import Data, Parameters, Results, Routine from qibocal.fitting.classifier.qubit_fit import QubitFit from qibocal.protocols.utils import table_dict, table_html +from qibolab.sweeper import Parameter, Sweeper, SweeperType @dataclass @@ -83,63 +84,77 @@ def _acquisition( """ data = ResonatorAmplitudeData() - for qubit in targets: + if True: error = 1 - old_amp = platform.qubits[qubit].native_gates.MZ.amplitude - new_amp = params.amplitude_start - while error > params.error_threshold and new_amp <= params.amplitude_stop: - platform.qubits[qubit].native_gates.MZ.amplitude = new_amp - sequence_0 = PulseSequence() - sequence_1 = PulseSequence() - - qd_pulses = platform.create_RX_pulse(qubit, start=0) - ro_pulses = platform.create_qubit_readout_pulse( - qubit, start=qd_pulses.finish - ) - sequence_0.add(ro_pulses) - sequence_1.add(qd_pulses) - sequence_1.add(ro_pulses) - - state0_results = platform.execute_pulse_sequence( - sequence_0, - ExecutionParameters( - nshots=params.nshots, - relaxation_time=params.relaxation_time, - acquisition_type=AcquisitionType.INTEGRATION, - ), - ) + + amplitude_range = np.arange( + params.amplitude_start, params.amplitude_stop, params.amplitude_step + ) + + sequence_0 = PulseSequence() + sequence_1 = PulseSequence() + + qd_pulses, ro_pulses = {},{} + for qubit in targets: + qd_pulses[qubit] = platform.create_RX_pulse(qubit, start=0) + ro_pulses[qubit] = platform.create_qubit_readout_pulse(qubit, start=qd_pulses[qubit].finish) + + sequence_0.add(ro_pulses[qubit]) + sequence_1.add(qd_pulses[qubit]) + sequence_1.add(ro_pulses[qubit]) + + sweeper = Sweeper( + Parameter.amplitude, + amplitude_range, + pulses=[ro_pulses[qubit] for qubit in targets], + type=SweeperType.ABSOLUTE, + ) + + results_0 = platform.sweep( + sequence_0, + ExecutionParameters( + nshots=params.nshots, + relaxation_time=params.relaxation_time, + acquisition_type=AcquisitionType.INTEGRATION, + ), + sweeper, + ) + + results_1 = platform.sweep( + sequence_1, + ExecutionParameters( + nshots=params.nshots, + relaxation_time=params.relaxation_time, + acquisition_type=AcquisitionType.INTEGRATION, + ), + sweeper, + ) + + for qubit in targets: + for k, amp in enumerate(delta_amplitude_range := amplitude_range): + i_values = [] + q_values = [] + states = [] + for i, results in enumerate([results_0, results_1]): + result = results[ro_pulses[qubit].serial] + i_values.extend(result.voltage_i[:, k]) + q_values.extend(result.voltage_q[:, k]) + states.extend([i] * len(result.voltage_i[:, k])) + + model = QubitFit() + model.fit(np.stack((i_values, q_values), axis=-1), np.array(states)) + error = model.probability_error + data.register_qubit( + ResonatorAmplitudeType, + (qubit), + dict( + amp=np.array([amp]), + error=np.array([error]), + angle=np.array([model.angle]), + threshold=np.array([model.threshold]), + ), + ) - state1_results = platform.execute_pulse_sequence( - sequence_1, - ExecutionParameters( - nshots=params.nshots, - relaxation_time=params.relaxation_time, - acquisition_type=AcquisitionType.INTEGRATION, - ), - ) - result0 = state0_results[ro_pulses.serial] - result1 = state1_results[ro_pulses.serial] - - i_values = np.concatenate((result0.voltage_i, result1.voltage_i)) - q_values = np.concatenate((result0.voltage_q, result1.voltage_q)) - iq_values = np.stack((i_values, q_values), axis=-1) - nshots = int(len(i_values) / 2) - states = [0] * nshots + [1] * nshots - model = QubitFit() - model.fit(iq_values, np.array(states)) - error = model.probability_error - data.register_qubit( - ResonatorAmplitudeType, - (qubit), - dict( - amp=np.array([new_amp]), - error=np.array([error]), - angle=np.array([model.angle]), - threshold=np.array([model.threshold]), - ), - ) - platform.qubits[qubit].native_gates.MZ.amplitude = old_amp - new_amp += params.amplitude_step return data diff --git a/src/qibocal/protocols/readout_optimization/resonator_frequency.py b/src/qibocal/protocols/readout_optimization/resonator_frequency.py index b31daf1d17..c9a27609fd 100644 --- a/src/qibocal/protocols/readout_optimization/resonator_frequency.py +++ b/src/qibocal/protocols/readout_optimization/resonator_frequency.py @@ -141,9 +141,9 @@ def _acquisition( states = [] for i, results in enumerate([results_0, results_1]): result = results[ro_pulses[qubit].serial] - i_values.extend(result.voltage_i[k]) - q_values.extend(result.voltage_q[k]) - states.extend([i] * len(result.voltage_i[k])) + i_values.extend(result.voltage_i[:, k]) + q_values.extend(result.voltage_q[:, k]) + states.extend([i] * len(result.voltage_i[:, k])) model = QubitFit() model.fit(np.stack((i_values, q_values), axis=-1), np.array(states)) @@ -151,7 +151,7 @@ def _acquisition( ResonatorFrequencyType, (qubit), dict( - freq=np.array([(ro_pulses[qubit].frequency + freq)]), + freq=np.array([ro_pulses[qubit].frequency + freq]), assignment_fidelity=np.array([model.assignment_fidelity]), angle=np.array([model.angle]), threshold=np.array([model.threshold]), diff --git a/src/qibocal/protocols/resonator_punchout.py b/src/qibocal/protocols/resonator_punchout.py index 58ad1dbf68..0c9b5b7fd6 100644 --- a/src/qibocal/protocols/resonator_punchout.py +++ b/src/qibocal/protocols/resonator_punchout.py @@ -15,7 +15,7 @@ from qibocal.auto.operation import Data, Parameters, Results, Routine from .utils import HZ_TO_GHZ, fit_punchout, norm, table_dict, table_html - +MHZ_TO_GHZ = 1e-3 @dataclass class ResonatorPunchoutParameters(Parameters): @@ -33,6 +33,8 @@ class ResonatorPunchoutParameters(Parameters): """Step amplitude multiplicative factor.""" amplitude: float = None """Initial readout amplitude.""" + phase_delay: float = None + """Phase delay correction in rad/MHz (us). By default no correction is performed.""" @dataclass @@ -147,10 +149,18 @@ def _acquisition( for qubit, ro_pulse in ro_pulses.items(): # average signal, phase, i and q over the number of shots defined in the runcard result = results[ro_pulse.serial] + + phase = result.phase + # Phase is a 2D array, we need to unwrap in the frequency dimension + if params.phase_delay is not None: + phase = np.unwrap(phase, axis = 1) + ( + delta_frequency_range*HZ_TO_GHZ * params.phase_delay/ (2 * np.pi*MHZ_TO_GHZ) + ) + data.register_qubit( qubit, signal=result.magnitude, - phase=result.phase, + phase=phase, freq=delta_frequency_range + ro_pulse.frequency, amp=amplitude_range * amplitudes[qubit], ) diff --git a/src/qibocal/protocols/resonator_punchout_attenuation.py b/src/qibocal/protocols/resonator_punchout_attenuation.py index 0ff28b693c..51074b0233 100644 --- a/src/qibocal/protocols/resonator_punchout_attenuation.py +++ b/src/qibocal/protocols/resonator_punchout_attenuation.py @@ -15,7 +15,7 @@ from qibocal.auto.operation import Data, Parameters, Results, Routine from .utils import HZ_TO_GHZ, fit_punchout, norm, table_dict, table_html - +MHZ_TO_GHZ = 1e-3 @dataclass class ResonatorPunchoutAttenuationParameters(Parameters): @@ -31,6 +31,8 @@ class ResonatorPunchoutAttenuationParameters(Parameters): """Attenuation maximum value [dB].""" step_att: int """Attenuation step [dB].""" + phase_delay: float = None + """Phase delay correction in rad/MHz (us). By default no correction is performed.""" @dataclass @@ -132,11 +134,27 @@ def _acquisition( # retrieve the results for every qubit for qubit in targets: result = results[ro_pulses[qubit].serial] + frequency = delta_frequency_range + ro_pulses[qubit].frequency + + # RESHAPE phase to match the frequency and attenuation sweeps + phase = result.phase.reshape( + len(attenuation_range), len(delta_frequency_range) + ) + magnitude = result.magnitude.reshape( + len(attenuation_range), len(delta_frequency_range) + ) + + # Phase is a 2D array, we need to unwrap in the frequency dimension + if params.phase_delay is not None: + phase = np.unwrap(phase, axis = 1) + ( + delta_frequency_range*HZ_TO_GHZ * params.phase_delay/ (2 * np.pi*MHZ_TO_GHZ) + ) + data.register_qubit( qubit, - signal=result.magnitude, - phase=result.phase, - freq=delta_frequency_range + ro_pulses[qubit].frequency, + signal=magnitude, + phase=phase, + freq=frequency, att=attenuation_range, ) diff --git a/src/qibocal/protocols/resonator_spectroscopy.py b/src/qibocal/protocols/resonator_spectroscopy.py index d66815481f..79bb5ab7a0 100644 --- a/src/qibocal/protocols/resonator_spectroscopy.py +++ b/src/qibocal/protocols/resonator_spectroscopy.py @@ -23,8 +23,11 @@ s21_fit, s21_spectroscopy_plot, spectroscopy_plot, + HZ_TO_GHZ ) +MHZ_TO_HZ = 1e6 + ResSpecType = np.dtype( [ ("freq", np.float64), @@ -100,6 +103,9 @@ class ResonatorSpectroscopyParameters(Parameters): Otherwise the default attenuation defined on the platform runcard will be used""" hardware_average: bool = True """By default hardware average will be performed.""" + phase_delay: float = None + """Phase delay correction in rad/MHz (us). By default no correction is performed.""" + def __post_init__(self): if isinstance(self.power_level, str): @@ -231,13 +237,21 @@ def _acquisition( # retrieve the results for every qubit for qubit in targets: result = results[ro_pulses[qubit].serial] - # store the results + # store the results + if params.phase_delay is not None: + phase = result.average.phase + phase = np.unwrap(phase) - ( + delta_frequency_range * params.phase_delay / MHZ_TO_HZ + ) + else: + phase = result.average.phase + data.register_qubit( ResSpecType, (qubit), dict( signal=result.average.magnitude, - phase=result.average.phase, + phase=phase, freq=delta_frequency_range + ro_pulses[qubit].frequency, error_signal=result.average.std, error_phase=result.phase_std, diff --git a/src/qibocal/protocols/state_tomography.py b/src/qibocal/protocols/state_tomography.py index 6094de710e..7724a2c08f 100644 --- a/src/qibocal/protocols/state_tomography.py +++ b/src/qibocal/protocols/state_tomography.py @@ -8,8 +8,8 @@ import plotly.graph_objects as go from plotly.subplots import make_subplots from qibo import Circuit, gates -from qibo.backends import GlobalBackend, NumpyBackend, matrices -from qibo.quantum_info import fidelity +from qibo.backends import NumpyBackend, construct_backend, matrices +from qibo.quantum_info import fidelity, partial_trace from qibolab.platform import Platform from qibolab.qubits import QubitId @@ -20,8 +20,8 @@ BASIS = ["X", "Y", "Z"] """Single qubit measurement basis.""" -SIMULATED_DENSITY_MATRIX = "ideal" -"""Filename for simulated density matrix.""" +CIRCUIT_PATH = "circuit.json" +"""Path where circuit is stored.""" @dataclass @@ -53,25 +53,30 @@ def __post_init__(self): class StateTomographyData(Data): """Tomography data""" - ideal: dict[tuple[QubitId, str], np.float64] = field(default_factory=dict) - """Ideal samples measurements.""" + targets: dict[QubitId, int] + """Store targets order.""" + circuit: Circuit + """Circuit where tomography will be executed.""" data: dict[tuple[QubitId, str], np.int64] = field(default_factory=dict) """Hardware measurements.""" + @property + def params(self) -> dict: + """Convert non-arrays attributes into dict.""" + params = super().params + params.pop("circuit") + return params + def save(self, path): - self._to_npz(path, DATAFILE) - np.savez( - path / f"{SIMULATED_DENSITY_MATRIX}.npz", - **{json.dumps(i): self.ideal[i] for i in self.ideal}, - ) + super().save(path) + (path / CIRCUIT_PATH).write_text(json.dumps(self.circuit.raw)) @classmethod def load(cls, path): - instance = cls() - instance.data = super().load_data(path, DATAFILE) - instance.ideal = super().load_data(path, SIMULATED_DENSITY_MATRIX) - - return instance + circuit = Circuit.from_dict(json.loads((path / CIRCUIT_PATH).read_text())) + data = super().load_data(path, DATAFILE) + params = super().load_params(path, DATAFILE) + return cls(data=data, circuit=circuit, targets=params["targets"]) @dataclass @@ -94,24 +99,24 @@ def _acquisition( params: StateTomographyParameters, platform: Platform, targets: list[QubitId] ) -> StateTomographyData: """Acquisition protocol for single qubit state tomography experiment.""" - if params.circuit is None: params.circuit = Circuit(len(targets)) - backend = GlobalBackend() - backend.platform = platform + backend = construct_backend("qibolab", platform=platform) transpiler = dummy_transpiler(backend) - data = StateTomographyData() + data = StateTomographyData( + circuit=params.circuit, targets={target: i for i, target in enumerate(targets)} + ) for basis in BASIS: - basis_circuit = deepcopy(params.circuit) + basis_circuit: Circuit = deepcopy(params.circuit) # FIXME: https://github.com/qiboteam/qibo/issues/1318 if basis != "Z": for i in range(len(targets)): basis_circuit.add(getattr(gates, basis)(i).basis_rotation()) - basis_circuit.add(gates.M(i) for i in range(len(targets))) + basis_circuit.add(gates.M(*range(len(targets)))) _, results = execute_transpiled_circuit( basis_circuit, targets, @@ -127,9 +132,6 @@ def _acquisition( samples=np.array(results.samples()).T[i], ), ) - data.ideal[target, basis] = np.array( - NumpyBackend().execute_circuit(basis_circuit, nshots=10000).samples() - ).T[i] return data @@ -140,30 +142,25 @@ def _fit(data: StateTomographyData) -> StateTomographyResults: target_density_matrix_real = {} target_density_matrix_imag = {} fid = {} - for qubit in data.qubits: - x_exp, y_exp, z_exp = ( - 1 - 2 * np.mean(data[qubit, basis].samples) for basis in BASIS - ) - density_matrix = 0.5 * ( + circuit = data.circuit + circuit.density_matrix = True + total_density_matrix = NumpyBackend().execute_circuit(circuit=circuit).state() + for i, qubit in enumerate(data.targets): + traced_qubits = [q for q in range(len(data.qubits)) if q != i] + target_density_matrix = partial_trace(total_density_matrix, traced_qubits) + x_exp = 1 - 2 * np.mean(data[qubit, "X"].samples) + y_exp = 1 - 2 * np.mean(data[qubit, "Y"].samples) + z_exp = 1 - 2 * np.mean(data[qubit, "Z"].samples) + measured_density_matrix = 0.5 * ( matrices.I + matrices.X * x_exp + matrices.Y * y_exp + matrices.Z * z_exp ) - measured_density_matrix_real[qubit] = np.real(density_matrix).tolist() - measured_density_matrix_imag[qubit] = np.imag(density_matrix).tolist() + measured_density_matrix_real[qubit] = np.real(measured_density_matrix).tolist() + measured_density_matrix_imag[qubit] = np.imag(measured_density_matrix).tolist() - x_theory, y_theory, z_theory = ( - 1 - 2 * np.mean(data.ideal[qubit, basis]) for basis in BASIS - ) - target_density_matrix = 0.5 * ( - matrices.I - + matrices.X * x_theory - + matrices.Y * y_theory - + matrices.Z * z_theory - ) target_density_matrix_real[qubit] = np.real(target_density_matrix).tolist() target_density_matrix_imag[qubit] = np.imag(target_density_matrix).tolist() fid[qubit] = fidelity( - np.array(measured_density_matrix_real[qubit]) - + 1.0j * np.array(measured_density_matrix_imag[qubit]), + measured_density_matrix, target_density_matrix, ) diff --git a/src/qibocal/protocols/two_qubit_interaction/__init__.py b/src/qibocal/protocols/two_qubit_interaction/__init__.py index e45930b337..455f4a431c 100644 --- a/src/qibocal/protocols/two_qubit_interaction/__init__.py +++ b/src/qibocal/protocols/two_qubit_interaction/__init__.py @@ -1,5 +1,18 @@ from .chevron import chevron, chevron_signal from .chsh import chsh_circuits, chsh_pulses +from .cross_resonance import ( + cross_resonance_length, + cross_resonance_length_sequences, + cross_resonance_amplitude, + cross_resonance_chevron_length, + cross_resonance_chevron_frequency, + cross_resonance_chevron_amplitude_frequency, + cross_resonance_chevron_coupler, + cross_resonance_cnot_length, + cross_resonance_cnot, +) + +from .mermin import mermin from .optimize import optimize_two_qubit_gate from .virtual_z_phases import correct_virtual_z_phases from .virtual_z_phases_signal import correct_virtual_z_phases_signal diff --git a/src/qibocal/protocols/two_qubit_interaction/chevron/chevron.py b/src/qibocal/protocols/two_qubit_interaction/chevron/chevron.py index c65ce9aebf..59aa009674 100644 --- a/src/qibocal/protocols/two_qubit_interaction/chevron/chevron.py +++ b/src/qibocal/protocols/two_qubit_interaction/chevron/chevron.py @@ -109,6 +109,9 @@ class ChevronData(Data): """Sweetspot value for high frequency qubit.""" data: dict[QubitPairId, npt.NDArray[ChevronType]] = field(default_factory=dict) + label: Optional[str] = None + """Label for the data.""" + def register_qubit(self, low_qubit, high_qubit, length, amp, prob_low, prob_high): """Store output for single qubit.""" size = len(length) * len(amp) @@ -253,7 +256,7 @@ def _plot(data: ChevronData, fit: ChevronResults, target: QubitPairId): rows=1, cols=2, subplot_titles=( - f"Qubit {target[0]} - Low Frequency", + f"Qubit {target[0]} - Target", f"Qubit {target[1]} - High Frequency", ), ) @@ -308,7 +311,7 @@ def _plot(data: ChevronData, fit: ChevronResults, target: QubitPairId): fig.update_layout( xaxis_title="Duration [ns]", xaxis2_title="Duration [ns]", - yaxis_title="Amplitude [a.u.]", + yaxis_title=data.label or "Amplitude [a.u.]", legend=dict(orientation="h"), ) fig.update_layout( diff --git a/src/qibocal/protocols/two_qubit_interaction/chsh/circuits.py b/src/qibocal/protocols/two_qubit_interaction/chsh/circuits.py index 6d2f4bba5a..898ab8536c 100644 --- a/src/qibocal/protocols/two_qubit_interaction/chsh/circuits.py +++ b/src/qibocal/protocols/two_qubit_interaction/chsh/circuits.py @@ -7,7 +7,7 @@ from .utils import READOUT_BASIS -def create_bell_circuit(nqubits, qubits, theta=np.pi / 4, bell_state=0): +def create_bell_circuit(theta=np.pi / 4, bell_state=0): """Creates the circuit to generate the bell states and with a theta-measurement bell_state chooses the initial bell state for the test: 0 -> |00>+|11> @@ -17,24 +17,24 @@ def create_bell_circuit(nqubits, qubits, theta=np.pi / 4, bell_state=0): Native defaults to only using GPI2 and GPI gates. """ p = [0, 0] - c = Circuit(nqubits) - c.add(gates.H(qubits[0])) - c.add(gates.H(qubits[1])) - c.add(gates.CZ(qubits[0], qubits[1])) - c.add(gates.H(qubits[1])) + c = Circuit(2) + c.add(gates.H(0)) + c.add(gates.H(1)) + c.add(gates.CZ(0, 1)) + c.add(gates.H(1)) if bell_state == 1: - c.add(gates.Z(qubits[0])) + c.add(gates.Z(0)) elif bell_state == 2: - c.add(gates.Z(qubits[0])) - c.add(gates.X(qubits[0])) + c.add(gates.Z(0)) + c.add(gates.X(0)) elif bell_state == 3: - c.add(gates.X(qubits[0])) + c.add(gates.X(0)) - c.add(gates.RY(qubits[0], theta)) + c.add(gates.RY(0, theta)) return c, p -def create_bell_circuit_native(nqubits, qubits, theta=np.pi / 4, bell_state=0): +def create_bell_circuit_native(theta=np.pi / 4, bell_state=0): """Creates the circuit to generate the bell states and with a theta-measurement bell_state chooses the initial bell state for the test: 0 -> |00>+|11> @@ -44,35 +44,33 @@ def create_bell_circuit_native(nqubits, qubits, theta=np.pi / 4, bell_state=0): Native defaults to only using GPI2 and GPI gates. """ - c = Circuit(nqubits) + c = Circuit(2) p = [0, 0] - c.add(gates.GPI2(qubits[0], np.pi / 2)) - c.add(gates.GPI2(qubits[1], np.pi / 2)) - c.add(gates.CZ(qubits[0], qubits[1])) - c.add(gates.GPI2(qubits[1], -np.pi / 2)) + c.add(gates.GPI2(0, np.pi / 2)) + c.add(gates.GPI2(1, np.pi / 2)) + c.add(gates.CZ(0, 1)) + c.add(gates.GPI2(1, -np.pi / 2)) if bell_state == 0: p[0] += np.pi elif bell_state == 1: p[0] += 0 elif bell_state == 2: p[0] += 0 - c.add(gates.GPI2(qubits[0], p[0])) - c.add(gates.GPI2(qubits[0], p[0])) + c.add(gates.GPI2(0, p[0])) + c.add(gates.GPI2(0, p[0])) elif bell_state == 3: p[0] += np.pi - c.add(gates.GPI2(qubits[0], p[0])) - c.add(gates.GPI2(qubits[0], p[0])) + c.add(gates.GPI2(0, p[0])) + c.add(gates.GPI2(0, p[0])) - c.add(gates.GPI2(qubits[0], p[0])) + c.add(gates.GPI2(0, p[0])) p[0] += theta - c.add(gates.GPI2(qubits[0], p[0] + np.pi)) + c.add(gates.GPI2(0, p[0] + np.pi)) return c, p def create_chsh_circuits( - platform, - qubits, theta=np.pi / 4, bell_state=0, native=True, @@ -84,16 +82,14 @@ def create_chsh_circuits( """ create_bell = create_bell_circuit_native if native else create_bell_circuit chsh_circuits = {} - nqubits = platform.nqubits if platform else max(qubits) + 1 for basis in readout_basis: - c, p = create_bell(nqubits, qubits, theta, bell_state) + c, p = create_bell(theta, bell_state) for i, base in enumerate(basis): if base == "X": if native: - c.add(gates.GPI2(qubits[i], p[i] + np.pi / 2)) + c.add(gates.GPI2(i, p[i] + np.pi / 2)) else: - c.add(gates.H(qubits[i])) - for qubit in qubits: - c.add(gates.M(qubit)) + c.add(gates.H(i)) + c.add(gates.M(0, 1)) chsh_circuits[basis] = c return chsh_circuits diff --git a/src/qibocal/protocols/two_qubit_interaction/chsh/protocol.py b/src/qibocal/protocols/two_qubit_interaction/chsh/protocol.py index 6adc6f1470..b5beb46c60 100644 --- a/src/qibocal/protocols/two_qubit_interaction/chsh/protocol.py +++ b/src/qibocal/protocols/two_qubit_interaction/chsh/protocol.py @@ -8,7 +8,7 @@ import numpy as np import numpy.typing as npt import plotly.graph_objects as go -from qibo.backends import GlobalBackend +from qibo.backends import construct_backend from qibolab import ExecutionParameters from qibolab.platform import Platform from qibolab.qubits import QubitId, QubitPairId @@ -76,14 +76,16 @@ class CHSHData(Data): def save(self, path: Path): """Saving data including mitigation matrix.""" - - np.savez( - path / f"{MITIGATION_MATRIX_FILE}.npz", - **{ - json.dumps((control, target)): self.mitigation_matrix[control, target] - for control, target, _, _, _ in self.data - }, - ) + if self.mitigation_matrix: + np.savez( + path / f"{MITIGATION_MATRIX_FILE}.npz", + **{ + json.dumps((control, target)): self.mitigation_matrix[ + control, target + ] + for control, target, _, _, _ in self.data + }, + ) super().save(path=path) @classmethod @@ -174,10 +176,11 @@ def _acquisition_pulses( if params.apply_error_mitigation: mitigation_data = mitigation_acquisition( - mitigation_params(pulses=True, nshots=params.nshots), platform, targets + mitigation_params(nshots=params.nshots), platform, targets ) mitigation_results = mitigation_fit(mitigation_data) + platform.connect() for pair in targets: if params.apply_error_mitigation: try: @@ -220,13 +223,11 @@ def _acquisition_circuits( bell_states=params.bell_states, thetas=thetas.tolist(), ) - backend = GlobalBackend() - backend.platform = platform + backend = construct_backend("qibolab", platform=platform) transpiler = dummy_transpiler(backend) - qubit_map = [i for i in range(platform.nqubits)] if params.apply_error_mitigation: mitigation_data = mitigation_acquisition( - mitigation_params(pulses=False, nshots=params.nshots), platform, targets + mitigation_params(nshots=params.nshots), platform, targets ) mitigation_results = mitigation_fit(mitigation_data) for pair in targets: @@ -242,8 +243,6 @@ def _acquisition_circuits( for bell_state in params.bell_states: for theta in thetas: chsh_circuits = create_chsh_circuits( - platform, - qubits=pair, bell_state=bell_state, theta=theta, native=params.native, @@ -254,7 +253,7 @@ def _acquisition_circuits( nshots=params.nshots, transpiler=transpiler, backend=backend, - qubit_map=qubit_map, + qubit_map=pair, ) frequencies = result.frequencies() data.register_basis(pair, bell_state, basis, frequencies) diff --git a/src/qibocal/protocols/two_qubit_interaction/cross_resonance/__init__.py b/src/qibocal/protocols/two_qubit_interaction/cross_resonance/__init__.py new file mode 100644 index 0000000000..9ffcb17883 --- /dev/null +++ b/src/qibocal/protocols/two_qubit_interaction/cross_resonance/__init__.py @@ -0,0 +1,9 @@ +from .length import cross_resonance_length +from .length_sequences import cross_resonance_length_sequences +from .amplitude import cross_resonance_amplitude +from .chevron_length import cross_resonance_chevron_length +from .chevron_frequency import cross_resonance_chevron_frequency +from .chevron_amplitude_frequency import cross_resonance_chevron_amplitude_frequency +from .chevron_coupler import cross_resonance_chevron_coupler +from .cnot_length import cross_resonance_cnot_length +from .cnot_amplitude import cross_resonance_cnot \ No newline at end of file diff --git a/src/qibocal/protocols/two_qubit_interaction/cross_resonance/amplitude.py b/src/qibocal/protocols/two_qubit_interaction/cross_resonance/amplitude.py new file mode 100644 index 0000000000..3105ede38b --- /dev/null +++ b/src/qibocal/protocols/two_qubit_interaction/cross_resonance/amplitude.py @@ -0,0 +1,179 @@ +from dataclasses import dataclass, field +from typing import Optional + +import numpy as np +import numpy.typing as npt +import itertools + +from qibolab import AcquisitionType, AveragingMode, ExecutionParameters +from qibolab.platform import Platform +from qibolab.sweeper import Parameter, Sweeper, SweeperType + +from qibolab.pulses import Pulse, PulseSequence, PulseType +from qibolab.pulses import Gaussian, Drag, Rectangular, GaussianSquare + +from qibolab.native import NativePulse +from qibolab.qubits import QubitId, QubitPairId + +from qibocal.auto.operation import Data, Parameters, Results, Routine +from .utils import STATES, BASIS, ro_projection_pulse, cr_plot, Setup, Basis + +CrossResonanceType = np.dtype( + [ + ("prob", np.float64), + ("amp", np.float64), + ("error", np.float64), + ] +) +"""Custom dtype for Cross Resonance Amplitude Gate Calibration.""" + +@dataclass +class CrossResonanceParameters(Parameters): + """Cross Resonance Amplitude Gate Calibration runcard inputs.""" + + min_amp_factor: float + """Minimum amplitude multiplicative factor.""" + max_amp_factor: float + """Maximum amplitude multiplicative factor.""" + step_amp_factor: float + """Step amplitude multiplicative factor.""" + pulse_duration: Optional[int] = None + """CR pulse duration [ns].""" + pulse_amplitude: Optional[float] = None + """CR pulse amplitude [ns].""" + shape: Optional[str] = "Rectangular()" + """CR pulse shape parameters.""" + projections: Optional[list[str]] = field(default_factory=lambda: [BASIS[-1]]) + """Measurement porjection""" + tgt_setup: Optional[list[str]] = field(default_factory=lambda: [STATES[0]]) + """Setup for the experiment.""" + + @property + def amplitude_factor_range(self): + return np.arange( + self.min_amp_factor, self.max_amp_factor, self.step_amp_factor + ) + """Amplitude factor range.""" + @property + def pulse_shape(self): + return eval(self.shape) + """Cross Resonance Pulse shape.""" + + +@dataclass +class CrossResonanceResults(Results): + """Cross Resonance Gate Calibration outputs.""" + + +@dataclass +class CrossResonanceData(Data): + """Data structure for Cross Resonance Gate Calibration in Pulse Amplitude.""" + + targets: list[QubitPairId] = field(default_factory=list) + """Targets for the Cross Resonance Gate Calibration stored as pair of [target, control].""" + + data: dict[(QubitPairId, QubitId, Setup, Setup, Basis), + npt.NDArray[CrossResonanceType]] = field(default_factory=dict) + """Raw data acquired.""" + + +def _acquisition( + params: CrossResonanceParameters, platform: Platform, targets: list[QubitPairId] +) -> CrossResonanceData: + """Data acquisition for Cross Resonance Gate Calibration.""" + + data = CrossResonanceData(targets=targets) + for pair in targets: + target, control = pair + for ctr_setup, tgt_setup, basis in itertools.product(STATES, params.tgt_setup, params.projections): + ctr_native_rx = platform.qubits[control].native_gates.RX.pulse(start=0) + tgt_native_rx = platform.qubits[target].native_gates.RX.pulse(start=0) + + sequence = PulseSequence() + + if ctr_setup == STATES[1]: + sequence.add(ctr_native_rx) + + if tgt_setup == STATES[1]: + sequence.add(tgt_native_rx) + + next_start = max(tgt_native_rx.finish, ctr_native_rx.finish) + + cr_pulse: Pulse = Pulse(start = next_start, + duration = ctr_native_rx.duration, + amplitude = ctr_native_rx.amplitude, + frequency = tgt_native_rx.frequency, + relative_phase=0, + channel=ctr_native_rx.channel, + shape = params.pulse_shape, + type = PulseType.DRIVE, + qubit = control, + ) + + if params.pulse_duration is not None: + cr_pulse.duration = params.pulse_duration + + if params.pulse_amplitude is not None: + cr_pulse.amplitude = params.pulse_amplitude + + sequence.add(cr_pulse) + + projection_pulse, ro_pulses = {}, {} + for ro_qubit in pair: + # sequence.add(platform.create_qubit_readout_pulse(qubit=qubit, start=cr_pulse.finish)) + projection_pulse[ro_qubit], ro_pulses[ro_qubit] = ro_projection_pulse( + platform, ro_qubit, start=cr_pulse.finish, projection=basis + ) + sequence.add(projection_pulse[ro_qubit]) + sequence.add(ro_pulses[ro_qubit]) + + amplitude_range = cr_pulse.amplitude*params.amplitude_factor_range + print(f"Amplitude range: {amplitude_range}") + # Create the amplitude sweeper + sweeper_amplitude = Sweeper( + parameter = Parameter.amplitude, + values = amplitude_range, + pulses=[cr_pulse], + type=SweeperType.ABSOLUTE, + ) + + results = platform.sweep( + sequence, + ExecutionParameters( + nshots=params.nshots, + relaxation_time=params.relaxation_time, + acquisition_type=AcquisitionType.DISCRIMINATION, + averaging_mode=AveragingMode.SINGLESHOT, + ), + sweeper_amplitude, + ) + + # store the results + for ro_qubit in pair: + probability = results[ro_qubit].probability(state=1) + data.register_qubit( + CrossResonanceType, + data_keys= (pair, ro_qubit, tgt_setup, ctr_setup, basis), + data_dict= dict( + prob=probability, + amp= amplitude_range, + error=np.sqrt(probability * (1 - probability) / params.nshots).tolist(), + ), + ) + + return data + + +def _fit( + data: CrossResonanceData, +) -> CrossResonanceResults: + """Post-processing function for Cross Resonance Gate Calibration.""" + return CrossResonanceResults() + + +def _plot(data: CrossResonanceData, target: QubitPairId, fit: CrossResonanceResults): + """Plotting function for Cross Resonance Gate Calibration.""" + return cr_plot(data,target, 'amp'), "" + +cross_resonance_amplitude = Routine(_acquisition, _fit, _plot, two_qubit_gates=True) +"""CrossResonance Amplitude Routine object.""" diff --git a/src/qibocal/protocols/two_qubit_interaction/cross_resonance/chevron_amplitude_frequency.py b/src/qibocal/protocols/two_qubit_interaction/cross_resonance/chevron_amplitude_frequency.py new file mode 100644 index 0000000000..b002e4ef41 --- /dev/null +++ b/src/qibocal/protocols/two_qubit_interaction/cross_resonance/chevron_amplitude_frequency.py @@ -0,0 +1,234 @@ +from dataclasses import dataclass, field +from typing import Optional + +import numpy as np +import numpy.typing as npt +import plotly.graph_objects as go +from plotly.subplots import make_subplots +from qibolab import AcquisitionType, AveragingMode, ExecutionParameters +from qibolab.platform import Platform +from qibolab.qubits import QubitId, QubitPairId +from qibolab.sweeper import Parameter, Sweeper, SweeperType +from qibocal.protocols.utils import HZ_TO_GHZ +from qibocal.auto.operation import Data, Parameters, Results, Routine +from qibolab.pulses import Pulse, PulseSequence, PulseType +from qibolab.pulses import Gaussian, Drag, Rectangular, GaussianSquare + +from .utils import STATES + +CrossResonanceChevronFrequencyType = np.dtype( + [ + ("amp", np.float64), + ("freq", np.int64), + ("prob", np.float64), + ] +) +"""Custom dtype for resonator spectroscopy.""" + + +@dataclass +class CrossResonanceChevronFrequencyParameters(Parameters): + """ResonatorSpectroscopy runcard inputs.""" + + min_amp_factor: float + """Initial CR pulse amplitude [a.u.].""" + max_amp_factor: float + """Final CR pulse amplitude [a.u.].""" + step_amp_factor: float + """Step CR pulse amplitude [a.u.].""" + freq_width: int + """Frequency range.""" + freq_step: int + """Frequency step size.""" + pulse_amplitude: Optional[float] = None + """Maximum pulse amplitude [a.u.].""" + pulse_duration: Optional[int] = None + """Pulse duration [ns].""" + shape: Optional[str] = "Rectangular()" + """CR pulse shape parameters.""" + @property + def pulse_shape(self): + return eval(self.shape) + """Cross Resonance Pulse shape.""" + + @property + def amplitude_factor(self): + return np.arange( + self.min_amp_factor, self.max_amp_factor, self.step_amp_factor + ) + + @property + def frequency_range(self): + return np.arange( + -self.freq_width/2, + self.freq_width/2, + self.freq_step, + ) + +@dataclass +class CrossResonanceChevronFrequencyResults(Results): + """Chevron wih Frequency Cross Resonance Calibration outputs.""" + + +@dataclass +class CrossResonanceChevronFrequencyData(Data): + """Data structure for Chevron wih Frequency.""" + + data: dict[QubitId, npt.NDArray[CrossResonanceChevronFrequencyType]] = field( + default_factory=dict + ) + """Raw data acquired.""" + + def register_qubit(self, dtype, data_key, data:dict): + """Store output for single qubit.""" + + prob = data["prob"] + freq = data["freq"] + amp = data["amp"] + + size = len(freq) * len(amp) + frequency, amplitude = np.meshgrid(freq, amp) + ar = np.empty(size, dtype=dtype) + ar["freq"] = frequency.ravel() + ar["amp"] = amplitude.ravel() + ar["prob"] = prob.ravel() + self.data[data_key] = np.rec.array(ar) + + +def _acquisition( + params: CrossResonanceChevronFrequencyParameters, + platform: Platform, + targets: list[QubitPairId], +) -> CrossResonanceChevronFrequencyData: + """Data acquisition for Chevron wih Frequency.""" + + data = CrossResonanceChevronFrequencyData() + for pair in targets: + target, control = pair + for setup in STATES: + sequence = PulseSequence() + target_drive_freq = platform.qubits[target].native_gates.RX.frequency + rx_control = platform.create_RX_pulse(control, 0) + + # add a RX control pulse if the setup is |1> + next_start=0 + if setup == STATES[1]: + next_start = rx_control.finish + sequence.add(rx_control) + + cr_pulse: Pulse = Pulse(start = next_start, + duration = rx_control.duration, + amplitude = rx_control.amplitude, + frequency = target_drive_freq, + relative_phase=0, + channel=rx_control.channel, + shape = params.pulse_shape, + type = PulseType.DRIVE, + qubit = control, + ) + + cr_pulse.frequency = target_drive_freq + if params.pulse_amplitude is not None: + cr_pulse.amplitude = params.pulse_amplitude + if params.pulse_duration is not None: + cr_pulse.duration = params.pulse_duration + + sequence.add(cr_pulse) + + # add readout pulses + for qubit in pair: + sequence.add(platform.create_qubit_readout_pulse(qubit, start=cr_pulse.finish)) + + # create a duration sweeper for the pulse duration + sweeper_amplitude = Sweeper( + Parameter.amplitude, + params.amplitude_factor, + pulses=[cr_pulse], + type=SweeperType.FACTOR, + ) + + # create a frequency sweeper for the pulse frequency + sweeper_frequency = Sweeper( + Parameter.frequency, + params.frequency_range, + pulses=[cr_pulse], + type=SweeperType.OFFSET, + ) + + # run the sweep + results = platform.sweep( + sequence, + ExecutionParameters( + nshots=params.nshots, + relaxation_time=params.relaxation_time, + acquisition_type=AcquisitionType.DISCRIMINATION, + averaging_mode=AveragingMode.SINGLESHOT, + ), + sweeper_amplitude, + sweeper_frequency, + ) + + # store the results for each qubit in the pair in the data object + # NOTE: Change this to use standard qibocal>auto>operation>Data>register_qubit + for qubit in pair: + prob = results[qubit].probability(state=1) + data.register_qubit( + CrossResonanceChevronFrequencyType, + (qubit, target, control, setup), + dict( + prob=prob, + amp=params.amplitude_factor*cr_pulse.amplitude, + freq=cr_pulse.frequency + params.frequency_range, + ) + ) + + return data + + +def _fit( + data:CrossResonanceChevronFrequencyData, +) -> CrossResonanceChevronFrequencyResults: + """Post-processing function for Chevron wih Frequency.""" + return CrossResonanceChevronFrequencyResults() + + +def _plot( + data: CrossResonanceChevronFrequencyData, + target: QubitPairId, + fit: CrossResonanceChevronFrequencyResults, +): + pair = target + """Plotting function for Chevron wih Frequency and Duration.""" + figs = [] + for qubit in pair: + fig = make_subplots( + rows=1, + cols=2, + subplot_titles=( + f"Q{qubit} , Control |{STATES[0]}>", + f"Q{qubit} , Control |{STATES[1]}>", + ), + ) + for i, setup in enumerate(STATES): + qubit_data = data.data[qubit, pair[0], pair[1], setup] + fig.add_trace( + go.Heatmap( + x=qubit_data.amp, + y=qubit_data.freq * HZ_TO_GHZ, + z=qubit_data.prob, + name=f"Control at |{setup}>", + coloraxis="coloraxis" + ), + row=1, + col=i+1, + ) + fig.update_xaxes(title_text="Pulse Amplitude [a.u.]", row=1, col=i+1) + fig.update_yaxes(title_text="Frequency [GHz]", row=1, col=i+1) + fig.update_layout(coloraxis={'colorscale':'Plasma'}) + figs.append(fig) + + + return figs, "" + +cross_resonance_chevron_amplitude_frequency = Routine(_acquisition, _fit, _plot, two_qubit_gates=True) +"""CrossResonanceChevronFrequency Routine object.""" \ No newline at end of file diff --git a/src/qibocal/protocols/two_qubit_interaction/cross_resonance/chevron_coupler.py b/src/qibocal/protocols/two_qubit_interaction/cross_resonance/chevron_coupler.py new file mode 100644 index 0000000000..60d1eb90d9 --- /dev/null +++ b/src/qibocal/protocols/two_qubit_interaction/cross_resonance/chevron_coupler.py @@ -0,0 +1,237 @@ +from dataclasses import dataclass, field +from typing import Optional + +import numpy as np +import numpy.typing as npt +import plotly.graph_objects as go +from plotly.subplots import make_subplots +from qibolab import AcquisitionType, AveragingMode, ExecutionParameters +from qibolab.platform import Platform +from qibolab.qubits import QubitId, QubitPairId +from qibolab.sweeper import Parameter, Sweeper, SweeperType +from qibocal.auto.operation import Data, Parameters, Results, Routine +from qibolab.pulses import Pulse, PulseSequence, PulseType +from qibolab.pulses import Gaussian, Drag, Rectangular, GaussianSquare + +from qibocal.protocols.two_qubit_interaction.utils import order_pair + + +from .utils import STATES + +CrossResonanceChevronType = np.dtype( + [ + ("flux", np.int64), + ("amp", np.float64), + ("prob", np.float64), + ] +) +"""Custom dtype for cross resonance chevron calibration.""" + +@dataclass +class CrossResonanceChevronParameters(Parameters): + """cross resonance chevron runcard inputs.""" + + coupler_amplitude_min_factor: float + """Initial coupler flux pulse amplitude.""" + coupler_amplitude_max_factor: float + """Final coupler flux pulse amplitude.""" + coupler_amplitude_step_factor: float + """Step coupler flux pulse amplitude.""" + + amplitude_min_factor: float + """CR pulse amplitude minimum.""" + amplitude_max_factor: float + """CR pulse amplitude maximum.""" + amplitude_step_factor: float + """CR pulse amplitude step.""" + + pulse_amplitude: Optional[float] = None + pulse_duration: Optional[int] = None + shape: Optional[str] = "Rectangular()" + """CR pulse shape parameters.""" + @property + def pulse_shape(self): + return eval(self.shape) + """Cross Resonance Pulse shape.""" + + @property + def amplitude_factor_range(self): + return np.arange( + self.amplitude_min_factor, + self.amplitude_max_factor, + self.amplitude_step_factor, + ) + + @property + def coupler_amplitude_range(self): + return np.arange( + self.coupler_amplitude_min_factor, + self.coupler_amplitude_max_factor, + self.coupler_amplitude_step_factor, + ) + +@dataclass +class CrossResonanceChevronResults(Results): + """cross resonance chevron outputs.""" + + +@dataclass +class CrossResonanceChevronData(Data): + """Data structure for cross resonance chevron.""" + + data: dict[QubitId, npt.NDArray[CrossResonanceChevronType]] = field( + default_factory=dict + ) + """Raw data acquired.""" + + def register_qubit(self, dtype, key, prob, flux, amp): + """Store output for single qubit.""" + size = len(flux) * len(amp) + amplitude, flux_amplitude = np.meshgrid(amp, flux) + ar = np.empty(size, dtype=dtype) + ar["flux"] = flux_amplitude.ravel() + ar["amp"] = amplitude.ravel() + ar["prob"] = prob.ravel() + self.data[key] = np.rec.array(ar) + + +def _acquisition( + params: CrossResonanceChevronParameters, + platform: Platform, + targets: list[QubitPairId], +) -> CrossResonanceChevronData: + """Data acquisition for cross resonance chevron.""" + """Run a CR gate with variable amplitude for different coupling flux bias.""" + data = CrossResonanceChevronData() + + for pair in targets: + for setup in STATES: + target, control = pair + ordered_pair = order_pair(pair, platform) + + sequence = PulseSequence() + target_drive_freq = platform.qubits[target].native_gates.RX.frequency + rx_control = platform.create_RX_pulse(control, 0) + + next_start = 0 + if setup == STATES[1]: + next_start = rx_control.finish + sequence.add(rx_control) + + native_gate, _ = platform.create_CZ_pulse_sequence( + (target,control), + start=sequence.finish, + ) + + flux_pulses = [p for p in native_gate.coupler_pulses(*pair)][:1] + flux_amplitude = getattr(flux_pulses[0], "amplitude") + + # Cross resonance pulse + cr_pulse: Pulse = Pulse(start = next_start, + duration = rx_control.duration, + amplitude = rx_control.amplitude, + frequency = target_drive_freq, + relative_phase=0, + channel=rx_control.channel, + shape = params.pulse_shape, + type = PulseType.DRIVE, + qubit = control, + ) + + if params.pulse_amplitude is not None: + cr_pulse.amplitude = params.pulse_amplitude + if params.pulse_duration is not None: + cr_pulse.duration = params.pulse_duration + + sequence.add(cr_pulse) + sequence.add( + platform.create_qubit_readout_pulse(target, start=cr_pulse.finish) + ) + + sweeper_coupler = Sweeper( + Parameter.amplitude, + params.coupler_amplitude_range, + pulses=[flux_pulses], + type=SweeperType.FACTOR, + ) + + sweeper_amplitude = Sweeper( + Parameter.amplitude, + cr_pulse.amplitude * params.amplitude_factor_range, + pulses=[cr_pulse], + type=SweeperType.FACTOR, + ) + + results = platform.sweep( + sequence, + ExecutionParameters( + nshots=params.nshots, + relaxation_time=params.relaxation_time, + acquisition_type=AcquisitionType.DISCRIMINATION, + averaging_mode=AveragingMode.SINGLESHOT, + ), + sweeper_coupler, + sweeper_amplitude, + ) + + # store the results + prob = results[target].probability(state=1) + data.register_qubit( + dtype = CrossResonanceChevronType, + key = (target, control, setup), + prob = prob, + flux = flux_amplitude*params.coupler_amplitude_range, + amp = cr_pulse.amplitude*params.amplitude_factor_range, + ) + # finally, save the remaining data + return data + + +def _fit( + data: CrossResonanceChevronData, +) -> CrossResonanceChevronResults: + """Post-processing function for Chevron with CR amplitude and coupler flux bias.""" + return CrossResonanceChevronResults() + + +def _plot( + data: CrossResonanceChevronData, + target: QubitPairId, + fit: CrossResonanceChevronResults, +): + pair = target + figs = [] + + """Plotting function for Cross Resonance Chevron with flux bias sweep.""" + fig = make_subplots( + rows=1, + cols=2, + subplot_titles=( + f"Control Q{pair[1]} = |{STATES[0]}>", + f"Control Q{pair[1]} = |{STATES[1]}>", + ), + ) + + for i, setup in enumerate(STATES): + qubit_data = data.data[target[0], target[1], setup] + fig.add_trace( + go.Heatmap( + x=qubit_data.flux, + y=qubit_data.amp, + z=qubit_data.prob, + name=f"Control at {setup}", + coloraxis="coloraxis" + ), + row=1, + col=i+1, + ) + fig.update_xaxes(title_text="Flux Pulse Amplitude [a.u.]", row=1, col=i+1) + fig.update_yaxes(title_text="CR Pulse Amplitude [a.u.]", row=1, col=i+1) + fig.update_layout(coloraxis={'colorscale':'Plasma'}) + + figs.append(fig) + return figs, "" + + +cross_resonance_chevron_coupler = Routine(_acquisition, _fit, _plot, two_qubit_gates=True) +"""CrossResonanceChevron Coupler Routine object.""" diff --git a/src/qibocal/protocols/two_qubit_interaction/cross_resonance/chevron_frequency.py b/src/qibocal/protocols/two_qubit_interaction/cross_resonance/chevron_frequency.py new file mode 100644 index 0000000000..b22e77c77e --- /dev/null +++ b/src/qibocal/protocols/two_qubit_interaction/cross_resonance/chevron_frequency.py @@ -0,0 +1,220 @@ +from dataclasses import dataclass, field +from typing import Optional + +import numpy as np +import numpy.typing as npt +import plotly.graph_objects as go +from plotly.subplots import make_subplots +from qibolab import AcquisitionType, AveragingMode, ExecutionParameters +from qibolab.platform import Platform +from qibolab.qubits import QubitId, QubitPairId +from qibolab.sweeper import Parameter, Sweeper, SweeperType +from qibocal.protocols.utils import HZ_TO_GHZ +from qibocal.auto.operation import Data, Parameters, Results, Routine +from qibolab.pulses import Pulse, PulseSequence, PulseType +from qibolab.pulses import Gaussian, Drag, Rectangular, GaussianSquare + +from .utils import STATES + +CrossResonanceChevronFrequencyType = np.dtype( + [ + ("length", np.float64), + ("freq", np.int64), + ("prob", np.float64), + ] +) +"""Custom dtype for resonator spectroscopy.""" + + +@dataclass +class CrossResonanceChevronFrequencyParameters(Parameters): + """ResonatorSpectroscopy runcard inputs.""" + + pulse_duration_start: float + """Initial pi pulse duration [ns].""" + pulse_duration_end: float + """Final pi pulse duration [ns].""" + pulse_duration_step: float + """Step pi pulse duration [ns].""" + freq_width: int + """Frequency range.""" + freq_step: int + """Frequency step size.""" + + pulse_amplitude: Optional[float] = None + shape: Optional[str] = "Rectangular()" + """CR pulse shape parameters.""" + @property + def pulse_shape(self): + return eval(self.shape) + """Cross Resonance Pulse shape.""" + + @property + def duration_range(self): + return np.arange( + self.pulse_duration_start, self.pulse_duration_end, self.pulse_duration_step + ) + + @property + def frequency_range(self): + return np.arange( + -self.freq_width/2, + self.freq_width/2, + self.freq_step, + ) + +@dataclass +class CrossResonanceChevronFrequencyResults(Results): + """Chevron wih Frequency Cross Resonance Calibration outputs.""" + + +@dataclass +class CrossResonanceChevronFrequencyData(Data): + """Data structure for Chevron wih Frequency.""" + + data: dict[QubitId, npt.NDArray[CrossResonanceChevronFrequencyType]] = field( + default_factory=dict + ) + """Raw data acquired.""" + + def register_qubit(self, dtype, key, prob, freq, length): + """Store output for single qubit.""" + size = len(freq) * len(length) + frequency, duration = np.meshgrid(freq, length) + ar = np.empty(size, dtype=dtype) + ar["freq"] = frequency.ravel() + ar["length"] = duration.ravel() + ar["prob"] = prob.ravel() + self.data[key] = np.rec.array(ar) + + +def _acquisition( + params: CrossResonanceChevronFrequencyParameters, + platform: Platform, + targets: list[QubitPairId], +) -> CrossResonanceChevronFrequencyData: + """Data acquisition for Chevron wih Frequency.""" + + data = CrossResonanceChevronFrequencyData() + for pair in targets: + target, control = pair + for setup in STATES: + sequence = PulseSequence() + target_drive_freq = platform.qubits[target].native_gates.RX.frequency + rx_control = platform.create_RX_pulse(control, 0) + + next_start = 0 + if setup == STATES[1]: + next_start = rx_control.finish # add a RX control pulse if the setup is |X> + sequence.add(rx_control) + + # Cross resonance pulse + cr_pulse: Pulse = Pulse(start = next_start, + duration = rx_control.duration, + amplitude = rx_control.amplitude, + frequency = target_drive_freq, + relative_phase=0, + channel=rx_control.channel, + shape = params.pulse_shape, + type = PulseType.DRIVE, + qubit = control, + ) + + if params.pulse_amplitude is not None: + cr_pulse.amplitude = params.pulse_amplitude + sequence.add(cr_pulse) + + # add readout pulses + for qubit in pair: + sequence.add(platform.create_qubit_readout_pulse(qubit, start=cr_pulse.finish)) + + # create a duration sweeper for the pulse duration + sweeper_duration = Sweeper( + Parameter.duration, + params.duration_range, + pulses=[cr_pulse], + type=SweeperType.ABSOLUTE, + ) + + # create a frequency sweeper for the pulse frequency + sweeper_frequency = Sweeper( + Parameter.frequency, + params.frequency_range, + pulses=[cr_pulse], + type=SweeperType.OFFSET, + ) + + # run the sweep + results = platform.sweep( + sequence, + ExecutionParameters( + nshots=params.nshots, + relaxation_time=params.relaxation_time, + acquisition_type=AcquisitionType.DISCRIMINATION, + averaging_mode=AveragingMode.SINGLESHOT, + ), + sweeper_duration, + sweeper_frequency, + ) + + # store the results for each qubit in the pair in the data object + for qubit in pair: + data.register_qubit( + dtype=CrossResonanceChevronFrequencyType, + key=(qubit, target, control, setup), + prob=results[qubit].probability(state=1), + length=params.duration_range, + freq=cr_pulse.frequency + params.frequency_range, + ) + + # return the data + return data + + +def _fit( + data:CrossResonanceChevronFrequencyData, +) -> CrossResonanceChevronFrequencyResults: + """Post-processing function for Chevron wih Frequency.""" + return CrossResonanceChevronFrequencyResults() + + +def _plot( + data: CrossResonanceChevronFrequencyData, + target: QubitPairId, + fit: CrossResonanceChevronFrequencyResults, +): + pair = target + """Plotting function for Chevron wih Frequency and Duration.""" + figs = [] + for qubit in pair: + fig = make_subplots( + rows=1, + cols=2, + subplot_titles=( + f"Q{qubit} , Control |{STATES[0]}>", + f"Q{qubit} , Control |{STATES[1]}>", + ), + ) + for i, setup in enumerate(STATES): + qubit_data = data.data[qubit, pair[0], pair[1], setup] + fig.add_trace( + go.Heatmap( + x=qubit_data.length, + y=qubit_data.freq * HZ_TO_GHZ, + z=qubit_data.prob, + name=f"Control at |{setup}>", + coloraxis="coloraxis" + ), + row=1, + col=i+1, + ) + fig.update_xaxes(title_text="Pulse Duration [ns]", row=1, col=i+1) + fig.update_yaxes(title_text="Frequency [GHz]", row=1, col=i+1) + fig.update_layout(coloraxis={'colorscale':'Plasma'}) + figs.append(fig) + + + return figs, "" + +cross_resonance_chevron_frequency = Routine(_acquisition, _fit, _plot, two_qubit_gates=True) +"""CrossResonanceChevronFrequency Routine object.""" \ No newline at end of file diff --git a/src/qibocal/protocols/two_qubit_interaction/cross_resonance/chevron_length.py b/src/qibocal/protocols/two_qubit_interaction/cross_resonance/chevron_length.py new file mode 100644 index 0000000000..3f6d74b072 --- /dev/null +++ b/src/qibocal/protocols/two_qubit_interaction/cross_resonance/chevron_length.py @@ -0,0 +1,218 @@ +from dataclasses import dataclass, field +from typing import Optional + +import numpy as np +import numpy.typing as npt +import plotly.graph_objects as go +from plotly.subplots import make_subplots +from qibolab import AcquisitionType, AveragingMode, ExecutionParameters +from qibolab.platform import Platform +from qibolab.qubits import QubitId, QubitPairId +from qibolab.sweeper import Parameter, Sweeper, SweeperType +from qibocal.auto.operation import Data, Parameters, Results, Routine +from qibolab.pulses import Pulse, PulseSequence, PulseType +from qibolab.pulses import Gaussian, Drag, Rectangular, GaussianSquare + +from .utils import STATES + +CrossResonanceChevronType = np.dtype( + [ + ("length", np.int64), + ("amp", np.float64), + ("prob", np.float64), + ] +) +"""Custom dtype for cross resonance chevron calibration.""" + +@dataclass +class CrossResonanceChevronParameters(Parameters): + """cross resonance chevron runcard inputs.""" + + pulse_duration_start: float + """Initial pi pulse duration [ns].""" + pulse_duration_end: float + """Final pi pulse duration [ns].""" + pulse_duration_step: float + """Step pi pulse duration [ns].""" + amplitude_min_factor: float + """Amplitude minimum.""" + amplitude_max_factor: float + """Amplitude maximum.""" + amplitude_step_factor: float + """Amplitude step.""" + + pulse_amplitude: Optional[float] = None + shape: Optional[str] = "Rectangular()" + """CR pulse shape parameters.""" + @property + def pulse_shape(self): + return eval(self.shape) + """Cross Resonance Pulse shape.""" + + @property + def duration_range(self): + return np.arange( + self.pulse_duration_start, self.pulse_duration_end, self.pulse_duration_step + ) + + @property + def amplitude_factor_range(self): + return np.arange( + self.amplitude_min_factor, + self.amplitude_max_factor, + self.amplitude_step_factor, + ) + + +@dataclass +class CrossResonanceChevronResults(Results): + """cross resonance chevron outputs.""" + + +@dataclass +class CrossResonanceChevronData(Data): + """Data structure for cross resonance chevron.""" + + data: dict[QubitId, npt.NDArray[CrossResonanceChevronType]] = field( + default_factory=dict + ) + """Raw data acquired.""" + + def register_qubit(self, dtype, key, prob, length, amp): + """Store output for single qubit.""" + size = len(length) * len(amp) + amplitude, duration = np.meshgrid(amp, length) + ar = np.empty(size, dtype=dtype) + ar["length"] = duration.ravel() + ar["amp"] = amplitude.ravel() + ar["prob"] = prob.ravel() + self.data[key] = np.rec.array(ar) + + +def _acquisition( + params: CrossResonanceChevronParameters, + platform: Platform, + targets: list[QubitPairId], +) -> CrossResonanceChevronData: + """Data acquisition for cross resonance chevron.""" + + data = CrossResonanceChevronData() + + for pair in targets: + for setup in STATES: + target, control = pair + sequence = PulseSequence() + target_drive_freq = platform.qubits[target].native_gates.RX.frequency + rx_control = platform.create_RX_pulse(control, 0) + + next_start = 0 + if setup == STATES[1]: + next_start = rx_control.finish + sequence.add(rx_control) + + # Cross resonance pulse + cr_pulse: Pulse = Pulse(start = next_start, + duration = rx_control.duration, + amplitude = rx_control.amplitude, + frequency = target_drive_freq, + relative_phase=0, + channel=rx_control.channel, + shape = params.pulse_shape, + type = PulseType.DRIVE, + qubit = control, + ) + + if params.pulse_amplitude is not None: + cr_pulse.amplitude = params.pulse_amplitude + sequence.add(cr_pulse) + sequence.add( + platform.create_qubit_readout_pulse(target, start=cr_pulse.finish) + ) + + sweeper_duration = Sweeper( + Parameter.duration, + params.duration_range, + pulses=[cr_pulse], + type=SweeperType.ABSOLUTE, + ) + + sweeper_amplitude = Sweeper( + Parameter.amplitude, + cr_pulse.amplitude * params.amplitude_factor_range, + pulses=[cr_pulse], + type=SweeperType.FACTOR, + ) + + results = platform.sweep( + sequence, + ExecutionParameters( + nshots=params.nshots, + relaxation_time=params.relaxation_time, + acquisition_type=AcquisitionType.DISCRIMINATION, + averaging_mode=AveragingMode.SINGLESHOT, + ), + sweeper_duration, + sweeper_amplitude, + ) + + # store the results + prob = results[target].probability(state=1) + data.register_qubit( + dtype=CrossResonanceChevronType, + key=(target, control, setup), + prob=prob, + length=params.duration_range, + amp=cr_pulse.amplitude * params.amplitude_factor_range, + ) + # finally, save the remaining data + return data + + +def _fit( + data: CrossResonanceChevronData, +) -> CrossResonanceChevronResults: + """Post-processing function for ResonatorSpectroscopy.""" + return CrossResonanceChevronResults() + + +def _plot( + data: CrossResonanceChevronData, + target: QubitPairId, + fit: CrossResonanceChevronResults, +): + pair = target + figs = [] + + """Plotting function for Cross Resonance Chevron .""" + fig = make_subplots( + rows=1, + cols=2, + subplot_titles=( + f"Control Q{pair[1]} = |{STATES[0]}>", + f"Control Q{pair[1]} = |{STATES[1]}>", + ), + ) + + for i, setup in enumerate(STATES): + qubit_data = data.data[target[0], target[1], setup] + fig.add_trace( + go.Heatmap( + x=qubit_data.length, + y=qubit_data.amp, + z=qubit_data.prob, + name=f"Control at {setup}", + coloraxis="coloraxis" + ), + row=1, + col=i+1, + ) + fig.update_xaxes(title_text="Pulse Duration [ns]", row=1, col=i+1) + fig.update_yaxes(title_text="Pulse Amplitude [a.u.]", row=1, col=i+1) + fig.update_layout(coloraxis={'colorscale':'Plasma'}) + + figs.append(fig) + return figs, "" + + +cross_resonance_chevron_length = Routine(_acquisition, _fit, _plot, two_qubit_gates=True) +"""CrossResonanceChevron Routine object.""" diff --git a/src/qibocal/protocols/two_qubit_interaction/cross_resonance/cnot_amplitude.py b/src/qibocal/protocols/two_qubit_interaction/cross_resonance/cnot_amplitude.py new file mode 100644 index 0000000000..3b3aeafd7b --- /dev/null +++ b/src/qibocal/protocols/two_qubit_interaction/cross_resonance/cnot_amplitude.py @@ -0,0 +1,208 @@ +from dataclasses import dataclass, field +from typing import Optional, Union + +import numpy as np +import numpy.typing as npt +import plotly.graph_objects as go +from plotly.subplots import make_subplots +import itertools + +from qibolab import AcquisitionType, AveragingMode, ExecutionParameters +from qibolab.platform import Platform +from qibolab.sweeper import Parameter, Sweeper, SweeperType +from qibolab.native import NativePulse +from qibolab.qubits import QubitId, QubitPairId +from qibocal.auto.operation import Data, Parameters, Results, Routine +from qibolab.pulses import Pulse, PulseSequence, PulseShape, PulseType, Gaussian, Drag, Rectangular, GaussianSquare, DrivePulse + +from .utils import STATES, BASIS, ro_projection_pulse,cr_plot, Setup, Basis +from .amplitude import ( + CrossResonanceType, + CrossResonanceParameters, + CrossResonanceData, +) +from qibo.backends import matrices +from typing import Literal, List + +projections: list[str] = BASIS +"""Projections to measure for the Cross Resonance CNOT calibration.""" + + +@dataclass +class CrossResonanceCnotData(CrossResonanceData): + """Data structure for Cross Resonance CNOT calibration.""" + + native: str = "CNOT" + """Native gate for the calibration.""" + + def __getitem__(self, pair): + return { + index: value + for index, value in self.data.items() + if set(pair).issubset(index) + } + + +@dataclass +class CrossResonanceCNOTParameters(CrossResonanceParameters): + """Cross Resonance Gate Calibration runcard inputs.""" + + target_amplitude: float = None + """Target pulse amplitude for ZZ correction.""" + + echo : bool = False + """Echo pulse for the control qubit.""" + + +@dataclass +class CrossResonanceCnotResults(Results): + """Cross Resonance Gate Calibration outputs.""" + + # exp_t: dict[QubitPairId, dict[str, str, dict[list[float],list[float],list[float]] ]] = field(default_factory=dict) + # # pair(Target, Control), control state, basis, expectation value + # """Expectation values for each basis in the Pauli group as a function of the pulse length.""" + + #measured_density_matrix: dict[QubitId, int, list] = field(default_factory=dict) + #"""Complex measured density matrix.""" + + +def _acquisition( + params: CrossResonanceCNOTParameters, platform: Platform, targets: list[QubitPairId] +) -> CrossResonanceCnotData: + """Data acquisition for Cross Resonance Gate Calibration. + The gate consists on a pi/2 pulse on the target qubit followed by a CR pulse on the control qubit. + The control qubit is prepared in either the |0> or |1> state and the target qubit is prepared in the |+> state. + Target: --[X/2]---[Pulse(omega_t, amp_t, phi=0)]---------[Pulse(omega_t, amp_t, phi=pi)]---[RO]-- + + Control: ---[X*]---[Pulse(omega_t, amp_c, phi=0)]---[X]--[Pulse(omega_t, amp_c, phi=pi)]--[X]--[RO]-- + """ + + data = CrossResonanceCnotData(targets = targets) + if isinstance(params.pulse_shape, str): + shape = PulseShape.eval(params.pulse_shape) + else: + shape = Rectangular() + + + for pair in targets: + for ctr_setup in STATES: + for basis in params.projections: + target, control = pair + tgt_native_rx:NativePulse = platform.qubits[target].native_gates.RX90.pulse(start=0) + ctr_native_rx:NativePulse = platform.qubits[control].native_gates.RX.pulse(start=0) + + pulse_duration = int(params.pulse_duration if params.pulse_duration is not None else ctr_native_rx.duration) + pulse_amplitude = params.pulse_amplitude if params.pulse_amplitude is not None else ctr_native_rx.amplitude + + sequence = PulseSequence() + next_start = 0 + + sequence.add(tgt_native_rx) + next_start = tgt_native_rx.finish + + if ctr_setup == STATES[1]: + sequence.add(ctr_native_rx) + next_start = max(ctr_native_rx.finish, next_start) + + cr_pulses = [] + + if params.target_amplitude is not None: + cr_pulse_tgt = Pulse(start=next_start, + duration= pulse_duration, + amplitude= params.target_amplitude, + frequency= tgt_native_rx.frequency, # control frequency + relative_phase=0, + shape= params.pulse_shape, + qubit= target, + channel= tgt_native_rx.channel , + type= PulseType.DRIVE + ) + cr_pulses.append(cr_pulse_tgt) + + cr_pulse_ctr: Pulse = Pulse(start= next_start, + duration= pulse_duration, + amplitude= pulse_amplitude, + frequency= tgt_native_rx.frequency, # control frequency + relative_phase= 0, + shape= params.pulse_shape, + qubit= control, + channel= ctr_native_rx.channel , + type= PulseType.DRIVE + ) + cr_pulses.append(cr_pulse_ctr) + cr_pulses.append(platform.create_RX_pulse(control, start=cr_pulses[-1].finish)) + + cr_pulse_ctr2: Pulse = Pulse(start= cr_pulses[-1].finish, + duration= pulse_duration, + amplitude= pulse_amplitude, + frequency= tgt_native_rx.frequency, # control frequency + relative_phase= 180, + shape= params.pulse_shape, + qubit= control, + channel= ctr_native_rx.channel , + type= PulseType.DRIVE + ) + cr_pulses.append(cr_pulse_ctr2) + cr_pulses.append(platform.create_RX_pulse(control, start=cr_pulses[-1].finish)) + next_start = cr_pulses[-1].finish + + for cr_pulse in cr_pulses: + sequence.add(cr_pulse) + next_start = max(cr_pulse.finish, next_start) + + # Add Readout pulses + ro_qubit = target + projection_pulses, ro_pulses= {}, {} + projection_pulses[ro_qubit], ro_pulses[ro_qubit] = ro_projection_pulse( + platform, ro_qubit, start=next_start+4, projection=basis + ) + sequence.add(projection_pulses[ro_qubit]) + sequence.add(ro_pulses[ro_qubit]) + + amplitude_range = pulse_amplitude*params.amplitude_factor_range + sweeper = Sweeper( + parameter = Parameter.amplitude, + values = amplitude_range, + pulses = [cr_pulse_ctr, cr_pulse_ctr2],# cr_pulse_echo, cr_pulse_tgt,cr_pulse_tgt_echo], + type = SweeperType.ABSOLUTE, + ) + + results = platform.sweep( + sequence, + ExecutionParameters( + nshots=params.nshots, + relaxation_time=params.relaxation_time, + acquisition_type=AcquisitionType.DISCRIMINATION, + averaging_mode=AveragingMode.SINGLESHOT, + ), + sweeper, + ) + + # Store the results + probability = results[ro_qubit].probability(state=1) + data.register_qubit( + CrossResonanceType, + data_keys=(pair, ro_qubit, 'X90', ctr_setup, basis), + data_dict=dict( + prob=probability, + amp=amplitude_range, + error = np.sqrt(probability*(1-probability)/params.nshots).tolist() + ), + ) + + return data + + +def _fit(data: CrossResonanceCnotData) -> CrossResonanceCnotResults: + """Post-processing function for Cross Resonance Gate Calibration.""" + return CrossResonanceCnotResults() + + +def _plot(data: CrossResonanceCnotData, target: QubitPairId, fit: CrossResonanceCnotResults): + """Plotting function for Cross Resonance Gate Calibration.""" + pair = tuple(target) + figs = cr_plot(data,target, 'amp') + return figs, "" + +cross_resonance_cnot = Routine(_acquisition, _fit, _plot, two_qubit_gates=True) +"""CrossResonance CNOT calibration object.""" diff --git a/src/qibocal/protocols/two_qubit_interaction/cross_resonance/cnot_length.py b/src/qibocal/protocols/two_qubit_interaction/cross_resonance/cnot_length.py new file mode 100644 index 0000000000..f88813cfb9 --- /dev/null +++ b/src/qibocal/protocols/two_qubit_interaction/cross_resonance/cnot_length.py @@ -0,0 +1,214 @@ +from dataclasses import dataclass, field +from typing import Optional, Union + +import numpy as np +import numpy.typing as npt +import plotly.graph_objects as go +from plotly.subplots import make_subplots +import itertools + +from qibolab import AcquisitionType, AveragingMode, ExecutionParameters +from qibolab.platform import Platform +from qibolab.sweeper import Parameter, Sweeper, SweeperType +from qibolab.native import NativePulse +from qibolab.qubits import QubitId, QubitPairId +from qibocal.auto.operation import Data, Parameters, Results, Routine +from qibolab.pulses import Pulse, PulseSequence, PulseShape, PulseType, Gaussian, Drag, Rectangular, GaussianSquare, DrivePulse + +from .utils import STATES, BASIS, ro_projection_pulse,cr_plot, Setup, Basis +from .length import ( + CrossResonanceLengthType, + CrossResonanceLengthParameters, + CrossResonanceLengthData, + CrossResonanceLengthResults, +) +from qibo.backends import matrices +from typing import Literal, List + +projections: list[str] = BASIS +"""Projections to measure for the Cross Resonance CNOT calibration.""" + + +@dataclass +class CrossResonanceCnotLengthData(CrossResonanceLengthData): + """Data structure for Cross Resonance CNOT calibration.""" + + native: str = "CNOT" + """Native gate for the calibration.""" + + def __getitem__(self, pair): + return { + index: value + for index, value in self.data.items() + if set(pair).issubset(index) + } + + +@dataclass +class CrossResonanceCNOTParameters(CrossResonanceLengthParameters): + """Cross Resonance Gate Calibration runcard inputs.""" + + target_amplitude: float = 0.0 + """Target pulse amplitude for ZZ correction.""" + + echo : bool = False + """Echo pulse for the control qubit.""" + + +@dataclass +class CrossResonanceCnotLengthResults(Results): + """Cross Resonance Gate Calibration outputs.""" + + # exp_t: dict[QubitPairId, dict[str, str, dict[list[float],list[float],list[float]] ]] = field(default_factory=dict) + # # pair(Target, Control), control state, basis, expectation value + # """Expectation values for each basis in the Pauli group as a function of the pulse length.""" + + #measured_density_matrix: dict[QubitId, int, list] = field(default_factory=dict) + #"""Complex measured density matrix.""" + + +def _acquisition( + params: CrossResonanceCNOTParameters, platform: Platform, targets: list[QubitPairId] +) -> CrossResonanceCnotLengthData: + """Data acquisition for Cross Resonance Gate Calibration. + The gate consists on a pi/2 pulse on the target qubit followed by a CR pulse on the control qubit. + The control qubit is prepared in either the |0> or |1> state and the target qubit is prepared in the |+> state. + Target: --[X/2]---[Pulse(omega_t, amp_t, phi=0)]---------[Pulse(omega_t, amp_t, phi=pi)]---[RO]-- + + Control: ---[X*]---[Pulse(omega_t, amp_c, phi=0)]---[X*]--[Pulse(omega_t, amp_c, phi=pi)]---[RO]-- + """ + + data = CrossResonanceCnotLengthData(targets = targets) + if isinstance(params.pulse_shape, str): + shape = PulseShape.eval(params.pulse_shape) + else: + shape = Rectangular() + + for pair in targets: + for ctr_setup in STATES: + for basis in BASIS: + target, control = pair + tgt_native_rx:NativePulse = platform.qubits[target].native_gates.RX90.pulse(start=0) + ctr_native_rx:NativePulse = platform.qubits[control].native_gates.RX.pulse(start=0) + + sequence = PulseSequence() + next_start = 0 + + sequence.add(tgt_native_rx) + next_start = tgt_native_rx.finish + + if ctr_setup == STATES[1]: + sequence.add(ctr_native_rx) + next_start = max(ctr_native_rx.finish, next_start) + + # cr_pulse_tgt = tgt_native_rx.copy() + # cr_pulse_tgt.amplitude = params.target_amplitude + # cr_pulse_tgt.start = next_start + # cr_pulse_tgt.duration = params.pulse_duration_start + # cr_pulse_tgt.shape = shape + + cr_pulse: Pulse = Pulse(start=next_start, + duration=params.pulse_duration_start, + amplitude=ctr_native_rx.amplitude, + frequency=tgt_native_rx.frequency, # control frequency + relative_phase=0, + shape=params.pulse_shape, + qubit=control, + channel= ctr_native_rx.channel , + type=PulseType.DRIVE + ) + if params.pulse_amplitude is not None: + cr_pulse.amplitude = params.pulse_amplitude + + sequence.add(cr_pulse) + next_start = cr_pulse.finish + + ## Echo Pulse + # if ctr_setup == STATES[1]: + # ctr_rx2:NativePulse = platform.qubits[control].native_gates.RX.pulse(start=next_start) + # sequence.add(platform.qubits[control].native_gates.RX.pulse(start=next_start)) + # next_start = max(ctr_rx2.finish, next_start) + + # cr_pulse_tgt_echo = tgt_native_rx.copy() + # cr_pulse_tgt_echo.amplitude = params.target_amplitude + # cr_pulse_tgt_echo.start = cr_pulse.finish + # cr_pulse_tgt_echo.duration = params.pulse_duration_start/2 + # cr_pulse_tgt_echo.shape = shape + # cr_pulse_tgt_echo.relative_phase = 180 + + # cr_pulse_echo: Pulse = Pulse(start=next_start, + # duration=params.pulse_duration_start, + # amplitude=ctr_native_rx.amplitude, + # frequency=tgt_native_rx.frequency, # target frequency at control qubit + # relative_phase=180, + # shape=shape, + # channel= ctr_native_rx.channel, + # qubit=control, + # type= PulseType.DRIVE, + # ) + + # if params.pulse_amplitude is not None: + # cr_pulse_echo.amplitude = params.pulse_amplitude + # next_start = cr_pulse_echo.finish + # sequence.add(cr_pulse_echo) + + # sequence.add(cr_pulse_tgt) + # sequence.add(cr_pulse_tgt_echo) + + sequence.add(cr_pulse) + + # Add Readout pulses + ro_qubit = target + projection_pulses, ro_pulses= {}, {} + projection_pulses[ro_qubit], ro_pulses[ro_qubit] = ro_projection_pulse( + platform, ro_qubit, start=cr_pulse.finish, projection=basis + ) + sequence.add(projection_pulses[ro_qubit]) + sequence.add(ro_pulses[ro_qubit]) + + sweeper_duration = Sweeper( + parameter = Parameter.duration, + values = params.duration_range, + pulses = [cr_pulse],# cr_pulse_echo, cr_pulse_tgt,cr_pulse_tgt_echo], + type = SweeperType.ABSOLUTE, + ) + + results = platform.sweep( + sequence, + ExecutionParameters( + nshots=params.nshots, + relaxation_time=params.relaxation_time, + acquisition_type=AcquisitionType.DISCRIMINATION, + averaging_mode=AveragingMode.SINGLESHOT, + ), + sweeper_duration, + ) + + # Store the results + probability = results[ro_qubit].probability(state=1) + data.register_qubit( + CrossResonanceLengthType, + data_keys=(pair, ro_qubit, 'X90', ctr_setup, basis), + data_dict=dict( + prob=probability, + duration=params.duration_range, + error = np.sqrt(probability*(1-probability)/params.nshots).tolist() + ), + ) + + return data + + +def _fit(data: CrossResonanceCnotLengthData) -> CrossResonanceCnotLengthResults: + """Post-processing function for Cross Resonance Gate Calibration.""" + return CrossResonanceCnotLengthResults() + + +def _plot(data: CrossResonanceCnotLengthData, target: QubitPairId, fit: CrossResonanceCnotLengthResults): + """Plotting function for Cross Resonance Gate Calibration.""" + pair = tuple(target) + figs = cr_plot(data,target, 'duration') + return figs, "" + +cross_resonance_cnot_length = Routine(_acquisition, _fit, _plot, two_qubit_gates=True) +"""CrossResonance Length CNOT calibration object.""" diff --git a/src/qibocal/protocols/two_qubit_interaction/cross_resonance/length.py b/src/qibocal/protocols/two_qubit_interaction/cross_resonance/length.py new file mode 100644 index 0000000000..d43818a465 --- /dev/null +++ b/src/qibocal/protocols/two_qubit_interaction/cross_resonance/length.py @@ -0,0 +1,289 @@ +from dataclasses import dataclass, field +from typing import Optional, Union + +import numpy as np +import numpy.typing as npt +import plotly.graph_objects as go +import itertools + +from qibolab import AcquisitionType, AveragingMode, ExecutionParameters +from qibolab.platform import Platform +from qibolab.sweeper import Parameter, Sweeper, SweeperType +from qibolab.native import NativePulse +from qibolab.qubits import QubitId, QubitPairId +from qibolab.pulses import Pulse, PulseSequence, PulseType +from qibolab.pulses import Gaussian, Drag, Rectangular, GaussianSquare + + +from qibocal.config import log +from qibocal.auto.operation import Data, Parameters, Results, Routine +from qibocal.protocols.utils import guess_period, fallback_period, chi2_reduced, table_html, table_dict +from qibocal.protocols.rabi.utils import fit_length_function, rabi_length_function + +from .utils import STATES, BASIS, ro_projection_pulse, cr_plot, Setup, Basis + +CrossResonanceLengthType = np.dtype( + [ + ("prob", np.float64), + ("duration", np.int64), + ("error", np.float64), + ] +) +"""Custom dtype for Cross Resonance Gate Calibration with Swept pulse duration.""" + +@dataclass +class CrossResonanceLengthParameters(Parameters): + """Cross Resonance Gate Calibration runcard inputs.""" + + pulse_duration_start: float + """Initial pi pulse duration [ns].""" + pulse_duration_end: float + """Final pi pulse duration [ns].""" + pulse_duration_step: float + """Step pi pulse duration [ns].""" + pulse_amplitude: Optional[float] = None + """CR pulse amplitude [ns].""" + shape: Optional[str] = "Rectangular()" + """CR pulse shape.""" + projections: Optional[list[str]] = field(default_factory=lambda: [BASIS[2]]) + """Measurement porjection""" + tgt_setup: Optional[list[str]] = field(default_factory=lambda: [STATES[0]]) + """Setup for the experiment.""" + + @property + def duration_range(self): + return np.arange( + self.pulse_duration_start, self.pulse_duration_end, self.pulse_duration_step + ) + """Pulse duration range.""" + @property + def pulse_shape(self): + return eval(self.shape) + """Cross Resonance Pulse shape.""" + + def __dict__(self): + """Convert the object to a dictionary.""" + return { + prop: getattr(self, prop) for prop in self.__dataclass_fields__ + if prop not in ["pulse_shape", "duration_range"] + } + + +@dataclass +class CrossResonanceLengthResults(Results): + """Cross Resonance Gate Calibration outputs.""" + amplitude: dict[QubitPairId, dict[Setup, float]] + """Pi pulse amplitude. Same for all bases in each qubit pair test. If specified in the runcard, same for all pairs.""" + duration: dict[QubitPairId, dict[Setup, float]] = field(default_factory=dict) + """Fitted pi pulse duration for each qubit.""" + fitted_parameters: dict[QubitPairId, dict[Setup, Setup, Basis, Union[float, list[float]]]] = field(default_factory=dict) + """Raw fitting output.""" + chi2: dict[QubitPairId, dict[Setup, Setup, Union[float, list[float]]]] = field(default_factory=dict) + """Reduced chi2 for each fitting.""" + Jeff: dict[QubitPairId, Union[float, list[float]]] = field(default_factory=dict) + """Effective coupling strength for each qubit pair.""" + +@dataclass +class CrossResonanceLengthData(Data): + """Data structure for Cross Resonance Gate Calibration.""" + + targets: list[QubitPairId] = field(default_factory=list) + """Targets for the Cross Resonance Gate Calibration stored as pair of [target, control].""" + + parameters: dict = field(default_factory=dict) + """Parameters for the Cross Resonance Gate Calibration.""" + + amplitude: dict[QubitPairId, float] = field(default_factory=dict) + """Amplitude of the qubit drive pulse.""" + + data: dict[(QubitPairId, QubitId, Setup, Setup, Basis), + npt.NDArray[CrossResonanceLengthType]] = field(default_factory=dict) + """Raw data acquired.""" + + +def _acquisition( + params: CrossResonanceLengthParameters, platform: Platform, targets: list[QubitPairId] +) -> CrossResonanceLengthData: + """Data acquisition for Cross Resonance Gate Calibration.""" + + parameters = params.__dict__() + parameters["ctr_setup"] = STATES + log.info(f"Cross Resonance Gate Calibration parameters: {parameters}") + data = CrossResonanceLengthData( + targets=targets, + parameters=parameters, + ) + amplitude = {} + for pair in targets: + target, control = pair + for tgt_setup, ctr_setup, basis in itertools.product(params.tgt_setup, STATES, params.projections): + tgt_native_rx:NativePulse = platform.qubits[target].native_gates.RX.pulse(start=0) + ctr_native_rx:NativePulse = platform.qubits[control].native_gates.RX.pulse(start=0) + + sequence = PulseSequence() + next_start = 0 + + if tgt_setup == STATES[1]: + sequence.add(tgt_native_rx) + next_start = tgt_native_rx.finish + + if ctr_setup == STATES[1]: + sequence.add(ctr_native_rx) + next_start = max(ctr_native_rx.finish, next_start) + + cr_pulse: Pulse = Pulse(start=next_start, + duration=params.pulse_duration_start, + amplitude=ctr_native_rx.amplitude, + frequency=tgt_native_rx.frequency, # control frequency + relative_phase=0, + shape=params.pulse_shape, + qubit=control, + channel= ctr_native_rx.channel ,type=PulseType.DRIVE + ) + + if params.pulse_amplitude is not None: + cr_pulse.amplitude = params.pulse_amplitude + amplitude[pair] = params.pulse_amplitude + else: + amplitude[pair] = cr_pulse.amplitude + + sequence.add(cr_pulse) + + # Add readout pulses + projection_pulse , ro_pulses = {}, {} + for ro_qubit in pair: + projection_pulse[ro_qubit], ro_pulses[ro_qubit] = ro_projection_pulse( + platform, ro_qubit, start=cr_pulse.finish, projection=basis + ) + sequence.add(projection_pulse[ro_qubit]) + sequence.add(ro_pulses[ro_qubit]) + + sweeper_duration = Sweeper( + parameter = Parameter.duration, + values = params.duration_range, + pulses=[cr_pulse], + type=SweeperType.ABSOLUTE, + ) + + results = platform.sweep( + sequence, + ExecutionParameters( + nshots=params.nshots, + relaxation_time=params.relaxation_time, + acquisition_type=AcquisitionType.DISCRIMINATION, + averaging_mode=AveragingMode.CYCLIC, + ), + sweeper_duration, + ) + + # store the results + for ro_qubit in pair: + probability = np.array(results[ro_qubit].probability(state=1)) + data.register_qubit( + CrossResonanceLengthType, + (pair, ro_qubit, tgt_setup, ctr_setup, basis), + dict( + prob=probability.tolist(), + duration=params.duration_range, + error=np.sqrt(probability * (1 - probability) / params.nshots).tolist(), + ), + ) + + data.amplitude = amplitude + + return data + +def _fit( + data: CrossResonanceLengthData, +) -> CrossResonanceLengthResults: + """Post-processing function for Cross Resonance Gate Calibration.""" + tgt_setups = data.parameters['tgt_setup'] + ctr_setups = data.parameters['ctr_setup'] if 'ctr_setup' in data.parameters else STATES + projections = data.parameters['projections'] + amplitude = data.amplitude + + # Initialize dictionaries to store the results + fit_popt = {} + fit_chi2 = {} + fit_duration = {} + fit_amplitude = {} + fit_Jeff = {} + # Loop over the qubit pairs and their setups + for i, pair in enumerate(data.targets): + target, control = pair + + _popt = {} + _chi2 = {} + _duration = {} + _amplitude = {} + + for tgt_setup, basis, ctr_setup in itertools.product(tgt_setups, projections, ctr_setups): + # Get the data for the current qubit pair and setup + + + _data: CrossResonanceLengthData = data[(tuple(pair), target, tgt_setup, ctr_setup, basis)] + raw_x = _data.duration + min_x = np.min(raw_x) + max_x = np.max(raw_x) + y = _data.prob + x = (raw_x - min_x) / (max_x - min_x) + + # Fit the data + period = fallback_period(guess_period(x, y)) + pguess = [0.5, 0.5, period, 0, 0] + try: + popt, perr, pi_pulse_parameter = fit_length_function(x, y, pguess, sigma=_data.error, signal = False, x_limits=(min_x, max_x)) + + _popt[tgt_setup, ctr_setup, basis] = popt + _chi2[tgt_setup, ctr_setup, basis] = [chi2_reduced(y, rabi_length_function(raw_x, *popt),_data.error), + np.sqrt(2 / len(y))] + + if basis == BASIS[-1]: + _amplitude[ctr_setup] = amplitude[tuple(pair)] + _duration[ctr_setup]= [pi_pulse_parameter, perr[2] * (max_x - min_x) / 2] + print(pi_pulse_parameter)# popt[2] / 2 + + + except Exception as e: + log.error(f"Error fitting data for {tuple(pair)} |{tgt_setup},{ctr_setup}>, <{basis}>: {e}") + continue + + if STATES[0] in _duration and STATES[1] in _duration: + fit_Jeff[tuple(pair)] = (1/_duration['X'][0]- 1/_duration['I'][0])*1e9/2 + print(f"Jeff for {tuple(pair)}: {fit_Jeff[tuple(pair)]*1e-6} MHz") + + fit_popt[tuple(pair)] = _popt + fit_chi2[tuple(pair)] = _chi2 + fit_duration[tuple(pair)] = _duration + fit_amplitude[tuple(pair)] = _amplitude + + ret = CrossResonanceLengthResults(amplitude = fit_amplitude, + duration = fit_duration, + Jeff = fit_Jeff, + chi2 = fit_chi2, + fitted_parameters = fit_popt) + return ret + +def _plot(data: CrossResonanceLengthData, fit: CrossResonanceLengthResults, target: QubitPairId + ) -> tuple[list[go.Figure], str]: + """Plotting function for Cross Resonance Gate Calibration.""" + target = tuple(target) + fit_table = "" + # Create a table with the results + if fit is not None: + fit_values = [1/np.array(fit.duration[target][ctr_setup][0])*1e9 for ctr_setup in STATES]+[fit.amplitude[target][STATES[1]], fit.Jeff[target]] + fit_names = [f"Rabi freq. Ctrl: |{ctr_setup}> [Hz]" for ctr_setup in STATES] + ["Ctr Amp.", "J_{eff}"] + + fit_table = table_html( + table_dict( + qubit = target[0], + names = fit_names, + values = fit_values, + display_error=False + ), + ) + + return cr_plot(data,target,'duration',fit = fit), fit_table + +cross_resonance_length = Routine(_acquisition, _fit, _plot, two_qubit_gates=True) +"""CrossResonance Duration Routine object.""" diff --git a/src/qibocal/protocols/two_qubit_interaction/cross_resonance/length_sequences.py b/src/qibocal/protocols/two_qubit_interaction/cross_resonance/length_sequences.py new file mode 100644 index 0000000000..64eed8bf23 --- /dev/null +++ b/src/qibocal/protocols/two_qubit_interaction/cross_resonance/length_sequences.py @@ -0,0 +1,116 @@ +from dataclasses import dataclass, field +from typing import Optional + +import numpy as np +import numpy.typing as npt +import plotly.graph_objects as go +import itertools + +from qibolab import AcquisitionType, AveragingMode, ExecutionParameters +from qibolab.platform import Platform +from qibolab.qubits import QubitId, QubitPairId +from qibocal.auto.operation import Data, Parameters, Results, Routine +from qibocal.protocols.two_qubit_interaction.cross_resonance.length import ( + CrossResonanceLengthParameters, + CrossResonanceLengthResults, + CrossResonanceLengthData, + CrossResonanceLengthType, +) +from qibolab.pulses import Pulse, PulseSequence, PulseType +from qibolab.pulses import Gaussian, Drag, Rectangular, GaussianSquare + +from .utils import STATES, cr_plot + +def _acquisition( + params: CrossResonanceLengthParameters, platform: Platform, targets: list[QubitPairId] +) -> CrossResonanceLengthData: + """Data acquisition for Cross Resonance Gate Calibration using Sequences.""" + from qibolab.native import NativePulse + + data = CrossResonanceLengthData() + + basis = 'Z' + + for pair in targets: + target, control = pair + for tgt_setup, ctr_setup in itertools.product(params.tgt_setups, STATES): + probability, length, error = {target: [], control: []}, {target: [], control: []}, {target: [], control: []} + for duration in params.duration_range: + target, control = pair + tgt_native_rx:NativePulse = platform.qubits[target].native_gates.RX.pulse(start=0) + ctr_native_rx:NativePulse = platform.qubits[control].native_gates.RX.pulse(start=0) + + sequence = PulseSequence() + next_start = 0 + + if tgt_setup == STATES[1]: + sequence.add(tgt_native_rx) + next_start = tgt_native_rx.finish + + if ctr_setup == STATES[1]: + sequence.add(ctr_native_rx) + next_start = max(ctr_native_rx.finish, next_start) + + cr_pulse: Pulse = Pulse(start=next_start, + duration=duration, + amplitude=ctr_native_rx.amplitude, + frequency=tgt_native_rx.frequency, # control frequency + relative_phase=0, + shape=params.pulse_shape, + qubit=control, + channel= ctr_native_rx.channel ,type=PulseType.DRIVE + ) + + if params.pulse_amplitude is not None: + cr_pulse.amplitude = params.pulse_amplitude + + sequence.add(cr_pulse) + + for ro_qubit in pair: + sequence.add(platform.create_qubit_readout_pulse(ro_qubit, start=cr_pulse.finish)) + + results = platform.execute_pulse_sequence( + sequence, + ExecutionParameters( + nshots=params.nshots, + relaxation_time=params.relaxation_time, + acquisition_type=AcquisitionType.DISCRIMINATION, + # averaging_mode=AveragingMode.SINGLESHOT, + averaging_mode=AveragingMode.CYCLIC, + ), + ) + for ro_qubit in pair: + probability[ro_qubit].append(results[ro_qubit].probability(state=1)) + length[ro_qubit].append(duration) + error[ro_qubit].append(np.sqrt(probability[ro_qubit][-1]*(1-probability[ro_qubit][-1])/params.nshots)) + + for ro_qubit in pair: + data.register_qubit( + CrossResonanceLengthType, + (pair, ro_qubit, tgt_setup, ctr_setup, basis), + dict( + prob=probability[ro_qubit], + length=length[ro_qubit], + error=error[ro_qubit], + ), + ) + + return data + + +def _fit( + data: CrossResonanceLengthData, +) -> CrossResonanceLengthResults: + """Post-processing function for Cross Resonance Gate Calibration using Sequences.""" + return CrossResonanceLengthResults() + + +def _plot(data: CrossResonanceLengthData, target: QubitPairId, fit: CrossResonanceLengthResults + ) -> tuple[list[go.Figure], str]: + """Plotting function for Cross Resonance Gate Calibration using Sequences.""" + return cr_plot(data,target, 'duration'), "" + + + +cross_resonance_length_sequences = Routine(_acquisition, _fit, _plot, two_qubit_gates=True) +"""CrossResonance Routine object.""" diff --git a/src/qibocal/protocols/two_qubit_interaction/cross_resonance/utils.py b/src/qibocal/protocols/two_qubit_interaction/cross_resonance/utils.py new file mode 100644 index 0000000000..7d155cecb9 --- /dev/null +++ b/src/qibocal/protocols/two_qubit_interaction/cross_resonance/utils.py @@ -0,0 +1,151 @@ +from qibolab.pulses import PulseSequence +from qibolab.qubits import QubitId, QubitPairId +from qibolab.pulses import Pulse, Rectangular, PulseType, Gaussian, DrivePulse, ReadoutPulse +from qibolab.native import NativePulse +from qibolab.platform import Platform +from qibolab.qubits import QubitId, QubitPairId + +from typing import Literal +import plotly.graph_objects as go +import itertools +import numpy as np +import numpy.typing as npt +from typing import Optional, Union + +from qibocal.protocols.utils import table_dict, table_html, COLORBAND, COLORBAND_LINE +from qibocal.protocols.rabi.utils import extract_rabi +from qibocal.protocols.rabi.amplitude import RabiAmplitudeData +from qibocal.protocols.rabi.length import RabiLengthData +from qibocal.config import log + +Setup = str +"""Type for setup for the experiment.""" + +BASIS = ['X', 'Y', 'Z'] +"""Standard projections for measurements.""" + +STATES = ['I', 'X'] +"""Setup states for the cross resonance gate calibration: {Identity, RX}.""" + +Basis = Literal[BASIS] +"""Type for basis for the experiment.""" + +DataType = np.dtype( + [ + ("prob", np.float64), + ("param", np.int64), + ("error", np.int64), + ] +) +"""Custom dtype for Gate Calibration with generic pulse parameter.""" + + +def ro_projection_pulse(platform: Platform, qubit, start=0, projection = BASIS[2]): + """Create a readout pulse for a given qubit.""" + + qd_pulse: DrivePulse = platform.create_RX90_pulse(qubit, start=start) + ro_pulse: ReadoutPulse = platform.create_MZ_pulse(qubit, start=qd_pulse.finish) + + if projection == BASIS[0]: + qd_pulse.relative_phase= 355/226 + ro_pulse.relative_phase= 0 + elif projection == BASIS[1]: + qd_pulse.relative_phase= 355/113 + ro_pulse.relative_phase= 0 #pi # 355/113 ~ pi (err:2.6e-7) + elif projection == BASIS[2]: + qd_pulse.amplitude = 0 + qd_pulse.duration = 4 + + else: + raise ValueError(f"Invalid measurement <{projection}>") + + return qd_pulse, ro_pulse + + +def cr_plot( + data: dict[(QubitPairId, QubitId, Setup, Setup, Basis), + npt.NDArray[DataType]], + target: QubitPairId, + parameter: Literal["amp", "duration"], + fit: Union[dict] = None) -> list[go.Figure]: + """Plot the cross resonance data.""" + target = tuple(target) + tgt, ctr = target + figs = [] + basis_set, ctr_set, tgt_set, qubit_set = set(), set(), set(), set() + + if parameter == "amp": + _, title, fitting = extract_rabi(RabiAmplitudeData()) + else: + _, title, fitting = extract_rabi(RabiLengthData()) + + + for key in data.data.keys(): + basis_set.add(key[4]) + ctr_set.add(key[3]) + tgt_set.add(key[2]) + qubit_set.add(key[1]) + basis_set = sorted(basis_set) + qubit_set = sorted(qubit_set) + + for ro_qubit, basis in itertools.product(qubit_set, basis_set): + fig = go.Figure() + for ctr_setup, tgt_setup in itertools.product(ctr_set,tgt_set): + # Check if the data is available + if (target, ro_qubit, tgt_setup, ctr_setup, basis) not in data.data: + log(f"Data not available for {ro_qubit}, {tgt}, {ctr}, {tgt_setup}, {ctr_setup}, {basis}") + continue + _data = data.data[target, ro_qubit, tgt_setup, ctr_setup, basis] + cr_indvar = getattr(_data, parameter) + fig.add_trace( + go.Scatter( + x=cr_indvar, y=np.real(1-2*np.array(_data.prob)), + name= f"Target: |{tgt_setup}>, Control: |{ctr_setup}>", + mode='markers', + ), + ) + + fig.add_trace( + go.Scatter( + x= np.concatenate((cr_indvar, cr_indvar[::-1])), + y = np.concatenate((np.real(1-2*(np.array(_data.prob) - np.array(_data.error))), + np.real(1-2*(np.array(_data.prob) + np.array(_data.error)))[::-1] )), + fill="toself", + fillcolor=COLORBAND, + line=dict(color=COLORBAND_LINE), + showlegend=True, + name="Errors", + ), + ) + + if fit is not None and ro_qubit == tgt: + cr_indvar = getattr(_data, parameter) + x = np.linspace( + min(cr_indvar), + max(cr_indvar), + 2 * len(cr_indvar), + ) + params = fit.fitted_parameters[target][tgt_setup, ctr_setup, basis] + y=fitting(x, *params) + fig.add_trace( + go.Scatter( + x=x, y=1-2*y, + mode='lines', + name=f'Fit Contrl:|{ctr_setup}>', + line=go.scatter.Line(dash="dot"), + marker_color="rgb(255, 130, 67)", + ) + ) + + + fig.update_layout( + title=f"Qubit {ro_qubit}", + xaxis_title=f"CR Pulse {parameter} [{'ns' if parameter == 'duration' else 'a.u.'}]", + yaxis_title=f"<{basis}({'t' if parameter == 'duration' else parameter})>", + #Adjust range + yaxis=dict(range=[-1., 1.]), + ) + figs.append(fig) + + + return figs \ No newline at end of file diff --git a/src/qibocal/protocols/two_qubit_interaction/mermin/__init__.py b/src/qibocal/protocols/two_qubit_interaction/mermin/__init__.py new file mode 100644 index 0000000000..5a4e9488d0 --- /dev/null +++ b/src/qibocal/protocols/two_qubit_interaction/mermin/__init__.py @@ -0,0 +1 @@ +from .protocol import mermin diff --git a/src/qibocal/protocols/two_qubit_interaction/mermin/protocol.py b/src/qibocal/protocols/two_qubit_interaction/mermin/protocol.py new file mode 100644 index 0000000000..a4f764d023 --- /dev/null +++ b/src/qibocal/protocols/two_qubit_interaction/mermin/protocol.py @@ -0,0 +1,264 @@ +from dataclasses import dataclass, field +from typing import Optional + +import numpy as np +import numpy.typing as npt +import plotly.graph_objects as go +from qibolab import ExecutionParameters +from qibolab.platform import Platform +from qibolab.qubits import QubitId + +from qibocal.auto.operation import Data, Parameters, Results, Routine + +from ...readout_mitigation_matrix import readout_mitigation_matrix +from ...utils import STRING_TYPE, calculate_frequencies +from .pulses import create_mermin_sequences +from .utils import ( + compute_mermin, + get_mermin_coefficients, + get_mermin_polynomial, + get_readout_basis, +) + +PLOT_PADDING = 0.2 + + +@dataclass +class MerminParameters(Parameters): + """Mermin experiment input parameters.""" + + ntheta: int + """Number of angles probed linearly between 0 and 2 pi.""" + native: Optional[bool] = False + """If True a circuit will be created using only GPI2 and CZ gates.""" + apply_error_mitigation: Optional[bool] = False + """Error mitigation model""" + + +MerminType = np.dtype( + [ + ("theta", float), + ("basis", STRING_TYPE), + ("state", int), + ("frequency", int), + ] +) + + +@dataclass +class MerminData(Data): + """Mermin Data structure.""" + + thetas: list + """Angles probed.""" + data: dict[list[QubitId], npt.NDArray[MerminType]] = field(default_factory=dict) + """Raw data acquired.""" + mitigation_matrix: dict[list[QubitId], npt.NDArray[np.float64]] = field( + default_factory=dict + ) + """Mitigation matrix computed using the readout_mitigation_matrix protocol.""" + + @property + def targets(self): + return list(self.data) + + +@dataclass +class MerminResults(Results): + """Mermin Results class.""" + + mermin: dict[tuple[QubitId, ...], npt.NDArray[np.float64]] = field( + default_factory=dict + ) + """Raw Mermin value.""" + + mermin_mitigated: dict[tuple[QubitId, ...], npt.NDArray[np.float64]] = field( + default_factory=dict + ) + """Mitigated Mermin value.""" + + +def _acquisition( + params: MerminParameters, + platform: Platform, + targets: list[list[QubitId]], +) -> MerminData: + """Data acquisition for Mermin protocol using pulse sequences.""" + + thetas = np.linspace(0, 2 * np.pi, params.ntheta) + data = MerminData(thetas=thetas.tolist()) + if params.apply_error_mitigation: + mitigation_data, _ = readout_mitigation_matrix.acquisition( + readout_mitigation_matrix.parameters_type.load(dict(nshots=params.nshots)), + platform, + targets, + ) + + mitigation_results, _ = readout_mitigation_matrix.fit(mitigation_data) + data.mitigation_matrix = mitigation_results.readout_mitigation_matrix + platform.connect() + for qubits in targets: + mermin_polynomial = get_mermin_polynomial(len(qubits)) + readout_basis = get_readout_basis(mermin_polynomial) + + for theta in thetas: + mermin_sequences = create_mermin_sequences( + platform, qubits, readout_basis=readout_basis, theta=theta + ) + options = ExecutionParameters(nshots=params.nshots) + # TODO: use unrolling + for basis, sequence in mermin_sequences.items(): + results = platform.execute_pulse_sequence(sequence, options=options) + frequencies = calculate_frequencies(results, qubits) + for state, frequency in enumerate(frequencies.values()): + data.register_qubit( + MerminType, + tuple(qubits), + dict( + theta=np.array([theta]), + basis=np.array([basis]), + state=np.array([state]), + frequency=np.array([frequency]), + ), + ) + return data + + +def _fit(data: MerminData) -> MerminResults: + """Fitting for Mermin protocol.""" + targets = data.targets + results = {qubits: [] for qubits in targets} + mitigated_results = {qubits: [] for qubits in targets} + basis = np.unique(data.data[targets[0]].basis) + for qubits in targets: + mermin_polynomial = get_mermin_polynomial(len(qubits)) + mermin_coefficients = get_mermin_coefficients(mermin_polynomial) + + for theta in data.thetas: + qubit_data = data.data[qubits] + outputs = [] + mitigated_outputs = [] + for base in basis: + frequencies = np.zeros(2 ** len(qubits)) + data_filter = (qubit_data.basis == base) & (qubit_data.theta == theta) + filtered_data = qubit_data[data_filter] + state_freq = qubit_data[data_filter].frequency + for state, freq in zip(filtered_data.state, filtered_data.frequency): + frequencies[state] = freq + + outputs.append( + { + format(i, f"0{len(qubits)}b"): freq + for i, freq in enumerate(state_freq) + } + ) + + if data.mitigation_matrix: + mitigated_output = np.dot( + data.mitigation_matrix[qubits], + frequencies, + ) + mitigated_outputs.append( + { + format(i, f"0{len(qubits)}b"): freq + for i, freq in enumerate(mitigated_output) + } + ) + if data.mitigation_matrix: + mitigated_results[tuple(qubits)].append( + compute_mermin(mitigated_outputs, mermin_coefficients) + ) + results[tuple(qubits)].append(compute_mermin(outputs, mermin_coefficients)) + return MerminResults( + mermin=results, + mermin_mitigated=mitigated_results, + ) + + +def _plot(data: MerminData, fit: MerminResults, target): + """Plotting function for Mermin protocol.""" + figures = [] + + n_qubits = len(target) + classical_bound = 2 ** (n_qubits // 2) + quantum_bound = 2 ** ((n_qubits - 1) / 2) * (2 ** (n_qubits // 2)) + + fig = go.Figure( + layout_yaxis_range=[-quantum_bound - PLOT_PADDING, quantum_bound + PLOT_PADDING] + ) + if fit is not None: + fig.add_trace( + go.Scatter( + x=data.thetas, + y=fit.mermin[tuple(target)], + name="Bare", + ) + ) + if fit.mermin_mitigated: + fig.add_trace( + go.Scatter( + x=data.thetas, + y=fit.mermin_mitigated[tuple(target)], + name="Mitigated", + ) + ) + + fig.add_trace( + go.Scatter( + mode="lines", + x=data.thetas, + y=[+classical_bound] * len(data.thetas), + line_color="gray", + name="Classical limit", + line_dash="dash", + legendgroup="classic", + ) + ) + + fig.add_trace( + go.Scatter( + mode="lines", + x=data.thetas, + y=[-classical_bound] * len(data.thetas), + line_color="gray", + name="Classical limit", + legendgroup="classic", + line_dash="dash", + showlegend=False, + ) + ) + + fig.add_trace( + go.Scatter( + mode="lines", + x=data.thetas, + y=[+quantum_bound] * len(data.thetas), + line_color="gray", + name="Quantum limit", + legendgroup="quantum", + ) + ) + + fig.add_trace( + go.Scatter( + mode="lines", + x=data.thetas, + y=[-quantum_bound] * len(data.thetas), + line_color="gray", + name="Quantum limit", + legendgroup="quantum", + showlegend=False, + ) + ) + + fig.update_layout( + xaxis_title="Theta [rad]", + yaxis_title="Mermin polynomial value", + xaxis=dict(range=[min(data.thetas), max(data.thetas)]), + ) + figures.append(fig) + + return figures, "" + + +mermin = Routine(_acquisition, _fit, _plot) diff --git a/src/qibocal/protocols/two_qubit_interaction/mermin/pulses.py b/src/qibocal/protocols/two_qubit_interaction/mermin/pulses.py new file mode 100644 index 0000000000..239f81d673 --- /dev/null +++ b/src/qibocal/protocols/two_qubit_interaction/mermin/pulses.py @@ -0,0 +1,84 @@ +from collections import defaultdict + +import numpy as np +from qibolab.pulses import PulseSequence + + +def create_mermin_sequence(platform, qubits, theta=None): + """Creates the pulse sequence to generate the bell states and with a theta-measurement""" + + nqubits = len(qubits) + if theta is None: + theta = ((nqubits - 1) * 0.25 * np.pi) % (2 * np.pi) + + virtual_z_phases = defaultdict(int) + sequence = PulseSequence() + + for qubit in qubits: + sequence.add( + platform.create_RX90_pulse( + qubit, start=0, relative_phase=virtual_z_phases[qubit] + np.pi / 2 + ) + ) + + # TODO: Not hardcode topology + + # qubits[0] needs to be the center qubit where everything is connected + for i in range(1, len(qubits)): + (cz_sequence1, cz_virtual_z_phases) = platform.create_CZ_pulse_sequence( + [qubits[0]] + [qubits[i]], sequence.finish + 8 # TODO: ask for the 8 + ) + sequence.add(cz_sequence1) + for qubit in cz_virtual_z_phases: + virtual_z_phases[qubit] += cz_virtual_z_phases[qubit] + + t = sequence.finish + 8 + + for i in range(1, len(qubits)): + sequence.add( + platform.create_RX90_pulse( + qubits[i], + start=t, + relative_phase=virtual_z_phases[qubits[i]] - np.pi / 2, + ) + ) + + virtual_z_phases[qubits[0]] -= theta + + return sequence, virtual_z_phases + + +def create_mermin_sequences(platform, qubits, readout_basis, theta): + """Creates the pulse sequences needed for the 4 measurement settings for chsh.""" + + mermin_sequences = {} + + for basis in readout_basis: + sequence, virtual_z_phases = create_mermin_sequence( + platform, qubits, theta=theta + ) + # t = sequence.finish + for i, base in enumerate(basis): + if base == "X": + sequence.add( + platform.create_RX90_pulse( + qubits[i], + start=sequence.finish, + relative_phase=virtual_z_phases[qubits[i]] + np.pi / 2, + ) + ) + if base == "Y": + sequence.add( + platform.create_RX90_pulse( + qubits[i], + start=sequence.finish, + relative_phase=virtual_z_phases[qubits[i]], + ) + ) + measurement_start = sequence.finish + + for qubit in qubits: + sequence.add(platform.create_MZ_pulse(qubit, start=measurement_start)) + + mermin_sequences[basis] = sequence + return mermin_sequences diff --git a/src/qibocal/protocols/two_qubit_interaction/mermin/utils.py b/src/qibocal/protocols/two_qubit_interaction/mermin/utils.py new file mode 100644 index 0000000000..e0afdca28a --- /dev/null +++ b/src/qibocal/protocols/two_qubit_interaction/mermin/utils.py @@ -0,0 +1,44 @@ +from qibo.hamiltonians import SymbolicHamiltonian +from qibo.symbols import X, Y + + +def compute_mermin(frequencies, mermin_coefficients): + """Computes the chsh inequality out of the frequencies of the 4 circuits executed.""" + assert len(frequencies) == len(mermin_coefficients) + m = 0 + for j, freq in enumerate(frequencies): + for key in freq: + m += ( + mermin_coefficients[j] + * freq[key] + * (-1) ** (sum([int(key[k]) for k in range(len(key))])) + ) + nshots = sum(freq[x] for x in freq) + if nshots != 0: + return float(m / nshots) + + return 0 + + +def get_mermin_polynomial(n): + assert n > 1 + m0 = X(0) + m0p = Y(0) + for i in range(1, n): + mn = m0 * (X(i) + Y(i)) + m0p * (X(i) - Y(i)) + mnp = m0 * (Y(i) - X(i)) + m0p * (X(i) + Y(i)) + m0 = mn.expand() + m0p = mnp.expand() + m = m0 / 2 ** ((n - 1) // 2) + return SymbolicHamiltonian(m.expand()) + + +def get_readout_basis(mermin_polynomial): + return [ + "".join([factor.name[0] for factor in term.factors]) + for term in mermin_polynomial.terms + ] + + +def get_mermin_coefficients(mermin_polynomial): + return [term.coefficient.real for term in mermin_polynomial.terms] diff --git a/src/qibocal/protocols/two_qubit_interaction/optimize.py b/src/qibocal/protocols/two_qubit_interaction/optimize.py index 020eecb66e..dcf4845b96 100644 --- a/src/qibocal/protocols/two_qubit_interaction/optimize.py +++ b/src/qibocal/protocols/two_qubit_interaction/optimize.py @@ -11,7 +11,6 @@ from qibolab.platform import Platform from qibolab.qubits import QubitId, QubitPairId from qibolab.sweeper import Parameter, Sweeper, SweeperType -from scipy.optimize import curve_fit from qibocal import update from qibocal.auto.operation import Data, Parameters, Results, Routine @@ -19,7 +18,7 @@ from qibocal.protocols.utils import table_dict, table_html from .utils import order_pair -from .virtual_z_phases import create_sequence, fit_function +from .virtual_z_phases import create_sequence, fit_sinusoid, phase_diff @dataclass @@ -112,8 +111,6 @@ class OptimizeTwoQubitGateData(Data): """Angles swept.""" native: str = "CZ" """Native two qubit gate.""" - vphases: dict[QubitPairId, dict[QubitId, float]] = field(default_factory=dict) - """Virtual phases for each qubit.""" amplitudes: dict[tuple[QubitId, QubitId], float] = field(default_factory=dict) """"Amplitudes swept.""" durations: dict[tuple[QubitId, QubitId], float] = field(default_factory=dict) @@ -166,10 +163,8 @@ def _acquisition( for setup in ("I", "X"): ( sequence, - virtual_z_phase, + flux_pulse, theta_pulse, - amplitude, - data.durations[ord_pair], ) = create_sequence( platform, setup, @@ -179,9 +174,8 @@ def _acquisition( params.native, params.dt, params.parking, - params.flux_pulse_amplitude_min, + flux_pulse_max_duration=params.duration_max, ) - data.vphases[ord_pair] = dict(virtual_z_phase) theta = np.arange( params.theta_start, params.theta_end, @@ -208,22 +202,22 @@ def _acquisition( sweeper_theta = Sweeper( Parameter.relative_phase, - theta - data.vphases[ord_pair][target_q], + theta, pulses=[theta_pulse], type=SweeperType.ABSOLUTE, ) sweeper_amplitude = Sweeper( Parameter.amplitude, - amplitude_range / amplitude, - pulses=[sequence.qf_pulses[0]], + amplitude_range / flux_pulse.amplitude, + pulses=[flux_pulse], type=SweeperType.FACTOR, ) sweeper_duration = Sweeper( Parameter.duration, duration_range, - pulses=[sequence.qf_pulses[0]], + pulses=[flux_pulse], type=SweeperType.ABSOLUTE, ) @@ -246,7 +240,7 @@ def _acquisition( target_q, control_q, setup, - theta - data.vphases[ord_pair][target_q], + theta, data.amplitudes[ord_pair], data.durations[ord_pair], result_control, @@ -284,28 +278,12 @@ def _fit( ) ) ] - pguess = [ - np.max(target_data) - np.min(target_data), - np.mean(target_data), - np.pi, - ] try: - popt, _ = curve_fit( - fit_function, - np.array(data.thetas) - data.vphases[ord_pair][target], - target_data, - p0=pguess, - bounds=( - (0, -np.max(target_data), 0), - (np.max(target_data), np.max(target_data), 2 * np.pi), - ), - ) - + params = fit_sinusoid(np.array(data.thetas), target_data) fitted_parameters[ target, control, setup, amplitude, duration - ] = popt.tolist() - + ] = params except Exception as e: log.warning( f"Fit failed for pair ({target, control}) due to {e}." @@ -316,13 +294,13 @@ def _fit( pair, list(pair)[::-1], ): - angles[target_q, control_q, amplitude, duration] = abs( + angles[target_q, control_q, amplitude, duration] = phase_diff( fitted_parameters[ target_q, control_q, "X", amplitude, duration - ][2] - - fitted_parameters[ + ][2], + fitted_parameters[ target_q, control_q, "I", amplitude, duration - ][2] + ][2], ) virtual_phases[ord_pair[0], ord_pair[1], amplitude, duration][ target_q @@ -431,7 +409,7 @@ def _plot( y=amps, z=cz, zmin=np.pi / 2, - zmax=3 * np.pi / 2, + zmax=np.pi, name="{fit.native} angle", colorbar_x=-0.1, colorscale="RdBu", diff --git a/src/qibocal/protocols/two_qubit_interaction/virtual_z_phases.py b/src/qibocal/protocols/two_qubit_interaction/virtual_z_phases.py index 01adbc5d11..d450f60688 100644 --- a/src/qibocal/protocols/two_qubit_interaction/virtual_z_phases.py +++ b/src/qibocal/protocols/two_qubit_interaction/virtual_z_phases.py @@ -38,10 +38,6 @@ class VirtualZPhasesParameters(Parameters): iSWAP and CZ are the possible options. """ - flux_pulse_amplitude: Optional[float] = None - """Amplitude of flux pulse implementing CZ.""" - flux_pulse_duration: Optional[float] = None - """Duration of flux pulse implementing CZ.""" dt: Optional[float] = 20 """Time delay between flux pulses and readout.""" parking: bool = True @@ -62,10 +58,6 @@ class VirtualZPhasesResults(Results): """Virtual Z phase correction.""" leakage: dict[QubitPairId, dict[QubitId, float]] """Leakage on control qubit for pair.""" - flux_pulse_amplitude: dict[QubitPairId, float] - """Amplitude of flux pulse implementing CZ.""" - flux_pulse_duration: dict[QubitPairId, int] - """Duration of flux pulse implementing CZ.""" def __contains__(self, key: QubitPairId): """Check if key is in class. @@ -88,9 +80,6 @@ class VirtualZPhasesData(Data): data: dict[tuple, npt.NDArray[VirtualZPhasesType]] = field(default_factory=dict) native: str = "CZ" thetas: list = field(default_factory=list) - vphases: dict[QubitPairId, dict[QubitId, float]] = field(default_factory=dict) - amplitudes: dict[tuple[QubitId, QubitId], float] = field(default_factory=dict) - durations: dict[tuple[QubitId, QubitId], float] = field(default_factory=dict) def __getitem__(self, pair): return { @@ -109,14 +98,11 @@ def create_sequence( native: str, parking: bool, dt: float, - amplitude: float = None, - duration: float = None, + flux_pulse_max_duration: float = None, ) -> tuple[ PulseSequence, - dict[QubitId, Pulse], - dict[QubitId, Pulse], - dict[QubitId, Pulse], - dict[QubitId, Pulse], + Pulse, + Pulse, ]: """Create the experiment PulseSequence.""" @@ -127,28 +113,24 @@ def create_sequence( ) RX_pulse_start = platform.create_RX_pulse(control_qubit, start=0, relative_phase=0) - flux_sequence, virtual_z_phase = getattr( - platform, f"create_{native}_pulse_sequence" - )( + flux_sequence, _ = getattr(platform, f"create_{native}_pulse_sequence")( (ordered_pair[1], ordered_pair[0]), start=max(Y90_pulse.finish, RX_pulse_start.finish), ) - if amplitude is not None: - flux_sequence.get_qubit_pulses(ordered_pair[1])[0].amplitude = amplitude - - if duration is not None: - flux_sequence.get_qubit_pulses(ordered_pair[1])[0].duration = duration + flux_pulse = flux_sequence.get_qubit_pulses(ordered_pair[1])[0] + if flux_pulse_max_duration is not None: + flux_pulse.duration = flux_pulse_max_duration theta_pulse = platform.create_RX90_pulse( target_qubit, start=flux_sequence.finish + dt, - relative_phase=virtual_z_phase[target_qubit], + relative_phase=0, ) RX_pulse_end = platform.create_RX_pulse( control_qubit, start=flux_sequence.finish + dt, - relative_phase=virtual_z_phase[control_qubit], + relative_phase=0, ) measure_target = platform.create_qubit_readout_pulse( target_qubit, start=theta_pulse.finish @@ -178,13 +160,7 @@ def create_sequence( pulse.duration = theta_pulse.finish sequence.add(pulse) - return ( - sequence, - virtual_z_phase, - theta_pulse, - flux_sequence.get_qubit_pulses(ordered_pair[1])[0].amplitude, - flux_sequence.get_qubit_pulses(ordered_pair[1])[0].duration, - ) + return sequence, flux_pulse, theta_pulse def _acquisition( @@ -222,10 +198,8 @@ def _acquisition( for setup in ("I", "X"): ( sequence, - virtual_z_phase, + _, theta_pulse, - data.amplitudes[ord_pair], - data.durations[ord_pair], ) = create_sequence( platform, setup, @@ -235,9 +209,7 @@ def _acquisition( params.native, params.dt, params.parking, - params.flux_pulse_amplitude, ) - data.vphases[ord_pair] = dict(virtual_z_phase) theta = np.arange( params.theta_start, params.theta_end, @@ -246,7 +218,7 @@ def _acquisition( ) sweeper = Sweeper( Parameter.relative_phase, - theta - data.vphases[ord_pair][target_q], + theta, pulses=[theta_pulse], type=SweeperType.ABSOLUTE, ) @@ -275,12 +247,38 @@ def _acquisition( return data -def fit_function(x, amplitude, offset, phase): +def sinusoid(x, amplitude, offset, phase): """Sinusoidal fit function.""" - # return p0 + p1 * np.sin(2*np.pi*p2 * x + p3) return np.sin(x + phase) * amplitude + offset +def phase_diff(phase_1, phase_2): + """Return the phase difference of two sinusoids, normalized in the range [0, pi].""" + return np.arccos(np.cos(phase_1 - phase_2)) + + +def fit_sinusoid(thetas, data): + """Fit sinusoid to the given data.""" + pguess = [ + np.max(data) - np.min(data), + np.mean(data), + np.pi, + ] + + popt, _ = curve_fit( + sinusoid, + thetas, + data, + p0=pguess, + bounds=( + (0, -np.max(data), 0), + (np.max(data), np.max(data), 2 * np.pi), + ), + ) + + return popt.tolist() + + def _fit( data: VirtualZPhasesData, ) -> VirtualZPhasesResults: @@ -302,23 +300,9 @@ def _fit( leakage[pair] = {} for target, control, setup in data[pair]: target_data = data[pair][target, control, setup].target - pguess = [ - np.max(target_data) - np.min(target_data), - np.mean(target_data), - np.pi, - ] try: - popt, _ = curve_fit( - fit_function, - np.array(data.thetas) - data.vphases[pair][target], - target_data, - p0=pguess, - bounds=( - (0, -np.max(target_data), 0), - (np.max(target_data), np.max(target_data), 2 * np.pi), - ), - ) - fitted_parameters[target, control, setup] = popt.tolist() + params = fit_sinusoid(np.array(data.thetas), target_data) + fitted_parameters[target, control, setup] = params except Exception as e: log.warning(f"CZ fit failed for pair ({target, control}) due to {e}.") @@ -328,11 +312,11 @@ def _fit( pair, list(pair)[::-1], ): - angle[target_q, control_q] = abs( - fitted_parameters[target_q, control_q, "X"][2] - - fitted_parameters[target_q, control_q, "I"][2] + angle[target_q, control_q] = phase_diff( + fitted_parameters[target_q, control_q, "X"][2], + fitted_parameters[target_q, control_q, "I"][2], ) - virtual_phase[pair][target_q] = fitted_parameters[ + virtual_phase[pair][target_q] = -fitted_parameters[ target_q, control_q, "I" ][2] @@ -348,11 +332,8 @@ def _fit( ) except KeyError: pass # exception covered above - return VirtualZPhasesResults( native=data.native, - flux_pulse_amplitude=data.amplitudes, - flux_pulse_duration=data.durations, angle=angle, virtual_phase=virtual_phase, fitted_parameters=fitted_parameters, @@ -360,7 +341,6 @@ def _fit( ) -# TODO: remove str def _plot(data: VirtualZPhasesData, fit: VirtualZPhasesResults, target: QubitPairId): """Plot routine for VirtualZPhases.""" pair_data = data[target] @@ -390,7 +370,7 @@ def _plot(data: VirtualZPhasesData, fit: VirtualZPhasesResults, target: QubitPai fig = fig1 if (target_q, control_q) == qubits else fig2 fig.add_trace( go.Scatter( - x=np.array(thetas) + data.vphases[qubits][target_q], + x=np.array(thetas), y=target_prob, name=f"{setup} sequence", legendgroup=setup, @@ -401,7 +381,7 @@ def _plot(data: VirtualZPhasesData, fit: VirtualZPhasesResults, target: QubitPai fig.add_trace( go.Scatter( - x=np.array(thetas) + data.vphases[qubits][control_q], + x=np.array(thetas), y=control_prob, name=f"{setup} sequence", legendgroup=setup, @@ -414,9 +394,9 @@ def _plot(data: VirtualZPhasesData, fit: VirtualZPhasesResults, target: QubitPai fitted_parameters = fit.fitted_parameters[target_q, control_q, setup] fig.add_trace( go.Scatter( - x=angle_range + data.vphases[qubits][target_q], - y=fit_function( - angle_range - data.vphases[qubits][target_q], + x=angle_range, + y=sinusoid( + angle_range, *fitted_parameters, ), name="Fit", @@ -445,21 +425,6 @@ def _plot(data: VirtualZPhasesData, fit: VirtualZPhasesResults, target: QubitPai ) ) ) - fitting_report.add( - table_html( - table_dict( - [qubits[1], qubits[1]], - [ - "Flux pulse amplitude [a.u.]", - "Flux pulse duration [ns]", - ], - [ - np.round(data.amplitudes[qubits], 4), - np.round(data.durations[qubits], 4), - ], - ) - ) - ) fig1.update_layout( title_text=f"Phase correction Qubit {qubits[0]}", @@ -482,17 +447,10 @@ def _plot(data: VirtualZPhasesData, fit: VirtualZPhasesResults, target: QubitPai def _update(results: VirtualZPhasesResults, platform: Platform, target: QubitPairId): # FIXME: quick fix for qubit order - qubit_pair = tuple(sorted(target)) target = tuple(sorted(target)) update.virtual_phases( results.virtual_phase[target], results.native, platform, target ) - getattr(update, f"{results.native}_duration")( - results.flux_pulse_duration[target], platform, target - ) - getattr(update, f"{results.native}_amplitude")( - results.flux_pulse_amplitude[target], platform, target - ) correct_virtual_z_phases = Routine( diff --git a/src/qibocal/protocols/two_qubit_interaction/virtual_z_phases_signal.py b/src/qibocal/protocols/two_qubit_interaction/virtual_z_phases_signal.py index 2b3f4419e6..35db5dc370 100644 --- a/src/qibocal/protocols/two_qubit_interaction/virtual_z_phases_signal.py +++ b/src/qibocal/protocols/two_qubit_interaction/virtual_z_phases_signal.py @@ -19,7 +19,10 @@ _fit, ) from .virtual_z_phases import _plot as _plot_prob -from .virtual_z_phases import _update, create_sequence +from .virtual_z_phases import ( + _update, + create_sequence, +) @dataclass @@ -75,10 +78,8 @@ def _acquisition( for setup in ("I", "X"): ( sequence, - virtual_z_phase, + _, theta_pulse, - data.amplitudes[ord_pair], - data.durations[ord_pair], ) = create_sequence( platform, setup, @@ -88,9 +89,7 @@ def _acquisition( params.native, params.dt, params.parking, - params.flux_pulse_amplitude, ) - data.vphases[ord_pair] = dict(virtual_z_phase) theta = np.arange( params.theta_start, params.theta_end, @@ -99,7 +98,7 @@ def _acquisition( ) sweeper = Sweeper( Parameter.relative_phase, - theta - data.vphases[ord_pair][target_q], + theta, pulses=[theta_pulse], type=SweeperType.ABSOLUTE, ) diff --git a/src/qibocal/protocols/two_qubit_state_tomography.py b/src/qibocal/protocols/two_qubit_state_tomography.py index 0d3ecabc4e..58da7ae15d 100644 --- a/src/qibocal/protocols/two_qubit_state_tomography.py +++ b/src/qibocal/protocols/two_qubit_state_tomography.py @@ -9,8 +9,8 @@ import plotly.graph_objects as go from plotly.subplots import make_subplots from qibo import Circuit, gates -from qibo.backends import GlobalBackend, NumpyBackend -from qibo.quantum_info import fidelity +from qibo.backends import NumpyBackend, construct_backend +from qibo.quantum_info import fidelity, partial_trace from qibo.result import QuantumState from qibolab.platform import Platform from qibolab.qubits import QubitId, QubitPairId @@ -97,9 +97,8 @@ def _acquisition( if params.circuit is None: params.circuit = Circuit(len(qubits)) - backend = GlobalBackend() - backend.platform = platform simulator = NumpyBackend() + backend = construct_backend("qibolab", platform=platform) transpiler = dummy_transpiler(backend) simulated_state = simulator.execute_circuit(deepcopy(params.circuit)) @@ -150,8 +149,8 @@ def _acquisition( traced_qubits = tuple( q for q in range(nqubits) if q not in (2 * i, 2 * i + 1) ) - data.ideal[pair] = simulator.partial_trace( - simulation_result.state(), traced_qubits, nqubits + data.ideal[pair] = partial_trace( + simulation_result.state(), traced_qubits ) return data @@ -179,11 +178,18 @@ def project_psd(matrix): def _fit(data: StateTomographyData) -> StateTomographyResults: """Post-processing for two qubit state tomography. - Uses the standard linear inversion algorithm described in - https://en.wikipedia.org/wiki/Quantum_tomography#Linear_inversion - to reconstruct the density matrix. - The matrix is also post projected after the linear inversion - using ``project_psd``. + Uses a linear inversion algorithm to reconstruct the density matrix + from measurements, with the following steps: + 1. Construct a linear transformation M, from density matrix + to Born-probabilities in the space of all two-qubit measurement bases + (in our case XX, XY, XZ, YX, YY, YZ, ZX, ZY, ZZ). + 2. Invert M to get the transformation from Born-probabilities to + density matrices. + 3. Calculate vector of Born-probabilities from experimental measurements (frequencies). + 4. Map this vector to a density matrix (``measured_raw_density_matrix``) using the + inverse of M from step 2. + 5. Project the calculated density matrix to the space of positive semidefinite + matrices (``measured_density_matrix``) using the function ``project_psd``. """ rotations = [ np.kron(rotation_matrix(basis1), rotation_matrix(basis2)) @@ -296,7 +302,7 @@ def _plot(data: StateTomographyData, fit: StateTomographyResults, target: QubitP return [fig_measurements], fitting_report measured = np.array(fit.measured_density_matrix_real[target]) + 1j * np.array( - fit.measured_raw_density_matrix_imag[target] + fit.measured_density_matrix_imag[target] ) fig = plot_reconstruction(data.ideal[target], measured) diff --git a/src/qibocal/protocols/utils.py b/src/qibocal/protocols/utils.py index a8513ef922..f7cebb4660 100644 --- a/src/qibocal/protocols/utils.py +++ b/src/qibocal/protocols/utils.py @@ -45,6 +45,7 @@ """Confidence interval used to clean outliers.""" DELAY_FIT_PERCENTAGE = 10 """Percentage of the first and last points used to fit the cable delay.""" +STRING_TYPE = " tuple[Output, Path]: @@ -68,17 +68,16 @@ def test_new_output(): path1 = _new_output() path1.mkdir() path2 = _new_output() - - assert str(path1).split("-")[-2] == "000" - assert str(path2).split("-")[-2] == "001" + assert path1.name.split("-")[3] == "000" + assert path2.name.split("-")[3] == "001" def test_output_mkdir(): path1 = Output.mkdir() path2 = Output.mkdir() - assert str(path1).split("-")[-2] == "000" - assert str(path2).split("-")[-2] == "001" + assert path1.name.split("-")[3] == "000" + assert path2.name.split("-")[3] == "001" with pytest.raises(RuntimeError): Output.mkdir(path1) diff --git a/tests/test_protocols.py b/tests/test_protocols.py index b5278a5a0b..9a145183f6 100644 --- a/tests/test_protocols.py +++ b/tests/test_protocols.py @@ -21,7 +21,7 @@ SINGLE_ACTION_RUNCARD = "action.yml" PLATFORM = create_platform("dummy") PATH_TO_RUNCARD = pathlib.Path(__file__).parent / "runcards/" -RUNCARDS_NAMES = ["protocols.yml", "rb_noise_protocols.yml", "protocols_couplers.yml"] +RUNCARDS_NAMES = ["protocols.yml", "protocols_couplers.yml"] INVOKER_OPTIONS = dict(catch_exceptions=False) """Generate errors when calling qq.""" @@ -62,19 +62,19 @@ def locate_tomography_file(runcard): @pytest.mark.parametrize("update", ["--update", "--no-update"]) @pytest.mark.parametrize("runcard", generate_runcard_single_protocol(), ids=idfn) -def test_auto_command(runcard, update, tmp_path): +def test_run_command(runcard, update, tmp_path): """Test auto command pipeline.""" runcard = runcard[0] locate_tomography_file(runcard) (tmp_path / SINGLE_ACTION_RUNCARD).write_text(yaml.safe_dump(runcard)) - outpath = tmp_path / "auto_test" + outpath = tmp_path / "run_test" runner = CliRunner() runner.invoke( command, [ - "auto", + "run", str(tmp_path / SINGLE_ACTION_RUNCARD), "-o", str(outpath), diff --git a/tests/test_randomized_benchmarking.py b/tests/test_randomized_benchmarking.py index 0baab439b4..3b82164a5a 100644 --- a/tests/test_randomized_benchmarking.py +++ b/tests/test_randomized_benchmarking.py @@ -2,13 +2,13 @@ import numpy as np import pytest -import qibo -from qibocal.protocols.randomized_benchmarking import fitting, noisemodels +from qibocal.protocols.randomized_benchmarking import fitting from qibocal.protocols.randomized_benchmarking.dict_utils import load_inverse_cliffords from qibocal.protocols.randomized_benchmarking.utils import ( RB_Generator, generate_inv_dict_cliffords_file, + layer_circuit, load_cliffords, random_clifford, ) @@ -110,35 +110,6 @@ def test_exp2_fitting(): popt, perr = fitting.fit_exp2_func(x, y_dist) -# Test noisemodels -def test_PauliErrors(): - def test_model(noise_model, num_keys=1): - assert isinstance(noise_model, qibo.noise.NoiseModel) - errorkeys = noise_model.errors.keys() - assert len(errorkeys) == num_keys - error = list(noise_model.errors.values())[0][0][1] - assert isinstance(error, qibo.noise.PauliError) - assert len(error.options) == 3 and np.sum(pair[1] for pair in error.options) < 1 - - noise_model1 = noisemodels.PauliErrorOnAll() - test_model(noise_model1) - noise_model2 = noisemodels.PauliErrorOnAll([0.1, 0.1, 0.1]) - test_model(noise_model2) - noise_model3 = noisemodels.PauliErrorOnAll(None) - test_model(noise_model3) - with pytest.raises(ValueError): - noise_model4 = noisemodels.PauliErrorOnAll([0.1, 0.2]) - - noise_model1 = noisemodels.PauliErrorOnX() - test_model(noise_model1) - noise_model2 = noisemodels.PauliErrorOnX([0.1, 0.1, 0.1]) - test_model(noise_model2) - noise_model3 = noisemodels.PauliErrorOnX(None) - test_model(noise_model3) - with pytest.raises(ValueError): - noise_model4 = noisemodels.PauliErrorOnX([0.1, 0.2]) - - # Test utils @pytest.mark.parametrize("seed", [10]) @pytest.mark.parametrize("qubits", [1, 2, [0, 1], np.array([0, 1])]) @@ -184,3 +155,47 @@ def test_generate_inv_dict_cliffords_file(tmp_path): clifford_matrices_inv = load_inverse_cliffords(file_inv) assert clifford_inv.files == clifford_matrices_inv.files + + +@pytest.mark.parametrize("depth", [1, 10, 34]) +def test_layer_circuit_single_qubit(mocker, depth): + qubit = 0 + rb_gen = RB_Generator(123) + single_qubit_spy = mocker.spy(rb_gen, "layer_gen_single_qubit") + two_qubit_spy = mocker.spy(rb_gen, "layer_gen_two_qubit") + + circuit, indices = layer_circuit(rb_gen, depth, qubit) + + # assert that generator was called expected number of times + assert single_qubit_spy.call_count == depth + assert two_qubit_spy.call_count == 0 + + # assert that results from generator calls were used + assert circuit.depth == depth + circuit_gates = {g for m in circuit.queue.moments for g in m} + indices = set(indices) + for gate, i in single_qubit_spy.spy_return_list: + assert gate in circuit_gates + assert i in indices + + +@pytest.mark.parametrize("depth", [2, 24, 47]) +def test_layer_circuit_two_qubit(mocker, depth): + qubit_pair = (0, 1) + rb_gen = RB_Generator(123, file="2qubitCliffs.json") + single_qubit_spy = mocker.spy(rb_gen, "layer_gen_single_qubit") + two_qubit_spy = mocker.spy(rb_gen, "layer_gen_two_qubit") + + circuit, indices = layer_circuit(rb_gen, depth, qubit_pair) + + # assert that generator was called expected number of times + assert single_qubit_spy.call_count == 0 + assert two_qubit_spy.call_count == depth + + # assert that results from generator calls were used + assert circuit.depth >= depth + circuit_gates = [g for m in circuit.queue.moments for g in m if g is not None] + indices = set(indices) + for gates, i in two_qubit_spy.spy_return_list: + assert all(g in circuit_gates for g in gates) + assert i in indices diff --git a/tests/test_task_options.py b/tests/test_task_options.py index f2caafd58a..25b4772852 100644 --- a/tests/test_task_options.py +++ b/tests/test_task_options.py @@ -4,7 +4,7 @@ import pytest from pytest import approx -from qibo.backends import GlobalBackend, set_backend +from qibo.backends import get_backend, set_backend from qibocal import protocols from qibocal.auto.mode import AUTOCALIBRATION, ExecutionMode @@ -20,7 +20,7 @@ @pytest.fixture(scope="module") def platform(): set_backend(backend="qibolab", platform="dummy") - return GlobalBackend().platform + return get_backend().platform TARGETS = [0, 1, 2] @@ -107,7 +107,7 @@ def test_update_argument(platform, global_update, local_update, tmp_path): NEW_CARD = modify_card( UPDATE_CARD, local_update=local_update, global_update=global_update ) - # platform = deepcopy(GlobalBackend().platform) + # platform = deepcopy(get_backend().platform) old_readout_frequency = platform.qubits[0].readout_frequency old_iq_angle = platform.qubits[1].iq_angle Runcard.load(NEW_CARD).run( diff --git a/tests/test_transpile.py b/tests/test_transpile.py index 499ac9d289..c830fdbc4c 100644 --- a/tests/test_transpile.py +++ b/tests/test_transpile.py @@ -1,6 +1,6 @@ import numpy as np -from qibo import Circuit, gates, set_backend -from qibo.backends import GlobalBackend +from qibo import Circuit, gates +from qibo.backends import construct_backend from qibocal.auto.transpile import ( dummy_transpiler, @@ -29,8 +29,7 @@ def test_execute_transpiled_circuit(): circuit.add(gates.X(0)) circuit.add(gates.X(1)) qubit_map = [1, 2] - set_backend("qibolab", platform="dummy") - backend = GlobalBackend() + backend = construct_backend("qibolab", platform="dummy") transpiler = dummy_transpiler(backend) transpiled_circuit, _ = execute_transpiled_circuit( circuit, qubit_map, backend, transpiler=transpiler @@ -51,8 +50,7 @@ def test_execute_transpiled_circuits(): circuit.add(gates.X(0)) circuit.add(gates.X(1)) qubit_map = [1, 2] - set_backend("qibolab", platform="dummy") - backend = GlobalBackend() + backend = construct_backend("qibolab", platform="dummy") transpiler = dummy_transpiler(backend) transpiled_circuits, _ = execute_transpiled_circuits( [circuit], [qubit_map], backend, transpiler=transpiler diff --git a/tests/test_update.py b/tests/test_update.py index b183cc2320..b43365c3c9 100644 --- a/tests/test_update.py +++ b/tests/test_update.py @@ -1,4 +1,4 @@ -"""Testing update_* helper functions. """ +"""Testing update_* helper functions.""" import random import re