From 5e7b5fe8846ba6f91f955f5de04fa4dc57719ec8 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Tue, 14 Nov 2023 18:05:35 +0400 Subject: [PATCH 01/52] Add unrolling option to allXY --- .../protocols/characterization/allxy/allxy.py | 48 +++++++++++-------- tests/runcards/protocols.yml | 7 +++ 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/src/qibocal/protocols/characterization/allxy/allxy.py b/src/qibocal/protocols/characterization/allxy/allxy.py index 59abd46a6..37b7a0cf5 100644 --- a/src/qibocal/protocols/characterization/allxy/allxy.py +++ b/src/qibocal/protocols/characterization/allxy/allxy.py @@ -17,6 +17,9 @@ class AllXYParameters(Parameters): beta_param: float = None """Beta parameter for drag pulse.""" + unrolling: bool = False + """If ``True`` it uses sequence unrolling to deploy multiple sequences in a single instrument call. + Defaults to ``False``.""" @dataclass @@ -80,31 +83,38 @@ def _acquisition( # repeat the experiment as many times as defined by software_averages # for iteration in range(params.software_averages): + sequences, all_ro_pulses = [], [] for gates in gatelist: - # create a sequence of pulses - ro_pulses = {} - sequence = PulseSequence() + sequences.append(PulseSequence()) + all_ro_pulses.append({}) for qubit in qubits: - sequence, ro_pulses[qubit] = add_gate_pair_pulses_to_sequence( - platform, gates, qubit, sequence, params.beta_param + sequences[-1], all_ro_pulses[-1][qubit] = add_gate_pair_pulses_to_sequence( + platform, gates, qubit, sequences[-1], params.beta_param ) - # execute the pulse sequence - results = platform.execute_pulse_sequence( - sequence, - ExecutionParameters( - nshots=params.nshots, - averaging_mode=AveragingMode.CYCLIC, - ), - ) - - # retrieve the results for every qubit + + # execute the pulse sequence + options = ExecutionParameters( + nshots=params.nshots, averaging_mode=AveragingMode.CYCLIC + ) + if params.unrolling: + results = platform.execute_pulse_sequences(sequences, options) + else: + results = [ + platform.execute_pulse_sequence(sequence, options) for sequence in sequences + ] + + for ig, (gates, ro_pulses) in enumerate(zip(gatelist, all_ro_pulses)): + gate = "-".join(gates) for qubit in qubits: - z_proj = 2 * results[ro_pulses[qubit].serial].probability(0) - 1 - # store the results - gate = "-".join(gates) + serial = ro_pulses[qubit].serial + if params.unrolling: + z_proj = 2 * results[serial][ig].probability(0) - 1 + else: + z_proj = 2 * results[ig][serial].probability(0) - 1 data.register_qubit( - AllXYType, (qubit), dict(prob=np.array([z_proj]), gate=np.array([gate])) + AllXYType, (qubit), dict(prob=np.array(z_proj), gate=np.array([gate])) ) + # finally, save the remaining data return data diff --git a/tests/runcards/protocols.yml b/tests/runcards/protocols.yml index 9cde41d4b..e079e498d 100644 --- a/tests/runcards/protocols.yml +++ b/tests/runcards/protocols.yml @@ -432,6 +432,13 @@ actions: beta_param: null nshots: 10 + - id: allXY + priority: 0 + operation: allxy + parameters: + beta_param: null + unrolling: True + nshots: 10 - id: allxy_drag_pulse_tuning priority: 0 From c40e1c9740f6eb24afbf1eeafde1edb518bea408 Mon Sep 17 00:00:00 2001 From: GabrielePalazzo <73099233+GabrielePalazzo@users.noreply.github.com> Date: Mon, 27 Nov 2023 11:58:39 +0400 Subject: [PATCH 02/52] Added documentation for resonator punchout --- doc/source/protocols/index.rst | 1 + doc/source/protocols/resonator_punchout.rst | 75 +++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 doc/source/protocols/resonator_punchout.rst diff --git a/doc/source/protocols/index.rst b/doc/source/protocols/index.rst index f751e10f0..ecacc6dd4 100644 --- a/doc/source/protocols/index.rst +++ b/doc/source/protocols/index.rst @@ -7,3 +7,4 @@ In this section we introduce the basics of all protocols supported by ``qibocal` :maxdepth: 1 resonator_spectroscopy + resonator_punchout diff --git a/doc/source/protocols/resonator_punchout.rst b/doc/source/protocols/resonator_punchout.rst new file mode 100644 index 000000000..1ce48c87e --- /dev/null +++ b/doc/source/protocols/resonator_punchout.rst @@ -0,0 +1,75 @@ +Resonator punchout +================== + + +With the resonator spectroscopy at high power we found the bare resonator frequency +(also called high power frequency), but this is not the frequency that will be used in measurements. +We need to find the frequency in the low power regime, where the resonator is actually coupled +to the qubit. To do that, we first have to find the correct amplitude of the readout pulse. +Also this experiment can be initially performed with a VNA, to check everything is +working and to obtain a rough estimation of the parameters to be used by the control devices. +We do again a resonator spectroscopy experiment, measuring at different frequencies, +but this time scanning in a narrow frequency span and also for different pulse amplitudes. +We expect the resonator frequency to have a strong dependency on the amplitude: in +particular we expect it to be fixed at first (in the high power regime) then undergo a +transition phase and then be fixed again at a different frequency because of the coupling +with the qubit. + +Eventually, we want to have a plot like fig. 3.8 !!!!! +This experiment is the first one where we actually are ”seeing” the qubit and it's +extremely important also to check that the qubit is working properly. +During a characterization, various experimental problems can happen and can lead the experimenter +to believe that the qubit is no longer working: this experiment gives us an easy way to check it. + +????? Why is punchout better than low power resonator spectroscopy? ????? + +Moreover, from this experiment we can actually already have an estimate of the qubit +frequency using: + +.. math:: + + \omega_{rh} - \omega_{rl} = \chi = \frac{g^2}{\Delta} + +Where :math:`\Delta = \omega_{rl} - \omega_q`. +So, if we know, maybe from design specifications, the expected value of :math:`g`, we can +have an estimate of the qubit frequency. If, as in most cases, we don't have information +on :math:`g`, then we still can infer if the qubit frequency is higher or lower than the resonator +frequency. + +To obtain a clear plot, this experiment usually requires multiple tries, to choose +"good parameters". In particular: + +* the amplitude range and step must be chosen carefully because punchout can lead to extremely long experiments (that we would like to avoid), but large steps will inevitably confuse the plot; +* the frequency usually shifts very little, but depending on :math:`g` and :math:`\Delta`, so it is difficult to set the frequency span and step; +* if the scan in amplitude is linear, it will be difficult to have a clear view of all the three regimes at the same time. If it is possible, it may be worth to do a logarithmic scan. + +Note also that, in literature, this plot is often presented as a scan in the attenuation +of the readout line. The effect is the same as of changing the amplitude (although it is +by default a logarithmic scan), but the plot is reversed: at the top (high attenuation) +we will see the low power regime and at the bottom (low attenuation) the high power +one. + +In fig. 3.9 different punchout plots are shown, so that is understandable how much +they can differ. (!!!!! Removed? !!!!!) +Note that in the plots measured amplitudes are normalized for every readout amplitude and we +actually have very high amplitudes in high power, and much lower amplitude elsewhere. +From these plots we can extract few things: + +* the pulse amplitude that we will use for the next experiments for the readout pulse; +* the peak frequency (ground state frequency). + +We should try to use the amplitude that maximizes the signal to noise (S/N) ratio for the resonator, so in general the highest +amplitude at low power. However, we still need to be sure to not enter the transition +regime, something that could lead to very noisy experiments and eventually prevent us +to reach any sensible result. To be sure that, at the given pulse amplitude, we are not +in the transition regime, we can repeat the standard resonator spectroscopy with a finer +scan, checking if the peak is Lorentzian. +A resonator spectroscopy is also useful to better check the resonator frequency at low +power. We can alse write down the maximum value of the peak. +Since we are not interacting directly with the qubit, we are effectively measuring the +amplitude of the ground state and, from now on we will not change the resonator frequency, +so we expect to always measure this amplitude for the zero state. Here it is +not needed to do a precise measurement, but it is nevertheless very useful to have an +approximate value, that can later be used to check, in other experiments, that we are +not exciting the qubit by error (if we see a change in amplitude, then maybe the qubit +state has changed). From b33c29adbcea8982f90e004c55c25aaebccc8bae Mon Sep 17 00:00:00 2001 From: GabrielePalazzo <73099233+GabrielePalazzo@users.noreply.github.com> Date: Mon, 27 Nov 2023 12:32:52 +0400 Subject: [PATCH 03/52] Added resonator punchout runcard --- doc/source/protocols/resonator_punchout.rst | 26 ++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/doc/source/protocols/resonator_punchout.rst b/doc/source/protocols/resonator_punchout.rst index 1ce48c87e..f895b232b 100644 --- a/doc/source/protocols/resonator_punchout.rst +++ b/doc/source/protocols/resonator_punchout.rst @@ -15,8 +15,32 @@ particular we expect it to be fixed at first (in the high power regime) then und transition phase and then be fixed again at a different frequency because of the coupling with the qubit. +This is and example of a runcard for a resonator punchout: + +.. code-block:: yaml + + platform: + + qubits: [0] + + actions: + + - id: resonator punchout + priority: 0 + operation: resonator_punchout + main: qubit spectroscopy + parameters: + freq_width: 40_000_000 + freq_step: 500_000 + amplitude: 0.03 + min_amp_factor: 0.1 + max_amp_factor: 2.4 + step_amp_factor: 0.3 + nshots: 2048 + relaxation_time: 5000 + Eventually, we want to have a plot like fig. 3.8 !!!!! -This experiment is the first one where we actually are ”seeing” the qubit and it's +This experiment is the first one where we actually are "seeing" the qubit and it's extremely important also to check that the qubit is working properly. During a characterization, various experimental problems can happen and can lead the experimenter to believe that the qubit is no longer working: this experiment gives us an easy way to check it. From 76bc53b007376c8da0c8f0c491cb413ea90aaf64 Mon Sep 17 00:00:00 2001 From: GabrielePalazzo <73099233+GabrielePalazzo@users.noreply.github.com> Date: Mon, 27 Nov 2023 15:23:35 +0400 Subject: [PATCH 04/52] Fixed typo --- doc/source/protocols/resonator_punchout.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/doc/source/protocols/resonator_punchout.rst b/doc/source/protocols/resonator_punchout.rst index f895b232b..a488a79bd 100644 --- a/doc/source/protocols/resonator_punchout.rst +++ b/doc/source/protocols/resonator_punchout.rst @@ -28,7 +28,6 @@ This is and example of a runcard for a resonator punchout: - id: resonator punchout priority: 0 operation: resonator_punchout - main: qubit spectroscopy parameters: freq_width: 40_000_000 freq_step: 500_000 From 0765d7185c80db31d2720e6764901661b11c5bc7 Mon Sep 17 00:00:00 2001 From: GabrielePalazzo <73099233+GabrielePalazzo@users.noreply.github.com> Date: Mon, 27 Nov 2023 16:19:30 +0400 Subject: [PATCH 05/52] Added punchout plot --- doc/source/protocols/resonator_punchout.png | Bin 0 -> 129101 bytes doc/source/protocols/resonator_punchout.rst | 5 ++++- 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 doc/source/protocols/resonator_punchout.png diff --git a/doc/source/protocols/resonator_punchout.png b/doc/source/protocols/resonator_punchout.png new file mode 100644 index 0000000000000000000000000000000000000000..25760401df62d6770e0b73517043390fef45d34e GIT binary patch literal 129101 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ɠ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�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 literal 0 HcmV?d00001 diff --git a/doc/source/protocols/resonator_punchout.rst b/doc/source/protocols/resonator_punchout.rst index a488a79bd..ce7c4f5db 100644 --- a/doc/source/protocols/resonator_punchout.rst +++ b/doc/source/protocols/resonator_punchout.rst @@ -38,7 +38,10 @@ This is and example of a runcard for a resonator punchout: nshots: 2048 relaxation_time: 5000 -Eventually, we want to have a plot like fig. 3.8 !!!!! +Eventually, we want to have a plot like the one below: + +.. image:: resonator_punchout.png + This experiment is the first one where we actually are "seeing" the qubit and it's extremely important also to check that the qubit is working properly. During a characterization, various experimental problems can happen and can lead the experimenter From 302152599291049828dd307a962a524a13cec097 Mon Sep 17 00:00:00 2001 From: GabrielePalazzo <73099233+GabrielePalazzo@users.noreply.github.com> Date: Tue, 5 Dec 2023 15:36:20 +0400 Subject: [PATCH 06/52] Added comment about resonator punchout --- doc/source/protocols/resonator_punchout.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/doc/source/protocols/resonator_punchout.rst b/doc/source/protocols/resonator_punchout.rst index ce7c4f5db..299313881 100644 --- a/doc/source/protocols/resonator_punchout.rst +++ b/doc/source/protocols/resonator_punchout.rst @@ -47,7 +47,8 @@ extremely important also to check that the qubit is working properly. During a characterization, various experimental problems can happen and can lead the experimenter to believe that the qubit is no longer working: this experiment gives us an easy way to check it. -????? Why is punchout better than low power resonator spectroscopy? ????? +Compared to a low power resonator spectroscopy, with punchout we can see the shift in the resonator frequency +and thus ensure that we are in the low power regime. Moreover, from this experiment we can actually already have an estimate of the qubit frequency using: @@ -75,8 +76,6 @@ by default a logarithmic scan), but the plot is reversed: at the top (high atten we will see the low power regime and at the bottom (low attenuation) the high power one. -In fig. 3.9 different punchout plots are shown, so that is understandable how much -they can differ. (!!!!! Removed? !!!!!) Note that in the plots measured amplitudes are normalized for every readout amplitude and we actually have very high amplitudes in high power, and much lower amplitude elsewhere. From these plots we can extract few things: From d5445f4edcd33f54ba1cc7af75671cf21d48915c Mon Sep 17 00:00:00 2001 From: Andrea Date: Thu, 7 Dec 2023 11:12:45 +0400 Subject: [PATCH 07/52] fix: Fix rabi fitting by including phase in period estimate Fixes #656 but it requires more tests. --- .../protocols/characterization/rabi/amplitude.py | 4 ++-- .../characterization/rabi/amplitude_signal.py | 4 +++- .../protocols/characterization/rabi/length.py | 2 +- .../characterization/rabi/length_signal.py | 5 ++++- .../protocols/characterization/rabi/utils.py | 16 +++++++++++++++- 5 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/qibocal/protocols/characterization/rabi/amplitude.py b/src/qibocal/protocols/characterization/rabi/amplitude.py index 68de5974a..3b2f6cc68 100644 --- a/src/qibocal/protocols/characterization/rabi/amplitude.py +++ b/src/qibocal/protocols/characterization/rabi/amplitude.py @@ -150,7 +150,7 @@ def _fit(data: RabiAmplitudeData) -> RabiAmplitudeResults: index = local_maxima[0] if len(local_maxima) > 0 else None # 0.5 hardcoded guess for less than one oscillation f = x[index] / (x[1] - x[0]) if index is not None else 0.5 - pguess = [0.5, 0.5, 1 / f, np.pi / 2] + pguess = [0.5, 0.5, 1 / f, 0] try: popt, perr = curve_fit( utils.rabi_amplitude_function, @@ -165,7 +165,7 @@ def _fit(data: RabiAmplitudeData) -> RabiAmplitudeResults: sigma=qubit_data.error, ) perr = np.sqrt(np.diag(perr)) - pi_pulse_parameter = np.abs(popt[2] / 2) + pi_pulse_parameter = utils.correct_period(period=popt[2], phase=popt[3]) except: log.warning("rabi_fit: the fitting was not succesful") diff --git a/src/qibocal/protocols/characterization/rabi/amplitude_signal.py b/src/qibocal/protocols/characterization/rabi/amplitude_signal.py index 5447cd65f..620ac303e 100644 --- a/src/qibocal/protocols/characterization/rabi/amplitude_signal.py +++ b/src/qibocal/protocols/characterization/rabi/amplitude_signal.py @@ -155,7 +155,9 @@ def _fit(data: RabiAmplitudeVoltData) -> RabiAmplitudeVoltResults: popt[2] * (x_max - x_min), popt[3] - 2 * np.pi * x_min / (x_max - x_min) / popt[2], ] - pi_pulse_parameter = np.abs((translated_popt[2]) / 2) + pi_pulse_parameter = utils.correct_period( + period=translated_popt[2], phase=translated_popt[3] + ) except: log.warning("rabi_fit: the fitting was not succesful") diff --git a/src/qibocal/protocols/characterization/rabi/length.py b/src/qibocal/protocols/characterization/rabi/length.py index 126a359bc..3c4ca89c9 100644 --- a/src/qibocal/protocols/characterization/rabi/length.py +++ b/src/qibocal/protocols/characterization/rabi/length.py @@ -169,7 +169,7 @@ def _fit(data: RabiLengthData) -> RabiLengthResults: sigma=qubit_data.error, ) perr = np.sqrt(np.diag(perr)) - pi_pulse_parameter = np.abs(popt[2] / 2) + pi_pulse_parameter = utils.correct_period(period=popt[2], phase=popt[3]) except: log.warning("rabi_fit: the fitting was not succesful") pi_pulse_parameter = 0 diff --git a/src/qibocal/protocols/characterization/rabi/length_signal.py b/src/qibocal/protocols/characterization/rabi/length_signal.py index 37757a72a..321b3f338 100644 --- a/src/qibocal/protocols/characterization/rabi/length_signal.py +++ b/src/qibocal/protocols/characterization/rabi/length_signal.py @@ -161,7 +161,10 @@ def _fit(data: RabiLengthVoltData) -> RabiLengthVoltResults: popt[3] - 2 * np.pi * x_min / popt[2] / (x_max - x_min), popt[4] / (x_max - x_min), ] - pi_pulse_parameter = np.abs(translated_popt[2] / 2) + pi_pulse_parameter = utils.correct_period( + period=translated_popt[2], phase=translated_popt[3] + ) + except: log.warning("rabi_fit: the fitting was not succesful") pi_pulse_parameter = 0 diff --git a/src/qibocal/protocols/characterization/rabi/utils.py b/src/qibocal/protocols/characterization/rabi/utils.py index 00b1e8aeb..1442935bc 100644 --- a/src/qibocal/protocols/characterization/rabi/utils.py +++ b/src/qibocal/protocols/characterization/rabi/utils.py @@ -12,7 +12,7 @@ def rabi_amplitude_function(x, offset, amplitude, period, phase): Args: x: Input data. """ - return offset + amplitude * np.sin(2 * np.pi * x / period + phase) + return offset + amplitude * np.cos(2 * np.pi * x / period + phase) def rabi_length_function(x, offset, amplitude, period, phase, t2_inv): @@ -190,3 +190,17 @@ def extract_rabi(data): if "RabiLength" in data.__class__.__name__: return "length", "Time [ns]", rabi_length_function raise RuntimeError("Data has to be a data structure of the Rabi routines.") + + +def correct_period(period: float, phase: float): + """Correct period by taking phase into account. + + https://github.com/qiboteam/qibocal/issues/656 + """ + + naive_half_period = period / 2 + # solution of cos (2 pi x / period + phase) = +/- 1 for k in [-2,2] + solutions = [naive_half_period * (k - phase / np.pi) for k in [-2, -1, 0, 1, 2]] + # chose solution closest to naive_half period + + return solutions[np.argmin(np.abs(solutions - naive_half_period))] From a36e84db8a99f1e722d566ddb128ba0b55b74ce9 Mon Sep 17 00:00:00 2001 From: Andrea Date: Thu, 7 Dec 2023 12:44:14 +0400 Subject: [PATCH 08/52] fix: Fix issues with report: end-time and hrefs Closes #655. There was an error in template.html regarding the hrefs. For the end-time the meta needed to be dumped after each action. --- src/qibocal/cli/autocalibration.py | 13 ++++++------- src/qibocal/web/templates/template.html | 14 ++++++-------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/qibocal/cli/autocalibration.py b/src/qibocal/cli/autocalibration.py index 520ad2348..57f3a6638 100644 --- a/src/qibocal/cli/autocalibration.py +++ b/src/qibocal/cli/autocalibration.py @@ -61,9 +61,12 @@ def autocalibrate(runcard, folder, force, update): for _ in executor.run(mode=ExecutionMode.autocalibration): report = ReportBuilder(path, qubits, executor, meta, executor.history) report.run(path) - - e = datetime.datetime.now(datetime.timezone.utc) - meta["end-time"] = e.strftime("%H:%M:%S") + # meta needs to be updated after each report to show correct end-time + e = datetime.datetime.now(datetime.timezone.utc) + meta["end-time"] = e.strftime("%H:%M:%S") + # dump updated meta + meta = add_timings_to_meta(meta, executor.history) + (path / META).write_text(json.dumps(meta, indent=4)) # stop and disconnect platform if platform is not None: @@ -73,7 +76,3 @@ def autocalibrate(runcard, folder, force, update): # dump updated runcard if platform is not None: dump_runcard(platform, path / UPDATED_PLATFORM) - - # dump updated meta - meta = add_timings_to_meta(meta, executor.history) - (path / META).write_text(json.dumps(meta, indent=4)) diff --git a/src/qibocal/web/templates/template.html b/src/qibocal/web/templates/template.html index 245a00069..fb1daefda 100644 --- a/src/qibocal/web/templates/template.html +++ b/src/qibocal/web/templates/template.html @@ -63,15 +63,13 @@ Actions
- {% for routine, iteration in report.history %} - {% endfor %}
@@ -132,7 +130,7 @@

{{ report.title }}

{% for task_uid in report.history %} -
+

{{ report.routine_name(*task_uid) }}

From 2b74dcc8376ff003bfc0308bb6b6f8a40ade3047 Mon Sep 17 00:00:00 2001 From: Andrea Date: Thu, 7 Dec 2023 12:46:21 +0400 Subject: [PATCH 09/52] chore: Remove unused file Removing autocalibration.html since the current report is rendered using template.html --- .../web/templates/autocalibration.html | 245 ------------------ 1 file changed, 245 deletions(-) delete mode 100644 src/qibocal/web/templates/autocalibration.html diff --git a/src/qibocal/web/templates/autocalibration.html b/src/qibocal/web/templates/autocalibration.html deleted file mode 100644 index 3731fd924..000000000 --- a/src/qibocal/web/templates/autocalibration.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - - - {% if report %} - {{ report.title }} - {% else %} - Qibocal {{version}} - {% endif %} - - - - - - - {% if is_static %} - - - - - {{ css_styles }} - {% else %} - - {% endif %} - - - - - - - -
- - - -
- - {% if report.path %} -
-

{{ report.title }}

- -
-

- Platform: {{ report.metadata.get('platform')}}
- Run date: {{ report.metadata.get('date') }}
- Start time (UTC): {{ report.metadata.get('start-time') }}
- End time (UTC): {{ report.metadata.get('end-time') }} -

-

- Summary

- -

In the table below we show the libraries and respective versions used in {{ report.title }}.

- -
- - - - - - - - - {% for library, version in report.metadata.get('versions').items() %} - - - - - {% endfor %} - -
LibraryVersion
{{ library }}{{ version }}
-
- -

- Actions

-

Please find below data generated by actions:

- - {% for task in report.history %} - -
-

- {{ report.routine_name(*task) }}

- {% set local_qubits=report.routine_qubits(task) %} - {% set qubits = local_qubits if local_qubits != [] else report.qubits%} - {% for qubit in report.routine_qubits(task) %} -
-
- {{ header }} - Qubit {{ qubit }}
- - - {% set figures, fitting_report = report.plot(task, qubit) %} - {% if "No fitting data" not in fitting_report %} - {% set fitting_params= fitting_report.split('
') %} -
- - - - - - - - - - {% for row in fitting_params %} - {% if row != '' %} - {% set run = row.split('|') %} - {% set fparam_value = run[1].split(':') %} - - - - - - {% endif %} - {% endfor %} - -
qubit Fitting Parameter Value
{{ run[0] }}{{ fparam_value[0] }}{{ fparam_value[1] }}
-
- {% endif %} - {{ figures }} - -
- {% endfor %} -
- {% endfor %} - {% endif %} -
-
- - - - - - - - From 9984ebc2b4053af6211446d5a954626ca496772d Mon Sep 17 00:00:00 2001 From: Andrea Date: Thu, 7 Dec 2023 15:54:28 +0400 Subject: [PATCH 10/52] style: Improve function with period correction --- .../protocols/characterization/rabi/amplitude.py | 6 +++++- .../characterization/rabi/amplitude_signal.py | 2 +- .../protocols/characterization/rabi/length.py | 6 +++++- .../protocols/characterization/rabi/length_signal.py | 8 ++++++-- src/qibocal/protocols/characterization/rabi/utils.py | 12 ++++-------- 5 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/qibocal/protocols/characterization/rabi/amplitude.py b/src/qibocal/protocols/characterization/rabi/amplitude.py index 3b2f6cc68..7854ab6e5 100644 --- a/src/qibocal/protocols/characterization/rabi/amplitude.py +++ b/src/qibocal/protocols/characterization/rabi/amplitude.py @@ -165,7 +165,11 @@ def _fit(data: RabiAmplitudeData) -> RabiAmplitudeResults: sigma=qubit_data.error, ) perr = np.sqrt(np.diag(perr)) - pi_pulse_parameter = utils.correct_period(period=popt[2], phase=popt[3]) + pi_pulse_parameter = ( + popt[2] + / 2 + * utils.period_correction_factor(period=popt[2], phase=popt[3]) + ) except: log.warning("rabi_fit: the fitting was not succesful") diff --git a/src/qibocal/protocols/characterization/rabi/amplitude_signal.py b/src/qibocal/protocols/characterization/rabi/amplitude_signal.py index 620ac303e..4f2dca95b 100644 --- a/src/qibocal/protocols/characterization/rabi/amplitude_signal.py +++ b/src/qibocal/protocols/characterization/rabi/amplitude_signal.py @@ -155,7 +155,7 @@ def _fit(data: RabiAmplitudeVoltData) -> RabiAmplitudeVoltResults: popt[2] * (x_max - x_min), popt[3] - 2 * np.pi * x_min / (x_max - x_min) / popt[2], ] - pi_pulse_parameter = utils.correct_period( + pi_pulse_parameter = utils.period_correction_factor( period=translated_popt[2], phase=translated_popt[3] ) diff --git a/src/qibocal/protocols/characterization/rabi/length.py b/src/qibocal/protocols/characterization/rabi/length.py index 3c4ca89c9..fee3acbf9 100644 --- a/src/qibocal/protocols/characterization/rabi/length.py +++ b/src/qibocal/protocols/characterization/rabi/length.py @@ -169,7 +169,11 @@ def _fit(data: RabiLengthData) -> RabiLengthResults: sigma=qubit_data.error, ) perr = np.sqrt(np.diag(perr)) - pi_pulse_parameter = utils.correct_period(period=popt[2], phase=popt[3]) + pi_pulse_parameter = ( + popt[2] + / 2 + * utils.period_correction_factor(period=popt[2], phase=popt[3]) + ) except: log.warning("rabi_fit: the fitting was not succesful") pi_pulse_parameter = 0 diff --git a/src/qibocal/protocols/characterization/rabi/length_signal.py b/src/qibocal/protocols/characterization/rabi/length_signal.py index 321b3f338..d93815199 100644 --- a/src/qibocal/protocols/characterization/rabi/length_signal.py +++ b/src/qibocal/protocols/characterization/rabi/length_signal.py @@ -161,8 +161,12 @@ def _fit(data: RabiLengthVoltData) -> RabiLengthVoltResults: popt[3] - 2 * np.pi * x_min / popt[2] / (x_max - x_min), popt[4] / (x_max - x_min), ] - pi_pulse_parameter = utils.correct_period( - period=translated_popt[2], phase=translated_popt[3] + pi_pulse_parameter = ( + translated_popt[2] + / 2 + * utils.period_correction_factor( + period=translated_popt[2], phase=translated_popt[3] + ) ) except: diff --git a/src/qibocal/protocols/characterization/rabi/utils.py b/src/qibocal/protocols/characterization/rabi/utils.py index 1442935bc..c7bdcb664 100644 --- a/src/qibocal/protocols/characterization/rabi/utils.py +++ b/src/qibocal/protocols/characterization/rabi/utils.py @@ -192,15 +192,11 @@ def extract_rabi(data): raise RuntimeError("Data has to be a data structure of the Rabi routines.") -def correct_period(period: float, phase: float): +def period_correction_factor(phase: float): """Correct period by taking phase into account. https://github.com/qiboteam/qibocal/issues/656 """ - - naive_half_period = period / 2 - # solution of cos (2 pi x / period + phase) = +/- 1 for k in [-2,2] - solutions = [naive_half_period * (k - phase / np.pi) for k in [-2, -1, 0, 1, 2]] - # chose solution closest to naive_half period - - return solutions[np.argmin(np.abs(solutions - naive_half_period))] + # solution of cos (2 pi x / period + phase) = +/- 1 for k in [-2,-1,0,1,2] + # with k that gets correction closest to period + return np.round(phase / np.pi + 1) - phase / np.pi From c42a41314c3e6381272f178379317991e00ead66 Mon Sep 17 00:00:00 2001 From: Andrea Date: Thu, 7 Dec 2023 16:06:54 +0400 Subject: [PATCH 11/52] fix: Fix pylint by correcting function arguments --- src/qibocal/protocols/characterization/rabi/amplitude.py | 4 +--- .../protocols/characterization/rabi/amplitude_signal.py | 2 +- src/qibocal/protocols/characterization/rabi/length.py | 4 +--- src/qibocal/protocols/characterization/rabi/length_signal.py | 4 +--- 4 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/qibocal/protocols/characterization/rabi/amplitude.py b/src/qibocal/protocols/characterization/rabi/amplitude.py index 7854ab6e5..7bcc8e228 100644 --- a/src/qibocal/protocols/characterization/rabi/amplitude.py +++ b/src/qibocal/protocols/characterization/rabi/amplitude.py @@ -166,9 +166,7 @@ def _fit(data: RabiAmplitudeData) -> RabiAmplitudeResults: ) perr = np.sqrt(np.diag(perr)) pi_pulse_parameter = ( - popt[2] - / 2 - * utils.period_correction_factor(period=popt[2], phase=popt[3]) + popt[2] / 2 * utils.period_correction_factor(phase=popt[3]) ) except: diff --git a/src/qibocal/protocols/characterization/rabi/amplitude_signal.py b/src/qibocal/protocols/characterization/rabi/amplitude_signal.py index 4f2dca95b..c1c936e25 100644 --- a/src/qibocal/protocols/characterization/rabi/amplitude_signal.py +++ b/src/qibocal/protocols/characterization/rabi/amplitude_signal.py @@ -156,7 +156,7 @@ def _fit(data: RabiAmplitudeVoltData) -> RabiAmplitudeVoltResults: popt[3] - 2 * np.pi * x_min / (x_max - x_min) / popt[2], ] pi_pulse_parameter = utils.period_correction_factor( - period=translated_popt[2], phase=translated_popt[3] + phase=translated_popt[3] ) except: diff --git a/src/qibocal/protocols/characterization/rabi/length.py b/src/qibocal/protocols/characterization/rabi/length.py index fee3acbf9..a0a8f0662 100644 --- a/src/qibocal/protocols/characterization/rabi/length.py +++ b/src/qibocal/protocols/characterization/rabi/length.py @@ -170,9 +170,7 @@ def _fit(data: RabiLengthData) -> RabiLengthResults: ) perr = np.sqrt(np.diag(perr)) pi_pulse_parameter = ( - popt[2] - / 2 - * utils.period_correction_factor(period=popt[2], phase=popt[3]) + popt[2] / 2 * utils.period_correction_factor(phase=popt[3]) ) except: log.warning("rabi_fit: the fitting was not succesful") diff --git a/src/qibocal/protocols/characterization/rabi/length_signal.py b/src/qibocal/protocols/characterization/rabi/length_signal.py index d93815199..3aa968df3 100644 --- a/src/qibocal/protocols/characterization/rabi/length_signal.py +++ b/src/qibocal/protocols/characterization/rabi/length_signal.py @@ -164,9 +164,7 @@ def _fit(data: RabiLengthVoltData) -> RabiLengthVoltResults: pi_pulse_parameter = ( translated_popt[2] / 2 - * utils.period_correction_factor( - period=translated_popt[2], phase=translated_popt[3] - ) + * utils.period_correction_factor(phase=translated_popt[3]) ) except: From 25e454434481d9066147a18ffdf7a9f04b281553 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 7 Dec 2023 18:14:46 +0400 Subject: [PATCH 12/52] build: bump qibolab version to 0.1.4 --- poetry.lock | 36 ++++++++++++++++++++++++++++++++++-- pyproject.toml | 2 +- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 0bf18a306..3fdd00a23 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "absl-py" @@ -1492,6 +1492,8 @@ description = "Clang Python Bindings, mirrored from the official LLVM repo: http optional = true python-versions = "*" files = [ + {file = "libclang-16.0.6-1-py2.py3-none-manylinux2014_aarch64.whl", hash = "sha256:88bc7e7b393c32e41e03ba77ef02fdd647da1f764c2cd028e69e0837080b79f6"}, + {file = "libclang-16.0.6-1-py2.py3-none-manylinux2014_armv7l.whl", hash = "sha256:d80ed5827736ed5ec2bcedf536720476fd9d4fa4c79ef0cb24aea4c59332f361"}, {file = "libclang-16.0.6-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:da9e47ebc3f0a6d90fb169ef25f9fbcd29b4a4ef97a8b0e3e3a17800af1423f4"}, {file = "libclang-16.0.6-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:e1a5ad1e895e5443e205568c85c04b4608e4e973dae42f4dfd9cb46c81d1486b"}, {file = "libclang-16.0.6-py2.py3-none-manylinux2010_x86_64.whl", hash = "sha256:9dcdc730939788b8b69ffd6d5d75fe5366e3ee007f1e36a99799ec0b0c001492"}, @@ -1548,6 +1550,16 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -2543,6 +2555,7 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -2550,8 +2563,15 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -2568,6 +2588,7 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -2575,6 +2596,7 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -3500,6 +3522,16 @@ files = [ {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, + {file = "wrapt-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecee4132c6cd2ce5308e21672015ddfed1ff975ad0ac8d27168ea82e71413f55"}, + {file = "wrapt-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2020f391008ef874c6d9e208b24f28e31bcb85ccff4f335f15a3251d222b92d9"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2feecf86e1f7a86517cab34ae6c2f081fd2d0dac860cb0c0ded96d799d20b335"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:240b1686f38ae665d1b15475966fe0472f78e71b1b4903c143a842659c8e4cb9"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9008dad07d71f68487c91e96579c8567c98ca4c3881b9b113bc7b33e9fd78b8"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6447e9f3ba72f8e2b985a1da758767698efa72723d5b59accefd716e9e8272bf"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:acae32e13a4153809db37405f5eba5bac5fbe2e2ba61ab227926a22901051c0a"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49ef582b7a1152ae2766557f0550a9fcbf7bbd76f43fbdc94dd3bf07cc7168be"}, + {file = "wrapt-1.14.1-cp311-cp311-win32.whl", hash = "sha256:358fe87cc899c6bb0ddc185bf3dbfa4ba646f05b1b0b9b5a27c2cb92c2cea204"}, + {file = "wrapt-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:26046cd03936ae745a502abf44dac702a5e6880b2b01c29aea8ddf3353b68224"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, @@ -3569,4 +3601,4 @@ viz = ["pydot"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "920fb2824bd3843d94bd35f62e7d18388bc070064c636004bde4d3ffe4c223c6" +content-hash = "970164c313a675cd694bd4be27a83a3d2791796d49314be6664fed11d9431850" diff --git a/pyproject.toml b/pyproject.toml index 3c014da3a..eea147c6e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,7 +17,7 @@ classifiers = [ [tool.poetry.dependencies] python = ">=3.9,<3.12" -qibolab = "^0.1.2" +qibolab = "^0.1.4" qibo = "^0.2.1" numpy = "^1.24.0" scipy = "^1.10.1" From 5962c6f30cbb319f7aeee8fb61ae72b89775ed5c Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Thu, 7 Dec 2023 18:15:04 +0400 Subject: [PATCH 13/52] revert: allxy prob shape back to original --- src/qibocal/protocols/characterization/allxy/allxy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibocal/protocols/characterization/allxy/allxy.py b/src/qibocal/protocols/characterization/allxy/allxy.py index 0c93eb367..c9a0c6b84 100644 --- a/src/qibocal/protocols/characterization/allxy/allxy.py +++ b/src/qibocal/protocols/characterization/allxy/allxy.py @@ -112,7 +112,7 @@ def _acquisition( else: z_proj = 2 * results[ig][serial].probability(0) - 1 data.register_qubit( - AllXYType, (qubit), dict(prob=np.array(z_proj), gate=np.array([gate])) + AllXYType, (qubit), dict(prob=np.array([z_proj]), gate=np.array([gate])) ) # finally, save the remaining data From abdb497a46119fea63b6e27fe051b15b22a508c6 Mon Sep 17 00:00:00 2001 From: andrea-pasquale Date: Fri, 8 Dec 2023 10:43:01 +0400 Subject: [PATCH 14/52] fix: Add missing pi pulse parameter in rabi_amplitude_signal --- .../protocols/characterization/rabi/amplitude_signal.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/qibocal/protocols/characterization/rabi/amplitude_signal.py b/src/qibocal/protocols/characterization/rabi/amplitude_signal.py index c1c936e25..136efb5c1 100644 --- a/src/qibocal/protocols/characterization/rabi/amplitude_signal.py +++ b/src/qibocal/protocols/characterization/rabi/amplitude_signal.py @@ -155,8 +155,10 @@ def _fit(data: RabiAmplitudeVoltData) -> RabiAmplitudeVoltResults: popt[2] * (x_max - x_min), popt[3] - 2 * np.pi * x_min / (x_max - x_min) / popt[2], ] - pi_pulse_parameter = utils.period_correction_factor( - phase=translated_popt[3] + pi_pulse_parameter = ( + translated_popt[2] + / 2 + * utils.period_correction_factor(phase=translated_popt[3]) ) except: From 27f9ad8ea993c5a1adf27d9c70f16a008b7a0e8b Mon Sep 17 00:00:00 2001 From: andrea-pasquale Date: Fri, 8 Dec 2023 11:33:58 +0400 Subject: [PATCH 15/52] revert: restore initial guess on phase --- src/qibocal/protocols/characterization/rabi/amplitude_signal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibocal/protocols/characterization/rabi/amplitude_signal.py b/src/qibocal/protocols/characterization/rabi/amplitude_signal.py index 136efb5c1..5c896f1c0 100644 --- a/src/qibocal/protocols/characterization/rabi/amplitude_signal.py +++ b/src/qibocal/protocols/characterization/rabi/amplitude_signal.py @@ -136,7 +136,7 @@ def _fit(data: RabiAmplitudeVoltData) -> RabiAmplitudeVoltResults: index = local_maxima[0] if len(local_maxima) > 0 else None # 0.5 hardcoded guess for less than one oscillation f = x[index] / (x[1] - x[0]) if index is not None else 0.5 - pguess = [0.5, 1, 1 / f, np.pi / 2] + pguess = [0.5, 1, 1 / f, 0] try: popt, _ = curve_fit( utils.rabi_amplitude_function, From 42987a4cf9d07d914d40e8c2a14b7251c83f514a Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Mon, 11 Dec 2023 15:42:45 +0400 Subject: [PATCH 16/52] Update tests/runcards/protocols.yml Co-authored-by: Andrea Pasquale --- tests/runcards/protocols.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/runcards/protocols.yml b/tests/runcards/protocols.yml index e079e498d..4c99e25e8 100644 --- a/tests/runcards/protocols.yml +++ b/tests/runcards/protocols.yml @@ -432,7 +432,7 @@ actions: beta_param: null nshots: 10 - - id: allXY + - id: allXY unrolling priority: 0 operation: allxy parameters: From 95eeab4065c73bbc79339f1bb306784a7d780866 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 21:09:55 +0000 Subject: [PATCH 17/52] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pycqa/isort: 5.12.0 → 5.13.1](https://github.com/pycqa/isort/compare/5.12.0...5.13.1) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 06fa61e91..ce7d66c86 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,7 +15,7 @@ repos: hooks: - id: black - repo: https://github.com/pycqa/isort - rev: 5.12.0 + rev: 5.13.1 hooks: - id: isort args: ["--profile", "black"] From ec8b25f0ec8aa002bb9318d79321a5b772236b71 Mon Sep 17 00:00:00 2001 From: Andrea Pasquale Date: Tue, 12 Dec 2023 11:28:15 +0400 Subject: [PATCH 18/52] (refactor): use np.modf instead of np.round Co-authored-by: Alessandro Candido --- src/qibocal/protocols/characterization/rabi/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibocal/protocols/characterization/rabi/utils.py b/src/qibocal/protocols/characterization/rabi/utils.py index c7bdcb664..df471a2dc 100644 --- a/src/qibocal/protocols/characterization/rabi/utils.py +++ b/src/qibocal/protocols/characterization/rabi/utils.py @@ -199,4 +199,4 @@ def period_correction_factor(phase: float): """ # solution of cos (2 pi x / period + phase) = +/- 1 for k in [-2,-1,0,1,2] # with k that gets correction closest to period - return np.round(phase / np.pi + 1) - phase / np.pi + return 1 - np.modf(phase / np.pi)[0] From 15019a36329a4137bf418a32f9b89cea9e30ffe8 Mon Sep 17 00:00:00 2001 From: Andrea Date: Tue, 12 Dec 2023 12:28:30 +0400 Subject: [PATCH 19/52] doc: improve docstring for period_correction_factor --- .../protocols/characterization/rabi/utils.py | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/qibocal/protocols/characterization/rabi/utils.py b/src/qibocal/protocols/characterization/rabi/utils.py index df471a2dc..11a7831e9 100644 --- a/src/qibocal/protocols/characterization/rabi/utils.py +++ b/src/qibocal/protocols/characterization/rabi/utils.py @@ -193,10 +193,24 @@ def extract_rabi(data): def period_correction_factor(phase: float): - """Correct period by taking phase into account. + r"""Correct period by taking phase into account. https://github.com/qiboteam/qibocal/issues/656 + + We want to find the first maximum or minimum which will + correspond to an exchange of population between 0 and 1. + To find it we need to solve the following equation + :math:`\cos(2 \pi x / T + \phi) = \pm 1` which will give us + the following solution + + .. math:: + + x = ( k - \phi / \pi) T / 2 + + + for integer :math:`k`, which is chosen such that we get the smallest + correction compared to :math:`T/2`. + """ - # solution of cos (2 pi x / period + phase) = +/- 1 for k in [-2,-1,0,1,2] - # with k that gets correction closest to period + return 1 - np.modf(phase / np.pi)[0] From 12214cff62695d809aab928d510622b3ac7ddadd Mon Sep 17 00:00:00 2001 From: Andrea Date: Tue, 12 Dec 2023 12:30:59 +0400 Subject: [PATCH 20/52] fix: use correct rabi function --- src/qibocal/protocols/characterization/rabi/length_signal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibocal/protocols/characterization/rabi/length_signal.py b/src/qibocal/protocols/characterization/rabi/length_signal.py index 3aa968df3..9e635cbbb 100644 --- a/src/qibocal/protocols/characterization/rabi/length_signal.py +++ b/src/qibocal/protocols/characterization/rabi/length_signal.py @@ -144,7 +144,7 @@ def _fit(data: RabiLengthVoltData) -> RabiLengthVoltResults: pguess = [0, np.sign(y[0]) * 0.5, 1 / f, 0, 0] try: popt, _ = curve_fit( - utils.rabi_amplitude_function, + utils.rabi_length_function, x, y, p0=pguess, From 1fe8cd1828259b7033e1e37d67f3313e1f981fdb Mon Sep 17 00:00:00 2001 From: Andrea Pasquale Date: Tue, 12 Dec 2023 13:53:14 +0400 Subject: [PATCH 21/52] docs: add multiplicative in docstring Co-authored-by: Alessandro Candido --- src/qibocal/protocols/characterization/rabi/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibocal/protocols/characterization/rabi/utils.py b/src/qibocal/protocols/characterization/rabi/utils.py index 11a7831e9..ead560e27 100644 --- a/src/qibocal/protocols/characterization/rabi/utils.py +++ b/src/qibocal/protocols/characterization/rabi/utils.py @@ -209,7 +209,7 @@ def period_correction_factor(phase: float): for integer :math:`k`, which is chosen such that we get the smallest - correction compared to :math:`T/2`. + multiplicative correction compared to :math:`T/2`. """ From 4e9adce6d3db80673564cef4e79e44fa0d669728 Mon Sep 17 00:00:00 2001 From: Gabriele Palazzo <73099233+GabrielePalazzo@users.noreply.github.com> Date: Wed, 13 Dec 2023 11:20:42 +0400 Subject: [PATCH 22/52] Apply suggestions from code review Co-authored-by: Andrea Pasquale --- doc/source/protocols/resonator_punchout.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/source/protocols/resonator_punchout.rst b/doc/source/protocols/resonator_punchout.rst index 299313881..06e7b2b70 100644 --- a/doc/source/protocols/resonator_punchout.rst +++ b/doc/source/protocols/resonator_punchout.rst @@ -3,10 +3,10 @@ Resonator punchout With the resonator spectroscopy at high power we found the bare resonator frequency -(also called high power frequency), but this is not the frequency that will be used in measurements. +(also called high power frequency), but this is not the frequency that will be used to perform measurements. We need to find the frequency in the low power regime, where the resonator is actually coupled to the qubit. To do that, we first have to find the correct amplitude of the readout pulse. -Also this experiment can be initially performed with a VNA, to check everything is +This experiment can be initially performed with a VNA, to check that everything is working and to obtain a rough estimation of the parameters to be used by the control devices. We do again a resonator spectroscopy experiment, measuring at different frequencies, but this time scanning in a narrow frequency span and also for different pulse amplitudes. @@ -42,9 +42,9 @@ Eventually, we want to have a plot like the one below: .. image:: resonator_punchout.png -This experiment is the first one where we actually are "seeing" the qubit and it's +This experiment is the first one where we are actually "seeing" the qubit and it's extremely important also to check that the qubit is working properly. -During a characterization, various experimental problems can happen and can lead the experimenter +During characterization, various experimental problems can happen and can lead experimentalists to believe that the qubit is no longer working: this experiment gives us an easy way to check it. Compared to a low power resonator spectroscopy, with punchout we can see the shift in the resonator frequency From b3ce63b7dc5456bf28d9126015f1aed9c55ffdb2 Mon Sep 17 00:00:00 2001 From: Andrea Date: Wed, 13 Dec 2023 14:19:37 +0400 Subject: [PATCH 23/52] feat(cli): add url after qq upload --- src/qibocal/cli/upload.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/qibocal/cli/upload.py b/src/qibocal/cli/upload.py index d0bb3f4de..a78b36f11 100644 --- a/src/qibocal/cli/upload.py +++ b/src/qibocal/cli/upload.py @@ -91,3 +91,4 @@ def upload_report(path: pathlib.Path, tag: str, author: str): url = urljoin(ROOT_URL, randname) log.info(f"Upload completed. The result is available at:\n{url}") + return url From eef9523c35124d6dd85aec04bd7a40d12aec34f8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 21:18:20 +0000 Subject: [PATCH 24/52] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/psf/black: 23.11.0 → 23.12.0](https://github.com/psf/black/compare/23.11.0...23.12.0) - [github.com/pycqa/isort: 5.13.1 → 5.13.2](https://github.com/pycqa/isort/compare/5.13.1...5.13.2) --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ce7d66c86..58acdeda3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,11 +11,11 @@ repos: - id: check-merge-conflict - id: debug-statements - repo: https://github.com/psf/black - rev: 23.11.0 + rev: 23.12.0 hooks: - id: black - repo: https://github.com/pycqa/isort - rev: 5.13.1 + rev: 5.13.2 hooks: - id: isort args: ["--profile", "black"] From 65b904cf7c2b5965b6d5b40284a5cdb810fbc46b Mon Sep 17 00:00:00 2001 From: Andrea Date: Wed, 20 Dec 2023 17:48:29 +0100 Subject: [PATCH 25/52] fix: fix rabi correction formula --- src/qibocal/protocols/characterization/rabi/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibocal/protocols/characterization/rabi/utils.py b/src/qibocal/protocols/characterization/rabi/utils.py index ead560e27..2ed058e28 100644 --- a/src/qibocal/protocols/characterization/rabi/utils.py +++ b/src/qibocal/protocols/characterization/rabi/utils.py @@ -213,4 +213,4 @@ def period_correction_factor(phase: float): """ - return 1 - np.modf(phase / np.pi)[0] + return np.round(1 + phase / np.pi) - phase / np.pi From 2e48250aa4ef429aab8133d586f428c981e21830 Mon Sep 17 00:00:00 2001 From: Andrea Pasquale Date: Thu, 21 Dec 2023 09:38:27 +0100 Subject: [PATCH 26/52] refactor: simplify the code by using x Co-authored-by: Alessandro Candido --- src/qibocal/protocols/characterization/rabi/utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/qibocal/protocols/characterization/rabi/utils.py b/src/qibocal/protocols/characterization/rabi/utils.py index 2ed058e28..433d6eb73 100644 --- a/src/qibocal/protocols/characterization/rabi/utils.py +++ b/src/qibocal/protocols/characterization/rabi/utils.py @@ -213,4 +213,5 @@ def period_correction_factor(phase: float): """ - return np.round(1 + phase / np.pi) - phase / np.pi + x = phase / np.pi + return np.round(1 + x) - x From f15611d47429a48ce2abf40f8758831d7ce90944 Mon Sep 17 00:00:00 2001 From: PiergiorgioButtarini Date: Mon, 25 Dec 2023 12:51:59 +0400 Subject: [PATCH 27/52] fix: tof routine with new sampling rate approach --- .../signal_experiments/time_of_flight_readout.py | 5 ++++- tests/runcards/protocols.yml | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/qibocal/protocols/characterization/signal_experiments/time_of_flight_readout.py b/src/qibocal/protocols/characterization/signal_experiments/time_of_flight_readout.py index 4e9d6bd3e..4fb1d2dff 100644 --- a/src/qibocal/protocols/characterization/signal_experiments/time_of_flight_readout.py +++ b/src/qibocal/protocols/characterization/signal_experiments/time_of_flight_readout.py @@ -21,6 +21,8 @@ class TimeOfFlightReadoutParameters(Parameters): """Amplitude of the readout pulse.""" window_size: Optional[int] = 10 """Window size for the moving average.""" + sampling_rate: Optional[int] = None + """Sampling rate of the specific driver.""" @dataclass @@ -72,9 +74,10 @@ def _acquisition( averaging_mode=AveragingMode.CYCLIC, ), ) + sampling_rate = params.sampling_rate if params.sampling_rate else 1e9 data = TimeOfFlightReadoutData( - windows_size=params.window_size, sampling_rate=platform.settings.sampling_rate + windows_size=params.window_size, sampling_rate=sampling_rate ) # retrieve and store the results for every qubit diff --git a/tests/runcards/protocols.yml b/tests/runcards/protocols.yml index 4c99e25e8..84f142ea4 100644 --- a/tests/runcards/protocols.yml +++ b/tests/runcards/protocols.yml @@ -10,6 +10,7 @@ actions: parameters: nshots: 1024 readout_amplitude: 0.5 + sampling_rate: 1_000_000_000 - id: resonator high power high amplitude priority: 0 From c9a5b7fd13964bd923968a4259bc8b0b57a27d88 Mon Sep 17 00:00:00 2001 From: PiergiorgioButtarini Date: Mon, 25 Dec 2023 14:57:17 +0400 Subject: [PATCH 28/52] minor update --- .../signal_experiments/time_of_flight_readout.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibocal/protocols/characterization/signal_experiments/time_of_flight_readout.py b/src/qibocal/protocols/characterization/signal_experiments/time_of_flight_readout.py index 4fb1d2dff..6cd4d9e9f 100644 --- a/src/qibocal/protocols/characterization/signal_experiments/time_of_flight_readout.py +++ b/src/qibocal/protocols/characterization/signal_experiments/time_of_flight_readout.py @@ -21,7 +21,7 @@ class TimeOfFlightReadoutParameters(Parameters): """Amplitude of the readout pulse.""" window_size: Optional[int] = 10 """Window size for the moving average.""" - sampling_rate: Optional[int] = None + sampling_rate: Optional[int] = 1e9 """Sampling rate of the specific driver.""" @@ -74,7 +74,7 @@ def _acquisition( averaging_mode=AveragingMode.CYCLIC, ), ) - sampling_rate = params.sampling_rate if params.sampling_rate else 1e9 + sampling_rate = params.sampling_rate data = TimeOfFlightReadoutData( windows_size=params.window_size, sampling_rate=sampling_rate From 18cf0baa85ffaf0320012e33dd76d94e7ea0c4d2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 25 Dec 2023 20:59:35 +0000 Subject: [PATCH 29/52] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/psf/black: 23.12.0 → 23.12.1](https://github.com/psf/black/compare/23.12.0...23.12.1) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 58acdeda3..a51872df5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ repos: - id: check-merge-conflict - id: debug-statements - repo: https://github.com/psf/black - rev: 23.12.0 + rev: 23.12.1 hooks: - id: black - repo: https://github.com/pycqa/isort From fd3b3c862566e73a94a4122a4b9c4f6d4eff9599 Mon Sep 17 00:00:00 2001 From: Piergiorgio Buttarini <100786647+PiergiorgioButtarini@users.noreply.github.com> Date: Wed, 27 Dec 2023 09:13:55 +0400 Subject: [PATCH 30/52] Update src/qibocal/protocols/characterization/signal_experiments/time_of_flight_readout.py Co-authored-by: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> --- .../signal_experiments/time_of_flight_readout.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibocal/protocols/characterization/signal_experiments/time_of_flight_readout.py b/src/qibocal/protocols/characterization/signal_experiments/time_of_flight_readout.py index 6cd4d9e9f..e41deb15e 100644 --- a/src/qibocal/protocols/characterization/signal_experiments/time_of_flight_readout.py +++ b/src/qibocal/protocols/characterization/signal_experiments/time_of_flight_readout.py @@ -21,7 +21,7 @@ class TimeOfFlightReadoutParameters(Parameters): """Amplitude of the readout pulse.""" window_size: Optional[int] = 10 """Window size for the moving average.""" - sampling_rate: Optional[int] = 1e9 + sampling_rate: int = 1e9 """Sampling rate of the specific driver.""" From db90c674732568cf84b2d4ad92bae92c2fbabc24 Mon Sep 17 00:00:00 2001 From: Andrea Date: Tue, 2 Jan 2024 18:21:33 +0100 Subject: [PATCH 31/52] refactor: Simplify fit in qubit flux dependence --- .../flux_dependence/qubit_flux_dependence.py | 137 +++-------- .../characterization/flux_dependence/utils.py | 231 +++++++----------- 2 files changed, 118 insertions(+), 250 deletions(-) diff --git a/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_dependence.py b/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_dependence.py index 562f3aad3..40cec7bba 100644 --- a/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_dependence.py +++ b/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_dependence.py @@ -1,5 +1,4 @@ from dataclasses import dataclass, field -from functools import partial from typing import Optional import numpy as np @@ -13,12 +12,11 @@ from qibocal import update from qibocal.auto.operation import Data, Parameters, Qubits, Results, Routine -from qibocal.config import log from qibocal.protocols.characterization.qubit_spectroscopy_ef import ( DEFAULT_ANHARMONICITY, ) -from ..utils import GHZ_TO_HZ, HZ_TO_GHZ +from ..utils import GHZ_TO_HZ from . import utils @@ -53,6 +51,8 @@ class QubitFluxResults(Results): """Sweetspot for each qubit.""" frequency: dict[QubitId, float] """Drive frequency for each qubit.""" + d: dict[QubitId, float] + """Asymmetry.""" fitted_parameters: dict[QubitId, dict[str, float]] """Raw fitting output.""" @@ -185,119 +185,52 @@ def _fit(data: QubitFluxData) -> QubitFluxResults: qubits = data.qubits frequency = {} sweetspot = {} + d = {} + # TODO: add flux matrix element fitted_parameters = {} for qubit in qubits: qubit_data = data[qubit] - Ec = data.Ec[qubit] - Ej = data.Ej[qubit] - - frequency[qubit] = 0 - sweetspot[qubit] = 0 - fitted_parameters[qubit] = { - "Xi": 0, - "d": 0, - "Ec": 0, - "Ej": 0, - "f_q_offset": 0, - "C_ii": 0, - } biases = qubit_data.bias frequencies = qubit_data.freq signal = qubit_data.signal - if data.resonator_type == "2D": - signal = -signal - - frequencies, biases = utils.image_to_curve( - frequencies, biases, signal, signal_mask=0.3 + frequencies, biases = utils.extract_feature( + biases, + frequencies, + signal, ) - max_c = biases[np.argmax(frequencies)] - min_c = biases[np.argmin(frequencies)] - xi = 1 / (2 * abs(max_c - min_c)) # Convert bias to flux. - - # First order approximation: Ec and Ej NOT provided - if Ec == 0 and Ej == 0: - try: - f_q_0 = np.max( - frequencies - ) # Initial estimation for qubit frequency at sweet spot. - popt = curve_fit( - utils.freq_q_transmon, - biases, - frequencies / GHZ_TO_HZ, - p0=[max_c, xi, 0, f_q_0 / GHZ_TO_HZ], - bounds=((-np.inf, 0, 0, 0), (np.inf, np.inf, np.inf, np.inf)), - maxfev=2000000, - )[0] - popt[3] *= GHZ_TO_HZ - f_qs = popt[3] # Qubit frequency at sweet spot. - f_q_offset = utils.freq_q_transmon( - 0, *popt - ) # Qubit frequenct at zero current. - C_ii = (f_qs - f_q_offset) / popt[ - 0 - ] # Corresponding flux matrix element. - - frequency[qubit] = f_qs * HZ_TO_GHZ - sweetspot[qubit] = popt[0] - fitted_parameters[qubit] = { - "Xi": popt[1], - "d": abs(popt[2]), - "f_q_offset": f_q_offset, - "C_ii": C_ii, - } - except: - log.warning( - "qubit_flux_fit: The first order approximation fitting was not succesful" - ) - - # Second order approximation: Ec and Ej provided - else: - try: - freq_q_mathieu1 = partial(utils.freq_q_mathieu, p5=0.4999) - popt = curve_fit( - freq_q_mathieu1, - biases, - frequencies / GHZ_TO_HZ, - p0=[max_c, xi, 0, Ec / GHZ_TO_HZ, Ej / GHZ_TO_HZ], - bounds=( - (-np.inf, 0, 0, 0, 0), - (np.inf, np.inf, np.inf, np.inf, np.inf), - ), - maxfev=2000000, - )[0] - popt[3] *= GHZ_TO_HZ - popt[4] *= GHZ_TO_HZ - f_qs = utils.freq_q_mathieu( - popt[0], *popt - ) # Qubit frequency at sweet spot. - f_q_offset = utils.freq_q_mathieu( - 0, *popt - ) # Qubit frequenct at zero current. - C_ii = (f_qs - f_q_offset) / popt[ - 0 - ] # Corresponding flux matrix element. - - frequency[qubit] = f_qs - sweetspot[qubit] = popt[0] - fitted_parameters[qubit] = { - "Xi": popt[1], - "d": abs(popt[2]), - "Ec": popt[3], - "Ej": popt[4], - "f_q_offset": f_q_offset, - "C_ii": C_ii, - } - except: - log.warning( - "qubit_flux_fit: The second order approximation fitting was not succesful" - ) + + popt = curve_fit( + utils.transmon_frequency, + biases, + frequencies / 1e9, + bounds=( + [ + np.mean(qubit_data.freq) / 1e9 - 1, + 0, + 0, + np.mean(qubit_data.bias) - 0.5, + ], + [ + np.mean(qubit_data.freq) / 1e9 + 1, + 1, + np.inf, + np.mean(qubit_data.bias) + 0.5, + ], + ), + maxfev=100000, + )[0] + fitted_parameters[qubit] = popt.tolist() + frequency[qubit] = popt[0] * GHZ_TO_HZ + d[qubit] = popt[1] + sweetspot[qubit] = popt[3] return QubitFluxResults( frequency=frequency, sweetspot=sweetspot, + d=d, fitted_parameters=fitted_parameters, ) diff --git a/src/qibocal/protocols/characterization/flux_dependence/utils.py b/src/qibocal/protocols/characterization/flux_dependence/utils.py index 8eb50413d..80f90ceb4 100644 --- a/src/qibocal/protocols/characterization/flux_dependence/utils.py +++ b/src/qibocal/protocols/characterization/flux_dependence/utils.py @@ -2,7 +2,6 @@ import plotly.graph_objects as go from plotly.subplots import make_subplots from scipy.special import mathieu_a, mathieu_b -from sklearn.linear_model import Ridge from ..utils import HZ_TO_GHZ, table_dict, table_html @@ -40,8 +39,8 @@ def create_data_array(freq, bias, signal, phase, dtype): def flux_dependence_plot(data, fit, qubit): figures = [] fitting_report = "" - qubit_data = data[qubit] + frequencies = qubit_data.freq * HZ_TO_GHZ if not data.__class__.__name__ == "CouplerSpectroscopyData": subplot_titles = ( @@ -61,27 +60,10 @@ def flux_dependence_plot(data, fit, qubit): vertical_spacing=0.1, subplot_titles=subplot_titles, ) - frequencies = qubit_data.freq * HZ_TO_GHZ - signal = qubit_data.signal - if data.__class__.__name__ == "ResonatorFluxData": - signal_mask = 0.5 - if data.resonator_type == "3D": - signal = -signal - elif ( - data.__class__.__name__ == "QubitFluxData" - or data.__class__.__name__ == "CouplerSpectroscopyData" - ): - signal_mask = 0.3 - if data.resonator_type == "2D": - signal = -signal - - frequencies1, biases1 = image_to_curve( - frequencies, qubit_data.bias, signal, signal_mask - ) fig.add_trace( go.Heatmap( - x=frequencies, + x=qubit_data.freq * HZ_TO_GHZ, y=qubit_data.bias, z=qubit_data.signal, colorbar_x=0.46, @@ -90,93 +72,35 @@ def flux_dependence_plot(data, fit, qubit): col=1, ) - if not data.__class__.__name__ == "CouplerSpectroscopyData": + # TODO: This fit is for frequency, can it be reused here, do we even want the fit ? + if fit is not None and not data.__class__.__name__ == "CouplerSpectroscopyData": + fitting_report = "" + params = fit.fitted_parameters[qubit] + bias = np.unique(qubit_data.bias) + fig.add_trace( go.Scatter( - x=frequencies1, - y=biases1, - mode="markers", - marker_color="green", + x=transmon_frequency(bias, *params), + y=bias, showlegend=True, - name="Curve estimation", + name="Fit", + marker=dict(color="black"), ), row=1, col=1, ) - # TODO: This fit is for frequency, can it be reused here, do we even want the fit ? - if fit is not None and not data.__class__.__name__ == "CouplerSpectroscopyData": - fitting_report = "" - params = fit.fitted_parameters[qubit] - fitting_report_label = "Frequency" - if fit.frequency[qubit] != 0: - if data.__class__.__name__ == "ResonatorFluxData": - fitting_report_label = "Resonator Frequency [Hz]" - if all(param in params for param in ["Ec", "Ej"]): - popt = [ - params["bare_resonator_frequency"], - params["g"], - fit.sweetspot[qubit], - params["Xi"], - params["d"], - params["Ec"], - params["Ej"], - ] - freq_fit = freq_r_mathieu(biases1, *popt) - else: - popt = [ - fit.sweetspot[qubit], - params["Xi"], - params["d"], - params["f_q/bare_resonator_frequency"], - params["g"], - params["bare_resonator_frequency"], - ] - freq_fit = freq_r_transmon(biases1, *popt) - elif data.__class__.__name__ == "QubitFluxData": - fitting_report_label = "Qubit Frequency [Hz]" - if all(param in params for param in ["Ec", "Ej"]): - popt = [ - fit.sweetspot[qubit], - params["Xi"], - params["d"], - params["Ec"], - params["Ej"], - ] - freq_fit = freq_q_mathieu(biases1, *popt) - else: - popt = [ - fit.sweetspot[qubit], - params["Xi"], - params["d"], - fit.frequency[qubit], - ] - freq_fit = freq_q_transmon(biases1, *popt) - - fig.add_trace( - go.Scatter( - x=freq_fit, - y=biases1, - showlegend=True, - name="Fit", - ), - row=1, - col=1, - ) - - parameters = [] - values = [] - - for key, value in fit.fitted_parameters[qubit].items(): - values.append(np.round(value, 5)) - parameters.append(FLUX_PARAMETERS[key]) - - parameters.extend([fitting_report_label, "Sweetspot"]) - values.extend( - [np.round(fit.frequency[qubit], 5), np.round(fit.sweetspot[qubit], 3)] + fitting_report = table_html( + table_dict( + qubit, + ["Sweetspot [V]", "Maximum Frequency [Hz]", "d"], + [ + np.round(fit.sweetspot[qubit], 2), + np.round(fit.frequency[qubit], 4), + np.round(fit.d[qubit], 4), + ], ) - - fitting_report = table_html(table_dict(qubit, parameters, values)) + ) fig.update_xaxes( title_text=f"Frequency [GHz]", @@ -190,7 +114,7 @@ def flux_dependence_plot(data, fit, qubit): fig.add_trace( go.Heatmap( - x=frequencies, + x=qubit_data.freq * HZ_TO_GHZ, y=qubit_data.bias, z=qubit_data.phase, colorbar_x=1.01, @@ -204,11 +128,6 @@ def flux_dependence_plot(data, fit, qubit): col=2, ) - if not data.__class__.__name__ == "CouplerSpectroscopyData": - fig.update_yaxes(title_text="Bias [V]", row=1, col=2) - else: - fig.update_yaxes(title_text="Pulse Amplitude [a.u.]", row=1, col=2) - fig.update_layout(xaxis1=dict(range=[np.min(frequencies), np.max(frequencies)])) fig.update_layout( @@ -434,52 +353,68 @@ def feature(x, order=3): return np.power(x, np.arange(order + 1).reshape(1, -1)) -def image_to_curve(x, y, z, signal_mask=0.5, alpha=1e-5, order=50): - """ - Extracts a feature characterized by min(z(x, y)). It considers all the data and applies Ridge regression on a polynomial ansatz in x. This allows obtaining a set of points describing the feature as y vs x. +def extract_feature(bias, freq, signal, threshold=1.5): + mean_signal = np.mean(signal) + std_signal = np.std(signal) + snr_map = (signal - mean_signal) / std_signal + binary_mask = snr_map > threshold + if len(binary_mask) == 0: + return freq, bias + return freq[binary_mask], bias[binary_mask] - Args: - x (ndarray) frequencies - y (ndarray) bias - z (ndarray) signal - Returns: - y_pred (ndarray) frequencies - x_pred (ndarray) bias - """ - max_x = np.max(x) - min_x = np.min(x) - lenx = int((max_x - min_x) / (x[1] - x[0])) + 1 - max_y = np.max(y) - min_y = np.min(y) - leny = int(len(y) / (lenx)) - z = np.array(z, float) - if len(z) != leny * lenx: - lenx += 1 - leny = int(len(y) / (lenx)) - x = np.linspace(min_x, max_x, lenx) - y = np.linspace(min_y, max_y, leny) - z = np.reshape(z, (leny, lenx)) - zmax, zmin = z.max(), z.min() - znorm = (z - zmin) / (zmax - zmin) - - # Mask out region - mask = znorm < signal_mask - z = np.argwhere(mask) - weights = znorm[mask] / float(znorm.max()) - # Column indices - x_fit = y[z[:, 0].reshape(-1, 1)] - # Row indices to predict. - y_fit = x[z[:, 1]] - - # Ridge regression, i.e., least squares with l2 regularization - A = feature(x_fit, order) - model = Ridge(alpha=alpha) - model.fit(A, y_fit, sample_weight=weights) - x_pred = y - X_pred = feature(x_pred, order) - y_pred = model.predict(X_pred) - return y_pred, x_pred +def transmon_frequency(x, w_max, d, element, offset): + return w_max * ( + d**2 + (1 - d**2) * (np.cos(np.pi * (x - offset) * element) ** 2) ** 0.25 + ) + + +# def image_to_curve(x, y, z, signal_mask=0.5, alpha=1e-5, order=50): +# """ +# Extracts a feature characterized by min(z(x, y)). It considers all the data and applies Ridge regression on a polynomial ansatz in x. This allows obtaining a set of points describing the feature as y vs x. + +# Args: +# x (ndarray) frequencies +# y (ndarray) bias +# z (ndarray) signal + +# Returns: +# y_pred (ndarray) frequencies +# x_pred (ndarray) bias +# """ +# max_x = np.max(x) +# min_x = np.min(x) +# lenx = int((max_x - min_x) / (x[1] - x[0])) + 1 +# max_y = np.max(y) +# min_y = np.min(y) +# leny = int(len(y) / (lenx)) +# z = np.array(z, float) +# if len(z) != leny * lenx: +# lenx += 1 +# leny = int(len(y) / (lenx)) +# x = np.linspace(min_x, max_x, lenx) +# y = np.linspace(min_y, max_y, leny) +# z = np.reshape(z, (leny, lenx)) +# zmax, zmin = z.max(), z.min() +# znorm = (z - zmin) / (zmax - zmin) + +# # Mask out region +# mask = znorm < signal_mask +# z = np.argwhere(mask) +# weights = znorm[mask] / float(znorm.max()) +# # Column indices +# x_fit = y[z[:, 0].reshape(-1, 1)] +# # Row indices to predict. +# y_fit = x[z[:, 1]] + +# # Ridge regression, i.e., least squares with l2 regularization +# A = feature(x_fit, order) +# model = Ridge(alpha=alpha) +# model.fit(A, y_fit, sample_weight=weights) +# x_pred = y +# X_pred = feature(x_pred, order) +# y_pred = model.predict(X_pred) +# return y_pred, x_pred def get_resonator_freq_flux( From 4e20342352c07c2a85a575dcdd87542d5fa53b28 Mon Sep 17 00:00:00 2001 From: PiergiorgioButtarini Date: Wed, 3 Jan 2024 15:19:07 +0400 Subject: [PATCH 32/52] update: adapt to new platform.sampling_rate --- .../signal_experiments/time_of_flight_readout.py | 5 +---- tests/runcards/protocols.yml | 1 - 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/qibocal/protocols/characterization/signal_experiments/time_of_flight_readout.py b/src/qibocal/protocols/characterization/signal_experiments/time_of_flight_readout.py index e41deb15e..6c701b362 100644 --- a/src/qibocal/protocols/characterization/signal_experiments/time_of_flight_readout.py +++ b/src/qibocal/protocols/characterization/signal_experiments/time_of_flight_readout.py @@ -21,8 +21,6 @@ class TimeOfFlightReadoutParameters(Parameters): """Amplitude of the readout pulse.""" window_size: Optional[int] = 10 """Window size for the moving average.""" - sampling_rate: int = 1e9 - """Sampling rate of the specific driver.""" @dataclass @@ -74,10 +72,9 @@ def _acquisition( averaging_mode=AveragingMode.CYCLIC, ), ) - sampling_rate = params.sampling_rate data = TimeOfFlightReadoutData( - windows_size=params.window_size, sampling_rate=sampling_rate + windows_size=params.window_size, sampling_rate=platform.sampling_rate ) # retrieve and store the results for every qubit diff --git a/tests/runcards/protocols.yml b/tests/runcards/protocols.yml index 84f142ea4..4c99e25e8 100644 --- a/tests/runcards/protocols.yml +++ b/tests/runcards/protocols.yml @@ -10,7 +10,6 @@ actions: parameters: nshots: 1024 readout_amplitude: 0.5 - sampling_rate: 1_000_000_000 - id: resonator high power high amplitude priority: 0 From bb15a30a5d1247519aa8201a9009e842a8a00193 Mon Sep 17 00:00:00 2001 From: Andrea Date: Wed, 3 Jan 2024 15:51:48 +0100 Subject: [PATCH 33/52] refactor: Simplify fit in resonator flux dependence --- .../flux_dependence/qubit_flux_dependence.py | 21 +- .../resonator_flux_dependence.py | 295 ++++-------------- .../characterization/flux_dependence/utils.py | 90 +++--- 3 files changed, 129 insertions(+), 277 deletions(-) diff --git a/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_dependence.py b/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_dependence.py index 40cec7bba..ece5ff86e 100644 --- a/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_dependence.py +++ b/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_dependence.py @@ -38,9 +38,7 @@ class QubitFluxParameters(Parameters): transition: Optional[str] = "01" """Flux spectroscopy transition type ("01" or "02"). Default value is 01""" drive_duration: int = 2000 - """ - Duration of the drive pulse. - """ + """Duration of the drive pulse.""" @dataclass @@ -196,11 +194,18 @@ def _fit(data: QubitFluxData) -> QubitFluxResults: frequencies = qubit_data.freq signal = qubit_data.signal - frequencies, biases = utils.extract_feature( - biases, - frequencies, - signal, - ) + if data.resonator_type == "3D": + frequencies, biases = utils.extract_min_feature( + frequencies, + biases, + signal, + ) + else: + frequencies, biases = utils.extract_max_feature( + frequencies, + biases, + signal, + ) popt = curve_fit( utils.transmon_frequency, diff --git a/src/qibocal/protocols/characterization/flux_dependence/resonator_flux_dependence.py b/src/qibocal/protocols/characterization/flux_dependence/resonator_flux_dependence.py index 31e37adcf..a1e170159 100644 --- a/src/qibocal/protocols/characterization/flux_dependence/resonator_flux_dependence.py +++ b/src/qibocal/protocols/characterization/flux_dependence/resonator_flux_dependence.py @@ -1,5 +1,4 @@ from dataclasses import dataclass, field -from functools import partial import numpy as np import numpy.typing as npt @@ -12,9 +11,8 @@ from qibocal import update from qibocal.auto.operation import Data, Parameters, Qubits, Results, Routine -from qibocal.config import log -from ..utils import GHZ_TO_HZ, HZ_TO_GHZ +from ..utils import GHZ_TO_HZ from . import utils @@ -40,20 +38,7 @@ class ResonatorFluxResults(Results): """Readout frequency for each qubit.""" sweetspot: dict[QubitId, float] """Sweetspot for each qubit.""" - flux_to_bias: dict[QubitId, float] - """flux_to_bias for each qubit.""" - asymmetry: dict[QubitId, float] - """asymmetry for each qubit.""" - Gs: dict[QubitId, float] - """readout_coupling for each qubit.""" - brf: dict[QubitId, float] - """bare_resonator_frequency for each qubit.""" - ssf_brf: dict[QubitId, float] - """sweetspot_qubit_frequency/bare_resonator_frequency for each qubit.""" - ECs: dict[QubitId, float] - """Ec for each qubit.""" - EJs: dict[QubitId, float] - """Ej for each qubit.""" + d: dict[QubitId, float] fitted_parameters: dict[QubitId, dict[str, float]] """Raw fitting output.""" @@ -71,19 +56,13 @@ class ResonatorFluxResults(Results): @dataclass class ResonatorFluxData(Data): - """Resonator type.""" - - resonator_type: str - """ResonatorFlux acquisition outputs.""" - Ec: dict[QubitId, float] = field(default_factory=dict) - """Qubit Ec provided by the user.""" - Ej: dict[QubitId, float] = field(default_factory=dict) - """Qubit Ej provided by the user.""" + """Resonator type.""" + resonator_type: str - g: dict[QubitId, float] = field(default_factory=dict) - """Qubit g provided by the user.""" + qubit_frequency: dict[QubitId, float] = field(default_factory=dict) + """Qubit frequencies.""" bare_resonator_frequency: dict[QubitId, int] = field(default_factory=dict) """Qubit bare resonator frequency power provided by the user.""" @@ -108,15 +87,10 @@ def _acquisition( # taking advantage of multiplexing, apply the same set of gates to all qubits in parallel sequence = PulseSequence() ro_pulses = {} - Ec = {} - Ej = {} - g = {} + qubit_frequency = {} bare_resonator_frequency = {} for qubit in qubits: - Ec[qubit] = qubits[qubit].Ec - Ej[qubit] = qubits[qubit].Ej - g[qubit] = qubits[qubit].g - bare_resonator_frequency[qubit] = qubits[qubit].bare_resonator_frequency + qubit_frequency[qubit] = platform.qubits[qubit].drive_frequency ro_pulses[qubit] = platform.create_qubit_readout_pulse(qubit, start=0) sequence.add(ro_pulses[qubit]) @@ -145,12 +119,9 @@ def _acquisition( ] data = ResonatorFluxData( - resonator_type=platform.resonator_type, - Ec=Ec, - Ej=Ej, - g=g, - bare_resonator_frequency=bare_resonator_frequency, + resonator_type=platform.resonator_type, qubit_frequency=qubit_frequency ) + options = ExecutionParameters( nshots=params.nshots, relaxation_time=params.relaxation_time, @@ -184,206 +155,66 @@ def _fit(data: ResonatorFluxData) -> ResonatorFluxResults: qubits = data.qubits frequency = {} sweetspot = {} - flux_to_bias = {} - asymmetry = {} - Gs = {} - brf = {} - ssf_brf = {} - ECs = {} - EJs = {} + d = {} fitted_parameters = {} for qubit in qubits: qubit_data = data[qubit] - Ec = data.Ec[qubit] - Ej = data.Ej[qubit] - - frequency[qubit] = 0 - sweetspot[qubit] = 0 - flux_to_bias[qubit] = 0 - asymmetry[qubit] = 0 - Gs[qubit] = 0 - brf[qubit] = 0 - ssf_brf[qubit] = 0 - ECs[qubit] = 0 - EJs[qubit] = 0 - - fitted_parameters[qubit] = { - "Xi": 0, - "d": 0, - "g": 0, - "Ec": 0, - "Ej": 0, - "bare_resonator_frequency": 0, - "f_qs": 0, - "f_r_offset": 0, - "C_ii": 0, - } biases = qubit_data.bias frequencies = qubit_data.freq signal = qubit_data.signal if data.resonator_type == "3D": - signal = -signal - - frequencies, biases = utils.image_to_curve( - frequencies, biases, signal, signal_mask=0.5 - ) - - bare_resonator_frequency = data.bare_resonator_frequency[ - qubit - ] # Resonator frequency at high power. - g = data.g[qubit] # Readout coupling. - max_c = biases[np.argmax(frequencies)] - min_c = biases[np.argmin(frequencies)] - xi = 1 / (2 * abs(max_c - min_c)) # Convert bias to flux. - - # First order approximation: bare_resonator_frequency, g provided - if (Ec == 0 and Ej == 0) and (bare_resonator_frequency != 0 and g != 0): - try: - # Initial estimation for resonator frequency at sweet spot. - f_r_0 = np.max(frequencies) - # Initial estimation for qubit frequency at sweet spot. - f_q_0 = bare_resonator_frequency - g**2 / ( - f_r_0 - bare_resonator_frequency - ) - popt = curve_fit( - utils.freq_r_transmon, - biases, - frequencies / GHZ_TO_HZ, - p0=[ - max_c, - xi, - 0, - f_q_0 / bare_resonator_frequency, - g / GHZ_TO_HZ, - bare_resonator_frequency / GHZ_TO_HZ, - ], - bounds=( - (-np.inf, 0, 0, 0, 0, 0), - (np.inf, np.inf, np.inf, np.inf, np.inf, np.inf), - ), - maxfev=2000000, - )[0] - - sweetspot[qubit] = popt[0] - flux_to_bias[qubit] = popt[1] - asymmetry[qubit] = popt[2] - Gs[qubit] = popt[4] - brf[qubit] = popt[5] - ssf_brf[qubit] = popt[3] - - popt[4] *= GHZ_TO_HZ - popt[5] *= GHZ_TO_HZ - f_qs = popt[3] * popt[5] # Qubit frequency at sweet spot. - f_rs = utils.freq_r_transmon( - popt[0], *popt - ) # Resonator frequency at sweet spot. - f_r_offset = utils.freq_r_transmon( - 0, *popt - ) # Resonator frequency at zero current. - C_ii = (f_rs - f_r_offset) / popt[ - 0 - ] # Corresponding flux matrix element. - - frequency[qubit] = f_rs * HZ_TO_GHZ - fitted_parameters[qubit] = { - "Xi": popt[1], - "d": abs(popt[2]), - "g": popt[4], - "bare_resonator_frequency": popt[5], - "f_qs": f_qs, - "f_r_offset": f_r_offset, - "C_ii": C_ii, - } - - except: - log.warning( - "resonator_flux_fit: First order approximation fitting was not succesful" - ) - - # Second order approximation: bare_resonator_frequency, g, Ec, Ej provided - elif Ec != 0 and Ej != 0 and bare_resonator_frequency != 0 and g != 0: - try: - freq_r_mathieu1 = partial(utils.freq_r_mathieu, p7=0.4999) - popt = curve_fit( - freq_r_mathieu1, - biases, - frequencies / GHZ_TO_HZ, - p0=[ - bare_resonator_frequency / GHZ_TO_HZ, - g / GHZ_TO_HZ, - max_c, - xi, - 0, - Ec / GHZ_TO_HZ, - Ej / GHZ_TO_HZ, - ], - bounds=( - (0, 0, -np.inf, 0, 0, 0, 0), - (np.inf, np.inf, np.inf, np.inf, np.inf, np.inf, np.inf), - ), - maxfev=2000000, - )[0] - - sweetspot[qubit] = popt[2] - flux_to_bias[qubit] = popt[3] - asymmetry[qubit] = popt[4] - Gs[qubit] = popt[1] - brf[qubit] = popt[0] - ECs[qubit] = popt[5] - EJs[qubit] = popt[6] - - popt[0] *= GHZ_TO_HZ - popt[1] *= GHZ_TO_HZ - popt[5] *= GHZ_TO_HZ - popt[6] *= GHZ_TO_HZ - f_qs = utils.freq_q_mathieu( - popt[2], *popt[2::] - ) # Qubit frequency at sweet spot. - f_rs = utils.freq_r_mathieu( - popt[2], *popt - ) # Resonator frequency at sweet spot. - f_r_offset = utils.freq_r_mathieu( - 0, *popt - ) # Resonator frequenct at zero current. - C_ii = (f_rs - f_r_offset) / popt[ - 2 - ] # Corresponding flux matrix element. - - frequency[qubit] = f_rs * HZ_TO_GHZ - sweetspot[qubit] = popt[2] - fitted_parameters[qubit] = { - "Xi": popt[3], - "d": abs(popt[4]), - "g": popt[1], - "Ec": popt[5], - "Ej": popt[6], - "bare_resonator_frequency": popt[0], - "f_qs": f_qs, - "f_r_offset": f_r_offset, - "C_ii": C_ii, - } - except: - log.warning( - "resonator_flux_fit: Second order approximation fitting was not succesful" - ) - + frequencies, biases = utils.extract_max_feature( + frequencies, + biases, + signal, + ) else: - log.warning("resonator_flux_fit: Not enought guess parameters provided") + frequencies, biases = utils.extract_min_feature( + frequencies, + biases, + signal, + ) + + popt = curve_fit( + utils.transmon_readout_frequency, + biases, + frequencies / 1e9, + bounds=( + [ + data.qubit_frequency[qubit] / 1e9 - 0.5, + 0, + 0, + np.mean(qubit_data.bias) - 0.5, + np.mean(qubit_data.freq) / 1e9 - 1, + 0, + ], + [ + data.qubit_frequency[qubit] / 1e9 + 0.5, + 1, + np.inf, + np.mean(qubit_data.bias) + 0.5, + np.mean(qubit_data.freq) / 1e9 + 1, + 1, + ], + ), + maxfev=100000, + )[0] + fitted_parameters[qubit] = popt.tolist() + + # frequency corresponds to transmon readout frequency + # at the sweetspot popt[3] + frequency[qubit] = utils.transmon_readout_frequency(popt[3], *popt) * GHZ_TO_HZ + sweetspot[qubit] = popt[3] + d[qubit] = popt[1] return ResonatorFluxResults( frequency=frequency, sweetspot=sweetspot, - flux_to_bias=flux_to_bias, - asymmetry=asymmetry, - Gs=Gs, - brf=brf, - ssf_brf=ssf_brf, - ECs=ECs, - EJs=EJs, + d=d, fitted_parameters=fitted_parameters, ) @@ -394,16 +225,16 @@ def _plot(data: ResonatorFluxData, fit: ResonatorFluxResults, qubit): def _update(results: ResonatorFluxResults, platform: Platform, qubit: QubitId): - update.bare_resonator_frequency_sweetspot(results.brf[qubit], platform, qubit) + # update.bare_resonator_frequency_sweetspot(results.brf[qubit], platform, qubit) update.readout_frequency(results.frequency[qubit], platform, qubit) - update.flux_to_bias(results.flux_to_bias[qubit], platform, qubit) - update.asymmetry(results.asymmetry[qubit], platform, qubit) - update.ratio_sweetspot_qubit_freq_bare_resonator_freq( - results.ssf_brf[qubit], platform, qubit - ) - update.charging_energy(results.ECs[qubit], platform, qubit) - update.josephson_energy(results.EJs[qubit], platform, qubit) - update.coupling(results.Gs[qubit], platform, qubit) + # update.flux_to_bias(results.flux_to_bias[qubit], platform, qubit) + update.asymmetry(results.d[qubit], platform, qubit) + # update.ratio_sweetspot_qubit_freq_bare_resonator_freq( + # results.ssf_brf[qubit], platform, qubit + # ) + # update.charging_energy(results.ECs[qubit], platform, qubit) + # update.josephson_energy(results.EJs[qubit], platform, qubit) + # update.coupling(results.Gs[qubit], platform, qubit) resonator_flux = Routine(_acquisition, _fit, _plot, _update) diff --git a/src/qibocal/protocols/characterization/flux_dependence/utils.py b/src/qibocal/protocols/characterization/flux_dependence/utils.py index 80f90ceb4..a2484515f 100644 --- a/src/qibocal/protocols/characterization/flux_dependence/utils.py +++ b/src/qibocal/protocols/characterization/flux_dependence/utils.py @@ -77,10 +77,14 @@ def flux_dependence_plot(data, fit, qubit): fitting_report = "" params = fit.fitted_parameters[qubit] bias = np.unique(qubit_data.bias) - + fit_function = ( + transmon_frequency + if data.__class__.__name__ == "QubitFluxData" + else transmon_readout_frequency + ) fig.add_trace( go.Scatter( - x=transmon_frequency(bias, *params), + x=fit_function(bias, *params), y=bias, showlegend=True, name="Fit", @@ -95,7 +99,7 @@ def flux_dependence_plot(data, fit, qubit): qubit, ["Sweetspot [V]", "Maximum Frequency [Hz]", "d"], [ - np.round(fit.sweetspot[qubit], 2), + np.round(fit.sweetspot[qubit], 4), np.round(fit.frequency[qubit], 4), np.round(fit.d[qubit], 4), ], @@ -194,23 +198,29 @@ def flux_crosstalk_plot(data, qubit): return figures, fitting_report -def G_f_d(x, p0, p1, p2): +def G_f_d(x, offset, d, element): """ Auxiliary function to calculate the qubit frequency as a function of bias for the qubit flux spectroscopy. It also determines the flux dependence of :math:`E_J`, :math:`E_J(\\phi)=E_J(0)G_f_d^2`. Args: - p[0] (float): bias offset. - p[1] (float): constant to convert flux (:math:`\\phi_0`) to bias (:math:`v_0`). Typically denoted as :math:`\\Xi`. :math:`v_0 = \\Xi \\phi_0`. - p[2] (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)`. + offset (float): bias offset. + matrix_element(float): constant to convert flux (:math:`\\phi_0`) to bias (:math:`v_0`). Typically denoted as :math:`\\Xi`. :math:`v_0 = \\Xi \\phi_0`. + 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)`. Returns: (float) """ - G = np.sqrt( - np.cos(np.pi * (x - p0) * p1) ** 2 - + p2**2 * np.sin(np.pi * (x - p0) * p1) ** 2 + return (d**2 + (1 - d**2) * np.cos(np.pi * (x - offset) * element) ** 2) ** 0.25 + + +def transmon_frequency(x, w_max, d, element, offset): + return w_max * G_f_d(x, offset=offset, d=d, element=element) + + +def transmon_readout_frequency(x, w_max, d, element, offset, resonator_freq, g): + return resonator_freq + g**2 * G_f_d(x, offset, d, element) / ( + resonator_freq - transmon_frequency(x, w_max, d, element, offset) ) - return np.sqrt(G) def freq_q_transmon(x, p0, p1, p2, p3): @@ -325,48 +335,54 @@ def freq_r_mathieu(x, p0, p1, p2, p3, p4, p5, p6, p7=0.499): return f_r -def line(x, p0, p1): - """ - Linear fit. +# def line(x, p0, p1): +# """ +# Linear fit. - Args: - p[0] (float): slope. - p[1] (float): intercept. +# Args: +# p[0] (float): slope. +# p[1] (float): intercept. - Returns: - (float) - """ - return p0 * x + p1 +# Returns: +# (float) +# """ +# return p0 * x + p1 -def feature(x, order=3): - """ - Auxilliary function for the function image_to_curve(). It generates a polynomial feature of the form [1, x, x^2, ..., x^order]. +# def feature(x, order=3): +# """ +# Auxilliary function for the function image_to_curve(). It generates a polynomial feature of the form [1, x, x^2, ..., x^order]. - Args: - x (ndarray) column vector. +# Args: +# x (ndarray) column vector. - Returns: - (ndarray) - """ - x = x.reshape(-1, 1) - return np.power(x, np.arange(order + 1).reshape(1, -1)) +# Returns: +# (ndarray) +# """ +# x = x.reshape(-1, 1) +# return np.power(x, np.arange(order + 1).reshape(1, -1)) -def extract_feature(bias, freq, signal, threshold=1.5): +def extract_min_feature(freq, bias, signal, threshold=1.5): + """Extract min feature using SNR.""" mean_signal = np.mean(signal) std_signal = np.std(signal) snr_map = (signal - mean_signal) / std_signal - binary_mask = snr_map > threshold + binary_mask = snr_map < -threshold if len(binary_mask) == 0: return freq, bias return freq[binary_mask], bias[binary_mask] -def transmon_frequency(x, w_max, d, element, offset): - return w_max * ( - d**2 + (1 - d**2) * (np.cos(np.pi * (x - offset) * element) ** 2) ** 0.25 - ) +def extract_max_feature(freq, bias, signal, threshold=1.5): + """Extract max feature using SNR.""" + mean_signal = np.mean(signal) + std_signal = np.std(signal) + snr_map = (signal - mean_signal) / std_signal + binary_mask = snr_map > threshold + if len(binary_mask) == 0: + return freq, bias + return freq[binary_mask], bias[binary_mask] # def image_to_curve(x, y, z, signal_mask=0.5, alpha=1e-5, order=50): From d909ff8e41f2d619020474a1857386f414146411 Mon Sep 17 00:00:00 2001 From: Andrea Date: Wed, 3 Jan 2024 19:28:48 +0100 Subject: [PATCH 34/52] refactor: Fix tables, update and add matrix element --- .../coupler_resonator_spectroscopy.py | 11 +++- .../flux_dependence/qubit_flux_dependence.py | 47 +++++++++----- .../flux_dependence/qubit_flux_tracking.py | 12 ++-- .../flux_dependence/resonator_crosstalk.py | 16 ++--- .../resonator_flux_dependence.py | 65 +++++++++++++++---- .../characterization/flux_dependence/utils.py | 46 +++---------- src/qibocal/update.py | 26 -------- 7 files changed, 116 insertions(+), 107 deletions(-) diff --git a/src/qibocal/protocols/characterization/couplers/coupler_resonator_spectroscopy.py b/src/qibocal/protocols/characterization/couplers/coupler_resonator_spectroscopy.py index e4e0c685a..6c9f5daf5 100644 --- a/src/qibocal/protocols/characterization/couplers/coupler_resonator_spectroscopy.py +++ b/src/qibocal/protocols/characterization/couplers/coupler_resonator_spectroscopy.py @@ -165,7 +165,16 @@ def _plot( for qubit in qubit_pair: if qubit in data.data.keys(): - return flux_dependence_plot(data, fit, qubit) + fig = flux_dependence_plot(data, fit, qubit)[0] + fig.update_yaxes(title_text="Pulse Amplitude [a.u.]", row=1, col=1) + fig.layout.annotations[0].update( + text="Signal [a.u.] Qubit" + str(qubit), + ) + fig.layout.annotations[1].update( + text="Phase [rad] Qubit" + str(qubit), + ) + + return fig, "" def _update(results: CouplerSpectroscopyResults, platform: Platform, qubit: QubitId): diff --git a/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_dependence.py b/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_dependence.py index ece5ff86e..97b489032 100644 --- a/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_dependence.py +++ b/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_dependence.py @@ -16,7 +16,7 @@ DEFAULT_ANHARMONICITY, ) -from ..utils import GHZ_TO_HZ +from ..utils import GHZ_TO_HZ, table_dict, table_html from . import utils @@ -53,6 +53,8 @@ class QubitFluxResults(Results): """Asymmetry.""" fitted_parameters: dict[QubitId, dict[str, float]] """Raw fitting output.""" + matrix_element: dict[QubitId, float] + """C_ii coefficient.""" QubitFluxType = np.dtype( @@ -73,13 +75,6 @@ class QubitFluxData(Data): """Resonator type.""" resonator_type: str - """ResonatorFlux acquisition outputs.""" - Ec: dict[QubitId, float] = field(default_factory=dict) - """Qubit Ec provided by the user.""" - - Ej: dict[QubitId, float] = field(default_factory=dict) - """Qubit Ej provided by the user.""" - data: dict[QubitId, npt.NDArray[QubitFluxType]] = field(default_factory=dict) """Raw data acquired.""" @@ -101,12 +96,7 @@ def _acquisition( sequence = PulseSequence() ro_pulses = {} qd_pulses = {} - Ec = {} - Ej = {} for qubit in qubits: - Ec[qubit] = qubits[qubit].Ec - Ej[qubit] = qubits[qubit].Ej - qd_pulses[qubit] = platform.create_qubit_drive_pulse( qubit, start=0, duration=params.drive_duration ) @@ -148,7 +138,7 @@ def _acquisition( type=SweeperType.OFFSET, ) ] - data = QubitFluxData(resonator_type=platform.resonator_type, Ec=Ec, Ej=Ej) + data = QubitFluxData(resonator_type=platform.resonator_type) options = ExecutionParameters( nshots=params.nshots, @@ -184,7 +174,7 @@ def _fit(data: QubitFluxData) -> QubitFluxResults: frequency = {} sweetspot = {} d = {} - # TODO: add flux matrix element + matrix_element = {} fitted_parameters = {} for qubit in qubits: @@ -231,23 +221,48 @@ def _fit(data: QubitFluxData) -> QubitFluxResults: frequency[qubit] = popt[0] * GHZ_TO_HZ d[qubit] = popt[1] sweetspot[qubit] = popt[3] + matrix_element[qubit] = popt[2] return QubitFluxResults( frequency=frequency, sweetspot=sweetspot, d=d, + matrix_element=matrix_element, fitted_parameters=fitted_parameters, ) def _plot(data: QubitFluxData, fit: QubitFluxResults, qubit): """Plotting function for QubitFlux Experiment.""" - return utils.flux_dependence_plot(data, fit, qubit) + figures = utils.flux_dependence_plot( + data, fit, qubit, fit_function=utils.transmon_frequency + ) + if fit is not None: + fitting_report = table_html( + table_dict( + qubit, + [ + "Sweetspot [V]", + "Qubit Frequency at Sweetspot [Hz]", + "Asymmetry d", + "C_ii", + ], + [ + np.round(fit.sweetspot[qubit], 4), + np.round(fit.frequency[qubit], 4), + np.round(fit.d[qubit], 4), + np.round(fit.matrix_element[qubit], 4), + ], + ) + ) + return figures, fitting_report + return figures, "" def _update(results: QubitFluxResults, platform: Platform, qubit: QubitId): update.drive_frequency(results.frequency[qubit], platform, qubit) update.sweetspot(results.sweetspot[qubit], platform, qubit) + update.asymmetry(results.d[qubit], platform, qubit) qubit_flux = Routine(_acquisition, _fit, _plot, _update) diff --git a/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_tracking.py b/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_tracking.py index 6a14a1cf5..ac7f83a8a 100644 --- a/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_tracking.py +++ b/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_tracking.py @@ -161,16 +161,14 @@ def _acquisition( for bias in delta_bias_range: for qubit in qubits: try: - freq_resonator = utils.get_resonator_freq_flux( + freq_resonator = utils.transmon_readout_frequency( bias, - qubits[qubit].sweetspot, - qubits[qubit].flux_to_bias, + qubits[qubit].drive_frequency, qubits[qubit].asymmetry, + qubits[qubit].Cii, + qubits[qubit].sweetspot, + qubits[qubit].bare_resonator_frequency, qubits[qubit].g, - qubits[qubit].brf, - qubits[qubit].ssf_brf, - qubits[qubit].Ec, - qubits[qubit].Ej, ) # modify qubit resonator frequency qubits[qubit].readout_frequency = freq_resonator diff --git a/src/qibocal/protocols/characterization/flux_dependence/resonator_crosstalk.py b/src/qibocal/protocols/characterization/flux_dependence/resonator_crosstalk.py index c14c188e1..94f74788d 100644 --- a/src/qibocal/protocols/characterization/flux_dependence/resonator_crosstalk.py +++ b/src/qibocal/protocols/characterization/flux_dependence/resonator_crosstalk.py @@ -66,15 +66,13 @@ def _acquisition( # taking advantage of multiplexing, apply the same set of gates to all qubits in parallel sequence = PulseSequence() ro_pulses = {} - Ec = {} - Ej = {} - g = {} bare_resonator_frequency = {} + qubit_frequency = {} for qubit in qubits: - Ec[qubit] = qubits[qubit].Ec - Ej[qubit] = qubits[qubit].Ej - g[qubit] = qubits[qubit].g - bare_resonator_frequency[qubit] = qubits[qubit].bare_resonator_frequency + bare_resonator_frequency[qubit] = platform.qubits[ + qubit + ].bare_resonator_frequency + qubit_frequency[qubit] = platform.qubits[qubit].drive_frequency ro_pulses[qubit] = platform.create_qubit_readout_pulse(qubit, start=0) sequence.add(ro_pulses[qubit]) @@ -111,9 +109,7 @@ def _acquisition( data = ResCrosstalkData( resonator_type=platform.resonator_type, - Ec=Ec, - Ej=Ej, - g=g, + qubit_frequency=qubit_frequency, bare_resonator_frequency=bare_resonator_frequency, ) options = ExecutionParameters( diff --git a/src/qibocal/protocols/characterization/flux_dependence/resonator_flux_dependence.py b/src/qibocal/protocols/characterization/flux_dependence/resonator_flux_dependence.py index a1e170159..763664459 100644 --- a/src/qibocal/protocols/characterization/flux_dependence/resonator_flux_dependence.py +++ b/src/qibocal/protocols/characterization/flux_dependence/resonator_flux_dependence.py @@ -12,7 +12,7 @@ from qibocal import update from qibocal.auto.operation import Data, Parameters, Qubits, Results, Routine -from ..utils import GHZ_TO_HZ +from ..utils import GHZ_TO_HZ, table_dict, table_html from . import utils @@ -39,8 +39,17 @@ class ResonatorFluxResults(Results): sweetspot: dict[QubitId, float] """Sweetspot for each qubit.""" d: dict[QubitId, float] + """Asymmetry.""" + bare_frequency: dict[QubitId, float] + """Resonator bare frequency.""" + drive_frequency: dict[QubitId, float] + """Qubit frequency at sweetspot.""" fitted_parameters: dict[QubitId, dict[str, float]] """Raw fitting output.""" + g: dict[QubitId, float] + """Coupling.""" + matrix_element: dict[QubitId, float] + """C_ii coefficient.""" ResFluxType = np.dtype( @@ -156,8 +165,11 @@ def _fit(data: ResonatorFluxData) -> ResonatorFluxResults: frequency = {} sweetspot = {} d = {} - + bare_frequency = {} + drive_frequency = {} fitted_parameters = {} + matrix_element = {} + g = {} for qubit in qubits: qubit_data = data[qubit] @@ -210,31 +222,62 @@ def _fit(data: ResonatorFluxData) -> ResonatorFluxResults: frequency[qubit] = utils.transmon_readout_frequency(popt[3], *popt) * GHZ_TO_HZ sweetspot[qubit] = popt[3] d[qubit] = popt[1] + bare_frequency[qubit] = popt[4] * GHZ_TO_HZ + drive_frequency[qubit] = popt[0] * GHZ_TO_HZ + g[qubit] = popt[5] + matrix_element[qubit] = popt[2] return ResonatorFluxResults( frequency=frequency, sweetspot=sweetspot, d=d, + bare_frequency=bare_frequency, + drive_frequency=drive_frequency, + g=g, + matrix_element=matrix_element, fitted_parameters=fitted_parameters, ) def _plot(data: ResonatorFluxData, fit: ResonatorFluxResults, qubit): """Plotting function for ResonatorFlux Experiment.""" - return utils.flux_dependence_plot(data, fit, qubit) + figures = utils.flux_dependence_plot( + data, fit, qubit, utils.transmon_readout_frequency + ) + if fit is not None: + fitting_report = table_html( + table_dict( + qubit, + [ + "Sweetspot [V]", + "Bare Resonator Frequency [Hz]", + "Readout Frequency [Hz]", + "Qubit Frequency at Sweetspot [Hz]", + "Asymmetry d", + "Coupling g", + "C_ii", + ], + [ + np.round(fit.sweetspot[qubit], 4), + np.round(fit.bare_frequency[qubit], 4), + np.round(fit.frequency[qubit], 4), + np.round(fit.drive_frequency[qubit], 4), + np.round(fit.d[qubit], 4), + np.round(fit.g[qubit], 4), + np.round(fit.matrix_element[qubit], 4), + ], + ) + ) + return figures, fitting_report + return figures, "" def _update(results: ResonatorFluxResults, platform: Platform, qubit: QubitId): - # update.bare_resonator_frequency_sweetspot(results.brf[qubit], platform, qubit) + update.bare_resonator_frequency(results.bare_frequency[qubit], platform, qubit) update.readout_frequency(results.frequency[qubit], platform, qubit) - # update.flux_to_bias(results.flux_to_bias[qubit], platform, qubit) + update.drive_frequency(results.drive_frequency[qubit], platform, qubit) update.asymmetry(results.d[qubit], platform, qubit) - # update.ratio_sweetspot_qubit_freq_bare_resonator_freq( - # results.ssf_brf[qubit], platform, qubit - # ) - # update.charging_energy(results.ECs[qubit], platform, qubit) - # update.josephson_energy(results.EJs[qubit], platform, qubit) - # update.coupling(results.Gs[qubit], platform, qubit) + update.coupling(results.g[qubit], platform, qubit) resonator_flux = Routine(_acquisition, _fit, _plot, _update) diff --git a/src/qibocal/protocols/characterization/flux_dependence/utils.py b/src/qibocal/protocols/characterization/flux_dependence/utils.py index a2484515f..93c737341 100644 --- a/src/qibocal/protocols/characterization/flux_dependence/utils.py +++ b/src/qibocal/protocols/characterization/flux_dependence/utils.py @@ -3,7 +3,7 @@ from plotly.subplots import make_subplots from scipy.special import mathieu_a, mathieu_b -from ..utils import HZ_TO_GHZ, table_dict, table_html +from ..utils import HZ_TO_GHZ FLUX_PARAMETERS = { "Xi": "Constant to map flux to bias [V]", @@ -36,22 +36,15 @@ def create_data_array(freq, bias, signal, phase, dtype): return np.rec.array(ar) -def flux_dependence_plot(data, fit, qubit): +def flux_dependence_plot(data, fit, qubit, fit_function=None): figures = [] - fitting_report = "" qubit_data = data[qubit] frequencies = qubit_data.freq * HZ_TO_GHZ - if not data.__class__.__name__ == "CouplerSpectroscopyData": - subplot_titles = ( - "Signal [a.u.]", - "Phase [rad]", - ) - else: - subplot_titles = ( - "Signal [a.u.] Qubit" + str(qubit), - "Phase [rad] Qubit" + str(qubit), - ) + subplot_titles = ( + "Signal [a.u.]", + "Phase [rad]", + ) fig = make_subplots( rows=1, @@ -74,14 +67,8 @@ def flux_dependence_plot(data, fit, qubit): # TODO: This fit is for frequency, can it be reused here, do we even want the fit ? if fit is not None and not data.__class__.__name__ == "CouplerSpectroscopyData": - fitting_report = "" params = fit.fitted_parameters[qubit] bias = np.unique(qubit_data.bias) - fit_function = ( - transmon_frequency - if data.__class__.__name__ == "QubitFluxData" - else transmon_readout_frequency - ) fig.add_trace( go.Scatter( x=fit_function(bias, *params), @@ -94,27 +81,13 @@ def flux_dependence_plot(data, fit, qubit): col=1, ) - fitting_report = table_html( - table_dict( - qubit, - ["Sweetspot [V]", "Maximum Frequency [Hz]", "d"], - [ - np.round(fit.sweetspot[qubit], 4), - np.round(fit.frequency[qubit], 4), - np.round(fit.d[qubit], 4), - ], - ) - ) - fig.update_xaxes( title_text=f"Frequency [GHz]", row=1, col=1, ) - if not data.__class__.__name__ == "CouplerSpectroscopyData": - fig.update_yaxes(title_text="Bias [V]", row=1, col=1) - else: - fig.update_yaxes(title_text="Pulse Amplitude [a.u.]", row=1, col=1) + + fig.update_yaxes(title_text="Bias [V]", row=1, col=1) fig.add_trace( go.Heatmap( @@ -141,7 +114,7 @@ def flux_dependence_plot(data, fit, qubit): figures.append(fig) - return figures, fitting_report + return figures def flux_crosstalk_plot(data, qubit): @@ -433,6 +406,7 @@ def extract_max_feature(freq, bias, signal, threshold=1.5): # return y_pred, x_pred +# FIXME: update with latest version of the code def get_resonator_freq_flux( bias, sweetspot, flux_to_bias, asymmetry, g, brf, ssf_brf, Ec, Ej ): diff --git a/src/qibocal/update.py b/src/qibocal/update.py index d7004b0e4..8e0bc02f6 100644 --- a/src/qibocal/update.py +++ b/src/qibocal/update.py @@ -186,35 +186,9 @@ def anharmonicity(anharmonicity: float, platform: Platform, qubit: QubitId): platform.qubits[qubit].anharmonicity = int(anharmonicity) -def bare_resonator_frequency_sweetspot( - bare_resonator_frequency_sweetspot: float, platform: Platform, qubit: QubitId -): - platform.qubits[qubit].bare_resonator_frequency_sweetspot = int( - bare_resonator_frequency_sweetspot - ) - - -def flux_to_bias(flux_to_bias: float, platform: Platform, qubit: QubitId): - platform.qubits[qubit].flux_to_bias = float(flux_to_bias) - - def asymmetry(asymmetry: float, platform: Platform, qubit: QubitId): platform.qubits[qubit].asymmetry = float(asymmetry) -def ratio_sweetspot_qubit_freq_bare_resonator_freq( - ssf_brf: float, platform: Platform, qubit: QubitId -): - platform.qubits[qubit].ssf_brf = float(ssf_brf) - - -def charging_energy(Ec: float, platform: Platform, qubit: QubitId): - platform.qubits[qubit].Ec = float(Ec) - - -def josephson_energy(Ej: float, platform: Platform, qubit: QubitId): - platform.qubits[qubit].Ej = float(Ej) - - def coupling(g: float, platform: Platform, qubit: QubitId): platform.qubits[qubit].g = float(g) From 679d5d1b1edc3b8aaee585fa228d7cccbe6631bd Mon Sep 17 00:00:00 2001 From: Gabriele Date: Wed, 3 Jan 2024 20:45:40 +0100 Subject: [PATCH 35/52] Added definition of resonator frequencies --- doc/source/protocols/resonator_punchout.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/source/protocols/resonator_punchout.rst b/doc/source/protocols/resonator_punchout.rst index 06e7b2b70..97c026c4f 100644 --- a/doc/source/protocols/resonator_punchout.rst +++ b/doc/source/protocols/resonator_punchout.rst @@ -58,6 +58,8 @@ frequency using: \omega_{rh} - \omega_{rl} = \chi = \frac{g^2}{\Delta} Where :math:`\Delta = \omega_{rl} - \omega_q`. + +:math:`\omega_{rh}` is the resonator frequency in the high power regime, and :math:`\omega_{rl}` is the resonator frequency at low power. So, if we know, maybe from design specifications, the expected value of :math:`g`, we can have an estimate of the qubit frequency. If, as in most cases, we don't have information on :math:`g`, then we still can infer if the qubit frequency is higher or lower than the resonator From f93473d569a994a7b44b468d42fe63daa8849c50 Mon Sep 17 00:00:00 2001 From: Gabriele Date: Wed, 3 Jan 2024 21:05:16 +0100 Subject: [PATCH 36/52] Added references --- doc/source/protocols/resonator_punchout.rst | 8 +++++++- doc/source/refs.bib | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/doc/source/protocols/resonator_punchout.rst b/doc/source/protocols/resonator_punchout.rst index 97c026c4f..52bb70fb3 100644 --- a/doc/source/protocols/resonator_punchout.rst +++ b/doc/source/protocols/resonator_punchout.rst @@ -51,7 +51,7 @@ Compared to a low power resonator spectroscopy, with punchout we can see the shi and thus ensure that we are in the low power regime. Moreover, from this experiment we can actually already have an estimate of the qubit -frequency using: +frequency using :cite:p:`Greene_2014, Gu_2017`: .. math:: @@ -100,3 +100,9 @@ not needed to do a precise measurement, but it is nevertheless very useful to ha approximate value, that can later be used to check, in other experiments, that we are not exciting the qubit by error (if we see a change in amplitude, then maybe the qubit state has changed). + +.. rubric:: References + +.. bibliography:: + :cited: + :style: plain diff --git a/doc/source/refs.bib b/doc/source/refs.bib index a4da060bc..85e6258ff 100644 --- a/doc/source/refs.bib +++ b/doc/source/refs.bib @@ -22,3 +22,22 @@ @article{wallraff2004strong year = {2004}, publisher = {Nature Publishing Group UK London} } + +@phdthesis{Greene_2014, + author = {Amy Greene} , + title = {Calibration and Utilization of High-Fidelity Two-Qubit Operations}, + school = {Massachusetts Institute of Technology}, + year = {2008} +} + +@article{Gu_2017, + doi = {10.1016/j.physrep.2017.10.002}, + year = {2017}, + month = nov, + publisher = {Elsevier {BV}}, + volume = {718-719}, + pages = {1--102}, + author = {Xiu Gu and Anton Frisk Kockum and Adam Miranowicz and Yu-xi Liu and Franco Nori}, + title = {Microwave photonics with superconducting quantum circuits}, + journal = {Physics Reports} +} From ab8bd08702c5bb277aa1608e5920d4d71708eb67 Mon Sep 17 00:00:00 2001 From: Andrea Date: Thu, 4 Jan 2024 09:53:49 +0100 Subject: [PATCH 37/52] refactor: Update qubit flux tracking protocol --- .../coupler_resonator_spectroscopy.py | 2 +- .../flux_dependence/qubit_crosstalk.py | 7 +- .../flux_dependence/qubit_flux_tracking.py | 239 ++---------------- 3 files changed, 23 insertions(+), 225 deletions(-) diff --git a/src/qibocal/protocols/characterization/couplers/coupler_resonator_spectroscopy.py b/src/qibocal/protocols/characterization/couplers/coupler_resonator_spectroscopy.py index 6c9f5daf5..fca7f0ba4 100644 --- a/src/qibocal/protocols/characterization/couplers/coupler_resonator_spectroscopy.py +++ b/src/qibocal/protocols/characterization/couplers/coupler_resonator_spectroscopy.py @@ -174,7 +174,7 @@ def _plot( text="Phase [rad] Qubit" + str(qubit), ) - return fig, "" + return [fig], "" def _update(results: CouplerSpectroscopyResults, platform: Platform, qubit: QubitId): diff --git a/src/qibocal/protocols/characterization/flux_dependence/qubit_crosstalk.py b/src/qibocal/protocols/characterization/flux_dependence/qubit_crosstalk.py index 556d908bc..0e5905b3b 100644 --- a/src/qibocal/protocols/characterization/flux_dependence/qubit_crosstalk.py +++ b/src/qibocal/protocols/characterization/flux_dependence/qubit_crosstalk.py @@ -71,12 +71,7 @@ def _acquisition( sequence = PulseSequence() ro_pulses = {} qd_pulses = {} - Ec = {} - Ej = {} for qubit in qubits: - Ec[qubit] = qubits[qubit].Ec - Ej[qubit] = qubits[qubit].Ej - qd_pulses[qubit] = platform.create_qubit_drive_pulse( qubit, start=0, duration=params.drive_duration ) @@ -124,7 +119,7 @@ def _acquisition( ) for flux_qubit in flux_qubits ] - data = QubitCrosstalkData(resonator_type=platform.resonator_type, Ec=Ec, Ej=Ej) + data = QubitCrosstalkData(resonator_type=platform.resonator_type) options = ExecutionParameters( nshots=params.nshots, diff --git a/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_tracking.py b/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_tracking.py index ac7f83a8a..68e392275 100644 --- a/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_tracking.py +++ b/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_tracking.py @@ -1,97 +1,37 @@ -from dataclasses import dataclass, field -from functools import partial -from typing import Optional +from dataclasses import dataclass import numpy as np -import numpy.typing as npt 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 scipy.optimize import curve_fit -from qibocal import update -from qibocal.auto.operation import Data, Parameters, Qubits, Results, Routine -from qibocal.config import log, raise_error +from qibocal.auto.operation import Qubits, Routine +from qibocal.config import raise_error from ..qubit_spectroscopy_ef import DEFAULT_ANHARMONICITY -from ..utils import GHZ_TO_HZ, HZ_TO_GHZ -from . import utils - -"""Initial guess for anharmonicity.""" +from . import qubit_flux_dependence, utils @dataclass -class QubitFluxParameters(Parameters): - """QubitFlux runcard inputs.""" - - freq_width: int - """Width for frequency sweep relative to the qubit frequency [Hz].""" - freq_step: int - """Frequency step for sweep [Hz].""" - bias_width: float - """Width for bias sweep [V].""" - bias_step: float - """Bias step for sweep [a.u.].""" - drive_duration: int - """Drive pulse duration [ns]. Same for all qubits.""" - drive_amplitude: Optional[float] = None - """Drive amplitude (optional). If defined, same amplitude will be used in all qubits. - Otherwise the default amplitude defined on the platform runcard will be used""" - nshots: Optional[int] = None - """Number of shots.""" - relaxation_time: Optional[int] = None - """Relaxation time [ns].""" - transition: Optional[str] = "01" - """Flux spectroscopy transition type ("01" or "02"). Default value is 01""" +class QubitFluxTrackParameters(qubit_flux_dependence.QubitFluxParameters): + """QubitFluxTrack runcard inputs.""" @dataclass -class QubitFluxResults(Results): - """QubitFlux outputs.""" - - sweetspot: dict[QubitId, float] - """Sweetspot for each qubit.""" - frequency: dict[QubitId, float] - """Drive frequency for each qubit.""" - fitted_parameters: dict[QubitId, dict[str, float]] - """Raw fitting output.""" - - -QubitFluxType = np.dtype( - [ - ("freq", np.float64), - ("bias", np.float64), - ("signal", np.float64), - ("phase", np.float64), - ] -) -"""Custom dtype for resonator flux dependence.""" +class QubitFluxTrackResults(qubit_flux_dependence.QubitFluxParameters): + """QubitFluxTrack outputs.""" @dataclass -class QubitFluxData(Data): - """QubitFlux acquisition outputs.""" - - """Resonator type.""" - resonator_type: str - - """ResonatorFlux acquisition outputs.""" - Ec: dict[QubitId, int] = field(default_factory=dict) - """Qubit Ec provided by the user.""" - - Ej: dict[QubitId, int] = field(default_factory=dict) - """Qubit Ej provided by the user.""" - - data: dict[QubitId, npt.NDArray[QubitFluxType]] = field(default_factory=dict) - """Raw data acquired.""" +class QubitFluxTrackData(qubit_flux_dependence.QubitFluxData): + """QubitFluxTrack acquisition outputs.""" def register_qubit_track(self, qubit, freq, bias, signal, phase): """Store output for single qubit.""" # to be able to handle the 1D sweeper case size = len(freq) - ar = np.empty(size, dtype=QubitFluxType) + ar = np.empty(size, dtype=qubit_flux_dependence.QubitFluxType) ar["freq"] = freq ar["bias"] = [bias] * size ar["signal"] = signal @@ -103,10 +43,10 @@ def register_qubit_track(self, qubit, freq, bias, signal, phase): def _acquisition( - params: QubitFluxParameters, + params: QubitFluxTrackResults, platform: Platform, qubits: Qubits, -) -> QubitFluxData: +) -> QubitFluxTrackData: """Data acquisition for QubitFlux Experiment.""" # create a sequence of pulses for the experiment: # MZ @@ -115,12 +55,7 @@ def _acquisition( sequence = PulseSequence() ro_pulses = {} qd_pulses = {} - Ec = {} - Ej = {} for qubit in qubits: - Ec[qubit] = qubits[qubit].Ec - Ej[qubit] = qubits[qubit].Ej - qd_pulses[qubit] = platform.create_qubit_drive_pulse( qubit, start=0, duration=params.drive_duration ) @@ -156,7 +91,7 @@ def _acquisition( type=SweeperType.OFFSET, ) - data = QubitFluxData(resonator_type=platform.resonator_type, Ec=Ec, Ej=Ej) + data = QubitFluxTrackData(resonator_type=platform.resonator_type) for bias in delta_bias_range: for qubit in qubits: @@ -208,142 +143,10 @@ def _acquisition( return data -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. - """ - - qubits = data.qubits - frequency = {} - sweetspot = {} - fitted_parameters = {} - - for qubit in qubits: - qubit_data = data[qubit] - Ec = data.Ec[qubit] - Ej = data.Ej[qubit] - - frequency[qubit] = 0 - sweetspot[qubit] = 0 - fitted_parameters[qubit] = { - "Xi": 0, - "d": 0, - "Ec": 0, - "Ej": 0, - "f_q_offset": 0, - "C_ii": 0, - } - - biases = qubit_data.bias - frequencies = qubit_data.freq - signal = qubit_data.signal - - if data.resonator_type == "2D": - signal = -signal - - frequencies, biases = utils.image_to_curve( - frequencies, biases, signal, signal_mask=0.3 - ) - max_c = biases[np.argmax(frequencies)] - min_c = biases[np.argmin(frequencies)] - xi = 1 / (2 * abs(max_c - min_c)) # Convert bias to flux. - - # First order approximation: Ec and Ej NOT provided - if Ec == 0 and Ej == 0: - try: - f_q_0 = np.max( - frequencies - ) # Initial estimation for qubit frequency at sweet spot. - popt = curve_fit( - utils.freq_q_transmon, - biases, - frequencies / GHZ_TO_HZ, - p0=[max_c, xi, 0, f_q_0 / GHZ_TO_HZ], - bounds=((-np.inf, 0, 0, 0), (np.inf, np.inf, np.inf, np.inf)), - maxfev=2000000, - )[0] - popt[3] *= GHZ_TO_HZ - f_qs = popt[3] # Qubit frequency at sweet spot. - f_q_offset = utils.freq_q_transmon( - 0, *popt - ) # Qubit frequenct at zero current. - C_ii = (f_qs - f_q_offset) / popt[ - 0 - ] # Corresponding flux matrix element. - - frequency[qubit] = f_qs * HZ_TO_GHZ - sweetspot[qubit] = popt[0] - fitted_parameters[qubit] = { - "Xi": popt[1], - "d": abs(popt[2]), - "f_q_offset": f_q_offset, - "C_ii": C_ii, - } - except: - log.warning( - "qubit_flux_fit: The first order approximation fitting was not succesful" - ) - - # Second order approximation: Ec and Ej provided - else: - try: - freq_q_mathieu1 = partial(utils.freq_q_mathieu, p5=0.4999) - popt = curve_fit( - freq_q_mathieu1, - biases, - frequencies / GHZ_TO_HZ, - p0=[max_c, xi, 0, Ec / GHZ_TO_HZ, Ej / GHZ_TO_HZ], - bounds=( - (-np.inf, 0, 0, 0, 0), - (np.inf, np.inf, np.inf, np.inf, np.inf), - ), - maxfev=2000000, - )[0] - popt[3] *= GHZ_TO_HZ - popt[4] *= GHZ_TO_HZ - f_qs = utils.freq_q_mathieu( - popt[0], *popt - ) # Qubit frequency at sweet spot. - f_q_offset = utils.freq_q_mathieu( - 0, *popt - ) # Qubit frequenct at zero current. - C_ii = (f_qs - f_q_offset) / popt[ - 0 - ] # Corresponding flux matrix element. - - frequency[qubit] = f_qs * HZ_TO_GHZ - sweetspot[qubit] = popt[0] - fitted_parameters[qubit] = { - "Xi": popt[1], - "d": abs(popt[2]), - "Ec": popt[3], - "Ej": popt[4], - "f_q_offset": f_q_offset, - "C_ii": C_ii, - } - except: - log.warning( - "qubit_flux_fit: The second order approximation fitting was not succesful" - ) - - return QubitFluxResults( - frequency=frequency, - sweetspot=sweetspot, - fitted_parameters=fitted_parameters, - ) - - -def _plot(data: QubitFluxData, fit: QubitFluxResults, qubit): - """Plotting function for QubitFlux Experiment.""" - return utils.flux_dependence_plot(data, fit, qubit) - - -def _update(results: QubitFluxResults, platform: Platform, qubit: QubitId): - update.sweetspot(results.sweetspot[qubit], platform, qubit) - update.drive_frequency(results.frequency[qubit], platform, qubit) - - -qubit_flux_tracking = Routine(_acquisition, _fit, _plot, _update) -"""QubitFlux Routine object.""" +qubit_flux_tracking = Routine( + _acquisition, + qubit_flux_dependence._fit, + qubit_flux_dependence._plot, + qubit_flux_dependence._update, +) +"""QubitFluxTrack Routine object.""" From cbb0c9f624119c8a95e4f93439957a7f8ac50b0e Mon Sep 17 00:00:00 2001 From: Andrea Date: Thu, 4 Jan 2024 10:26:22 +0100 Subject: [PATCH 38/52] doc: Improve docstrings and coverage --- .../characterization/flux_dependence/utils.py | 448 +++++++++--------- 1 file changed, 221 insertions(+), 227 deletions(-) diff --git a/src/qibocal/protocols/characterization/flux_dependence/utils.py b/src/qibocal/protocols/characterization/flux_dependence/utils.py index 93c737341..42a89df92 100644 --- a/src/qibocal/protocols/characterization/flux_dependence/utils.py +++ b/src/qibocal/protocols/characterization/flux_dependence/utils.py @@ -1,7 +1,6 @@ import numpy as np import plotly.graph_objects as go from plotly.subplots import make_subplots -from scipy.special import mathieu_a, mathieu_b from ..utils import HZ_TO_GHZ @@ -172,13 +171,16 @@ def flux_crosstalk_plot(data, qubit): def G_f_d(x, offset, d, element): - """ - Auxiliary function to calculate the qubit frequency as a function of bias for the qubit flux spectroscopy. It also determines the flux dependence of :math:`E_J`, :math:`E_J(\\phi)=E_J(0)G_f_d^2`. + """Auxiliary function to calculate qubit frequency as a function of bias. + + It also determines the flux dependence of :math:`E_J`,:math:`E_J(\\phi)=E_J(0)G_f_d^2`. + For more details see: https://arxiv.org/pdf/cond-mat/0703002.pdf Args: offset (float): bias offset. matrix_element(float): constant to convert flux (:math:`\\phi_0`) to bias (:math:`v_0`). Typically denoted as :math:`\\Xi`. :math:`v_0 = \\Xi \\phi_0`. - 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)`. + 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)`. Returns: (float) @@ -187,153 +189,270 @@ def G_f_d(x, offset, d, element): def transmon_frequency(x, w_max, d, element, offset): + r"""Approximation to transmon frequency. + + The formula holds in the transmon regime Ej / Ec >> 1. + + See https://arxiv.org/pdf/cond-mat/0703002.pdf for the complete formula. + + Args: + x (float): bias value + w_max (float): maximum frequency :math:`w_{max} = \sqrt{8 E_j E_c} + d (float): d (float): asymmetry between the two junctions of the transmon. + element (float): matrix element + offset (float): bias corresponding to zero flux (sweetspot). + + Returns: + (float): qubit frequency as a function of bias. + """ return w_max * G_f_d(x, offset=offset, d=d, element=element) def transmon_readout_frequency(x, w_max, d, element, offset, resonator_freq, g): + r"""Approximation to flux dependent resonator frequency. + + The formula holds in the transmon regime Ej / Ec >> 1. + + See https://arxiv.org/pdf/cond-mat/0703002.pdf for the complete formula. + + Args: + x (float): bias value + w_max (float): maximum frequency :math:`w_{max} = \sqrt{8 E_j E_c} + d (float): d (float): asymmetry between the two junctions of the transmon. + element (float): matrix element + offset (float): bias corresponding to zero flux (sweetspot). + resonator_freq (float): bare resonator frequency [GHz] + g (float): readout coupling. + + Returns: + (float): resonator frequency as a function of bias. + """ return resonator_freq + g**2 * G_f_d(x, offset, d, element) / ( resonator_freq - transmon_frequency(x, w_max, d, element, offset) ) -def freq_q_transmon(x, p0, p1, p2, p3): - """ - Qubit frequency in the boson description. Close to the half-flux quantum (:math:'\\phi=0.5`), :math:`E_J/E_C = E_J(\\phi=0)*d/E_C` can be too small for a quasi-symmetric split-transmon to apply this expression. We assume that the qubit frequencty :math:`\\gg E_C`. +# TODO: restore second order approximation +# def freq_q_transmon(x, p0, p1, p2, p3): +# """ +# Qubit frequency in the boson description. Close to the half-flux quantum (:math:'\\phi=0.5`), :math:`E_J/E_C = E_J(\\phi=0)*d/E_C` can be too small for a quasi-symmetric split-transmon to apply this expression. We assume that the qubit frequencty :math:`\\gg E_C`. - Args: - p[0] (float): bias offset. - p[1] (float): constant to convert flux (:math:`\\phi_0`) to bias (:math:`v_0`). Typically denoted as :math:`\\Xi`. :math:`v_0 = \\Xi \\phi_0`. - p[2] (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)`. - p[3] (float): qubit frequency at the sweetspot. +# Args: +# p[0] (float): bias offset. +# p[1] (float): constant to convert flux (:math:`\\phi_0`) to bias (:math:`v_0`). Typically denoted as :math:`\\Xi`. :math:`v_0 = \\Xi \\phi_0`. +# p[2] (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)`. +# p[3] (float): qubit frequency at the sweetspot. - Returns: - (float) - """ - return p3 * G_f_d(x, p0, p1, p2) +# Returns: +# (float) +# """ +# return p3 * G_f_d(x, p0, p1, p2) -def freq_r_transmon(x, p0, p1, p2, p3, p4, p5): - """ - Flux dependent resonator frequency in the transmon limit. +# def freq_r_transmon(x, p0, p1, p2, p3, p4, p5): +# """ +# Flux dependent resonator frequency in the transmon limit. - Args: - p[0] (float): bias offset. - p[1] (float): constant to convert flux (:math:`\\phi_0`) to bias (:math:`v_0`). Typically denoted as :math:`\\Xi`. :math:`v_0 = \\Xi \\phi_0`. - p[2] (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)`. - p[3] (float): qubit frequency at the sweetspot / high power resonator frequency, - p[4] (float): readout coupling at the sweetspot. Typically denoted as :math:`g`. - p[5] (float): high power resonator frequency. +# Args: +# p[0] (float): bias offset. +# p[1] (float): constant to convert flux (:math:`\\phi_0`) to bias (:math:`v_0`). Typically denoted as :math:`\\Xi`. :math:`v_0 = \\Xi \\phi_0`. +# p[2] (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)`. +# p[3] (float): qubit frequency at the sweetspot / high power resonator frequency, +# p[4] (float): readout coupling at the sweetspot. Typically denoted as :math:`g`. +# p[5] (float): high power resonator frequency. - Returns: - (float) - """ - return p5 + p4**2 * G_f_d(x, p0, p1, p2) / (p5 - p3 * p5 * G_f_d(x, p0, p1, p2)) +# Returns: +# (float) +# """ +# return p5 + p4**2 * G_f_d(x, p0, p1, p2) / (p5 - p3 * p5 * G_f_d(x, p0, p1, p2)) -def kordering(m, ng=0.4999): - """ - Auxilliary function to compute the qubit frequency in the CPB model (useful when the boson description fails). It sorts the eigenvalues :math:`|m,ng\\rangle` for the Schrodinger equation for the - Cooper pair box circuit in the phase basis. +# def kordering(m, ng=0.4999): +# """ +# Auxilliary function to compute the qubit frequency in the CPB model (useful when the boson description fails). It sorts the eigenvalues :math:`|m,ng\\rangle` for the Schrodinger equation for the +# Cooper pair box circuit in the phase basis. - Args: - m (integer): index denoting the m eigenvector. - ng (float): effective offset charge. The sorting does not work for ng integer or half-integer. To study the sweet spot at :math:`ng = 0.5` for instance, one should insert an approximation like :math:`ng = 0.4999`. +# Args: +# m (integer): index denoting the m eigenvector. +# ng (float): effective offset charge. The sorting does not work for ng integer or half-integer. To study the sweet spot at :math:`ng = 0.5` for instance, one should insert an approximation like :math:`ng = 0.4999`. - Returns: - (float) - """ +# Returns: +# (float) +# """ - a1 = (round(2 * ng + 1 / 2) % 2) * (round(ng) + 1 * (-1) ** m * divmod(m + 1, 2)[0]) - a2 = (round(2 * ng - 1 / 2) % 2) * (round(ng) - 1 * (-1) ** m * divmod(m + 1, 2)[0]) - return a1 + a2 +# a1 = (round(2 * ng + 1 / 2) % 2) * (round(ng) + 1 * (-1) ** m * divmod(m + 1, 2)[0]) +# a2 = (round(2 * ng - 1 / 2) % 2) * (round(ng) - 1 * (-1) ** m * divmod(m + 1, 2)[0]) +# return a1 + a2 -def mathieu(index, x): - """ - Mathieu's characteristic value. Auxilliary function to compute the qubit frequency in the CPB model. +# def mathieu(index, x): +# """ +# Mathieu's characteristic value. Auxilliary function to compute the qubit frequency in the CPB model. - Args: - index (integer): index to specify the Mathieu's characteristic value. +# Args: +# index (integer): index to specify the Mathieu's characteristic value. - Returns: - (float) - """ - if index < 0: - return mathieu_b(-index, x) - else: - return mathieu_a(index, x) +# Returns:def freq_q_transmon(x, p0, p1, p2, p3): +# """ +# Qubit frequency in the boson description. Close to the half-flux quantum (:math:'\\phi=0.5`), :math:`E_J/E_C = E_J(\\phi=0)*d/E_C` can be too small for a quasi-symmetric split-transmon to apply this expression. We assume that the qubit frequencty :math:`\\gg E_C`. +# Args: +# p[0] (float): bias offset. +# p[1] (float): constant to convert flux (:math:`\\phi_0`) to bias (:math:`v_0`). Typically denoted as :math:`\\Xi`. :math:`v_0 = \\Xi \\phi_0`. +# p[2] (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)`. +# p[3] (float): qubit frequency at the sweetspot. -def freq_q_mathieu(x, p0, p1, p2, p3, p4, p5=0.499): - """ - Qubit frequency in the CPB model. It is useful when the boson description fails and to determine :math:`E_C` and :math:`E_J`. +# Returns: +# (float) +# """ +# return p3 * G_f_d(x, p0, p1, p2) - Args: - p[0] (float): bias offset. - p[1] (float): constant to convert flux (:math:`\\phi_0`) to bias (:math:`v_0`). Typically denoted as :math:`\\Xi`. :math:`v_0 = \\Xi \\phi_0`. - p[2] (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)`. - p[3] (float): charge energy at the sweetspot, :math:`E_C`. - p[4] (float): Josephson energy, :math:`E_J`. - p[5] (float): effective offset charge, :math:`ng`. - Returns: - (float) - """ - index1 = int(2 * (p5 + kordering(1, p5))) - index0 = int(2 * (p5 + kordering(0, p5))) - p4 = p4 * G_f_d(x, p0, p1, p2) - return p3 * (mathieu(index1, -p4 / (2 * p3)) - mathieu(index0, -p4 / (2 * p3))) +# def freq_r_transmon(x, p0, p1, p2, p3, p4, p5): +# """ +# Flux dependent resonator frequency in the transmon limit. +# Args: +# p[0] (float): bias offset. +# p[1] (float): constant to convert flux (:math:`\\phi_0`) to bias (:math:`v_0`). Typically denoted as :math:`\\Xi`. :math:`v_0 = \\Xi \\phi_0`. +# p[2] (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)`. +# p[3] (float): qubit frequency at the sweetspot / high power resonator frequency, +# p[4] (float): readout coupling at the sweetspot. Typically denoted as :math:`g`. +# p[5] (float): high power resonator frequency. -def freq_r_mathieu(x, p0, p1, p2, p3, p4, p5, p6, p7=0.499): - """ - Resonator frequency in the CPB model. +# Returns: +# (float) +# """ +# return p5 + p4**2 * G_f_d(x, p0, p1, p2) / (p5 - p3 * p5 * G_f_d(x, p0, p1, p2)) - Args: - p[0] (float): high power resonator frequency. - p[1] (float): readout coupling at the sweetspot. - p[2] (float): bias offset. - p[3] (float): constant to convert flux (:math:`\\phi_0`) to bias (:math:`v_0`). Typically denoted as :math:`\\Xi`. :math:`v_0 = \\Xi \\phi_0`. - p[4] (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)`. - p[5] (float): charge energy at the sweetspot, :math:`E_C`. - p[6] (float): Josephson energy, :math:`E_J`. - p[7] (float): effective offset charge, :math:`ng`. - Returns: - (float) - """ - G = G_f_d(x, p2, p3, p4) - f_q = freq_q_mathieu(x, p2, p3, p4, p5, p6, p7) - f_r = p0 + p1**2 * G / (p0 - f_q) - return f_r +# def kordering(m, ng=0.4999): +# """ +# Auxilliary function to compute the qubit frequency in the CPB model (useful when the boson description fails). It sorts the eigenvalues :math:`|m,ng\\rangle` for the Schrodinger equation for the +# Cooper pair box circuit in the phase basis. + +# Args: +# m (integer): index denoting the m eigenvector. +# ng (float): effective offset charge. The sorting does not work for ng integer or half-integer. To study the sweet spot at :math:`ng = 0.5` for instance, one should insert an approximation like :math:`ng = 0.4999`. + +# Returns: +# (float) +# """ + +# a1 = (round(2 * ng + 1 / 2) % 2) * (round(ng) + 1 * (-1) ** m * divmod(m + 1, 2)[0]) +# a2 = (round(2 * ng - 1 / 2) % 2) * (round(ng) - 1 * (-1) ** m * divmod(m + 1, 2)[0]) +# return a1 + a2 + + +# def mathieu(index, x): +# """ +# Mathieu's characteristic value. Auxilliary function to compute the qubit frequency in the CPB model. + +# Args: +# index (integer): index to specify the Mathieu's characteristic value. + +# Returns: +# (float) +# """ +# if index < 0: +# return mathieu_b(-index, x) +# else: +# return mathieu_a(index, x) -# def line(x, p0, p1): +# def freq_q_mathieu(x, p0, p1, p2, p3, p4, p5=0.499): # """ -# Linear fit. +# Qubit frequency in the CPB model. It is useful when the boson description fails and to determine :math:`E_C` and :math:`E_J`. # Args: -# p[0] (float): slope. -# p[1] (float): intercept. +# p[0] (float): bias offset. +# p[1] (float): constant to convert flux (:math:`\\phi_0`) to bias (:math:`v_0`). Typically denoted as :math:`\\Xi`. :math:`v_0 = \\Xi \\phi_0`. +# p[2] (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)`. +# p[3] (float): charge energy at the sweetspot, :math:`E_C`. +# p[4] (float): Josephson energy, :math:`E_J`. +# p[5] (float): effective offset charge, :math:`ng`. # Returns: # (float) # """ -# return p0 * x + p1 +# index1 = int(2 * (p5 + kordering(1, p5))) +# index0 = int(2 * (p5 + kordering(0, p5))) +# p4 = p4 * G_f_d(x, p0, p1, p2) +# return p3 * (mathieu(index1, -p4 / (2 * p3)) - mathieu(index0, -p4 / (2 * p3))) -# def feature(x, order=3): +# def freq_r_mathieu(x, p0, p1, p2, p3, p4, p5, p6, p7=0.499): # """ -# Auxilliary function for the function image_to_curve(). It generates a polynomial feature of the form [1, x, x^2, ..., x^order]. +# Resonator frequency in the CPB model. # Args: -# x (ndarray) column vector. +# p[0] (float): high power resonator frequency. +# p[1] (float): readout coupling at the sweetspot. +# p[2] (float): bias offset. +# p[3] (float): constant to convert flux (:math:`\\phi_0`) to bias (:math:`v_0`). Typically denoted as :math:`\\Xi`. :math:`v_0 = \\Xi \\phi_0`. +# p[4] (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)`. +# p[5] (float): charge energy at the sweetspot, :math:`E_C`. +# p[6] (float): Josephson energy, :math:`E_J`. +# p[7] (float): effective offset charge, :math:`ng`. # Returns: -# (ndarray) +# (float) +# """ +# G = G_f_d(x, p2, p3, p4) +# f_q = freq_q_mathieu(x, p2, p3, p4, p5, p6, p7) +# f_r = p0 + p1**2 * G / (p0 - f_q) +# return f_r + +# (float) +# """ +# if index < 0: +# return mathieu_b(-index, x) +# else: +# return mathieu_a(index, x) + + +# def freq_q_mathieu(x, p0, p1, p2, p3, p4, p5=0.499): # """ -# x = x.reshape(-1, 1) -# return np.power(x, np.arange(order + 1).reshape(1, -1)) +# Qubit frequency in the CPB model. It is useful when the boson description fails and to determine :math:`E_C` and :math:`E_J`. + +# Args: +# p[0] (float): bias offset. +# p[1] (float): constant to convert flux (:math:`\\phi_0`) to bias (:math:`v_0`). Typically denoted as :math:`\\Xi`. :math:`v_0 = \\Xi \\phi_0`. +# p[2] (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)`. +# p[3] (float): charge energy at the sweetspot, :math:`E_C`. +# p[4] (float): Josephson energy, :math:`E_J`. +# p[5] (float): effective offset charge, :math:`ng`. + +# Returns: +# (float) +# """ +# index1 = int(2 * (p5 + kordering(1, p5))) +# index0 = int(2 * (p5 + kordering(0, p5))) +# p4 = p4 * G_f_d(x, p0, p1, p2) +# return p3 * (mathieu(index1, -p4 / (2 * p3)) - mathieu(index0, -p4 / (2 * p3))) + + +# def freq_r_mathieu(x, p0, p1, p2, p3, p4, p5, p6, p7=0.499): +# """ +# Resonator frequency in the CPB model. + +# Args: +# p[0] (float): high power resonator frequency. +# p[1] (float): readout coupling at the sweetspot. +# p[2] (float): bias offset. +# p[3] (float): constant to convert flux (:math:`\\phi_0`) to bias (:math:`v_0`). Typically denoted as :math:`\\Xi`. :math:`v_0 = \\Xi \\phi_0`. +# p[4] (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)`. +# p[5] (float): charge energy at the sweetspot, :math:`E_C`. +# p[6] (float): Josephson energy, :math:`E_J`. +# p[7] (float): effective offset charge, :math:`ng`. + +# Returns: +# (float) +# """ +# G = G_f_d(x, p2, p3, p4) +# f_q = freq_q_mathieu(x, p2, p3, p4, p5, p6, p7) +# f_r = p0 + p1**2 * G / (p0 - f_q) +# return f_r def extract_min_feature(freq, bias, signal, threshold=1.5): @@ -342,8 +461,6 @@ def extract_min_feature(freq, bias, signal, threshold=1.5): std_signal = np.std(signal) snr_map = (signal - mean_signal) / std_signal binary_mask = snr_map < -threshold - if len(binary_mask) == 0: - return freq, bias return freq[binary_mask], bias[binary_mask] @@ -353,127 +470,4 @@ def extract_max_feature(freq, bias, signal, threshold=1.5): std_signal = np.std(signal) snr_map = (signal - mean_signal) / std_signal binary_mask = snr_map > threshold - if len(binary_mask) == 0: - return freq, bias return freq[binary_mask], bias[binary_mask] - - -# def image_to_curve(x, y, z, signal_mask=0.5, alpha=1e-5, order=50): -# """ -# Extracts a feature characterized by min(z(x, y)). It considers all the data and applies Ridge regression on a polynomial ansatz in x. This allows obtaining a set of points describing the feature as y vs x. - -# Args: -# x (ndarray) frequencies -# y (ndarray) bias -# z (ndarray) signal - -# Returns: -# y_pred (ndarray) frequencies -# x_pred (ndarray) bias -# """ -# max_x = np.max(x) -# min_x = np.min(x) -# lenx = int((max_x - min_x) / (x[1] - x[0])) + 1 -# max_y = np.max(y) -# min_y = np.min(y) -# leny = int(len(y) / (lenx)) -# z = np.array(z, float) -# if len(z) != leny * lenx: -# lenx += 1 -# leny = int(len(y) / (lenx)) -# x = np.linspace(min_x, max_x, lenx) -# y = np.linspace(min_y, max_y, leny) -# z = np.reshape(z, (leny, lenx)) -# zmax, zmin = z.max(), z.min() -# znorm = (z - zmin) / (zmax - zmin) - -# # Mask out region -# mask = znorm < signal_mask -# z = np.argwhere(mask) -# weights = znorm[mask] / float(znorm.max()) -# # Column indices -# x_fit = y[z[:, 0].reshape(-1, 1)] -# # Row indices to predict. -# y_fit = x[z[:, 1]] - -# # Ridge regression, i.e., least squares with l2 regularization -# A = feature(x_fit, order) -# model = Ridge(alpha=alpha) -# model.fit(A, y_fit, sample_weight=weights) -# x_pred = y -# X_pred = feature(x_pred, order) -# y_pred = model.predict(X_pred) -# return y_pred, x_pred - - -# FIXME: update with latest version of the code -def get_resonator_freq_flux( - bias, sweetspot, flux_to_bias, asymmetry, g, brf, ssf_brf, Ec, Ej -): - """ - Estimate the resonator frequency for a give "bias". - - Args: - bias (float): Bias value where the resonator frequency should be estimated - sweetspot (float): qubit sweetspot - flux_to_bias (float): Resonator value to convert from flux to bias - asymmetry (float): Resonator asymmetry - g (float): Readout coupling - brf (float): Bare resonator frequency at sweetspot - ssf_brf (float): Estimated sweetspot qubit frequency divided by the bare_resonator_frequency - Ec (float): Readout Charge Energy - Ej (float): Readout Josephson Energy - - Returns: - freq_resonator (float): Estimated Resonator frequency at the provided bias point - """ - if ( - flux_to_bias == 0.0 - or asymmetry == 0.0 - or g == 0.0 - or brf == 0.0 - or Ec == 0.0 - or Ej == 0.0 - ): - raise ValueError( - "Not enough parameters to estimate the resonator frequency for the given bias" - ) - - if ssf_brf == 0: - # First order approximation used during resonator flux fitting - # 'sweetspot_0':p0, - # 'flux_to_bias':p1, - # 'asymmetry':p2, - # 'readout_coupling':p4, - # 'bare_resonator_frequency_0':p5 - # 'sweetspot_qubit_frequency/bare_resonator_frequency':p3, - freq_resonator = freq_r_transmon( - bias, - sweetspot, - flux_to_bias, - asymmetry, - ssf_brf, - g, - brf, - ) - else: - # Second order approximation used during resonator flux fitting - # 'sweetspot_0':p2, - # 'flux_to_bias':p3, - # 'asymmetry':p4, - # 'readout_coupling':p1, - # 'bare_resonator_frequency_0':p0, - # 'Ec':p5, - # 'Ej:p6' - freq_resonator = freq_r_mathieu( - bias, - brf, - g, - sweetspot, - flux_to_bias, - asymmetry, - Ec, - Ej, - ) - - return freq_resonator From d78736c9ba024f664ff406d769794f0782d4b787 Mon Sep 17 00:00:00 2001 From: Andrea Date: Thu, 4 Jan 2024 15:46:03 +0100 Subject: [PATCH 39/52] refactor: Renaming Cii -> Vii --- .../characterization/flux_dependence/qubit_flux_dependence.py | 4 ++-- .../flux_dependence/resonator_flux_dependence.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_dependence.py b/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_dependence.py index 97b489032..da65ec7a3 100644 --- a/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_dependence.py +++ b/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_dependence.py @@ -54,7 +54,7 @@ class QubitFluxResults(Results): fitted_parameters: dict[QubitId, dict[str, float]] """Raw fitting output.""" matrix_element: dict[QubitId, float] - """C_ii coefficient.""" + """V_ii coefficient.""" QubitFluxType = np.dtype( @@ -245,7 +245,7 @@ def _plot(data: QubitFluxData, fit: QubitFluxResults, qubit): "Sweetspot [V]", "Qubit Frequency at Sweetspot [Hz]", "Asymmetry d", - "C_ii", + "V_ii [V]", ], [ np.round(fit.sweetspot[qubit], 4), diff --git a/src/qibocal/protocols/characterization/flux_dependence/resonator_flux_dependence.py b/src/qibocal/protocols/characterization/flux_dependence/resonator_flux_dependence.py index 763664459..8f892be4c 100644 --- a/src/qibocal/protocols/characterization/flux_dependence/resonator_flux_dependence.py +++ b/src/qibocal/protocols/characterization/flux_dependence/resonator_flux_dependence.py @@ -255,7 +255,7 @@ def _plot(data: ResonatorFluxData, fit: ResonatorFluxResults, qubit): "Qubit Frequency at Sweetspot [Hz]", "Asymmetry d", "Coupling g", - "C_ii", + "V_ii [V]", ], [ np.round(fit.sweetspot[qubit], 4), From 2f2cad8a380df7e7efc69c0c5ba483eeca0b24e6 Mon Sep 17 00:00:00 2001 From: GabrielePalazzo Date: Fri, 5 Jan 2024 18:14:38 +0100 Subject: [PATCH 40/52] Added plot with attenuation --- doc/source/protocols/resonator_punchout.rst | 26 ++++++++++++++++++ .../resonator_punchout_attenuation.png | Bin 0 -> 35939 bytes 2 files changed, 26 insertions(+) create mode 100644 doc/source/protocols/resonator_punchout_attenuation.png diff --git a/doc/source/protocols/resonator_punchout.rst b/doc/source/protocols/resonator_punchout.rst index 52bb70fb3..0d65cd2bf 100644 --- a/doc/source/protocols/resonator_punchout.rst +++ b/doc/source/protocols/resonator_punchout.rst @@ -101,6 +101,32 @@ approximate value, that can later be used to check, in other experiments, that w not exciting the qubit by error (if we see a change in amplitude, then maybe the qubit state has changed). +It is also to run the punchout experiment with attenuation: + +.. image:: resonator_punchout_attenuation.png + +This is and example of a runcard for a resonator punchout with attenuation: + +.. code-block:: yaml + + platform: + + qubits: [0] + + actions: + + - id: resonator_punchout_attenuation + priority: 0 + operation: resonator_punchout_attenuation + parameters: + freq_width: 10_000_000 + freq_step: 500_000 + max_att: 60 + min_att: 4 + nshots: 1000 + step_att: 4 + nshots: 2048 + .. rubric:: References .. bibliography:: diff --git a/doc/source/protocols/resonator_punchout_attenuation.png b/doc/source/protocols/resonator_punchout_attenuation.png new file mode 100644 index 0000000000000000000000000000000000000000..6a05795991dc85329567485cb541f1f0ae9822cb GIT binary patch literal 35939 zcmb@uby!qu+cu7g1#ANm5HLWbk!}28q5f-NfO&@IgjFmy-^ASx0=cOy9r z-OYEeh5GFMe$V?mzCV8JIB;gIS?gYRUe|e@*LnL!QC^DV4AmJTA|evRqX)`FM8pIl zq9aoR>LG4m^j8`G;Rnl6j`U^KwGGC|vP-eOy9iqHTFJqK# z_3>4njHdG6H<+vg9x&u_)MAC3?AIf=_7W!h@sCX+9OpkTta$2l>qL5hZ{4!o8<9JE z*o9_mN1<5xBcOV}4&SR|rcS?4pic+tsI`Bbk8}S2d+JMA{!;Y@-SH_{J-a_*BDdXi zObvC9(Rv`S#@A>b)t=~|+N8^lh&rg#K)0nk7G*nredT7+YCfVig^-qS9oLMXc^%>WUSNmJ9PxYQKD*6R83 zgZ%DHw>hW0O+@S#VoTHJt)qAh-+1pCY6NCcz@wqR++m1YbJ`)kM0Fv?ns8gI;15_xZXosB#n1wdp$eD@lfC&HFdE z&D;6puI|5>&+>@2bbrsx&vg6tU46{XLqr|w%vqAI`x}GSPuen8Ha1k^{?56oYx?Ag z@6lt&E?v43kwiEF)ut-^IPnRS9kI{x@p5iAzT~a>f{PAk!A$WbT&AQ&n+g|oBuB=l zJFk=mu&a&)tk?{dYTH&6Kkj##4+qbv*{~-K4brNG2Ba_`=)6nSRVGA~N?@IQ7D}Gv?C`x;hPc z{WR{bP0CrjGp4ZuUh-SZuQFP7c~^Y~>C_&Zb4Tts~ zRqhtue}iCRrlm~s0^91Nz9J3)~aG{kz8km;aNmmVsjV1 z!mYu1(({E)MM~z$4R2*Km)UIlY|*qGsv*pY25grww|Hk+c4e}Xtmct=6dkVF!ul&yS$>wr*9ljoE+uehF)`&$8t>W{k)EH)I9E~F0*gie{T5cxL$?^kO(urJ~_B1 z>rY%LJ|BVI!@Dvtq)lVALU}W7DJGh!@lnmg%?b-mnyDvbx@RPwBIncX^Ci~_=oecn zj~r~pH^<0_E#_avzU{e{_(5a>8T@VMo437Va4*!5+FR`{E6uWSBcb7!vTfdc5G;vJrwf-;#)_P$ z5?u1>mWnTXR%qf`qRb&SC@Eta*z&_$fk2?+xBR&pH0Z9IjlHAGs1V;>X1m&zr+Kpz zD`!aJV;ShZJE4GR>lU}_YN$z@Zt7>o2UFJY<_))RFZb)O_Vs9Dj92N_;#?Ml6PavR z+cHn@IkAf=Sz`O0I@iKj$djJ7Dp83UU@m7rPFq=eV>2;WYFOzP7@Z~Q+TDW0*L0M+ z=~nD+a60it%ONj~EM$Lui-_WK{e0`3&pm2&d8LL_SM%u-K_UB@7)wDfe+9J)VVlk` z=J$E5o#>#^OsNhYsJ9nHnd99jCvwk_p6O^@$~GJA=ytM9ad02)e1lm#3QdKPvqz8a z@~$K`t7T|C^xDApYjJr+6fFp)^WXA{FvoIWdp|i&ahTOpSMZuBx>|2J1`S27q3Ac( zU;6ABhU-xa%P16BXQt#!TJ%L9q&Y5~p4sa&LLh5KRg1A>t2;%aRJ{l0Y~DWUXjRrM zo9uV(^Lze--lE|dg(blp*Y6;j$s#^^y4@(S>-+0HZHMmJaIdU((=~&E6-C8QRNdLA zSP!z#lRh~J8a8*^^eAu(^4r^Vd0f3kS58sa!Jt)TnC=cKe!f2=UHV&FzD>?YUoS(JwsUDTweR!Bho+dakuHx7eQ$5?DA9yU$u$BxVB)D-k?K1=&(ilu zm9~P3<^~@`qVIayqyx%KWB_((j8v6QFT^k{JhBSPJkwb zkKq+hqAC(g#k8n-Y(;=%#oqJFa@5F)C2L`_bmc8&4EF>B6D!Yy6qyH>wQ(;aC$rR1 zI$=}c>`EPL3xDS*B9tSMk!dL@DJ*Pky7%rquMg*!Xiz^$uQoK98OJ-;|Hxrs5`1Wo zpkW(!u&}1uy|bb*E%D`HXW5wgpn73BdPrHlEhVYHcy1tjO1QXwHAbtGo#cM8WApVB zC-k;gv?eCGFtyf2GWQP-3Wev<1a`F>S}Tl|Xkgw~_x!{Q3|3s&_N`*Y9_LBY(Al6h z+(p7B1b4;)@m!$HfTApXey`+t;l4HP}_PQg=$Z?RjK6^lM3OTYJg=}qj9N$qEaZ}!qF=E zc~29QE~#D1rpE_Wt}}t@T8LJ&%c^N^PVGmBbq9)SWV7frRa%0<>-QK*m$?5z6-+0B z+ru*x8o-8&>hS~9E(8I|?CJioJB2gLXtBMY9-WmdU9v&CveN1aFWmA)7)4kgPy{P; z$-Vvi6pm|H9Jk6w3idX(nL+QTZe>&v6l@dxSDvOU8h(ZmIqW!n^^RRP9c;ZDJrJc z4v0R!i-eX3SXA!Iqp774A&I~(na}_1v=~ZvNqtE~kKcX$fIOf++`Lbma-T(DlWU=W zSa?F;v*I3rT}s7_v>jD(G?ysPr|KW{poZ=bISX(2(1>_S#ClXD^zquXMjtCf*{O;N zUX|x{FX?vXxCjk}@9grh*G9{SCx~!Azk`JWpB^i|y$Z{@E^j-0PvZ9C;62FgyIb}> zC7~47hS1V;QQ`D@oUzl=(>#E6RVxtPvV`3JIgB5cabMTco^kkF@}(2R#KxL|jLsy$ zrqjZmeOo&(qOY)A>SCJDtWd))-TBc3>GFt}3BflM!D{KBT!ZS1`f0XTR~9<549|-8 zB+I8de`evV(gy}T5!lXFeEyQw{zOpJ=KclpAMsK&{d{V^m6bxk-1BX8H!lwWG%(#v zv%`QmO%co`y1qcO(|~BsA*@EOFl!}0NyU#ETzAj4q-Hx4>{gpa@@PNw6NoLqh`<@TeedTng8f)m*BzqmdUI#9{cSJ&I|l{!>ryi=g%jc zIdi51_|rU*=HZ3!7%PH27B~*wa#@-QEx4})A^F$fJX`sLrvliVZGf-3 zKg=Kj_D6u#i2_Dn4>w{b5MtnZTR-j~R@3_q(?k7(l3wSNTb=aux6Hpq#fQWhgwsDH z|B(UkAfZdzxX@$RU~8+_N#?b(ko#@{VRnNn_n}&%+4U1AH(6|rN~8}&S%)h9Q)NJ} zg%7*vI1eT<`lRzIkad0De8n0xC;Y4ukg7Hg?;4g;$^8laiWZDtOZe zypg^xYhzxz;T*~7CY}plOf9?gwIGBfcek}hu>YgBD>6N!!CfnXG z>J+4`+_pM1O(|qIUE(q)oQbVTyDcK3%C=C}pFs)Y3e{YlOvu6c2gY?YRrs%3RW6}j zYqJ6rO49cLAT}u0U)ln`3W7?0?_yJEJbpTD_Aq7X?BoNG@+qoVuT)(p+yz%KS*E|X zze^6k27q0bo5L#pQ&KZel>-7EO5wY->u2`1SXRe4d@O)<1nWxX`H_7M-2V8@4alGc ziStW9&_mz5KOvsqwtJOK1Kpg%gnrDf?rf=nTP{x}vB3A#Ez^-yYwN_ADK)gBw53l^CcuHx3e7E$$MN)>Y&|NbRjN)CM~An+1&<+S zd_2-IN`#<7Bjm0;yuVro{f?s=wC`wY%5+xTT#bF9?0izJ7J< z19%hw^^{RtoKp3!n~m8Z;3!!9s)>o7b>1Z7>-b_kY__pqgE7y&^P1O7NB@0%(W9(5 zs$?P`@y>K*J;z(C8qYmH>NRuz3{B$!(RkrBkK&zHrI{^NYPE`#cSTl%SyH7Woo$*o zF`EO6Ie*E~?c@!)+vdi3E;*;9n5I8-3W-}7(8`MH45bHfN5vM~C)Yle-2ylO<{Kii zoh;$)08?M0b-{028=e%;s7^9P*ZQ6gI7bFx3KhQkmMcDEflt?d@Y~zVZM${Z7F{nm zcsyE}V?iuOnx^tC;F4OGBpvIP@`~8LGH`GmAH-riC-K!b z6c_1H{TJDsrl%255JG;LDiH*LsvCi9&OcWLNocuc_V+c!dqy0nx=@&=xhV75j@RyE zv1DosfoKT1OtR}`;px2C#l^)*W;&J1Ht5thD=}Uh(m}O6i|_HJ8?8h27b!7C8{ORi zYGu*!**N1IXTMVJVZDNCBjJ%RL4sd3JSC8{b7HC}6y5@WpOe_0>ba@1e7b>3QxDK# zW{n{ygq*iyGBBKLxS_mWtL2Sie8n9v9+Uc`6#~zY0NSaF2uTmdTcH@~Y~1f>HxKTu zB5t}{bR=)hv>3hu%LLWUO=bzapM%cS4-a57maUoyG~FO%+&rGvj^dtTH=??6&@JwQ zGHh1T;XMPP{qQ@X`4w(G%WtFUg2} z>#VoE(q@Xil~g9#+pB9B0X7|UcU<-drm3Jlj5%z~?JB81Xjw>H+($z~V@^Lu7WY_v zxB%Q~RWohe>~nPebAeXc{_S{GWrqOe_O^U$8X}_c%RGc5M4X?sI+ z8!~3r`iw$Z^&VXG-w45(G%SgLU_(92WN>YAJjlT+Hs0&AUSX7T_pUyPrk3p_F&aZG%nbLn~h`#^g+V$w_8LNEGVXc`Pb$-5sd z;_1)mq2~YTbdiqIrR=-BZn`vy5MIagMXNnrgzt$~z@>p> zMBJUkTPmUY-ttO5B@N7e5k0>2YtZ(Sq^8ut91d;0bNJNjKTk1-z2y};tX+=4zbVul zqNKxmE(UFOaQS8O+b)XT?>Y;YAYz!(cjT~i-{u^_ck=L6BG1U|4pJ!i4L0#k%%9?z z4qIm6El@B8RM3(c<*ymGNF)E!2EM=Qs^=#cJHVN|j}Xwf=wJD1t${H^8H7>mT{=Pf zXG{aRl5zmBB$DzuA9JTuPAMFki3IgX=)6!_`Y$*Or~ z{nQeAlzl~%*4o<1pz!-3ItRyyu;-K8Wu9&~SNo&zlC|(tMB!t{3SUM{-~RSM3W2=9 zam%uG*|uX5GegVaZ?Fh29kH58o=J#hCn9RB4!0mSOl4J^+lf~j_!#Vtb+io9Kl`gA z7VNG#9roDd$o;~X;qlgKav4MIqORSFY2kX|?f72GBhYdN2Pl*CPni@J#KP-e@l&{d z21LU3dowLXxh@OhiNK6KTh;nCJ3Rf{O&S4s0Y}73vJO)D*f$ynN(+FfMIhP&c*P-a zP2Lz^n-qRwq>%sH@uw>(&_bgP41AKV??Q1$=!JHpsyj>MC1{zAH@LP=pRzf-&R>gC z=6_8YTjixRI@uFPD?o1Mbi4sk$JuP}UH!2R%wd@)4+2`xvohv9dI2W7$yo({P}0$# zxE0HKj?Q6F2!h=hx-@HkayO8xR)POv($Mc@Qwjln` z$mLMdz=KG%$;r}5`lsyI7-4uR68-yj>F(IWNik&lpEa|P(?SY@O>q1;c^ORu5#r$3 zJQw}iFYmwHZP)Xk752}n{BLC|x4#f{@!<%YgNO%a}%chC@+GCGr$xiRH7=v8(&e6okAcw#X|LST~z^GV6mpz zZQ(17AXx8=c2avXa!^nEejbfky6^r7nd(!bd^QZDrseK8pQWL4%)Lm%xAGwLGTh)r z2GID3Jk9tI5y{`zY}&Q&$2TwcWY{(-CY4#5eJ{a6xYeC3GL!dgEfc42ENnIwo%#H6 z)2DKL&%QxGoQOEP2V;XFb@6NqGIZFYx}*EjWvWaHJumIIVcG3tS@U=rCiK@uClTU`GuP#!KsX69Qz_S%RFvBQcQGEt&m-`N31yB; zp3vzu=u>1U15FMbRj0bLv{tHHFj57K!3~6TadZ;V#mh!VH`glcK&{o#9i;WH+X;4Uh%i zlfBL#xNELfIyb8FbJi58B4ciq4rSHQYvNY<>sj@g$~0YQ>D#X!Clo{*mT@3RgN=9_ zT=cn`J!Uu?Bf_OSD=7ByAa|qcJizlq&f=n?_d$+?8E|b!l^)fRjXLHZ=&`GOuz-0_N7v()q9j*{nOl=-LX5~HR|tUOYf%1$7@Ukr0}ABGynk=ZH!eLw(2O$4`*f* zy?^In63_U75b8nhmy`4`;<^^T__42A+`Fel4Pre$2cLYls{@7h;MgSfzgO&ocqFS_ zsniZ=dQ-3BRcpXdXx(INYPhflG8t4{Hbp~TN#W{V0$Kn*bbiRquUJ=ytMA*e_#70h z?zt8WA1gPKf-YPYk#x*EtCMdnoA%8I)Fv!5;zd zvBP3+0yQS}Nt_V~F233DH`@b4JGrSfi3>IYcJ8619w#uEKgVi7s8Wmy&$Nr0^gjFis%Y-2HVPgVVg{3y7nNwq-^Y4%>Fc^0H8#r_>u? zeQrso_qGO@S~{c=fAtO%f-<$2Q^qCVh_~**1EC=zQ{OEhr#kGgT{Z0J8i67ud=Sht ziI^^1;H+C;y}Qc;s%)DtXyIqFS+PL|o&u&3dG(f?0&ZEjk5g|7j8>SD`Zul-J1HhtX} zq$G!W+*hX-z-Xwy8RcW!_Y_tec)SK{FNSc~zUpsC_`OKQ>|Uqzjke_%6SUPIAOf}bv6`Ygwn=CRLS24*7FQESK6qoNl)msNAsnp+^m(y15&K_ zKn%7tAGEjb&Q)puF%tmX&*?)hyn;Ar1_T13AVJti9FIcmX@PmyjV&?U_O78rCOf1U z78v)_0^&1-K5KY2?aLPln`td)c+QPbfjKwA_9w~`vm5*j{QG;#4&9_%-k%@^OO}J+ z`eA^pO2_B2a88{u?NPZYepMIWB>Fk_cjc1I!CApX9 z^BVevG&klu$QqN>f?Eb*%_xL}^sRb}uoz@xaEFL&J}2RFassekupBUj^1_-;7&^RaH|HKdN$4vv_GjjuP6k;^ zopvbL*br;eUej9Z$SIy=uCd|gybisx>LM7ah*C`-0G_?}*ZgGL^}HPYsD{*Z#aTV1 zIGnv6SNO}SyPp&W+%XZ+lQWP9eXOjdRXP;2n{Z~bc`T~PzJZiYb1Unzte0Gd*ww6; z{y~5$aQ^-pwph=;LwJIp;2#*D1(K}}gW`_!kWEcr&sqqrtc;)O!X&02bt`bgM_|&RfQ&IJ?kk1twnx1g%Zrv=P^&u#G#!LZd^1E zXZvbMhwAIoUfsV-!OgmhRnz_?SLoXP>GE1B)cMK4-z)Uzo#(>-Q?g4h^yF*!Mz ziC*A`v-t1eA-%j>C@P8Rux5G6b0blq;jg~Zzo*%akvcoaJv&Gs9S^*taycDHlb9pK zgPOiEmZbXo9cN);U~4Z2K@pI9)pfzq$CHP3Oq6Hd{um8)2oo-Uf=AP-rauuI)XY~7 ztChI_GBjkj^5r&1C&>#2MB12O4-8s7;{ZbLw(6o_xsU=xXKn>8Pah^?gg*#lH7g$u z+iu>sZGLB=%t4)e%}URv zbQZBNgJO`^7j1|nXm|wjXX=aft}TFY(W2M<6Lx3S8lhY$J;4LQ6-YOM-86X#5HNa3 zhfjM2DvGH5D_Awv0>P52jZTmXFp6{5E%Xf=TI8d_jIbxVPwcV&Xu|cVoh1v=^%l{S z3@{=1tPxDoVvf5d?t_wZqIRll3z@0X**)X08VP`biH5ObgVHh7Vg-M6Yj{v z4@%a;lcc0h!-5zvm$%9fa!uGaCB#{ylXu;2it71kal!5Qj<0x`)%AA_RGU99(h`>_ZLLU_Hlf3l0ab^K>=CbZJnV-ms2^Ne<3+jJ z_drSm!+jUQf{vd_@0G@2-OUrPyeAFn>Sy%a9q3D|tO ztLrajhTSsgnLu7Y8!K4z;TJ6=6!QnuKZ^%+lDm^l3Q(Z%Iu9)q;QAXfHqQi7@yj6R z%d?QY9qh|p&mw+N(gC4A}Q1%Cw*o3}xIR9PuJY8vb^G~?sq5_cLq+0)6dYY_7wL>~qGj4J7gm28PszpRlmd zqEJ++@9H2O1@wqj&co)&;F(~qUBHoF)(&tBO!&cB7k>RK{lNmmN_pDHYKS#wyFGYy z7}e2n7y6E~32esq8aeJ(hSQ&*q^S~B`p5)15FcN`B9&WPlnjV7jW8?~Xm4C`9X3HG z`O@6#ixJw(7A5nHL0~C}1`P8f$GQU%Po}CehzV13&;}modv{(vsi%izJgF`PH=YW?=D(qtsMtY4c(6Hf zKdj*|RadYetf7lfKWVLxq=z&MR{b)_)y^;W0n8t|=O(}+6L%W0D!x2!Cj`;Y#Tqcp zQstwGFFl+$RXd&uE*}6m^w#Fy^9y&xnRo#>NEjwfyHDskNbQNZ0Y&H_fz{_T9U&k8 zUL)Tx#tQ~SCHMZ!3OLfk^k(|3blPBi$UH1DCs$`bspDo$qNZLlSQY@u;zm0>4IIc> zbX^aJ6-FuEagF6qaqglmCGuf-vO(A4FrUvumI-j4%qD%pow!$W@-JN;2{4CM8SXVHr~c3Lj>5dTG9B zr}0g5>pjc(?e%A@WnA#ebU5qp{4eGYJXaR>UNuSDEo*C?0urd2<0(rkv>vYE_tPzg zw66bt@U*_5(EbjIHm}Rf(O4lby-=30uJnCfah|px-r-ThG|+2IqFX<_KuQIrmS1YonTb)#J!}X0VewX7j0|aLT>DGM8*pCaTJg$r zLKDq@3$(VIMEzCso}DM5Xuy-pgF0Raygb#du@ynwSjs2&iYvtH4~*+RYR-_eh^m8^l+?tV+m zJ9s_b#Z0n*nk}YlR?bAfr{eRL53^j}Gwd(z9r|%N`%*H0XBJ>97ZkN-n8vQUU=uVA zIAQWjmm+i{^Kj~w^uRJRDEL8S!DVw~=8;>aKVJfPJP>k_=vH*(lM=ZUUVi$pW6Jc)0= zkf|!XnEsNI>S}TkSw}MlYzP6-_dt_DEX^UJ{6GS%I%vH9jno{lF#%VIhx@ko%fA94 zV5auwI&IVexCdN6Is*_Xd3&ZKS-^+8@m__>yylwQ_A5sMCoDuPy0SNC7(tRts?v7Y zqqo-lFg;kpY+7ZledAwv2quy zVjV}D`Ci+_NJA2;^Ii5)Xq~|gCUS&p!%bks?LHXO^H7(g9*8sF2Dv)(-GbLzoNK(< zez2JvXXj~xp8)hD%4MWAat$!UZKBS$4O|uGHT__r+{u0o+w5`qf5)%1v6}kHibt%6 z-R`Q{GDVwjgJcGj!O(aKm*+r7H3ij*Xv6{@G|geGvmwOtvPBK0048DFN!nwbt}Cxo zdVdTCe3TSBQp?mT6Y3i?~6x`INZO%t6D& z7@pPR7v%qV6yFVyM;lSf*FypvoB||C#!@h5yvuHy@{0<9Z?VIf?CmOG+bW!GRUi@l zL2x!k$abe|!=0_CQy^AeE(ZG`-g7^8mehZy6RY;pLmbue;TohW0$PraCQ*AxmH(VW zEP+bRrv9T2Tz_iA6dIc=gq1>S9`i{?A&>nRHca};_jjBixig{-2&OEm+X_J&S}N8o zEbcb11A>KL08Wfo(O{K@H~%Y9NoeKT#qidE4AV?U?+V68e=bZ#Y-`tJZ=a*uh&00->3tY)rK zMk{Ywn=N8H3Susa$>_QhCkXFIU=U*$&Cx-6;X-hSZ3hp@T)XBlo0oPdb4b^ZH!C9E zu)_oDe%%9F?oCY~-ezqO0aJY2vDQ0C!@B~=U|NA#C=}oxdPpE{He78e^ea%M9NU2; z=YS?vQhi?Dm*-q;ldX5BcKNW%WbYlH-3R+?hOYMLPBdH!hlNfV*r96(kO70j)+wR> z1dtDls;~>CwRH|MaD$(lUwPeEy)Ea126AV#Itp<5GG!*{esmg;>j67Az3zYk3A0Mk zKIocdDJd-8N9_1)2D?5t7TvU}KPt&Lz5DK)+zRrLkRR#C*Lxi%lbd;J$gh$WLpw**8~~Vs_)&4Ont3WyPpDLBVy`qrKLnAcg(OhBtX)nB|Cju9V944 zwQ~7cW7ea9I{s5PBd(heET*{PF|VjBJ;{F!mV;kMCcl5q=pZt-_P4_;z!zDM$`^}C z_`S6&6(4xjYQ^P!Y%K7$DMUJ{-|oB`-|l&9OANtPm!`@*Lh%$3&%Dk+5A#BMd0fy0 zoTa2h7z&4mU2p<;U$?=%|I)T#qu28j zC!RE|(oHOl3!xqzFX$kRY^NXI|M1sJ%(yXk^)Mq)5Zp|qkDShC^3{3szC#V_I#!;? zKqKDF!v@6ug+6%pVrCAYqJY%kspYNO&_1JHHxu?v9o;_O4YP@ELRq|z#?sT*YPX8g z0kf0jPiOVXU~FpovpgC8N3IH>omI?!q4}y61ZXddr)V2-MW;6 z)ID$V?O|22D@FBzDjE{dH+S!6f_(?K|F;a^|LS!zhqtGD z>x$|HO5wKM-fCEOz4AsYP2B3V>{O9SB~$VI@(^si(te$^>{h-^032NA`D_vA-deDy zfXDRd!PP_BYmrvJXVj0^$-H|vAe=xLz(fiaTZYxVf!<0qG{RE&Qizwuaw|rOzu;Vu zyr8(({0p!XLlSA^DnJi*NYr#LY^_tR%)g*M1G{uzjz6({IEdwGc?oYXv!~PXS%uP* z|DZ+z)pMv5UUmae4esJ_;_aHo|A0jxp%e+?J)kJnDmHqd#Zw_Oxbwa{wpgug-pgMt zOZl_a=~GbMeu&19{>B6KzwiKB6YTy;$viXOkc63|QydaGzdhGHXwmm6OsK#dsY?kP z@z2LiKmRMfte^*;rEzTm>_z+p?MKAH%$%=I!`rBP8lJ2-YcLazl7n{FplaNm zHwOM0`bGrP=g&GaZ5@5~4rJ|TrkA+2c4|xj*Op6R2*29lCd=GE7iu>WqT}Z zp%d(u?ZEPq0R1QA1M>e37O^IK6JH-l;j0qHh91MZhiep$LYeu$6g|Ijx4o3SQDj(D z7=|SJ0I2Hc3l*W#dr0#)1Hz7j-9wJeo)|)0Gn|`MpOh(lDZ)$eiQ(s~ z&1-4-i~R2ZC+)jXb%_opWK0ipBSaf3DSh|iqSkWnw8jO%qec`@^{Wei|JLtH*HRKR zgarK5bU(ZJ;tdwxUw!AA)bsgcse zhh$MSFJzvcjpq?Q9{$=dEfSnbeBo*&tv0?l3La*+mqy;;!Ua|_NS3sN5=@Twj?0}1 zA74#4!f#c7vh0a3$y1SL`P{yTpJ-f^5t4D}z{xYG@@h?EeeZgFWkOsZT~D_?alCIT zKdGJ447|I}sc-CxG0S?d++2;kU}4?nkDOM^VRl1#f4QGLZ*}(rF+bXCC-du2R7=Y$ zaRD$rIx>~1Jg)iK2po4uAX~;m;&)+$%L=M?b|2E7vewJtero~X7j6osoj5rF^4Wm6 z#}%=Pu&ScW1v$?08#St~5%zPwurI%dmo3qV_wT~CZq!WJ39L2P_B(Tm-Lux}2&ZR= zl~Yp1o(eh++pk4Bbpc^9kOP(qimfkV1?)WFE_%bfJ{yIe(N|F{?n2Mv7NOoJTD1IK zC^0GH^cxCEe9s#dfaWx!FRwXs?nlh~{N$CR?UYipEooA*ht2S=?QFwZzkFcJ8IO0_6;t)X6-6SC+0f{ns~4Kw&km@s5&#|J0lKzm;!#~ z6Fqfr#SkRqx2rZE(FmRAP(#I8%7c zwN52}zgXM_j|$8pzZA09O=~sypxV3*vcXn)%|{@#ZvcMBSOUZ<>lcoA+zZoUUuX4>$9} z%XUuT7mhQX=)~+)(uUmK1dr%x@Tartij7+KORIr96U=46@{zjD1wsBXHUK-|+YUw8|x& z#z^R@yXmry7Z<@YD@t7cb>fP?lW2I<8rUF**2oCZo7;<+x9z=FyEm1ssh|0%vGXB3 zl#7;FCl}Z$6WNIigUm(cdK_~oM^;tUfFZ7(m*5{1ZQlx5a=3CMq<#iXFz-Q>Lkw;% zb+t*FkL}lS5ry`ffg|UfaLg}VQlp`N-#tK?>S{G-V>Es4n_SPoZ-=;Z^9!)q>Mf_Z zfOSu<7t;^byy{*BIf9l`yx`KHGHWk%R@7(!Zr6O{u->DP^fnIi1rIL^8v}EFn#HLL z+;Lg)D{byco#3b7lH(;i$Y*d_T}Y!Byg9o>`OQ4O*h}#K+(#9isL_IbUutZlqT+{| z*=y_#q<7*dE{ORJm1z%n#rWOgHxs9>%Myy zTBR=Yf)R#p)kl?>H8XP>f`Zd5yDASRS4s=jC*Gc1nF}IxmiAh+i^E(3aLNTrt?=vt z`Z00~Vn+E}Gr^krQ;)qJ3j^Fsa5U`V@^SKXTeeBw1brXE%0rfd&7FAiD}VjcAKR(T zu96(OVgQuVX)Xo5?VNtztg|*Y?uPMie`8u`hqu7#ZYC8ih<(yVYqVK5i>Icp*o1bq{wH4<}hu@yT z3phq_I%D^3tH~giXHTe;XK_nD;N7YA{rggDGe3gXx|_V1X(=+o;|b|eYS|m^p3ob7 z%N_g1wHkA<#^Tm(5eUZ+yWJ3I!c}_-Wyqog5N-bP>}{DGl^X7nsq0Y0Up9nH2B3t6@0L)1DLXGAdM`Vhi;JtXyp=6# zYlsD{llu<*rwOas16PU&SWT?n*-GuK-iyRc%=)k5yo@tb8#NPw$S28O zpaOw!57kVum#%q{m>Ia9X6!O%(z8%Rq5Bfdc}3KMn!jjO>f0UkXV0RZu9r@eXGEzk zePPy3Ob@8lbyTbVe1ECrF^L!6p8O44`j5XkdDA_D*XM(}mxA9wyU?A@JknmgII31D zuLg{jWqTNniT@$b^SqsNiWqD9Xt)Wjx#kWi$8^mat-gG5J>)8G+1bLw^%!K`xNhhK z4GgOev+A2V9E!0uwhqnHfq-o$R%ZD09$Bf1K?!Y2MWlJWg2vr zvPFsdL~e_<>mfs;qA-g&EtxwvzeoV|YNP%Pdb6*{GN5T?aNB1?IkYAA;^#h1#8)PL z%yv=PZN2C|jjFb2pCDKG>Wc6)FzYGfF4)?Lr4lbMe)00frSr6@;~lfdW`S<&q2wzM zUYJu_JaK-MUGDp&x*tM(QSNLwrghPtdu?ik|@i4aRkZIF>Z%JriU;+RC0fcgSt>^hI+@y4aZ@@@;JQTRQa`ChT z>PGEy<$l+NZZ=of1}$~0>}g!A$m9EZvx!G)7%l5#7@(OkL_2W*-aQ*ZM%X!z7(ip* zm~Yi7NrMnTh0*L7Yhyj}9Q4OhC;-cN6*UfF<@@#l{sQ#uIudiG?GkUvjX=ejL9u zzOeKEQwsjR%Awo|4%MFP^AZ?&_WB|BIGL(z;y;qtGHnDo)w>^{KuCSJ&<|WhvKu!8 zZ`c6xZFS%(Qc3I^_y~&}7RzQTv-69fd2ZR{x7EV*R^1>eJXlxkDD`tF?(#k7VZ_VX zK6^@s!t*<=API1N@;9$31}rZ-x^Lip4^Dl!$^8R3P!`deTXeJxDMmeG?*;EviP^fC z9)p52hQLQVS6g4U&E>|M(7%ob6;KYo0bNHRK0;MhVOkehkI!jcS~dG5YSDk4anAl7 zl737zqW5|U{mMJhKqX{|OBZeJeuohhr7!LFL(KbQl9Q#aO+Qx`^yI&swHSgz$E#lNo-h5`LCmS zjxOq#j{D!k1{}pdLEfRrX`Ona|`=|ce#q+PbIX&^Ku(cu@aRCnb zmvlVmTw3puUBih!Hh0UPtPEF$QGLqe9HGlp7Pj-hn|~PTkBHPH`%nl4hh%!!+%mU|Z_-+tC}V z>i9yv_R}8$)}kZfW^F!O5X;r163N1Ro9v;*G7I&rkWl^0ILGA? zazM3fR%ASCkRUB5Q#rnnsa5;6FrqzpFL*P60;l|97;!H*1l9>M+yqHF3Er|Sq!8fa7;?IV%>B<6& z)?DgEKbowp+^#CZ&L>sgpl;pa&rM-I)3Xn`{ulFIlSrr z0$SiX#)TY}$cL}`#yx`wH0zuFGHorp*P&kuI(UFR=shbpcZb~k)3RMMzvhD+nkMbw zr#HB90H)?Dtv{0^4-~ZqpqWLBwHh)dx94AhC75})RV7@%?&z72xBLKWpZJy>0TA_3 zX?j4vG$_}bLT6lOddDg{KF;q6WO0V-R%oe#9q^a-%9qGGOHqlpaF0Kkkk~5ODSm(` z?U()+RV(FrW5pcR@7KzAuiA3}H`F(qGkOwleqHFk>fSZYZnNfZG{RsP#H?X+Kdt71ZTT)+uxd zkw0WZ7TYwQ=Ecc+%%;ivi~bCuuQ3mb%KaG5o?171iG>}E_{#=LfLtxqEA)^ZnFeft z448P>y^`_ElJ{kD4m43vVwAF7+H-Qboo2t9t7R+e)oeS50`+u(-0*(My)}Yrd!8D# zGZ;-Rm)Y>SjqqkKsS`;_ji(Ncdb}yX{x(0))ZWIlR_gzs;=Vhoscm}~4@WGB*Z=_m z6%+*lk=|{TP?g>h>AlxbR0LF-bm<}`^hgUe35pcyB@lWQLhrr4wZU`lx%b`Q8{>`l z$8!vjz|PLzYtJ>;H^2GKxmtA5qb^-JnxkK4JC1Ai)csT@uVsK>3==DOuWrSE!Rib6 zx(PGy{DSE#%2=FlJ91S=oJ4ARngt=zM<9yo-i5TVnzJT@y2aK3#;tnkX5;Llq};#j zNR4{*S%i+>^@5%ilzPU?;+P9DE%|$s<`nC;aY9V6e>daFFCo7xTwhR6l9wD!qgRoD zPkJWIu9|X6)ZyoDbZ%b;xe0p*E*}&kT=x9A{P=W5~aUhc&zq*RhFYGWcqs? zI?Dh4`@F;NzxRS=_h0TiiN^lejky30^KWOb?)lePu>aG=F2>Uy$E?CoN$y{#9{o2S z^zU=PykH9RE+(xzK^L$ehsh~3xLLWu zz8UJl!yguq*cf*459mxQ4Q3tW9t!Ez$tAa2R3{`799Pz2EH^#3rf&{zkF1)vr6c?* zMdV`6`@^39egpUjlx264oV*Hx;FtZftV3V{4%i}d4=u9X*uzA3C(nlvSrRBqa;!o= zet=pWU* z^NMI1t>2otY}HlBCg%0vxwqwT_IayCWzawjkPTTqpG>XB`azc?pmZiZLR(#E2U@4a zf!lQ}Hc?2W{tDVVytg$&FOItZI!NC!-WI%k^C;ZWJ_81?r$B>&`eGhv0ye3R0cCBG z?*gDYjqU;q8Op9i;^m=pM-Rr<_guKw2%IIdRe&~$XC6RJ0?-WBC$%n^3*>qRJE`9x{E9eMA%CF~*;$v1`PLM|g9 zJ00?43%j1Nz*YQUM>4}2?!5?EOgh;!#d0UP?hQLO>?Hq_`Bi$Ow>^xilBK|b7{+x9 zb1C#PJ%deO+}PTs<)z{2nc%0e|4zSa=K8dLLd~9wIoH8e-Q2wVd-dZ&Yst61EIe#F zVOQuWGs(R53{*|ocU3ZhS1u5MJ%NDGcK0tX;MxQzBkqI$4AXlF#6Lpy8X@Ll!v?zr zlTt0Rh!)xC6dRjg?K|YD0$Au!$RcDM!z6BX9=#_``ElET6LRnGu^#}wk_nzGP>|m| zv3TDG=#djqjsgS&_eiJ~HHweh|k`=8P^%<*k8sfKcKyFnl>!q0s@I))tz+}IG`^vYML)~Q!8hF2Tv z9W&fJnL%r=c+8e-hF@imII*8XcZ7h9a+d2wv`DG{n>QXa@y8dU(LzK+D0PRz?&lS{ zVN8h5XXDQ3TQC`u5CBgoaLHCmB704<_WbdHlr1kW*`7D{JCf?v6Cc~Mx5<87@pc6{ zhr8bUQgu1H{^7=B3H`upo3d)Uvl5az1=iPL|Hpt~8{Fp6&HOuNG;==sB~ew!KmFW4 zsJVZ0MP$ci*#8k+oWO9691D^D4N5Mh{pDl-Ef(=Gt2*X#kNnxcyyD-S;(x%-u+DlPwYXM`;Af|V)bv7s`ozt<9|}Ae>-yw_kX);+pV_02a3-8Q~*{l+m4~N^S#ph z^8D|`Gy@2TgNii}!J2o|-snE8hJ|qr(A!BXE=?1GIr5&X3+e2HJRKqnk&3?b`H`rIM%zM z_e3ds&sUhd)unXVt*cP>tlH}wj9Pvc`%uYeZuJqKJ?W=mO8IN9LHc~bPH3hZ1)qa^ zv^g2}G0MXlzQS_u^6vD6g4${Ty7HUt^ujvk?1hW#W?==b%iLVm^xp8Jqs-3lR&I1! zJ(!d&RGkbV{)8NtM3^-M-4Di=NV_li2oeGC_fUYLQ8hyV^5m@-VUqxVYl z_RJ|BOm3|>KJ70uH(TMi!n(=mzp$E2X1Lu#ZljG$0OUMcL@y7BGx+~TQx9_Pk3^+L zT9i!XzAuchor}m)X35syuV6U>fk&pa1P99{vi;M*|(qUjxV*Plq)*ycl_x zBHBsFTRHXYQ}G$lqpCOR7`-eWVSWHBRqC9ZaTD7Yr3K@@0I+8PgsB4QRndPTuODZL z7b0-nppk&F7A5F|2FS7Sn@322hybvgt$@D;v`gix4WA9Vd`1^gwFGv2uk;gBW9{dj2k6*fKywbnw*Zb)B)zSA6 zg{|MWeEdsYiDT6I`w)(lTT7I69&x2YfXLi|FXnZYv=4_1EO_B*%FXXj&?T>L+e*r-EP5H~Li8rIEn`UifI}A~%J3ulE-;$@mm z2Bev-o%3Bw-El4Z!PUtww_CeFT+yAiJ+6F5(7Ssvf!|4Df9O-{*4ywMbLkdr5OP^U z-l0FqGZf+AKI0e$x(j?s^4@-O@uEKHQIko3I6OGi%OCD)ASQxTLh?DuCI3MqvP9i# z_3>mWDt|612>I{$d16=x#~me@4+5xiX>})7U8xnL6!&?fMl%8W|dziDIM8 zP$==ga^b>AFBw-ml^zl|!l_iq)>vPUQ&=5V`Zkqe*%-ZF1T(nZ{QUc}QkF8Nh-7m* z2Ovr&9YI8%*T%^gdJ9*5pypyDT1is~CoPE91^u!!PigT*G3}Q*B^m#%Zm}v$nBEli9-ZC^U>!fJ zH=Y;I4%ks2Nrm>d=)`BM5+#QF^47bB$Q4IXg^jnFcVX?;7gyUaun|5+ppe5nwxj;7LrJ=E4AcfeWF}LMzd}v~**}ZN3-1fZL zhl~QZn(Lb!uZrl>TU3fUVM_RZI=VHRjl~p7pt}cyxZmv<74Z~c7AIJ$K=MWxQG7T?(I4iCRKk?_;u2g$(wzq9~B%SxE0e2<^xvw@U! zy4)bC&fRhwL8Ft%5L!G`%hn%+3c;FJ@;iQ6-s$hGq$`-XCKh8lux_h2uKZFlcz40g z@)f61%cbgRM;ccAfibRp76x7L{d3h*oFjDO=nw+63XRJH`FQE3orKiFyR{-A8+=3V z-YC0P1L8^)o$A;^{3J?jm(+!@R+D@==urydDj4xvjE`iXdu|0SZHeV(--i0@3J3Qg zK+y*ZF}Qzo^=fksvGM8BhRHh!8J~Bby=*X9nKpEGIBX!HlLxzJJ+QtMP&=AZ7X%)5 z5Ib7(D)w-_BpOvqqlz3hcU)LE4xaE2q31In9&Fy4D4F-G9_1d25yns9EK2pSy1{L* zI1@c0%(!&zi$zc2)~WSAeny}L<+tVk25K+`#*sR^WYzZr;q>!KJb8mF1nU&}Mnn)$ zstomCC$%+^PXJYS1qNaU8+%3)#_83c1Z*Y$UN(o@$AC|y=E8PvDDdEzpv zNmwncvx^p$W$*hSOSh~NWOQ(8o}~L<-3vhj+9LOA)j|B8GbGOe-dAK`L!ND0KjDm) zG1)FTT^C;?K2v6wQec4pXd9!|BCgtMLHXgsSJp@!l@ljU0G?Jc4EI+!J$~{}sYNol ze2`7{LgZF%{h&azmG=hKLW@}^NiiSYeFttRb>4CtLV5@<8 zg2~;|2-crw)^$x>CQ1=vdT&dwM544~N?lE9g zSuRp#SH$7kUBvRD^{+x5W*|frrkwUt10)>{cU41>4leTJm*r=qzMm1XRbV`M^5l&7 zCQp0j4<>AOUHq|=e7_@OJ$}~PHccQ`YgGa*RD@U&pS;GbZGL>aQc_nxL z)gy#p;Tv=t4Un+`|2VLz1dA1RNCxT14`!ZGHgA@E zGp%xk#4V`p=fhUXwKlX|WdWP&XeJ&Lv76sF+@9lq?L4AZVOtT%M9@?FQ05olE*U|- z=9(xmmu%2ZrVl>yPWnd;3;&%v7K6X}iYy&;7?c$U?Rg|X#T$^`s3j#eEId|=?G)J! zF^v1d@-K`hK+gzXY|sgh#gKh{{k{{Uh&Z*V=&If#!>XLCtjd$ET3?Pfu3m)T0ZeiF zk~pxYg<}3(OTZ)TY)6Z&Rfz=I4^UmZk_y%(RjH*i{AQF@1w|ysVAwFP6zGn|8Hg;8Xx{A=^}QE@08 z%gp!9p3yuaN%=b7pvKFK{3=U{ZLui@GS`6#zxul&jWuO@6EAz2^``Pda=)CB*TQaYD{>0 zh@c?+-211M_9%HCH{$4aZ^he#oAj-4(7eg63Q%*TW1h1RA)5iWg`%PVFyx+Bgkl40 zd{~i*cO^zA|B()ZnN$0&XABsX+jlj9#B63@S8mX2vCw_bH`L4NOE9zj4iFl#T!>T% z!QNMt>)(8Ss2?8b$Xnw;tIwI}KA#lbe{3umt^7w5d2C+2v(Aq{y z6^%hZrCYFxoqrn_AYjY?h~s=h>J85dZD$>C!gT!3_`zIed?HM`Th2u^FV9nAx{SFm z^M_cosrShH_`Kmg1hC00UbdMEF6I8Er}8#=s*iyACyRIbS?n$8?#wkVt`B}7TR7L> zAspKIBh}Dqf7M0~?(!-fE%a~|yZsYszq4!-pcA|O@?W|3p@}-@^+FD!-SQ4jb&2#R zfXe*Nop;7q7t!G#Y`35z(So-3jO(58z0eChvq2()E^JM`M5IBMrzN1ZMI;*#LHIh_XWeir@xNJX3sJ zu)OeF^Gus(Mxwh}k+}*o^^e0C%5FW6{e4ZIEHy?vx%0nk4u-FIXh#CY-_L?#kTM_C z#_w9-y+oG3-$D1F(O?znl4XZVbARop4B9b;0#3Q?}T)0;vtu+g6-(a?;oXF@!#COTJ>q@FbLOWl*B7)k^ z=y7Oer_b-2f`X&JD zAZqmPo@YG690~UF00H9JbLXD5)-B@06eP{Ncah*af7l?%cJQx1Bn?TT`XP>a|A3Rg0R%ZrMz~b>9;n9ah8f3E* zUW0>R(VeM|3E+0JJQSAOpFJ`K7aoJJ4&wvf$QUn-^%Bsk0-adBpjX6Q3It%MIwo_4 zL<%obLhF(uh@#BCImuEN@2$}Ias|RynNdnQC*U*;# z(XJ68MHX3f-V8V(kFtK>+mM%zN{Cxjv%+PqYvDf2DL@)rkW5ysGZ}7M>53bqC^vFr zL7b^mFvBPMXq1p4lt9Pq8#gdwE$hniGL!)-W8O0)2lkg@5%%thtiTgU6b`lSqZdDZ zA^oLvkTGYXfgCK7^IjNWhV4vsif5_kMbMXF%}`GNlPm^dZzOFx(KieWu>G!3l<5u`H<=m`eL-fJ$`R6t)4&l)?R`b4R2!^L7w)hYjI zVFB?E$jReuJ@%qo48j!%p zw_wRO?=~KkKr- z7fk?77MFg(lf;q_#=NK+r+uAzSbt_>7s1pp`xkR(jf#e14cTvd<>}8(Y?9bKQtRZX zZ~iT(E-*i3Bu&u?ve((|M)El;Clec{Au17iDq!va5ftd18Ofq{FZ*%(_8<+G0vH&i zHfjVNWb`UFSQ$H$V^*WGfcCAN$2ogNS-!QRC!gkUB?L(r2?J6>-L)qJ@kp<>bt4&2 z_Sg|y;_7=TIH{XJbw#QlNSOECg>!CjfToC};XEL=jbzb%3Mfvf7l_k*n=}&3C6_Ch z$cl@;tD;P-H#Jv0|DZF?UeJEe#N9-S95@IC-dP> zok0_oC>>QhUI7(Qqc31z>D9^WxjRnMg;bJTr9|R326vqr2L}rlIP}urPRi5g@D1-O z7fy13?kmEZWc}h|Gp|+2)>j7E>R$!h($d8_&vKn`7TqR9nmV{0{aPtb+>x51b}tWpBPUT|yz0dX%~Hmf;M znFA81C`<>{i``6fjdzduImn?Bx~XGGGshZsJXD)hA*C*+K_XXFwE$EhB@!N$Fm%UHhpjVglUfi{Qe zs+f+}%0P*zBxWZ0@09R# zmsR0e$mNkLbm^75n2(o?e~_8rhSP0y2w35rJ_AW{28h3T_jaOn-3`KkDlZlEzh^HK zqY4aOX+Xu)C<#~%WuTySjJ-AF8DJu-8lCcUToB*B~K&DE*Vj zsKjIzibjYbuPif5UpAEY-}F`-+{NbNip~vc&Ps@^_IM5raCZXkDOylY3^Ya9%yhq9av1U$KS z#E~M4udC0LAHK&&fB~K)vuS^)mblXAaLoAQg*OIl_fb|QU_+tel>iqC8k(_U0{vR| z70>-@O;E+sj^~ohaD4wo7Y-^Gaz20&t%?F-6NJd_xWhg2bLZNkjFLWG2z8QW*en3D z=>#WuO)J)X=Fl@`_^>Yp6bn(XT}u&~!7G=5Di07WhCxae9zf+8E6`+s$88L+{FZ{4 z0^ZB>epc(Pq(Z~|@0t};p2vFA_>CsNBieuD3pmQO<;?^Y+GeNp1f-~RAujkhq|-m$ zek#^vP&C0+m7z)d^P-wHR3!4DfhzL@=zY2Rgv}8?pQSNdJlCTzugR+ngp&m#Lt~40 z^QyRTD0k}MIrPX=aJpt;-bp6FdSUQ75s@WiH&v)a*U~glp)evQLoEBgCd(Mq^81Cv zWgZT?_`8dGVL_j%B7@CGXt8yfTp&j_MjysLe!RthWCKeg#TLpPK=0;ok3*Bc_N{5o zG>E5)z1_dY%Rd3E`9pj(TQUe`Ade<8XcH)b-YHrz*Y2OYe}ZU9Lz!@b2&MA%A?_AJ zmX`B?>sF#b_75(T^;w1rsGi1Y#P$uyEjx$~`U^rDt?jeLn^2sy?v3(cGTRxj;juV) zKqqRi4QfcbuqLMf#Vj6%10-v)xqG(Pwp9g?eXH4<$3n@lX4=76O>A>4kKK#BZ2{-8B2b;C1^%RjKc8C= zrKg8VoxxQ;T2x3t8Zcj0$$2*`{vp~=zT4c>+sM>TaxtL_Z3A{UwLyB}F0DY_8 z0a9#7B|yFZT?v4n<}z^tg%C7bdj@@FgwO66L3viJE1$(iB}jw~dfAXeiGH9~iLwa3 zExWG>Gf^rstvwCogH4*cDGlo^S}gJ)@^)+324pVoOSOzZlvsaSZn;RGphCz=qE}+4 zk8+~IH$cxEz#XTT^9^Tkh|;qlI@>_;jcVqY@A`gxN%61FP>5jn!*I!kMTAa2!}5u? z4Z7gkTS=Lxdh7aU!h7{t`T6V92wHplnx6L!UQ3|+999G zKHLsNitDq>Ux5ltRzcK01msF?R^JC8Y6dXXkrk-7Q7zQD7dgZ-Im0KX5bIh_dI39{ zrH(=8s_WhJ(pY(?5{=i{X*)k8d8+_25xD!PaSX&hvZ4hiGoN$7s!s`L>R}J1uwI9u zyq-cD#nxFFD3?PQ=VKR?19}6gL&)#-lQWva4sRQx*qwXx_v@FF?t(pxSSN$JPNnF! zt(6TQtg1&N>8|m|e>Tyh&X(-s?P?_*#!IH`n%5GBXBuy1Gr_(+`UWON$m|M zF<%Z0?L%*V#B8~zr8+qIXF5bdEp{{o;eh}{car)rXXxg#uw0d112!2tlt$-O-?n z>qBQK(J2bmG|+(yEjP6pcWu+(xM zo3`IL7Hid?1{$ws5XP-k?g(Om8uc@$k2|D+VvEJK=U+xZ0opAXq~vcAIo0(AHrQBO zbolHIL?sH}!%fU@4R=0KE`|{-#i(@0Ie;V<^l|_#n>uy@LkMyyG;OOFqZy8OCdifo z>0s-SVpZ+YtDvjmgdnQbk$W^(42&_S& zQ9@WMJhrP7oXkX|rG&LRTRgn{?D>X$rZ=+wPk=TRR1Mfgml&+23JA=Q0N&}7Rl=&1 z&t>LT)2b!%wZ7GmOc3L;ivj)L!CSK>WpFz}BF_Wb$t4=eNVfUJS+6StinwZ6ri$;Ri%FDLH1?UO&`Qd_Lwu&c7pWc0NQyA1q;3@G6vnAzM z8bQmwhHQdLVjy~2nBqt*aWrEU&hhV2y_3JGC%b&dxvOwQ8do41y zE$d?QLFMPexjmoztuwPez1ilVReJd9mo0xG+wP0nKZ15$b-Tf4l4d!8po(>Z|6(0f z##p|$#I7FTkP(i&0{sPmK$z;}h%(>!@%rqpiPq5q_caV;~#yhCaA`l5_Tm# z22SFUtyY%adr!YyJ8y!bnRmjM5B(bQUdrIL8cc2o5;W5C8Vz&-2)`FIN)L>_sA$ar z>phjRkfX;nivc+fXt80+Y}P5UXqdYNQH~a8DWOn#z5Npvxa?OgUCDGUbHzS0a!DVn zN9)V?s|Q@J&|YSPxzD|xEJxPN_jcq^sY(k<`O+x^tG)upe&tor zR*{BEXS0$NPY&qSLldE?(A_v)`~6j)k!y{_f7pBG0a7c^%SN_?6;0m-QW*FY@_|ST zZ9*iQimd-w$lYm6>F)e=ooos7z1H{2i=KPF@rTqOqgkFm1@IxpO2hG>-m-aT>+NOt z=^z-CUk9=dg5t5F!L=UTrmGk}?Yb zGh797v+`Hp;qXv`q@>EknQMotzFABv6fA}uVMG`Iym9){^)oWxW8bQr{G%zfX4)!d5Pod`R@Y5)jHtJ_~KGwKzCygX~pIpCC@a*-+3k7N$ePLOE0u)xfed8y$ zoJ$C{RUlr;rmPYEOL=8zacFq{<@xAV&Jx7zhTr-3#<-<#9>ue#tH-{aA?1AF{#2XX zlUPiQC!d({&OH|2^C#AGXYr%op5&&5!s)$+5VGp;@;l)^4unR*uKm7#EwlVSx4G98 zA{$Rm-*~&l8UDhPLA%^BQ|a?T!vP@lUcP);e#dFQRNLCw+xyK27E=1_EW&SNl6Q}2 zk5d`B7KXDMo_mJd*NQaBTv}lIyCtVMsiO1mTiGL#ZY_aNMfV&*!Kv|`LIToopz~z+ zT6tpd27_o#UDBd{;|}5$Z4$Vwc4Cb}40%IiV}*#Sj?O-n&EaD+0o6Dkm6+)q%`iV* zs)tTi#9X(B{rVJ|bpnjH|BO{(p@=G%7$b>M=jQWmyTG_hPWUKlbu)%EJ=BK%n|Yx@ zp-`{O)|C=*^S^W*<;xC=g}P>?IZI6El5 zP@HIPTQsg;Vz?=*$?;O{ITIVWmJ^wrVG?JdG1)BM4O`ZOxW7*tohdM`V55i{SYBy7A?&VDq~%$#eQOW8B7wKth~n z-PaOCn&JUD&in(1%6+3TQ_5z!8!R^?2Hw1^4WSO^tbf>7bmme9)fmZp2F|zbjAO1F zV#5eba!k50Yis2WJ2?_g_v&pspF!KHf`k3}BK7%e%`GO2$>Gx5-#A0LxlzwthlEUL zcMVMLu%mb2qYMk5eo_gM+l@$_w_>N#5b(WMPB>Fwf7X4j|5GTRUFXQ_$|e7hjI2z; zkLkyW9-~-O3kCf}0>b#)9ISF}vaU&!8(D}ZP$lmYm+cEitD|(_&IyL zEC+7JsJ9^c{YSsV#t!`-l?7g;s&NUDUghz;(K6ec)j5A287uhqV>r%2q~Bs^o0G@x z9Ie>)SsBmEw~SOgO0A+5QP@Y4U)!tN=RB%te+{n>o|)MCzV=fY-(3jyKb||!Y(&A6 zIFJT6~wP7K{w41rw z50#&umI1rn%@5O$J%$NvPhJw;PC^fC22g>qefslh8!edP^l)bp1>vID*U$AE;64oO zoy^b#uXSkrr6Urz7{i7cHZ zOPtJ#X=E=Z6RnZ21b3{ht_HWaog{ftEO45X(|+;8N${I=&kvlwp)Pr;N;<%V-ujZT zGTxI6c{gs`tubI7;_`I*-aUkwZ6y>Wl? zQSg{*Ysn3Izf(6@;;t(3SM(p2vauq+U7^lu@<1E)0Nm91j6yGKBud|>&9qXiZ<&$A zVX24uw%ohL1HaAdeOH3n+ZbLw;tT}=$P}|$m;=l;CZs*uc8j6cw zBKSzAGxE@0VyutfVce#tla`yZ7dheEn!rH-&+0n*e)q)U=0u~yA!#dSLo^OGH-g$q z9w;`YOq$=KUkYZyy43u!;Q8xh;651>bD-f+j$vP4rA2Al?GU5+Sfd=c+hyRbpGx{J zZxOS8a_wgm*^o(7T<&(TaN8@PtuLLWdh2_2ds{@tqdOOC(4x%iwZc<^P?+xI;fRfU ztn7Mv(PQnF1-<8)ior)yM2tVjC6|9{DRAwjV~l)zH@Z&H&}e<)cL{1eIP{v}yi~XD zk^3)8%t}n0Px3J32|08oHfvT8#OHrz7v zSlOm0dVFe)u!(j1NHw(e4$tS+K$PFno~>OAYC+fQE^M*Q1-_k; zF1hIZ-HOX#5-&BH42?y%R;JA*-FN;oP8VK@Ux%E&80Dp$MPjt>uvOKNDYtHkvnm^G z(Vosh$?%TSWt$0L8<<{~z+|5k7>wSbxm@tzMw)7-N4LIW=Cf{=7E#aOv5vFKEMJ8* zD=ddcEz`baMagM7Z{ciQTsx&)WX*mpBBy!PhwUUXs;8ND17o;O)(p|nlfOPORJGyT zVQ=3;IqFG!YI2KC+ z{h*HQ(iTxjQ)P5e@GTX^xGsw2xp@E!NZ6?P^xbW>tavaACV#bt5SOTeDzP3WIP86c zbGa=IHCZ!0yrcGOFpqE(bH8=Pgnn{2~1dIB|7RvtO7hg>W=)NI`l^Kj<4o4qEG z$mw~Lx|7*CYw^Rc<&>@Qe(a2sx7YrZ*tR87H}>018nsT;sYQEFR?60e4Of>p=LEa+ zG`c4$B7)1|R9rTyVFk)VA8HB@6+EG}*(--hefZSv@H2(I0~7g6OG6>5dk*IU0`%3j z&jCb++`Km7sC$vohJMeaOT%&b!Q|M3s3sYJbUxa!-xwZnGe(1jvZ?CyWUKUoW0PKX zO|QPl?Kt%8LlIY#kGi>BAKx1=UZoXlB3#RE{?@XuaSv-iLLB&rn@7vdCYx{km1_34 z_P)MR?TQr*stY6GABK!wSh$wDSa{S5xJ$~kOW`r@Kl^U<*tispEh5FKuC|%Yo5TH4 z08+Tyl?_BhsI2VGGOV<+PVRd6pZyDNJnos39~vz1sZFN@*a|&psS~*+mb)B8J zpHDehaa*T;+Hsu`(@EYU8wZEa(1 zTRn7Gkhjea_AQ4{t9~ff-#G2@-X{&K^Op#@quGO!uJd?u#|DzVNHt!|Ti{U9aHREH zgx)}XV3WVKY248=DHutRwzg}xXl`!i=7alSNPJHCe6!V=ajF>H)9*CNsQAPa6LCN6 zdG&aY+jUYI9b%T^*mrF&jOFAYU}PeML6oBsea*tR*Jg=x)Z_iCdmABGfsMd+G zH0ks7Vm^%%64}#|(j8Z2Lz9b8Wj$qw{1jc3Z`NJ|A8t@A@F_BE#DPx0jgXm>$H?YX zS-`=H04+&wfd}&@h{RYP_7F+>f^cxJfyJWj)J}NB{SPU<+oglnQS9+8p>x75l$7Jh zuKVU&7wlJB04UQblLyNleaI;#!>e~;25oDrDN7!A>*Oad8@64hqmYo-z1V1z^qT#C z72!bKkNnw=GeG!mk-h*f_mxWkq-`jx@RVvQBn=aaKBe%|g@0KoJ4V=!8w6s&#tiC) z3;yNdoGqt&j*X5exA1ojT zDgNV_8$S*i!$|c0^Q|}DmVRSW=lJ*YL2n&+aY&lgPpVyBEz<`v5ioK2r+JTGy!l@V C=-HeA literal 0 HcmV?d00001 From 47047bfde4477864a2c76f4ef7862be643c73d5e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Jan 2024 20:12:06 +0000 Subject: [PATCH 41/52] Bump jinja2 from 3.1.2 to 3.1.3 Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.2 to 3.1.3. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.1.2...3.1.3) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- poetry.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3fdd00a23..593526756 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "absl-py" @@ -1242,13 +1242,13 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" -version = "3.1.2" +version = "3.1.3" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, ] [package.dependencies] From 836e787456aaaabcfb151eaf979fdbe385fc2465 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 12 Jan 2024 15:50:34 +0400 Subject: [PATCH 42/52] fix: remove platform.start() etc. --- src/qibocal/cli/acquisition.py | 3 --- src/qibocal/cli/autocalibration.py | 3 --- 2 files changed, 6 deletions(-) diff --git a/src/qibocal/cli/acquisition.py b/src/qibocal/cli/acquisition.py index fdce5cd47..f386d5063 100644 --- a/src/qibocal/cli/acquisition.py +++ b/src/qibocal/cli/acquisition.py @@ -51,8 +51,6 @@ def acquire(runcard, folder, force): # connect and initialize platform if platform is not None: platform.connect() - platform.setup() - platform.start() # run protocols list(executor.run(mode=ExecutionMode.acquire)) @@ -62,7 +60,6 @@ def acquire(runcard, folder, force): # stop and disconnect platform if platform is not None: - platform.stop() platform.disconnect() # dump updated meta diff --git a/src/qibocal/cli/autocalibration.py b/src/qibocal/cli/autocalibration.py index 57f3a6638..eb6504f22 100644 --- a/src/qibocal/cli/autocalibration.py +++ b/src/qibocal/cli/autocalibration.py @@ -54,8 +54,6 @@ def autocalibrate(runcard, folder, force, update): # connect and initialize platform if platform is not None: platform.connect() - platform.setup() - platform.start() # run protocols for _ in executor.run(mode=ExecutionMode.autocalibration): @@ -70,7 +68,6 @@ def autocalibrate(runcard, folder, force, update): # stop and disconnect platform if platform is not None: - platform.stop() platform.disconnect() # dump updated runcard From 7d6f7fdc0d74b0f7623e791c4d7bf01ca19d60f1 Mon Sep 17 00:00:00 2001 From: Stavros Efthymiou <35475381+stavros11@users.noreply.github.com> Date: Fri, 12 Jan 2024 15:56:00 +0400 Subject: [PATCH 43/52] fix: update attenuation getter and setter --- .../characterization/resonator_spectroscopy_attenuation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibocal/protocols/characterization/resonator_spectroscopy_attenuation.py b/src/qibocal/protocols/characterization/resonator_spectroscopy_attenuation.py index 71d1fd37a..9c7c8f370 100644 --- a/src/qibocal/protocols/characterization/resonator_spectroscopy_attenuation.py +++ b/src/qibocal/protocols/characterization/resonator_spectroscopy_attenuation.py @@ -90,9 +90,9 @@ def _acquisition( amplitudes[qubit] = ro_pulses[qubit].amplitude if params.attenuation is not None: - platform.set_attenuation(qubit, params.attenuation) + qubits[qubit].readout.attenuation = params.attenuation - attenuations[qubit] = platform.get_attenuation(qubit) + attenuations[qubit] = qubits[qubit].readout.attenuation sequence.add(ro_pulses[qubit]) From a37d9d9b35c4b9c955a864757b6e59453d432b96 Mon Sep 17 00:00:00 2001 From: Andrea Date: Fri, 19 Jan 2024 11:22:52 +0400 Subject: [PATCH 44/52] refactor: Implement Juan suggestions --- .../flux_dependence/qubit_flux_dependence.py | 31 +- .../flux_dependence/qubit_flux_tracking.py | 7 +- .../resonator_flux_dependence.py | 32 +-- .../characterization/flux_dependence/utils.py | 266 ++---------------- 4 files changed, 60 insertions(+), 276 deletions(-) diff --git a/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_dependence.py b/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_dependence.py index da65ec7a3..6a2ec0d0b 100644 --- a/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_dependence.py +++ b/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_dependence.py @@ -16,7 +16,7 @@ DEFAULT_ANHARMONICITY, ) -from ..utils import GHZ_TO_HZ, table_dict, table_html +from ..utils import GHZ_TO_HZ, HZ_TO_GHZ, table_dict, table_html from . import utils @@ -72,8 +72,11 @@ class QubitFluxResults(Results): class QubitFluxData(Data): """QubitFlux acquisition outputs.""" - """Resonator type.""" resonator_type: str + """Resonator type.""" + + qubit_frequency: dict[QubitId, float] = field(default_factory=dict) + """Qubit frequencies.""" data: dict[QubitId, npt.NDArray[QubitFluxType]] = field(default_factory=dict) """Raw data acquired.""" @@ -96,10 +99,12 @@ def _acquisition( sequence = PulseSequence() ro_pulses = {} qd_pulses = {} + qubit_frequency = {} for qubit in qubits: qd_pulses[qubit] = platform.create_qubit_drive_pulse( qubit, start=0, duration=params.drive_duration ) + qubit_frequency[qubit] = platform.qubits[qubit].drive_frequency if params.transition == "02": if qubits[qubit].anharmonicity: @@ -138,7 +143,9 @@ def _acquisition( type=SweeperType.OFFSET, ) ] - data = QubitFluxData(resonator_type=platform.resonator_type) + data = QubitFluxData( + resonator_type=platform.resonator_type, qubit_frequency=qubit_frequency + ) options = ExecutionParameters( nshots=params.nshots, @@ -159,7 +166,6 @@ def _acquisition( freq=delta_frequency_range + qd_pulses[qubit].frequency, bias=delta_bias_range + sweetspot, ) - return data @@ -200,20 +206,9 @@ def _fit(data: QubitFluxData) -> QubitFluxResults: popt = curve_fit( utils.transmon_frequency, biases, - frequencies / 1e9, - bounds=( - [ - np.mean(qubit_data.freq) / 1e9 - 1, - 0, - 0, - np.mean(qubit_data.bias) - 0.5, - ], - [ - np.mean(qubit_data.freq) / 1e9 + 1, - 1, - np.inf, - np.mean(qubit_data.bias) + 0.5, - ], + frequencies * HZ_TO_GHZ, + bounds=utils.qubit_flux_dependence_fit_bounds( + data.qubit_frequency[qubit], qubit_data.bias ), maxfev=100000, )[0] diff --git a/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_tracking.py b/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_tracking.py index 68e392275..3952362bb 100644 --- a/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_tracking.py +++ b/src/qibocal/protocols/characterization/flux_dependence/qubit_flux_tracking.py @@ -55,11 +55,12 @@ def _acquisition( sequence = PulseSequence() ro_pulses = {} qd_pulses = {} + qubit_frequency = {} for qubit in qubits: qd_pulses[qubit] = platform.create_qubit_drive_pulse( qubit, start=0, duration=params.drive_duration ) - + qubit_frequency[qubit] = platform.qubits[qubit].drive_frequency if params.transition == "02": if qubits[qubit].anharmonicity != 0: qd_pulses[qubit].frequency -= qubits[qubit].anharmonicity / 2 @@ -91,7 +92,9 @@ def _acquisition( type=SweeperType.OFFSET, ) - data = QubitFluxTrackData(resonator_type=platform.resonator_type) + data = QubitFluxTrackData( + resonator_type=platform.resonator_type, qubit_frequency=qubit_frequency + ) for bias in delta_bias_range: for qubit in qubits: diff --git a/src/qibocal/protocols/characterization/flux_dependence/resonator_flux_dependence.py b/src/qibocal/protocols/characterization/flux_dependence/resonator_flux_dependence.py index 8f892be4c..542f9e524 100644 --- a/src/qibocal/protocols/characterization/flux_dependence/resonator_flux_dependence.py +++ b/src/qibocal/protocols/characterization/flux_dependence/resonator_flux_dependence.py @@ -12,7 +12,7 @@ from qibocal import update from qibocal.auto.operation import Data, Parameters, Qubits, Results, Routine -from ..utils import GHZ_TO_HZ, table_dict, table_html +from ..utils import GHZ_TO_HZ, HZ_TO_GHZ, table_dict, table_html from . import utils @@ -100,6 +100,9 @@ def _acquisition( bare_resonator_frequency = {} for qubit in qubits: qubit_frequency[qubit] = platform.qubits[qubit].drive_frequency + bare_resonator_frequency[qubit] = platform.qubits[ + qubit + ].bare_resonator_frequency ro_pulses[qubit] = platform.create_qubit_readout_pulse(qubit, start=0) sequence.add(ro_pulses[qubit]) @@ -128,7 +131,9 @@ def _acquisition( ] data = ResonatorFluxData( - resonator_type=platform.resonator_type, qubit_frequency=qubit_frequency + resonator_type=platform.resonator_type, + qubit_frequency=qubit_frequency, + bare_resonator_frequency=bare_resonator_frequency, ) options = ExecutionParameters( @@ -194,24 +199,11 @@ def _fit(data: ResonatorFluxData) -> ResonatorFluxResults: popt = curve_fit( utils.transmon_readout_frequency, biases, - frequencies / 1e9, - bounds=( - [ - data.qubit_frequency[qubit] / 1e9 - 0.5, - 0, - 0, - np.mean(qubit_data.bias) - 0.5, - np.mean(qubit_data.freq) / 1e9 - 1, - 0, - ], - [ - data.qubit_frequency[qubit] / 1e9 + 0.5, - 1, - np.inf, - np.mean(qubit_data.bias) + 0.5, - np.mean(qubit_data.freq) / 1e9 + 1, - 1, - ], + frequencies * HZ_TO_GHZ, + bounds=utils.resonator_flux_dependence_fit_bounds( + data.qubit_frequency[qubit], + qubit_data.bias, + data.bare_resonator_frequency[qubit], ), maxfev=100000, )[0] diff --git a/src/qibocal/protocols/characterization/flux_dependence/utils.py b/src/qibocal/protocols/characterization/flux_dependence/utils.py index 42a89df92..a0e9489e5 100644 --- a/src/qibocal/protocols/characterization/flux_dependence/utils.py +++ b/src/qibocal/protocols/characterization/flux_dependence/utils.py @@ -4,19 +4,6 @@ from ..utils import HZ_TO_GHZ -FLUX_PARAMETERS = { - "Xi": "Constant to map flux to bias [V]", - "d": "Junction asymmetry", - "Ec": "Charge energy Ec [Hz]", - "Ej": "Josephson energy Ej [Hz]", - "f_q_offset": "Qubit frequency offset [Hz]", - "C_ii": "Flux matrix element C_ii [Hz/V]", - "g": "Readout coupling", - "bare_resonator_frequency": "Bare resonator frequency [Hz]", - "f_qs": "Qubit frequency [Hz]", - "f_r_offset": "Resonator frequency offset [Hz]", -} - def is_crosstalk(data): """Check if keys are tuple which corresponds to crosstalk data structure.""" @@ -232,229 +219,6 @@ def transmon_readout_frequency(x, w_max, d, element, offset, resonator_freq, g): ) -# TODO: restore second order approximation -# def freq_q_transmon(x, p0, p1, p2, p3): -# """ -# Qubit frequency in the boson description. Close to the half-flux quantum (:math:'\\phi=0.5`), :math:`E_J/E_C = E_J(\\phi=0)*d/E_C` can be too small for a quasi-symmetric split-transmon to apply this expression. We assume that the qubit frequencty :math:`\\gg E_C`. - -# Args: -# p[0] (float): bias offset. -# p[1] (float): constant to convert flux (:math:`\\phi_0`) to bias (:math:`v_0`). Typically denoted as :math:`\\Xi`. :math:`v_0 = \\Xi \\phi_0`. -# p[2] (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)`. -# p[3] (float): qubit frequency at the sweetspot. - -# Returns: -# (float) -# """ -# return p3 * G_f_d(x, p0, p1, p2) - - -# def freq_r_transmon(x, p0, p1, p2, p3, p4, p5): -# """ -# Flux dependent resonator frequency in the transmon limit. - -# Args: -# p[0] (float): bias offset. -# p[1] (float): constant to convert flux (:math:`\\phi_0`) to bias (:math:`v_0`). Typically denoted as :math:`\\Xi`. :math:`v_0 = \\Xi \\phi_0`. -# p[2] (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)`. -# p[3] (float): qubit frequency at the sweetspot / high power resonator frequency, -# p[4] (float): readout coupling at the sweetspot. Typically denoted as :math:`g`. -# p[5] (float): high power resonator frequency. - -# Returns: -# (float) -# """ -# return p5 + p4**2 * G_f_d(x, p0, p1, p2) / (p5 - p3 * p5 * G_f_d(x, p0, p1, p2)) - - -# def kordering(m, ng=0.4999): -# """ -# Auxilliary function to compute the qubit frequency in the CPB model (useful when the boson description fails). It sorts the eigenvalues :math:`|m,ng\\rangle` for the Schrodinger equation for the -# Cooper pair box circuit in the phase basis. - -# Args: -# m (integer): index denoting the m eigenvector. -# ng (float): effective offset charge. The sorting does not work for ng integer or half-integer. To study the sweet spot at :math:`ng = 0.5` for instance, one should insert an approximation like :math:`ng = 0.4999`. - -# Returns: -# (float) -# """ - -# a1 = (round(2 * ng + 1 / 2) % 2) * (round(ng) + 1 * (-1) ** m * divmod(m + 1, 2)[0]) -# a2 = (round(2 * ng - 1 / 2) % 2) * (round(ng) - 1 * (-1) ** m * divmod(m + 1, 2)[0]) -# return a1 + a2 - - -# def mathieu(index, x): -# """ -# Mathieu's characteristic value. Auxilliary function to compute the qubit frequency in the CPB model. - -# Args: -# index (integer): index to specify the Mathieu's characteristic value. - -# Returns:def freq_q_transmon(x, p0, p1, p2, p3): -# """ -# Qubit frequency in the boson description. Close to the half-flux quantum (:math:'\\phi=0.5`), :math:`E_J/E_C = E_J(\\phi=0)*d/E_C` can be too small for a quasi-symmetric split-transmon to apply this expression. We assume that the qubit frequencty :math:`\\gg E_C`. - -# Args: -# p[0] (float): bias offset. -# p[1] (float): constant to convert flux (:math:`\\phi_0`) to bias (:math:`v_0`). Typically denoted as :math:`\\Xi`. :math:`v_0 = \\Xi \\phi_0`. -# p[2] (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)`. -# p[3] (float): qubit frequency at the sweetspot. - -# Returns: -# (float) -# """ -# return p3 * G_f_d(x, p0, p1, p2) - - -# def freq_r_transmon(x, p0, p1, p2, p3, p4, p5): -# """ -# Flux dependent resonator frequency in the transmon limit. - -# Args: -# p[0] (float): bias offset. -# p[1] (float): constant to convert flux (:math:`\\phi_0`) to bias (:math:`v_0`). Typically denoted as :math:`\\Xi`. :math:`v_0 = \\Xi \\phi_0`. -# p[2] (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)`. -# p[3] (float): qubit frequency at the sweetspot / high power resonator frequency, -# p[4] (float): readout coupling at the sweetspot. Typically denoted as :math:`g`. -# p[5] (float): high power resonator frequency. - -# Returns: -# (float) -# """ -# return p5 + p4**2 * G_f_d(x, p0, p1, p2) / (p5 - p3 * p5 * G_f_d(x, p0, p1, p2)) - - -# def kordering(m, ng=0.4999): -# """ -# Auxilliary function to compute the qubit frequency in the CPB model (useful when the boson description fails). It sorts the eigenvalues :math:`|m,ng\\rangle` for the Schrodinger equation for the -# Cooper pair box circuit in the phase basis. - -# Args: -# m (integer): index denoting the m eigenvector. -# ng (float): effective offset charge. The sorting does not work for ng integer or half-integer. To study the sweet spot at :math:`ng = 0.5` for instance, one should insert an approximation like :math:`ng = 0.4999`. - -# Returns: -# (float) -# """ - -# a1 = (round(2 * ng + 1 / 2) % 2) * (round(ng) + 1 * (-1) ** m * divmod(m + 1, 2)[0]) -# a2 = (round(2 * ng - 1 / 2) % 2) * (round(ng) - 1 * (-1) ** m * divmod(m + 1, 2)[0]) -# return a1 + a2 - - -# def mathieu(index, x): -# """ -# Mathieu's characteristic value. Auxilliary function to compute the qubit frequency in the CPB model. - -# Args: -# index (integer): index to specify the Mathieu's characteristic value. - -# Returns: -# (float) -# """ -# if index < 0: -# return mathieu_b(-index, x) -# else: -# return mathieu_a(index, x) - - -# def freq_q_mathieu(x, p0, p1, p2, p3, p4, p5=0.499): -# """ -# Qubit frequency in the CPB model. It is useful when the boson description fails and to determine :math:`E_C` and :math:`E_J`. - -# Args: -# p[0] (float): bias offset. -# p[1] (float): constant to convert flux (:math:`\\phi_0`) to bias (:math:`v_0`). Typically denoted as :math:`\\Xi`. :math:`v_0 = \\Xi \\phi_0`. -# p[2] (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)`. -# p[3] (float): charge energy at the sweetspot, :math:`E_C`. -# p[4] (float): Josephson energy, :math:`E_J`. -# p[5] (float): effective offset charge, :math:`ng`. - -# Returns: -# (float) -# """ -# index1 = int(2 * (p5 + kordering(1, p5))) -# index0 = int(2 * (p5 + kordering(0, p5))) -# p4 = p4 * G_f_d(x, p0, p1, p2) -# return p3 * (mathieu(index1, -p4 / (2 * p3)) - mathieu(index0, -p4 / (2 * p3))) - - -# def freq_r_mathieu(x, p0, p1, p2, p3, p4, p5, p6, p7=0.499): -# """ -# Resonator frequency in the CPB model. - -# Args: -# p[0] (float): high power resonator frequency. -# p[1] (float): readout coupling at the sweetspot. -# p[2] (float): bias offset. -# p[3] (float): constant to convert flux (:math:`\\phi_0`) to bias (:math:`v_0`). Typically denoted as :math:`\\Xi`. :math:`v_0 = \\Xi \\phi_0`. -# p[4] (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)`. -# p[5] (float): charge energy at the sweetspot, :math:`E_C`. -# p[6] (float): Josephson energy, :math:`E_J`. -# p[7] (float): effective offset charge, :math:`ng`. - -# Returns: -# (float) -# """ -# G = G_f_d(x, p2, p3, p4) -# f_q = freq_q_mathieu(x, p2, p3, p4, p5, p6, p7) -# f_r = p0 + p1**2 * G / (p0 - f_q) -# return f_r - -# (float) -# """ -# if index < 0: -# return mathieu_b(-index, x) -# else: -# return mathieu_a(index, x) - - -# def freq_q_mathieu(x, p0, p1, p2, p3, p4, p5=0.499): -# """ -# Qubit frequency in the CPB model. It is useful when the boson description fails and to determine :math:`E_C` and :math:`E_J`. - -# Args: -# p[0] (float): bias offset. -# p[1] (float): constant to convert flux (:math:`\\phi_0`) to bias (:math:`v_0`). Typically denoted as :math:`\\Xi`. :math:`v_0 = \\Xi \\phi_0`. -# p[2] (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)`. -# p[3] (float): charge energy at the sweetspot, :math:`E_C`. -# p[4] (float): Josephson energy, :math:`E_J`. -# p[5] (float): effective offset charge, :math:`ng`. - -# Returns: -# (float) -# """ -# index1 = int(2 * (p5 + kordering(1, p5))) -# index0 = int(2 * (p5 + kordering(0, p5))) -# p4 = p4 * G_f_d(x, p0, p1, p2) -# return p3 * (mathieu(index1, -p4 / (2 * p3)) - mathieu(index0, -p4 / (2 * p3))) - - -# def freq_r_mathieu(x, p0, p1, p2, p3, p4, p5, p6, p7=0.499): -# """ -# Resonator frequency in the CPB model. - -# Args: -# p[0] (float): high power resonator frequency. -# p[1] (float): readout coupling at the sweetspot. -# p[2] (float): bias offset. -# p[3] (float): constant to convert flux (:math:`\\phi_0`) to bias (:math:`v_0`). Typically denoted as :math:`\\Xi`. :math:`v_0 = \\Xi \\phi_0`. -# p[4] (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)`. -# p[5] (float): charge energy at the sweetspot, :math:`E_C`. -# p[6] (float): Josephson energy, :math:`E_J`. -# p[7] (float): effective offset charge, :math:`ng`. - -# Returns: -# (float) -# """ -# G = G_f_d(x, p2, p3, p4) -# f_q = freq_q_mathieu(x, p2, p3, p4, p5, p6, p7) -# f_r = p0 + p1**2 * G / (p0 - f_q) -# return f_r - - def extract_min_feature(freq, bias, signal, threshold=1.5): """Extract min feature using SNR.""" mean_signal = np.mean(signal) @@ -471,3 +235,33 @@ def extract_max_feature(freq, bias, signal, threshold=1.5): snr_map = (signal - mean_signal) / std_signal binary_mask = snr_map > threshold return freq[binary_mask], bias[binary_mask] + + +def qubit_flux_dependence_fit_bounds(qubit_frequency: float, bias: np.array): + """Returns bounds for qubit flux fit.""" + return ( + [ + qubit_frequency * HZ_TO_GHZ - 1, + 0, + 0, + np.mean(bias) - 0.5, + ], + [ + qubit_frequency * HZ_TO_GHZ + 1, + 1, + np.inf, + np.mean(bias) + 0.5, + ], + ) + + +def resonator_flux_dependence_fit_bounds( + qubit_frequency: float, bias: np.array, bare_resonator_frequency: float +): + """Returns bounds for resonator flux fit.""" + left_bound, right_bound = qubit_flux_dependence_fit_bounds( + qubit_frequency=qubit_frequency, bias=bias + ) + left_bound += [bare_resonator_frequency - 0.5, 0] + right_bound += [bare_resonator_frequency + 0.5, 1] + return (left_bound, right_bound) From e473c838915aa9964263f1d9af4ece390b2c80c6 Mon Sep 17 00:00:00 2001 From: Gabriele Palazzo <73099233+GabrielePalazzo@users.noreply.github.com> Date: Mon, 22 Jan 2024 16:22:36 +0400 Subject: [PATCH 45/52] Apply suggestions from code review Co-authored-by: Edoardo Pedicillo --- doc/source/protocols/resonator_punchout.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/protocols/resonator_punchout.rst b/doc/source/protocols/resonator_punchout.rst index 0d65cd2bf..3b6fe0239 100644 --- a/doc/source/protocols/resonator_punchout.rst +++ b/doc/source/protocols/resonator_punchout.rst @@ -4,7 +4,7 @@ Resonator punchout With the resonator spectroscopy at high power we found the bare resonator frequency (also called high power frequency), but this is not the frequency that will be used to perform measurements. -We need to find the frequency in the low power regime, where the resonator is actually coupled +We need to find the frequency, where the resonator is actually coupled to the qubit. To do that, we first have to find the correct amplitude of the readout pulse. This experiment can be initially performed with a VNA, to check that everything is working and to obtain a rough estimation of the parameters to be used by the control devices. @@ -92,7 +92,7 @@ to reach any sensible result. To be sure that, at the given pulse amplitude, we in the transition regime, we can repeat the standard resonator spectroscopy with a finer scan, checking if the peak is Lorentzian. A resonator spectroscopy is also useful to better check the resonator frequency at low -power. We can alse write down the maximum value of the peak. +power. We can also write down the maximum value of the peak. Since we are not interacting directly with the qubit, we are effectively measuring the amplitude of the ground state and, from now on we will not change the resonator frequency, so we expect to always measure this amplitude for the zero state. Here it is From 24d4889eb773d0e5d23ab31efa94f997df238919 Mon Sep 17 00:00:00 2001 From: Gabriele Palazzo <73099233+GabrielePalazzo@users.noreply.github.com> Date: Mon, 22 Jan 2024 16:23:50 +0400 Subject: [PATCH 46/52] Update typo in resonator_punchout.rst --- doc/source/protocols/resonator_punchout.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/protocols/resonator_punchout.rst b/doc/source/protocols/resonator_punchout.rst index 3b6fe0239..40e63fef7 100644 --- a/doc/source/protocols/resonator_punchout.rst +++ b/doc/source/protocols/resonator_punchout.rst @@ -101,7 +101,7 @@ approximate value, that can later be used to check, in other experiments, that w not exciting the qubit by error (if we see a change in amplitude, then maybe the qubit state has changed). -It is also to run the punchout experiment with attenuation: +It is also possible to run the punchout experiment with attenuation: .. image:: resonator_punchout_attenuation.png From 75334549baa452e5991888a383af743fd614f4dd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jan 2024 22:19:31 +0000 Subject: [PATCH 47/52] Bump pillow from 10.1.0 to 10.2.0 Bumps [pillow](https://github.com/python-pillow/Pillow) from 10.1.0 to 10.2.0. - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/10.1.0...10.2.0) --- updated-dependencies: - dependency-name: pillow dependency-type: indirect ... Signed-off-by: dependabot[bot] --- poetry.lock | 129 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 74 insertions(+), 55 deletions(-) diff --git a/poetry.lock b/poetry.lock index 593526756..2adb6fc0e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2039,70 +2039,88 @@ ptyprocess = ">=0.5" [[package]] name = "pillow" -version = "10.1.0" +version = "10.2.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "Pillow-10.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106"}, - {file = "Pillow-10.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593"}, - {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db"}, - {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f"}, - {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818"}, - {file = "Pillow-10.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57"}, - {file = "Pillow-10.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7"}, - {file = "Pillow-10.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172"}, - {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061"}, - {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262"}, - {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992"}, - {file = "Pillow-10.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a"}, - {file = "Pillow-10.1.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b"}, - {file = "Pillow-10.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de"}, - {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651"}, - {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b"}, - {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f"}, - {file = "Pillow-10.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996"}, - {file = "Pillow-10.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793"}, - {file = "Pillow-10.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01"}, - {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d"}, - {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80"}, - {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212"}, - {file = "Pillow-10.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14"}, - {file = "Pillow-10.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099"}, - {file = "Pillow-10.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34"}, - {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd"}, - {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28"}, - {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2"}, - {file = "Pillow-10.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4"}, - {file = "Pillow-10.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b"}, - {file = "Pillow-10.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f"}, - {file = "Pillow-10.1.0.tar.gz", hash = "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38"}, + {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, + {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"}, + {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"}, + {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"}, + {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"}, + {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"}, + {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"}, + {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"}, + {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"}, + {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"}, + {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe"}, + {file = "pillow-10.2.0-cp38-cp38-win32.whl", hash = "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e"}, + {file = "pillow-10.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"}, + {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"}, + {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"}, + {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"}, + {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"}, + {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, ] [package.extras] docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] [[package]] name = "platformdirs" @@ -2568,6 +2586,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, From 1faf3ceb0880b8f431ca6c6b2c816eb6b1e7040a Mon Sep 17 00:00:00 2001 From: Andrea Date: Fri, 26 Jan 2024 18:45:10 +0400 Subject: [PATCH 48/52] refactor: Update qibocal to new platform layout --- src/qibocal/cli/acquisition.py | 5 +++-- src/qibocal/cli/autocalibration.py | 8 +++++--- src/qibocal/cli/utils.py | 4 ++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/qibocal/cli/acquisition.py b/src/qibocal/cli/acquisition.py index f386d5063..0fbc09eeb 100644 --- a/src/qibocal/cli/acquisition.py +++ b/src/qibocal/cli/acquisition.py @@ -3,7 +3,7 @@ from dataclasses import asdict import yaml -from qibolab.serialize import dump_runcard +from qibolab.serialize import dump_platform from ..auto.execute import Executor from ..auto.history import add_timings_to_meta @@ -39,7 +39,8 @@ def acquire(runcard, folder, force): meta = generate_meta(backend, platform, path) # dump platform if backend.name == "qibolab": - dump_runcard(platform, path / PLATFORM) + (path / PLATFORM).mkdir(parents=True, exist_ok=True) + dump_platform(platform, path / PLATFORM) # dump action runcard (path / RUNCARD).write_text(yaml.safe_dump(asdict(runcard))) diff --git a/src/qibocal/cli/autocalibration.py b/src/qibocal/cli/autocalibration.py index eb6504f22..a119b819d 100644 --- a/src/qibocal/cli/autocalibration.py +++ b/src/qibocal/cli/autocalibration.py @@ -3,7 +3,7 @@ from dataclasses import asdict import yaml -from qibolab.serialize import dump_runcard +from qibolab.serialize import dump_platform from ..auto.execute import Executor from ..auto.history import add_timings_to_meta @@ -41,7 +41,8 @@ def autocalibrate(runcard, folder, force, update): meta = generate_meta(backend, platform, path) # dump platform if backend.name == "qibolab": - dump_runcard(platform, path / PLATFORM) + (path / PLATFORM).mkdir(parents=True, exist_ok=True) + dump_platform(platform, path / PLATFORM) # dump action runcard (path / RUNCARD).write_text(yaml.safe_dump(asdict(runcard))) @@ -72,4 +73,5 @@ def autocalibrate(runcard, folder, force, update): # dump updated runcard if platform is not None: - dump_runcard(platform, path / UPDATED_PLATFORM) + (path / UPDATED_PLATFORM).mkdir(parents=True, exist_ok=True) + dump_platform(platform, path / UPDATED_PLATFORM) diff --git a/src/qibocal/cli/utils.py b/src/qibocal/cli/utils.py index f3fd6eb95..89a4e2d67 100644 --- a/src/qibocal/cli/utils.py +++ b/src/qibocal/cli/utils.py @@ -10,8 +10,8 @@ from qibocal.utils import allocate_qubits_pairs, allocate_single_qubits RUNCARD = "runcard.yml" -UPDATED_PLATFORM = "new_platform.yml" -PLATFORM = "platform.yml" +UPDATED_PLATFORM = "new_platform" +PLATFORM = "platform" META = "meta.json" From c03218d4e10b14311ec53d0de3f83c7a8cda5d02 Mon Sep 17 00:00:00 2001 From: Andrea Date: Fri, 26 Jan 2024 19:43:12 +0400 Subject: [PATCH 49/52] fix: Fix following introduction of CNOT native --- .../two_qubit_interaction/chevron.py | 4 +--- src/qibocal/update.py | 4 ---- src/qibocal/utils.py | 2 +- tests/runcards/protocols.yml | 2 +- tests/test_update.py | 15 ++++++++------- 5 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/qibocal/protocols/characterization/two_qubit_interaction/chevron.py b/src/qibocal/protocols/characterization/two_qubit_interaction/chevron.py index dd17d998e..31cbb5150 100644 --- a/src/qibocal/protocols/characterization/two_qubit_interaction/chevron.py +++ b/src/qibocal/protocols/characterization/two_qubit_interaction/chevron.py @@ -126,9 +126,7 @@ def _aquisition( # Patch to get the coupler until the routines use QubitPair if platform.couplers: sequence.add( - cz.coupler_pulses( - platform.pairs[tuple(sorted(ordered_pair))].coupler.name - ) + cz.coupler_pulses(platform.pairs[tuple(ordered_pair)].coupler.name) ) if params.parking: diff --git a/src/qibocal/update.py b/src/qibocal/update.py index d7004b0e4..b7c685cf0 100644 --- a/src/qibocal/update.py +++ b/src/qibocal/update.py @@ -113,8 +113,6 @@ def virtual_phases(phases: dict[QubitId, float], platform: Platform, pair: Qubit def CZ_duration(duration: int, platform: Platform, pair: QubitPairId): """Update CZ duration for specific pair.""" - if pair not in platform.pairs: - pair = (pair[1], pair[0]) for pulse in platform.pairs[pair].native_gates.CZ.pulses: if pulse.qubit.name == pair[1]: pulse.duration = int(duration) @@ -122,8 +120,6 @@ def CZ_duration(duration: int, platform: Platform, pair: QubitPairId): def CZ_amplitude(amp: float, platform: Platform, pair: QubitPairId): """Update CZ amplitude for specific pair.""" - if pair not in platform.pairs: - pair = (pair[1], pair[0]) for pulse in platform.pairs[pair].native_gates.CZ.pulses: if pulse.qubit.name == pair[1]: pulse.amplitude = float(amp) diff --git a/src/qibocal/utils.py b/src/qibocal/utils.py index 85bfa7329..45d90a9c4 100644 --- a/src/qibocal/utils.py +++ b/src/qibocal/utils.py @@ -15,7 +15,7 @@ def allocate_qubits_pairs( platform: Optional[Platform], qubit_pairs_ids: list[tuple[QubitId, QubitId]] ) -> dict[tuple[QubitId, QubitId], QubitPair]: """Construct the map from the chosen id pairs to the corresponding physical qubit pairs available on the platform.""" - return {tuple(qq): platform.pairs[tuple(sorted(qq))] for qq in qubit_pairs_ids} + return {tuple(qq): platform.pairs[tuple(qq)] for qq in qubit_pairs_ids} def allocate_single_qubits_lists( diff --git a/tests/runcards/protocols.yml b/tests/runcards/protocols.yml index 4c99e25e8..874eb5dc5 100644 --- a/tests/runcards/protocols.yml +++ b/tests/runcards/protocols.yml @@ -531,7 +531,7 @@ actions: - id: chevron id priority: 0 operation: chevron - qubits: [[0, 2],[1,2],[3,2], [2,3]] + qubits: [[0, 2],[1,2]] parameters: amplitude_min: 0.1 amplitude_max: 0.6 diff --git a/tests/test_update.py b/tests/test_update.py index a3b7f181c..0038f6ae4 100644 --- a/tests/test_update.py +++ b/tests/test_update.py @@ -100,14 +100,15 @@ def test_virtual_phases_update(pair): @pytest.mark.parametrize("pair", PAIRS) def test_CZ_params_update(pair): - update.CZ_amplitude(RANDOM_FLOAT, PLATFORM, pair) - update.CZ_duration(RANDOM_INT, PLATFORM, pair) + if hasattr(PLATFORM.pairs[pair].native_gates, "CZ"): + if PLATFORM.pairs[pair].native_gates.CZ is not None: + update.CZ_amplitude(RANDOM_FLOAT, PLATFORM, pair) + update.CZ_duration(RANDOM_INT, PLATFORM, pair) - if PLATFORM.pairs[pair].native_gates.CZ is not None: - for pulse in PLATFORM.pairs[pair].native_gates.CZ.pulses: - if pulse.qubit.name == pair[1]: - assert pulse.duration == RANDOM_INT - assert pulse.amplitude == RANDOM_FLOAT + for pulse in PLATFORM.pairs[pair].native_gates.CZ.pulses: + if pulse.qubit.name == pair[1]: + assert pulse.duration == RANDOM_INT + assert pulse.amplitude == RANDOM_FLOAT @pytest.mark.parametrize("qubit", QUBITS) From 9c1adbbbcfea126c49a240a6bc7553d7b1e9634e Mon Sep 17 00:00:00 2001 From: Andrea Date: Sat, 27 Jan 2024 10:20:00 +0400 Subject: [PATCH 50/52] build: Upgrade qibolab to 0.1.5 --- poetry.lock | 1098 +++++++++++++++++++++++------------------------- pyproject.toml | 2 +- 2 files changed, 527 insertions(+), 573 deletions(-) diff --git a/poetry.lock b/poetry.lock index 2adb6fc0e..e9516781d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,39 +2,39 @@ [[package]] name = "absl-py" -version = "2.0.0" +version = "2.1.0" description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." optional = true python-versions = ">=3.7" files = [ - {file = "absl-py-2.0.0.tar.gz", hash = "sha256:d9690211c5fcfefcdd1a45470ac2b5c5acd45241c3af71eed96bc5441746c0d5"}, - {file = "absl_py-2.0.0-py3-none-any.whl", hash = "sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3"}, + {file = "absl-py-2.1.0.tar.gz", hash = "sha256:7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff"}, + {file = "absl_py-2.1.0-py3-none-any.whl", hash = "sha256:526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308"}, ] [[package]] name = "alabaster" -version = "0.7.13" -description = "A configurable sidebar-enabled Sphinx theme" +version = "0.7.16" +description = "A light, configurable Sphinx theme" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" files = [ - {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, - {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, + {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"}, + {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, ] [[package]] name = "ansi2html" -version = "1.8.0" -description = "" +version = "1.9.1" +description = "Convert text with ANSI color codes to HTML or to LaTeX" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "ansi2html-1.8.0-py3-none-any.whl", hash = "sha256:ef9cc9682539dbe524fbf8edad9c9462a308e04bce1170c32daa8fdfd0001785"}, - {file = "ansi2html-1.8.0.tar.gz", hash = "sha256:38b82a298482a1fa2613f0f9c9beb3db72a8f832eeac58eb2e47bf32cd37f6d5"}, + {file = "ansi2html-1.9.1-py3-none-any.whl", hash = "sha256:29ccdb1e83520d648ebdc9c9544059ea4d424ecc33d3ef723657f7f5a9ae5225"}, + {file = "ansi2html-1.9.1.tar.gz", hash = "sha256:5c6837a13ecc1903aab7a545353312049dfedfe5105362ad3a8d9d207871ec71"}, ] [package.extras] -docs = ["Sphinx", "setuptools-scm", "sphinx-rtd-theme"] +docs = ["mkdocs", "mkdocs-material", "mkdocs-material-extensions", "mkdocstrings", "mkdocstrings-python", "pymdown-extensions"] test = ["pytest", "pytest-cov"] [[package]] @@ -91,31 +91,32 @@ wheel = ">=0.23.0,<1.0" [[package]] name = "attrs" -version = "23.1.0" +version = "23.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, ] [package.extras] cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] +dev = ["attrs[tests]", "pre-commit"] docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] [[package]] name = "babel" -version = "2.13.1" +version = "2.14.0" description = "Internationalization utilities" optional = false python-versions = ">=3.7" files = [ - {file = "Babel-2.13.1-py3-none-any.whl", hash = "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed"}, - {file = "Babel-2.13.1.tar.gz", hash = "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900"}, + {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, + {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, ] [package.extras] @@ -123,19 +124,22 @@ dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "beautifulsoup4" -version = "4.12.2" +version = "4.12.3" description = "Screen-scraping library" optional = false python-versions = ">=3.6.0" files = [ - {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, - {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, ] [package.dependencies] soupsieve = ">1.2" [package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] @@ -360,7 +364,7 @@ test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] name = "contourpy" version = "1.2.0" description = "Python library for calculating contours of 2D quadrilateral grids" -optional = false +optional = true python-versions = ">=3.9" files = [ {file = "contourpy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8"}, @@ -421,63 +425,63 @@ test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" -version = "7.3.2" +version = "7.4.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"}, - {file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"}, - {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"}, - {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"}, - {file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"}, - {file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"}, - {file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"}, - {file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"}, - {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"}, - {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"}, - {file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"}, - {file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"}, - {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"}, - {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"}, - {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"}, - {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"}, - {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"}, - {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"}, - {file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"}, - {file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"}, - {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"}, - {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"}, - {file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"}, - {file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"}, - {file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"}, - {file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"}, - {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"}, - {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"}, - {file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"}, - {file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"}, - {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"}, - {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, + {file = "coverage-7.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:077d366e724f24fc02dbfe9d946534357fda71af9764ff99d73c3c596001bbd7"}, + {file = "coverage-7.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0193657651f5399d433c92f8ae264aff31fc1d066deee4b831549526433f3f61"}, + {file = "coverage-7.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d17bbc946f52ca67adf72a5ee783cd7cd3477f8f8796f59b4974a9b59cacc9ee"}, + {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3277f5fa7483c927fe3a7b017b39351610265308f5267ac6d4c2b64cc1d8d25"}, + {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dceb61d40cbfcf45f51e59933c784a50846dc03211054bd76b421a713dcdf19"}, + {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6008adeca04a445ea6ef31b2cbaf1d01d02986047606f7da266629afee982630"}, + {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c61f66d93d712f6e03369b6a7769233bfda880b12f417eefdd4f16d1deb2fc4c"}, + {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9bb62fac84d5f2ff523304e59e5c439955fb3b7f44e3d7b2085184db74d733b"}, + {file = "coverage-7.4.1-cp310-cp310-win32.whl", hash = "sha256:f86f368e1c7ce897bf2457b9eb61169a44e2ef797099fb5728482b8d69f3f016"}, + {file = "coverage-7.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:869b5046d41abfea3e381dd143407b0d29b8282a904a19cb908fa24d090cc018"}, + {file = "coverage-7.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b8ffb498a83d7e0305968289441914154fb0ef5d8b3157df02a90c6695978295"}, + {file = "coverage-7.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3cacfaefe6089d477264001f90f55b7881ba615953414999c46cc9713ff93c8c"}, + {file = "coverage-7.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d6850e6e36e332d5511a48a251790ddc545e16e8beaf046c03985c69ccb2676"}, + {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18e961aa13b6d47f758cc5879383d27b5b3f3dcd9ce8cdbfdc2571fe86feb4dd"}, + {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfd1e1b9f0898817babf840b77ce9fe655ecbe8b1b327983df485b30df8cc011"}, + {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6b00e21f86598b6330f0019b40fb397e705135040dbedc2ca9a93c7441178e74"}, + {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:536d609c6963c50055bab766d9951b6c394759190d03311f3e9fcf194ca909e1"}, + {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7ac8f8eb153724f84885a1374999b7e45734bf93a87d8df1e7ce2146860edef6"}, + {file = "coverage-7.4.1-cp311-cp311-win32.whl", hash = "sha256:f3771b23bb3675a06f5d885c3630b1d01ea6cac9e84a01aaf5508706dba546c5"}, + {file = "coverage-7.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:9d2f9d4cc2a53b38cabc2d6d80f7f9b7e3da26b2f53d48f05876fef7956b6968"}, + {file = "coverage-7.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f68ef3660677e6624c8cace943e4765545f8191313a07288a53d3da188bd8581"}, + {file = "coverage-7.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23b27b8a698e749b61809fb637eb98ebf0e505710ec46a8aa6f1be7dc0dc43a6"}, + {file = "coverage-7.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e3424c554391dc9ef4a92ad28665756566a28fecf47308f91841f6c49288e66"}, + {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0860a348bf7004c812c8368d1fc7f77fe8e4c095d661a579196a9533778e156"}, + {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe558371c1bdf3b8fa03e097c523fb9645b8730399c14fe7721ee9c9e2a545d3"}, + {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3468cc8720402af37b6c6e7e2a9cdb9f6c16c728638a2ebc768ba1ef6f26c3a1"}, + {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:02f2edb575d62172aa28fe00efe821ae31f25dc3d589055b3fb64d51e52e4ab1"}, + {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ca6e61dc52f601d1d224526360cdeab0d0712ec104a2ce6cc5ccef6ed9a233bc"}, + {file = "coverage-7.4.1-cp312-cp312-win32.whl", hash = "sha256:ca7b26a5e456a843b9b6683eada193fc1f65c761b3a473941efe5a291f604c74"}, + {file = "coverage-7.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:85ccc5fa54c2ed64bd91ed3b4a627b9cce04646a659512a051fa82a92c04a448"}, + {file = "coverage-7.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8bdb0285a0202888d19ec6b6d23d5990410decb932b709f2b0dfe216d031d218"}, + {file = "coverage-7.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:918440dea04521f499721c039863ef95433314b1db00ff826a02580c1f503e45"}, + {file = "coverage-7.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:379d4c7abad5afbe9d88cc31ea8ca262296480a86af945b08214eb1a556a3e4d"}, + {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b094116f0b6155e36a304ff912f89bbb5067157aff5f94060ff20bbabdc8da06"}, + {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f5968608b1fe2a1d00d01ad1017ee27efd99b3437e08b83ded9b7af3f6f766"}, + {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:10e88e7f41e6197ea0429ae18f21ff521d4f4490aa33048f6c6f94c6045a6a75"}, + {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a4a3907011d39dbc3e37bdc5df0a8c93853c369039b59efa33a7b6669de04c60"}, + {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d224f0c4c9c98290a6990259073f496fcec1b5cc613eecbd22786d398ded3ad"}, + {file = "coverage-7.4.1-cp38-cp38-win32.whl", hash = "sha256:23f5881362dcb0e1a92b84b3c2809bdc90db892332daab81ad8f642d8ed55042"}, + {file = "coverage-7.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:a07f61fc452c43cd5328b392e52555f7d1952400a1ad09086c4a8addccbd138d"}, + {file = "coverage-7.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8e738a492b6221f8dcf281b67129510835461132b03024830ac0e554311a5c54"}, + {file = "coverage-7.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46342fed0fff72efcda77040b14728049200cbba1279e0bf1188f1f2078c1d70"}, + {file = "coverage-7.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9641e21670c68c7e57d2053ddf6c443e4f0a6e18e547e86af3fad0795414a628"}, + {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeb2c2688ed93b027eb0d26aa188ada34acb22dceea256d76390eea135083950"}, + {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d12c923757de24e4e2110cf8832d83a886a4cf215c6e61ed506006872b43a6d1"}, + {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0491275c3b9971cdbd28a4595c2cb5838f08036bca31765bad5e17edf900b2c7"}, + {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8dfc5e195bbef80aabd81596ef52a1277ee7143fe419efc3c4d8ba2754671756"}, + {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1a78b656a4d12b0490ca72651fe4d9f5e07e3c6461063a9b6265ee45eb2bdd35"}, + {file = "coverage-7.4.1-cp39-cp39-win32.whl", hash = "sha256:f90515974b39f4dea2f27c0959688621b46d96d5a626cf9c53dbc653a895c05c"}, + {file = "coverage-7.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:64e723ca82a84053dd7bfcc986bdb34af8d9da83c521c19d6b472bc6880e191a"}, + {file = "coverage-7.4.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:32a8d985462e37cfdab611a6f95b09d7c091d07668fdc26e47a725ee575fe166"}, + {file = "coverage-7.4.1.tar.gz", hash = "sha256:1ed4b95480952b1a26d863e546fa5094564aa0065e1e5f0d4d0041f293251d04"}, ] [package.dependencies] @@ -490,7 +494,7 @@ toml = ["tomli"] name = "cycler" version = "0.12.1" description = "Composable style cycles" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, @@ -683,13 +687,13 @@ typing = ["typing-extensions (>=4.8)"] [[package]] name = "flask" -version = "3.0.0" +version = "3.0.1" description = "A simple framework for building complex web applications." optional = false python-versions = ">=3.8" files = [ - {file = "flask-3.0.0-py3-none-any.whl", hash = "sha256:21128f47e4e3b9d597a3e8521a329bf56909b690fcc3fa3e477725aa81367638"}, - {file = "flask-3.0.0.tar.gz", hash = "sha256:cfadcdb638b609361d29ec22360d6070a77d7463dcb3ab08d2c2f2f168845f58"}, + {file = "flask-3.0.1-py3-none-any.whl", hash = "sha256:ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13"}, + {file = "flask-3.0.1.tar.gz", hash = "sha256:6489f51bb3666def6f314e15f19d50a1869a19ae0e8c9a3641ffe66c77d42403"}, ] [package.dependencies] @@ -717,59 +721,59 @@ files = [ [[package]] name = "fonttools" -version = "4.46.0" +version = "4.47.2" description = "Tools to manipulate font files" -optional = false +optional = true python-versions = ">=3.8" files = [ - {file = "fonttools-4.46.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d4e69e2c7f93b695d2e6f18f709d501d945f65c1d237dafaabdd23cd935a5276"}, - {file = "fonttools-4.46.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:25852f0c63df0af022f698464a4a80f7d1d5bd974bcd22f995f6b4ad198e32dd"}, - {file = "fonttools-4.46.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:adab73618d0a328b203a0e242b3eba60a2b5662d9cb2bd16ed9c52af8a7d86af"}, - {file = "fonttools-4.46.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cf923a4a556ab4cc4c52f69a4a2db624cf5a2cf360394368b40c5152fe3321e"}, - {file = "fonttools-4.46.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:87c214197712cc14fd2a4621efce2a9c501a77041232b789568149a8a3161517"}, - {file = "fonttools-4.46.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:156ae342a1ed1fe38e180de471e98fbf5b2b6ae280fa3323138569c4ca215844"}, - {file = "fonttools-4.46.0-cp310-cp310-win32.whl", hash = "sha256:c506e3d3a9e898caee4dc094f34b49c5566870d5a2d1ca2125f0a9f35ecc2205"}, - {file = "fonttools-4.46.0-cp310-cp310-win_amd64.whl", hash = "sha256:f8bc3973ed58893c4107993e0a7ae34901cb572b5e798249cbef35d30801ffd4"}, - {file = "fonttools-4.46.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:982f69855ac258260f51048d9e0c53c5f19881138cc7ca06deb38dc4b97404b6"}, - {file = "fonttools-4.46.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c23c59d321d62588620f2255cf951270bf637d88070f38ed8b5e5558775b86c"}, - {file = "fonttools-4.46.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0e94244ec24a940ecfbe5b31c975c8a575d5ed2d80f9a280ce3b21fa5dc9c34"}, - {file = "fonttools-4.46.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a9f9cdd7ef63d1b8ac90db335762451452426b3207abd79f60da510cea62da5"}, - {file = "fonttools-4.46.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ca9eceebe70035b057ce549e2054cad73e95cac3fe91a9d827253d1c14618204"}, - {file = "fonttools-4.46.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8be6adfa4e15977075278dd0a0bae74dec59be7b969b5ceed93fb86af52aa5be"}, - {file = "fonttools-4.46.0-cp311-cp311-win32.whl", hash = "sha256:7b5636f5706d49f13b6d610fe54ee662336cdf56b5a6f6683c0b803e23d826d2"}, - {file = "fonttools-4.46.0-cp311-cp311-win_amd64.whl", hash = "sha256:49ea0983e55fd7586a809787cd4644a7ae471e53ab8ddc016f9093b400e32646"}, - {file = "fonttools-4.46.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7b460720ce81773da1a3e7cc964c48e1e11942b280619582a897fa0117b56a62"}, - {file = "fonttools-4.46.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8bee9f4fc8c99824a424ae45c789ee8c67cb84f8e747afa7f83b7d3cef439c3b"}, - {file = "fonttools-4.46.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3d7b96aba96e05e8c911ce2dfc5acc6a178b8f44f6aa69371ab91aa587563da"}, - {file = "fonttools-4.46.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e6aeb5c340416d11a3209d75c48d13e72deea9e1517837dd1522c1fd1f17c11"}, - {file = "fonttools-4.46.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c779f8701deedf41908f287aeb775b8a6f59875ad1002b98ac6034ae4ddc1b7b"}, - {file = "fonttools-4.46.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce199227ce7921eaafdd4f96536f16b232d6b580ce74ce337de544bf06cb2752"}, - {file = "fonttools-4.46.0-cp312-cp312-win32.whl", hash = "sha256:1c9937c4dd1061afd22643389445fabda858af5e805860ec3082a4bc07c7a720"}, - {file = "fonttools-4.46.0-cp312-cp312-win_amd64.whl", hash = "sha256:a9fa52ef8fd14d7eb3d813e1451e7ace3e1eebfa9b7237d3f81fee8f3de6a114"}, - {file = "fonttools-4.46.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c94564b1f3b5dd87e73577610d85115b1936edcc596deaf84a31bbe70e17456b"}, - {file = "fonttools-4.46.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4a50a1dfad7f7ba5ca3f99cc73bf5cdac67ceade8e4b355a877521f20ad1b63"}, - {file = "fonttools-4.46.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89c2c520f9492844ecd6316d20c6c7a157b5c0cb73a1411b3db28ee304f30122"}, - {file = "fonttools-4.46.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5b7905fd68eacb7cc56a13139da5c312c45baae6950dd00b02563c54508a041"}, - {file = "fonttools-4.46.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8485cc468288e213f31afdaf1fdda3c79010f542559fbba936a54f4644df2570"}, - {file = "fonttools-4.46.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:87c3299da7da55394fb324349db0ede38114a46aafd0e7dfcabfecd28cdd94c3"}, - {file = "fonttools-4.46.0-cp38-cp38-win32.whl", hash = "sha256:f5f1423a504ccc329efb5aa79738de83d38c072be5308788dde6bd419969d7f5"}, - {file = "fonttools-4.46.0-cp38-cp38-win_amd64.whl", hash = "sha256:6d4a4ebcc76e30898ff3296ea786491c70e183f738319ae2629e0d44f17ece42"}, - {file = "fonttools-4.46.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9a0e422ab79e5cb2b47913be6a4b5fd20c4c7ac34a24f3691a4e099e965e0b8"}, - {file = "fonttools-4.46.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:13ac0cba2fc63fa4b232f2a7971f35f35c6eaf10bd1271fa96d4ce6253a8acfd"}, - {file = "fonttools-4.46.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:795150d5edc595e1a2cfb3d65e8f4f3d027704fc2579f8990d381bef6b188eb6"}, - {file = "fonttools-4.46.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d00fc63131dcac6b25f50a5a129758438317e54e3ce5587163f7058de4b0e933"}, - {file = "fonttools-4.46.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3033b55f401a622de2630b3982234d97219d89b058607b87927eccb0f922313c"}, - {file = "fonttools-4.46.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e26e7fb908ae4f622813e7cb32cd2db6c24e3122bb3b98f25e832a2fe0e7e228"}, - {file = "fonttools-4.46.0-cp39-cp39-win32.whl", hash = "sha256:2d0eba685938c603f2f648dfc0aadbf8c6a4fe1c7ca608c2970a6ef39e00f254"}, - {file = "fonttools-4.46.0-cp39-cp39-win_amd64.whl", hash = "sha256:5200b01f463d97cc2b7ff8a1e3584151f4413e98cb8419da5f17d1dbb84cc214"}, - {file = "fonttools-4.46.0-py3-none-any.whl", hash = "sha256:5b627ed142398ea9202bd752c04311592558964d1a765fb2f78dc441a05633f4"}, - {file = "fonttools-4.46.0.tar.gz", hash = "sha256:2ae45716c27a41807d58a9f3f59983bdc8c0a46cb259e4450ab7e196253a9853"}, -] - -[package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] + {file = "fonttools-4.47.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3b629108351d25512d4ea1a8393a2dba325b7b7d7308116b605ea3f8e1be88df"}, + {file = "fonttools-4.47.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c19044256c44fe299d9a73456aabee4b4d06c6b930287be93b533b4737d70aa1"}, + {file = "fonttools-4.47.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8be28c036b9f186e8c7eaf8a11b42373e7e4949f9e9f370202b9da4c4c3f56c"}, + {file = "fonttools-4.47.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f83a4daef6d2a202acb9bf572958f91cfde5b10c8ee7fb1d09a4c81e5d851fd8"}, + {file = "fonttools-4.47.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a5a5318ba5365d992666ac4fe35365f93004109d18858a3e18ae46f67907670"}, + {file = "fonttools-4.47.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8f57ecd742545362a0f7186774b2d1c53423ed9ece67689c93a1055b236f638c"}, + {file = "fonttools-4.47.2-cp310-cp310-win32.whl", hash = "sha256:a1c154bb85dc9a4cf145250c88d112d88eb414bad81d4cb524d06258dea1bdc0"}, + {file = "fonttools-4.47.2-cp310-cp310-win_amd64.whl", hash = "sha256:3e2b95dce2ead58fb12524d0ca7d63a63459dd489e7e5838c3cd53557f8933e1"}, + {file = "fonttools-4.47.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:29495d6d109cdbabe73cfb6f419ce67080c3ef9ea1e08d5750240fd4b0c4763b"}, + {file = "fonttools-4.47.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0a1d313a415eaaba2b35d6cd33536560deeebd2ed758b9bfb89ab5d97dc5deac"}, + {file = "fonttools-4.47.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90f898cdd67f52f18049250a6474185ef6544c91f27a7bee70d87d77a8daf89c"}, + {file = "fonttools-4.47.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3480eeb52770ff75140fe7d9a2ec33fb67b07efea0ab5129c7e0c6a639c40c70"}, + {file = "fonttools-4.47.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0255dbc128fee75fb9be364806b940ed450dd6838672a150d501ee86523ac61e"}, + {file = "fonttools-4.47.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f791446ff297fd5f1e2247c188de53c1bfb9dd7f0549eba55b73a3c2087a2703"}, + {file = "fonttools-4.47.2-cp311-cp311-win32.whl", hash = "sha256:740947906590a878a4bde7dd748e85fefa4d470a268b964748403b3ab2aeed6c"}, + {file = "fonttools-4.47.2-cp311-cp311-win_amd64.whl", hash = "sha256:63fbed184979f09a65aa9c88b395ca539c94287ba3a364517698462e13e457c9"}, + {file = "fonttools-4.47.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4ec558c543609e71b2275c4894e93493f65d2f41c15fe1d089080c1d0bb4d635"}, + {file = "fonttools-4.47.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e040f905d542362e07e72e03612a6270c33d38281fd573160e1003e43718d68d"}, + {file = "fonttools-4.47.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6dd58cc03016b281bd2c74c84cdaa6bd3ce54c5a7f47478b7657b930ac3ed8eb"}, + {file = "fonttools-4.47.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32ab2e9702dff0dd4510c7bb958f265a8d3dd5c0e2547e7b5f7a3df4979abb07"}, + {file = "fonttools-4.47.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a808f3c1d1df1f5bf39be869b6e0c263570cdafb5bdb2df66087733f566ea71"}, + {file = "fonttools-4.47.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac71e2e201df041a2891067dc36256755b1229ae167edbdc419b16da78732c2f"}, + {file = "fonttools-4.47.2-cp312-cp312-win32.whl", hash = "sha256:69731e8bea0578b3c28fdb43dbf95b9386e2d49a399e9a4ad736b8e479b08085"}, + {file = "fonttools-4.47.2-cp312-cp312-win_amd64.whl", hash = "sha256:b3e1304e5f19ca861d86a72218ecce68f391646d85c851742d265787f55457a4"}, + {file = "fonttools-4.47.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:254d9a6f7be00212bf0c3159e0a420eb19c63793b2c05e049eb337f3023c5ecc"}, + {file = "fonttools-4.47.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eabae77a07c41ae0b35184894202305c3ad211a93b2eb53837c2a1143c8bc952"}, + {file = "fonttools-4.47.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86a5ab2873ed2575d0fcdf1828143cfc6b977ac448e3dc616bb1e3d20efbafa"}, + {file = "fonttools-4.47.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13819db8445a0cec8c3ff5f243af6418ab19175072a9a92f6cc8ca7d1452754b"}, + {file = "fonttools-4.47.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4e743935139aa485fe3253fc33fe467eab6ea42583fa681223ea3f1a93dd01e6"}, + {file = "fonttools-4.47.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d49ce3ea7b7173faebc5664872243b40cf88814ca3eb135c4a3cdff66af71946"}, + {file = "fonttools-4.47.2-cp38-cp38-win32.whl", hash = "sha256:94208ea750e3f96e267f394d5588579bb64cc628e321dbb1d4243ffbc291b18b"}, + {file = "fonttools-4.47.2-cp38-cp38-win_amd64.whl", hash = "sha256:0f750037e02beb8b3569fbff701a572e62a685d2a0e840d75816592280e5feae"}, + {file = "fonttools-4.47.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3d71606c9321f6701642bd4746f99b6089e53d7e9817fc6b964e90d9c5f0ecc6"}, + {file = "fonttools-4.47.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:86e0427864c6c91cf77f16d1fb9bf1bbf7453e824589e8fb8461b6ee1144f506"}, + {file = "fonttools-4.47.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a00bd0e68e88987dcc047ea31c26d40a3c61185153b03457956a87e39d43c37"}, + {file = "fonttools-4.47.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5d77479fb885ef38a16a253a2f4096bc3d14e63a56d6246bfdb56365a12b20c"}, + {file = "fonttools-4.47.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5465df494f20a7d01712b072ae3ee9ad2887004701b95cb2cc6dcb9c2c97a899"}, + {file = "fonttools-4.47.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4c811d3c73b6abac275babb8aa439206288f56fdb2c6f8835e3d7b70de8937a7"}, + {file = "fonttools-4.47.2-cp39-cp39-win32.whl", hash = "sha256:5b60e3afa9635e3dfd3ace2757039593e3bd3cf128be0ddb7a1ff4ac45fa5a50"}, + {file = "fonttools-4.47.2-cp39-cp39-win_amd64.whl", hash = "sha256:7ee48bd9d6b7e8f66866c9090807e3a4a56cf43ffad48962725a190e0dd774c8"}, + {file = "fonttools-4.47.2-py3-none-any.whl", hash = "sha256:7eb7ad665258fba68fd22228a09f347469d95a97fb88198e133595947a20a184"}, + {file = "fonttools-4.47.2.tar.gz", hash = "sha256:7df26dd3650e98ca45f1e29883c96a0b9f5bb6af8d632a6a108bc744fa0bd9b3"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "scipy"] +interpolatable = ["munkres", "pycairo", "scipy"] lxml = ["lxml (>=4.0,<5)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] @@ -782,13 +786,13 @@ woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "fsspec" -version = "2023.12.1" +version = "2023.12.2" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2023.12.1-py3-none-any.whl", hash = "sha256:6271f1d3075a378bfe432f6f42bf7e1d2a6ba74f78dd9b512385474c579146a0"}, - {file = "fsspec-2023.12.1.tar.gz", hash = "sha256:c4da01a35ac65c853f833e43f67802c25213f560820d54ddf248f92eddd5e990"}, + {file = "fsspec-2023.12.2-py3-none-any.whl", hash = "sha256:d800d87f72189a745fa3d6b033b9dc4a34ad069f60ca60b943a63599f5501960"}, + {file = "fsspec-2023.12.2.tar.gz", hash = "sha256:8548d39e8810b59c38014934f6b31e57f40c1b20f911f4cc2b85389c7e9bf0cb"}, ] [package.extras] @@ -855,13 +859,13 @@ files = [ [[package]] name = "google-auth" -version = "2.25.1" +version = "2.27.0" description = "Google Authentication Library" optional = true python-versions = ">=3.7" files = [ - {file = "google-auth-2.25.1.tar.gz", hash = "sha256:d5d66b8f4f6e3273740d7bb73ddefa6c2d1ff691704bd407d51c6b5800e7c97b"}, - {file = "google_auth-2.25.1-py2.py3-none-any.whl", hash = "sha256:dfd7b44935d498e106c08883b2dac0ad36d8aa10402a6412e9a1c9d74b4773f1"}, + {file = "google-auth-2.27.0.tar.gz", hash = "sha256:e863a56ccc2d8efa83df7a80272601e43487fa9a728a376205c86c26aaefa821"}, + {file = "google_auth-2.27.0-py2.py3-none-any.whl", hash = "sha256:8e4bad367015430ff253fe49d500fdc3396c1a434db5740828c728e45bcce245"}, ] [package.dependencies] @@ -911,69 +915,69 @@ six = "*" [[package]] name = "grpcio" -version = "1.59.3" +version = "1.60.0" description = "HTTP/2-based RPC framework" optional = true python-versions = ">=3.7" files = [ - {file = "grpcio-1.59.3-cp310-cp310-linux_armv7l.whl", hash = "sha256:aca028a6c7806e5b61e5f9f4232432c52856f7fcb98e330b20b6bc95d657bdcc"}, - {file = "grpcio-1.59.3-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:19ad26a7967f7999c8960d2b9fe382dae74c55b0c508c613a6c2ba21cddf2354"}, - {file = "grpcio-1.59.3-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:72b71dad2a3d1650e69ad42a5c4edbc59ee017f08c32c95694172bc501def23c"}, - {file = "grpcio-1.59.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c0f0a11d82d0253656cc42e04b6a149521e02e755fe2e4edd21123de610fd1d4"}, - {file = "grpcio-1.59.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60cddafb70f9a2c81ba251b53b4007e07cca7389e704f86266e22c4bffd8bf1d"}, - {file = "grpcio-1.59.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6c75a1fa0e677c1d2b6d4196ad395a5c381dfb8385f07ed034ef667cdcdbcc25"}, - {file = "grpcio-1.59.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e1d8e01438d5964a11167eec1edb5f85ed8e475648f36c834ed5db4ffba24ac8"}, - {file = "grpcio-1.59.3-cp310-cp310-win32.whl", hash = "sha256:c4b0076f0bf29ee62335b055a9599f52000b7941f577daa001c7ef961a1fbeab"}, - {file = "grpcio-1.59.3-cp310-cp310-win_amd64.whl", hash = "sha256:b1f00a3e6e0c3dccccffb5579fc76ebfe4eb40405ba308505b41ef92f747746a"}, - {file = "grpcio-1.59.3-cp311-cp311-linux_armv7l.whl", hash = "sha256:3996aaa21231451161dc29df6a43fcaa8b332042b6150482c119a678d007dd86"}, - {file = "grpcio-1.59.3-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:cb4e9cbd9b7388fcb06412da9f188c7803742d06d6f626304eb838d1707ec7e3"}, - {file = "grpcio-1.59.3-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:8022ca303d6c694a0d7acfb2b472add920217618d3a99eb4b14edc7c6a7e8fcf"}, - {file = "grpcio-1.59.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b36683fad5664283755a7f4e2e804e243633634e93cd798a46247b8e54e3cb0d"}, - {file = "grpcio-1.59.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8239b853226e4824e769517e1b5232e7c4dda3815b200534500338960fcc6118"}, - {file = "grpcio-1.59.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0511af8653fbda489ff11d542a08505d56023e63cafbda60e6e00d4e0bae86ea"}, - {file = "grpcio-1.59.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e78dc982bda74cef2ddfce1c91d29b96864c4c680c634e279ed204d51e227473"}, - {file = "grpcio-1.59.3-cp311-cp311-win32.whl", hash = "sha256:6a5c3a96405966c023e139c3bcccb2c7c776a6f256ac6d70f8558c9041bdccc3"}, - {file = "grpcio-1.59.3-cp311-cp311-win_amd64.whl", hash = "sha256:ed26826ee423b11477297b187371cdf4fa1eca874eb1156422ef3c9a60590dd9"}, - {file = "grpcio-1.59.3-cp312-cp312-linux_armv7l.whl", hash = "sha256:45dddc5cb5227d30fa43652d8872dc87f086d81ab4b500be99413bad0ae198d7"}, - {file = "grpcio-1.59.3-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:1736496d74682e53dd0907fd515f2694d8e6a96c9a359b4080b2504bf2b2d91b"}, - {file = "grpcio-1.59.3-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:ddbd1a16138e52e66229047624de364f88a948a4d92ba20e4e25ad7d22eef025"}, - {file = "grpcio-1.59.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fcfa56f8d031ffda902c258c84c4b88707f3a4be4827b4e3ab8ec7c24676320d"}, - {file = "grpcio-1.59.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2eb8f0c7c0c62f7a547ad7a91ba627a5aa32a5ae8d930783f7ee61680d7eb8d"}, - {file = "grpcio-1.59.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8d993399cc65e3a34f8fd48dd9ad7a376734564b822e0160dd18b3d00c1a33f9"}, - {file = "grpcio-1.59.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c0bd141f4f41907eb90bda74d969c3cb21c1c62779419782a5b3f5e4b5835718"}, - {file = "grpcio-1.59.3-cp312-cp312-win32.whl", hash = "sha256:33b8fd65d4e97efa62baec6171ce51f9cf68f3a8ba9f866f4abc9d62b5c97b79"}, - {file = "grpcio-1.59.3-cp312-cp312-win_amd64.whl", hash = "sha256:0e735ed002f50d4f3cb9ecfe8ac82403f5d842d274c92d99db64cfc998515e07"}, - {file = "grpcio-1.59.3-cp37-cp37m-linux_armv7l.whl", hash = "sha256:ea40ce4404e7cca0724c91a7404da410f0144148fdd58402a5942971e3469b94"}, - {file = "grpcio-1.59.3-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:83113bcc393477b6f7342b9f48e8a054330c895205517edc66789ceea0796b53"}, - {file = "grpcio-1.59.3-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:73afbac602b8f1212a50088193601f869b5073efa9855b3e51aaaec97848fc8a"}, - {file = "grpcio-1.59.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:575d61de1950b0b0699917b686b1ca108690702fcc2df127b8c9c9320f93e069"}, - {file = "grpcio-1.59.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cd76057b5c9a4d68814610ef9226925f94c1231bbe533fdf96f6181f7d2ff9e"}, - {file = "grpcio-1.59.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:95d6fd804c81efe4879e38bfd84d2b26e339a0a9b797e7615e884ef4686eb47b"}, - {file = "grpcio-1.59.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0d42048b8a3286ea4134faddf1f9a59cf98192b94aaa10d910a25613c5eb5bfb"}, - {file = "grpcio-1.59.3-cp37-cp37m-win_amd64.whl", hash = "sha256:4619fea15c64bcdd9d447cdbdde40e3d5f1da3a2e8ae84103d94a9c1df210d7e"}, - {file = "grpcio-1.59.3-cp38-cp38-linux_armv7l.whl", hash = "sha256:95b5506e70284ac03b2005dd9ffcb6708c9ae660669376f0192a710687a22556"}, - {file = "grpcio-1.59.3-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:9e17660947660ccfce56c7869032910c179a5328a77b73b37305cd1ee9301c2e"}, - {file = "grpcio-1.59.3-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:00912ce19914d038851be5cd380d94a03f9d195643c28e3ad03d355cc02ce7e8"}, - {file = "grpcio-1.59.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e58b3cadaa3c90f1efca26ba33e0d408b35b497307027d3d707e4bcd8de862a6"}, - {file = "grpcio-1.59.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d787ecadea865bdf78f6679f6f5bf4b984f18f659257ba612979df97a298b3c3"}, - {file = "grpcio-1.59.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0814942ba1bba269db4e760a34388640c601dece525c6a01f3b4ff030cc0db69"}, - {file = "grpcio-1.59.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fb111aa99d3180c361a35b5ae1e2c63750220c584a1344229abc139d5c891881"}, - {file = "grpcio-1.59.3-cp38-cp38-win32.whl", hash = "sha256:eb8ba504c726befe40a356ecbe63c6c3c64c9a439b3164f5a718ec53c9874da0"}, - {file = "grpcio-1.59.3-cp38-cp38-win_amd64.whl", hash = "sha256:cdbc6b32fadab9bebc6f49d3e7ec4c70983c71e965497adab7f87de218e84391"}, - {file = "grpcio-1.59.3-cp39-cp39-linux_armv7l.whl", hash = "sha256:c82ca1e4be24a98a253d6dbaa216542e4163f33f38163fc77964b0f0d255b552"}, - {file = "grpcio-1.59.3-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:36636babfda14f9e9687f28d5b66d349cf88c1301154dc71c6513de2b6c88c59"}, - {file = "grpcio-1.59.3-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5f9b2e591da751ac7fdd316cc25afafb7a626dededa9b414f90faad7f3ccebdb"}, - {file = "grpcio-1.59.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a93a82876a4926bf451db82ceb725bd87f42292bacc94586045261f501a86994"}, - {file = "grpcio-1.59.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce31fa0bfdd1f2bb15b657c16105c8652186eab304eb512e6ae3b99b2fdd7d13"}, - {file = "grpcio-1.59.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:16da0e40573962dab6cba16bec31f25a4f468e6d05b658e589090fe103b03e3d"}, - {file = "grpcio-1.59.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1d1a17372fd425addd5812049fa7374008ffe689585f27f802d0935522cf4b7"}, - {file = "grpcio-1.59.3-cp39-cp39-win32.whl", hash = "sha256:52cc38a7241b5f7b4a91aaf9000fdd38e26bb00d5e8a71665ce40cfcee716281"}, - {file = "grpcio-1.59.3-cp39-cp39-win_amd64.whl", hash = "sha256:b491e5bbcad3020a96842040421e508780cade35baba30f402df9d321d1c423e"}, - {file = "grpcio-1.59.3.tar.gz", hash = "sha256:7800f99568a74a06ebdccd419dd1b6e639b477dcaf6da77ea702f8fb14ce5f80"}, -] - -[package.extras] -protobuf = ["grpcio-tools (>=1.59.3)"] + {file = "grpcio-1.60.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:d020cfa595d1f8f5c6b343530cd3ca16ae5aefdd1e832b777f9f0eb105f5b139"}, + {file = "grpcio-1.60.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:b98f43fcdb16172dec5f4b49f2fece4b16a99fd284d81c6bbac1b3b69fcbe0ff"}, + {file = "grpcio-1.60.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:20e7a4f7ded59097c84059d28230907cd97130fa74f4a8bfd1d8e5ba18c81491"}, + {file = "grpcio-1.60.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452ca5b4afed30e7274445dd9b441a35ece656ec1600b77fff8c216fdf07df43"}, + {file = "grpcio-1.60.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43e636dc2ce9ece583b3e2ca41df5c983f4302eabc6d5f9cd04f0562ee8ec1ae"}, + {file = "grpcio-1.60.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e306b97966369b889985a562ede9d99180def39ad42c8014628dd3cc343f508"}, + {file = "grpcio-1.60.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f897c3b127532e6befdcf961c415c97f320d45614daf84deba0a54e64ea2457b"}, + {file = "grpcio-1.60.0-cp310-cp310-win32.whl", hash = "sha256:b87efe4a380887425bb15f220079aa8336276398dc33fce38c64d278164f963d"}, + {file = "grpcio-1.60.0-cp310-cp310-win_amd64.whl", hash = "sha256:a9c7b71211f066908e518a2ef7a5e211670761651039f0d6a80d8d40054047df"}, + {file = "grpcio-1.60.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:fb464479934778d7cc5baf463d959d361954d6533ad34c3a4f1d267e86ee25fd"}, + {file = "grpcio-1.60.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:4b44d7e39964e808b071714666a812049765b26b3ea48c4434a3b317bac82f14"}, + {file = "grpcio-1.60.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:90bdd76b3f04bdb21de5398b8a7c629676c81dfac290f5f19883857e9371d28c"}, + {file = "grpcio-1.60.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91229d7203f1ef0ab420c9b53fe2ca5c1fbeb34f69b3bc1b5089466237a4a134"}, + {file = "grpcio-1.60.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b36a2c6d4920ba88fa98075fdd58ff94ebeb8acc1215ae07d01a418af4c0253"}, + {file = "grpcio-1.60.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:297eef542156d6b15174a1231c2493ea9ea54af8d016b8ca7d5d9cc65cfcc444"}, + {file = "grpcio-1.60.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:87c9224acba0ad8bacddf427a1c2772e17ce50b3042a789547af27099c5f751d"}, + {file = "grpcio-1.60.0-cp311-cp311-win32.whl", hash = "sha256:95ae3e8e2c1b9bf671817f86f155c5da7d49a2289c5cf27a319458c3e025c320"}, + {file = "grpcio-1.60.0-cp311-cp311-win_amd64.whl", hash = "sha256:467a7d31554892eed2aa6c2d47ded1079fc40ea0b9601d9f79204afa8902274b"}, + {file = "grpcio-1.60.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:a7152fa6e597c20cb97923407cf0934e14224af42c2b8d915f48bc3ad2d9ac18"}, + {file = "grpcio-1.60.0-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:7db16dd4ea1b05ada504f08d0dca1cd9b926bed3770f50e715d087c6f00ad748"}, + {file = "grpcio-1.60.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:b0571a5aef36ba9177e262dc88a9240c866d903a62799e44fd4aae3f9a2ec17e"}, + {file = "grpcio-1.60.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fd9584bf1bccdfff1512719316efa77be235469e1e3295dce64538c4773840b"}, + {file = "grpcio-1.60.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6a478581b1a1a8fdf3318ecb5f4d0cda41cacdffe2b527c23707c9c1b8fdb55"}, + {file = "grpcio-1.60.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:77c8a317f0fd5a0a2be8ed5cbe5341537d5c00bb79b3bb27ba7c5378ba77dbca"}, + {file = "grpcio-1.60.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1c30bb23a41df95109db130a6cc1b974844300ae2e5d68dd4947aacba5985aa5"}, + {file = "grpcio-1.60.0-cp312-cp312-win32.whl", hash = "sha256:2aef56e85901c2397bd557c5ba514f84de1f0ae5dd132f5d5fed042858115951"}, + {file = "grpcio-1.60.0-cp312-cp312-win_amd64.whl", hash = "sha256:e381fe0c2aa6c03b056ad8f52f8efca7be29fb4d9ae2f8873520843b6039612a"}, + {file = "grpcio-1.60.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:92f88ca1b956eb8427a11bb8b4a0c0b2b03377235fc5102cb05e533b8693a415"}, + {file = "grpcio-1.60.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:e278eafb406f7e1b1b637c2cf51d3ad45883bb5bd1ca56bc05e4fc135dfdaa65"}, + {file = "grpcio-1.60.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:a48edde788b99214613e440fce495bbe2b1e142a7f214cce9e0832146c41e324"}, + {file = "grpcio-1.60.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de2ad69c9a094bf37c1102b5744c9aec6cf74d2b635558b779085d0263166454"}, + {file = "grpcio-1.60.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:073f959c6f570797272f4ee9464a9997eaf1e98c27cb680225b82b53390d61e6"}, + {file = "grpcio-1.60.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c826f93050c73e7769806f92e601e0efdb83ec8d7c76ddf45d514fee54e8e619"}, + {file = "grpcio-1.60.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9e30be89a75ee66aec7f9e60086fadb37ff8c0ba49a022887c28c134341f7179"}, + {file = "grpcio-1.60.0-cp37-cp37m-win_amd64.whl", hash = "sha256:b0fb2d4801546598ac5cd18e3ec79c1a9af8b8f2a86283c55a5337c5aeca4b1b"}, + {file = "grpcio-1.60.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:9073513ec380434eb8d21970e1ab3161041de121f4018bbed3146839451a6d8e"}, + {file = "grpcio-1.60.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:74d7d9fa97809c5b892449b28a65ec2bfa458a4735ddad46074f9f7d9550ad13"}, + {file = "grpcio-1.60.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:1434ca77d6fed4ea312901122dc8da6c4389738bf5788f43efb19a838ac03ead"}, + {file = "grpcio-1.60.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e61e76020e0c332a98290323ecfec721c9544f5b739fab925b6e8cbe1944cf19"}, + {file = "grpcio-1.60.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675997222f2e2f22928fbba640824aebd43791116034f62006e19730715166c0"}, + {file = "grpcio-1.60.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5208a57eae445ae84a219dfd8b56e04313445d146873117b5fa75f3245bc1390"}, + {file = "grpcio-1.60.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:428d699c8553c27e98f4d29fdc0f0edc50e9a8a7590bfd294d2edb0da7be3629"}, + {file = "grpcio-1.60.0-cp38-cp38-win32.whl", hash = "sha256:83f2292ae292ed5a47cdcb9821039ca8e88902923198f2193f13959360c01860"}, + {file = "grpcio-1.60.0-cp38-cp38-win_amd64.whl", hash = "sha256:705a68a973c4c76db5d369ed573fec3367d7d196673fa86614b33d8c8e9ebb08"}, + {file = "grpcio-1.60.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:c193109ca4070cdcaa6eff00fdb5a56233dc7610216d58fb81638f89f02e4968"}, + {file = "grpcio-1.60.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:676e4a44e740deaba0f4d95ba1d8c5c89a2fcc43d02c39f69450b1fa19d39590"}, + {file = "grpcio-1.60.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5ff21e000ff2f658430bde5288cb1ac440ff15c0d7d18b5fb222f941b46cb0d2"}, + {file = "grpcio-1.60.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c86343cf9ff7b2514dd229bdd88ebba760bd8973dac192ae687ff75e39ebfab"}, + {file = "grpcio-1.60.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fd3b3968ffe7643144580f260f04d39d869fcc2cddb745deef078b09fd2b328"}, + {file = "grpcio-1.60.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:30943b9530fe3620e3b195c03130396cd0ee3a0d10a66c1bee715d1819001eaf"}, + {file = "grpcio-1.60.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b10241250cb77657ab315270b064a6c7f1add58af94befa20687e7c8d8603ae6"}, + {file = "grpcio-1.60.0-cp39-cp39-win32.whl", hash = "sha256:79a050889eb8d57a93ed21d9585bb63fca881666fc709f5d9f7f9372f5e7fd03"}, + {file = "grpcio-1.60.0-cp39-cp39-win_amd64.whl", hash = "sha256:8a97a681e82bc11a42d4372fe57898d270a2707f36c45c6676e49ce0d5c41353"}, + {file = "grpcio-1.60.0.tar.gz", hash = "sha256:2199165a1affb666aa24adf0c97436686d0a61bc5fc113c037701fb7c7fceb96"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.60.0)"] [[package]] name = "h5py" @@ -1014,13 +1018,13 @@ numpy = ">=1.17.3" [[package]] name = "huggingface-hub" -version = "0.19.4" +version = "0.20.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.19.4-py3-none-any.whl", hash = "sha256:dba013f779da16f14b606492828f3760600a1e1801432d09fe1c33e50b825bb5"}, - {file = "huggingface_hub-0.19.4.tar.gz", hash = "sha256:176a4fc355a851c17550e7619488f383189727eab209534d7cef2114dae77b22"}, + {file = "huggingface_hub-0.20.3-py3-none-any.whl", hash = "sha256:d988ae4f00d3e307b0c80c6a05ca6dbb7edba8bba3079f74cda7d9c2e562a7b6"}, + {file = "huggingface_hub-0.20.3.tar.gz", hash = "sha256:94e7f8e074475fbc67d6a71957b678e1b4a74ff1b64a644fd6cbb83da962d05d"}, ] [package.dependencies] @@ -1033,15 +1037,14 @@ tqdm = ">=4.42.1" typing-extensions = ">=3.7.4.3" [package.extras] -all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "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", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "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", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] -docs = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "hf-doc-builder", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)", "watchdog"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "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"] inference = ["aiohttp", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)"] quality = ["mypy (==1.5.1)", "ruff (>=0.1.3)"] tensorflow = ["graphviz", "pydot", "tensorflow"] -testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] torch = ["torch"] typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] @@ -1110,13 +1113,13 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.0.0" +version = "7.0.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.0.0-py3-none-any.whl", hash = "sha256:d97503976bb81f40a193d41ee6570868479c69d5068651eb039c40d850c59d67"}, - {file = "importlib_metadata-7.0.0.tar.gz", hash = "sha256:7fc841f8b8332803464e5dc1c63a2e59121f46ca186c0e2e182e80bf8c1319f7"}, + {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, + {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, ] [package.dependencies] @@ -1131,7 +1134,7 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs name = "importlib-resources" version = "6.1.1" description = "Read resources from Python packages" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, @@ -1195,20 +1198,17 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pa [[package]] name = "isort" -version = "5.12.0" +version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" files = [ - {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, - {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, ] [package.extras] -colors = ["colorama (>=0.4.3)"] -pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] -plugins = ["setuptools"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] +colors = ["colorama (>=0.4.6)"] [[package]] name = "itsdangerous" @@ -1306,7 +1306,7 @@ tests = ["black", "flake8", "isort", "namex", "pandas", "portpicker", "pytest", name = "kiwisolver" version = "1.4.5" description = "A fast implementation of the Cassowary constraint solver" -optional = false +optional = true python-versions = ">=3.7" files = [ {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, @@ -1442,47 +1442,48 @@ six = ">=1.4.1" [[package]] name = "lazy-object-proxy" -version = "1.9.0" +version = "1.10.0" description = "A fast and thorough lazy object proxy." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, + {file = "lazy-object-proxy-1.10.0.tar.gz", hash = "sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab7004cf2e59f7c2e4345604a3e6ea0d92ac44e1c2375527d56492014e690c3"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc0d2fc424e54c70c4bc06787e4072c4f3b1aa2f897dfdc34ce1013cf3ceef05"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e2adb09778797da09d2b5ebdbceebf7dd32e2c96f79da9052b2e87b6ea495895"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1f711e2c6dcd4edd372cf5dec5c5a30d23bba06ee012093267b3376c079ec83"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-win32.whl", hash = "sha256:76a095cfe6045c7d0ca77db9934e8f7b71b14645f0094ffcd842349ada5c5fb9"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:b4f87d4ed9064b2628da63830986c3d2dca7501e6018347798313fcf028e2fd4"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fec03caabbc6b59ea4a638bee5fce7117be8e99a4103d9d5ad77f15d6f81020c"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02c83f957782cbbe8136bee26416686a6ae998c7b6191711a04da776dc9e47d4"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009e6bb1f1935a62889ddc8541514b6a9e1fcf302667dcb049a0be5c8f613e56"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75fc59fc450050b1b3c203c35020bc41bd2695ed692a392924c6ce180c6f1dc9"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:782e2c9b2aab1708ffb07d4bf377d12901d7a1d99e5e410d648d892f8967ab1f"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-win32.whl", hash = "sha256:edb45bb8278574710e68a6b021599a10ce730d156e5b254941754a9cc0b17d03"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:e271058822765ad5e3bca7f05f2ace0de58a3f4e62045a8c90a0dfd2f8ad8cc6"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e98c8af98d5707dcdecc9ab0863c0ea6e88545d42ca7c3feffb6b4d1e370c7ba"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:952c81d415b9b80ea261d2372d2a4a2332a3890c2b83e0535f263ddfe43f0d43"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80b39d3a151309efc8cc48675918891b865bdf742a8616a337cb0090791a0de9"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e221060b701e2aa2ea991542900dd13907a5c90fa80e199dbf5a03359019e7a3"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:92f09ff65ecff3108e56526f9e2481b8116c0b9e1425325e13245abfd79bdb1b"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-win32.whl", hash = "sha256:3ad54b9ddbe20ae9f7c1b29e52f123120772b06dbb18ec6be9101369d63a4074"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:127a789c75151db6af398b8972178afe6bda7d6f68730c057fbbc2e96b08d282"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4ed0518a14dd26092614412936920ad081a424bdcb54cc13349a8e2c6d106a"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ad9e6ed739285919aa9661a5bbed0aaf410aa60231373c5579c6b4801bd883c"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc0a92c02fa1ca1e84fc60fa258458e5bf89d90a1ddaeb8ed9cc3147f417255"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0aefc7591920bbd360d57ea03c995cebc204b424524a5bd78406f6e1b8b2a5d8"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5faf03a7d8942bb4476e3b62fd0f4cf94eaf4618e304a19865abf89a35c0bbee"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-win32.whl", hash = "sha256:e333e2324307a7b5d86adfa835bb500ee70bfcd1447384a822e96495796b0ca4"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:cb73507defd385b7705c599a94474b1d5222a508e502553ef94114a143ec6696"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:366c32fe5355ef5fc8a232c5436f4cc66e9d3e8967c01fb2e6302fd6627e3d94"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2297f08f08a2bb0d32a4265e98a006643cd7233fb7983032bd61ac7a02956b3b"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18dd842b49456aaa9a7cf535b04ca4571a302ff72ed8740d06b5adcd41fe0757"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:217138197c170a2a74ca0e05bddcd5f1796c735c37d0eee33e43259b192aa424"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a3a87cf1e133e5b1994144c12ca4aa3d9698517fe1e2ca82977781b16955658"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-win32.whl", hash = "sha256:30b339b2a743c5288405aa79a69e706a06e02958eab31859f7f3c04980853b70"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:a899b10e17743683b293a729d3a11f2f399e8a90c73b089e29f5d0fe3509f0dd"}, + {file = "lazy_object_proxy-1.10.0-pp310.pp311.pp312.pp38.pp39-none-any.whl", hash = "sha256:80fa48bd89c8f2f456fc0765c11c23bf5af827febacd2f523ca5bc1893fcc09d"}, ] [[package]] @@ -1492,8 +1493,6 @@ description = "Clang Python Bindings, mirrored from the official LLVM repo: http optional = true python-versions = "*" files = [ - {file = "libclang-16.0.6-1-py2.py3-none-manylinux2014_aarch64.whl", hash = "sha256:88bc7e7b393c32e41e03ba77ef02fdd647da1f764c2cd028e69e0837080b79f6"}, - {file = "libclang-16.0.6-1-py2.py3-none-manylinux2014_armv7l.whl", hash = "sha256:d80ed5827736ed5ec2bcedf536720476fd9d4fa4c79ef0cb24aea4c59332f361"}, {file = "libclang-16.0.6-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:da9e47ebc3f0a6d90fb169ef25f9fbcd29b4a4ef97a8b0e3e3a17800af1423f4"}, {file = "libclang-16.0.6-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:e1a5ad1e895e5443e205568c85c04b4608e4e973dae42f4dfd9cb46c81d1486b"}, {file = "libclang-16.0.6-py2.py3-none-manylinux2010_x86_64.whl", hash = "sha256:9dcdc730939788b8b69ffd6d5d75fe5366e3ee007f1e36a99799ec0b0c001492"}, @@ -1507,13 +1506,13 @@ files = [ [[package]] name = "markdown" -version = "3.5.1" +version = "3.5.2" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "Markdown-3.5.1-py3-none-any.whl", hash = "sha256:5874b47d4ee3f0b14d764324d2c94c03ea66bee56f2d929da9f2508d65e722dc"}, - {file = "Markdown-3.5.1.tar.gz", hash = "sha256:b65d7beb248dc22f2e8a31fb706d93798093c308dc1aba295aedeb9d41a813bd"}, + {file = "Markdown-3.5.2-py3-none-any.whl", hash = "sha256:d43323865d89fc0cb9b20c75fc8ad313af307cc087e84b657d9eec768eddeadd"}, + {file = "Markdown-3.5.2.tar.gz", hash = "sha256:e1ac7b3dc550ee80e602e71c1d168002f062e49f1b11e26a36264dafd4df2ef8"}, ] [package.dependencies] @@ -1525,78 +1524,78 @@ testing = ["coverage", "pyyaml"] [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.4" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-win32.whl", hash = "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-win32.whl", hash = "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-win32.whl", hash = "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-win32.whl", hash = "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-win32.whl", hash = "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-win32.whl", hash = "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959"}, + {file = "MarkupSafe-2.1.4.tar.gz", hash = "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f"}, ] [[package]] name = "matplotlib" version = "3.8.2" description = "Python plotting package" -optional = false +optional = true python-versions = ">=3.9" files = [ {file = "matplotlib-3.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:09796f89fb71a0c0e1e2f4bdaf63fb2cefc84446bb963ecdeb40dfee7dfa98c7"}, @@ -1732,13 +1731,13 @@ tests = ["pytest (>=4.6)"] [[package]] name = "nest-asyncio" -version = "1.5.8" +version = "1.6.0" description = "Patch asyncio to allow nested event loops" optional = false python-versions = ">=3.5" files = [ - {file = "nest_asyncio-1.5.8-py3-none-any.whl", hash = "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d"}, - {file = "nest_asyncio-1.5.8.tar.gz", hash = "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb"}, + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, ] [[package]] @@ -2041,7 +2040,7 @@ ptyprocess = ">=0.5" name = "pillow" version = "10.2.0" description = "Python Imaging Library (Fork)" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, @@ -2154,13 +2153,13 @@ tenacity = ">=6.2.0" [[package]] name = "pluggy" -version = "1.3.0" +version = "1.4.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, + {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, + {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, ] [package.extras] @@ -2169,13 +2168,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "prompt-toolkit" -version = "3.0.41" +version = "3.0.43" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.41-py3-none-any.whl", hash = "sha256:f36fe301fafb7470e86aaf90f036eef600a3210be4decf461a5b1ca8403d3cb2"}, - {file = "prompt_toolkit-3.0.41.tar.gz", hash = "sha256:941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0"}, + {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, + {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, ] [package.dependencies] @@ -2183,52 +2182,24 @@ wcwidth = "*" [[package]] name = "protobuf" -version = "4.25.1" +version = "4.25.2" description = "" optional = true python-versions = ">=3.8" files = [ - {file = "protobuf-4.25.1-cp310-abi3-win32.whl", hash = "sha256:193f50a6ab78a970c9b4f148e7c750cfde64f59815e86f686c22e26b4fe01ce7"}, - {file = "protobuf-4.25.1-cp310-abi3-win_amd64.whl", hash = "sha256:3497c1af9f2526962f09329fd61a36566305e6c72da2590ae0d7d1322818843b"}, - {file = "protobuf-4.25.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:0bf384e75b92c42830c0a679b0cd4d6e2b36ae0cf3dbb1e1dfdda48a244f4bcd"}, - {file = "protobuf-4.25.1-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:0f881b589ff449bf0b931a711926e9ddaad3b35089cc039ce1af50b21a4ae8cb"}, - {file = "protobuf-4.25.1-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:ca37bf6a6d0046272c152eea90d2e4ef34593aaa32e8873fc14c16440f22d4b7"}, - {file = "protobuf-4.25.1-cp38-cp38-win32.whl", hash = "sha256:abc0525ae2689a8000837729eef7883b9391cd6aa7950249dcf5a4ede230d5dd"}, - {file = "protobuf-4.25.1-cp38-cp38-win_amd64.whl", hash = "sha256:1484f9e692091450e7edf418c939e15bfc8fc68856e36ce399aed6889dae8bb0"}, - {file = "protobuf-4.25.1-cp39-cp39-win32.whl", hash = "sha256:8bdbeaddaac52d15c6dce38c71b03038ef7772b977847eb6d374fc86636fa510"}, - {file = "protobuf-4.25.1-cp39-cp39-win_amd64.whl", hash = "sha256:becc576b7e6b553d22cbdf418686ee4daa443d7217999125c045ad56322dda10"}, - {file = "protobuf-4.25.1-py3-none-any.whl", hash = "sha256:a19731d5e83ae4737bb2a089605e636077ac001d18781b3cf489b9546c7c80d6"}, - {file = "protobuf-4.25.1.tar.gz", hash = "sha256:57d65074b4f5baa4ab5da1605c02be90ac20c8b40fb137d6a8df9f416b0d0ce2"}, -] - -[[package]] -name = "psutil" -version = "5.9.6" -description = "Cross-platform lib for process and system monitoring in Python." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "psutil-5.9.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:fb8a697f11b0f5994550555fcfe3e69799e5b060c8ecf9e2f75c69302cc35c0d"}, - {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:91ecd2d9c00db9817a4b4192107cf6954addb5d9d67a969a4f436dbc9200f88c"}, - {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:10e8c17b4f898d64b121149afb136c53ea8b68c7531155147867b7b1ac9e7e28"}, - {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:18cd22c5db486f33998f37e2bb054cc62fd06646995285e02a51b1e08da97017"}, - {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ca2780f5e038379e520281e4c032dddd086906ddff9ef0d1b9dcf00710e5071c"}, - {file = "psutil-5.9.6-cp27-none-win32.whl", hash = "sha256:70cb3beb98bc3fd5ac9ac617a327af7e7f826373ee64c80efd4eb2856e5051e9"}, - {file = "psutil-5.9.6-cp27-none-win_amd64.whl", hash = "sha256:51dc3d54607c73148f63732c727856f5febec1c7c336f8f41fcbd6315cce76ac"}, - {file = "psutil-5.9.6-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c69596f9fc2f8acd574a12d5f8b7b1ba3765a641ea5d60fb4736bf3c08a8214a"}, - {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92e0cc43c524834af53e9d3369245e6cc3b130e78e26100d1f63cdb0abeb3d3c"}, - {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4"}, - {file = "psutil-5.9.6-cp36-cp36m-win32.whl", hash = "sha256:3ebf2158c16cc69db777e3c7decb3c0f43a7af94a60d72e87b2823aebac3d602"}, - {file = "psutil-5.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:ff18b8d1a784b810df0b0fff3bcb50ab941c3b8e2c8de5726f9c71c601c611aa"}, - {file = "psutil-5.9.6-cp37-abi3-win32.whl", hash = "sha256:a6f01f03bf1843280f4ad16f4bde26b817847b4c1a0db59bf6419807bc5ce05c"}, - {file = "psutil-5.9.6-cp37-abi3-win_amd64.whl", hash = "sha256:6e5fb8dc711a514da83098bc5234264e551ad980cec5f85dabf4d38ed6f15e9a"}, - {file = "psutil-5.9.6-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:daecbcbd29b289aac14ece28eca6a3e60aa361754cf6da3dfb20d4d32b6c7f57"}, - {file = "psutil-5.9.6.tar.gz", hash = "sha256:e4b92ddcd7dd4cdd3f900180ea1e104932c7bce234fb88976e2a3b296441225a"}, + {file = "protobuf-4.25.2-cp310-abi3-win32.whl", hash = "sha256:b50c949608682b12efb0b2717f53256f03636af5f60ac0c1d900df6213910fd6"}, + {file = "protobuf-4.25.2-cp310-abi3-win_amd64.whl", hash = "sha256:8f62574857ee1de9f770baf04dde4165e30b15ad97ba03ceac65f760ff018ac9"}, + {file = "protobuf-4.25.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:2db9f8fa64fbdcdc93767d3cf81e0f2aef176284071507e3ede160811502fd3d"}, + {file = "protobuf-4.25.2-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:10894a2885b7175d3984f2be8d9850712c57d5e7587a2410720af8be56cdaf62"}, + {file = "protobuf-4.25.2-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:fc381d1dd0516343f1440019cedf08a7405f791cd49eef4ae1ea06520bc1c020"}, + {file = "protobuf-4.25.2-cp38-cp38-win32.whl", hash = "sha256:33a1aeef4b1927431d1be780e87b641e322b88d654203a9e9d93f218ee359e61"}, + {file = "protobuf-4.25.2-cp38-cp38-win_amd64.whl", hash = "sha256:47f3de503fe7c1245f6f03bea7e8d3ec11c6c4a2ea9ef910e3221c8a15516d62"}, + {file = "protobuf-4.25.2-cp39-cp39-win32.whl", hash = "sha256:5e5c933b4c30a988b52e0b7c02641760a5ba046edc5e43d3b94a74c9fc57c1b3"}, + {file = "protobuf-4.25.2-cp39-cp39-win_amd64.whl", hash = "sha256:d66a769b8d687df9024f2985d5137a337f957a0916cf5464d1513eee96a63ff0"}, + {file = "protobuf-4.25.2-py3-none-any.whl", hash = "sha256:a8b7a98d4ce823303145bf3c1a8bdb0f2f4642a414b196f04ad9853ed0c8f830"}, + {file = "protobuf-4.25.2.tar.gz", hash = "sha256:fe599e175cb347efc8ee524bcd4b902d11f7262c0e569ececcb89995c15f0a5e"}, ] -[package.extras] -test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] - [[package]] name = "ptyprocess" version = "0.7.0" @@ -2326,47 +2297,47 @@ pybtex = ">=0.16" [[package]] name = "pydantic" -version = "1.10.13" +version = "1.10.14" description = "Data validation and settings management using python type hints" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic-1.10.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:efff03cc7a4f29d9009d1c96ceb1e7a70a65cfe86e89d34e4a5f2ab1e5693737"}, - {file = "pydantic-1.10.13-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ecea2b9d80e5333303eeb77e180b90e95eea8f765d08c3d278cd56b00345d01"}, - {file = "pydantic-1.10.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1740068fd8e2ef6eb27a20e5651df000978edce6da6803c2bef0bc74540f9548"}, - {file = "pydantic-1.10.13-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84bafe2e60b5e78bc64a2941b4c071a4b7404c5c907f5f5a99b0139781e69ed8"}, - {file = "pydantic-1.10.13-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bc0898c12f8e9c97f6cd44c0ed70d55749eaf783716896960b4ecce2edfd2d69"}, - {file = "pydantic-1.10.13-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:654db58ae399fe6434e55325a2c3e959836bd17a6f6a0b6ca8107ea0571d2e17"}, - {file = "pydantic-1.10.13-cp310-cp310-win_amd64.whl", hash = "sha256:75ac15385a3534d887a99c713aa3da88a30fbd6204a5cd0dc4dab3d770b9bd2f"}, - {file = "pydantic-1.10.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c553f6a156deb868ba38a23cf0df886c63492e9257f60a79c0fd8e7173537653"}, - {file = "pydantic-1.10.13-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5e08865bc6464df8c7d61439ef4439829e3ab62ab1669cddea8dd00cd74b9ffe"}, - {file = "pydantic-1.10.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e31647d85a2013d926ce60b84f9dd5300d44535a9941fe825dc349ae1f760df9"}, - {file = "pydantic-1.10.13-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:210ce042e8f6f7c01168b2d84d4c9eb2b009fe7bf572c2266e235edf14bacd80"}, - {file = "pydantic-1.10.13-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8ae5dd6b721459bfa30805f4c25880e0dd78fc5b5879f9f7a692196ddcb5a580"}, - {file = "pydantic-1.10.13-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f8e81fc5fb17dae698f52bdd1c4f18b6ca674d7068242b2aff075f588301bbb0"}, - {file = "pydantic-1.10.13-cp311-cp311-win_amd64.whl", hash = "sha256:61d9dce220447fb74f45e73d7ff3b530e25db30192ad8d425166d43c5deb6df0"}, - {file = "pydantic-1.10.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4b03e42ec20286f052490423682016fd80fda830d8e4119f8ab13ec7464c0132"}, - {file = "pydantic-1.10.13-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f59ef915cac80275245824e9d771ee939133be38215555e9dc90c6cb148aaeb5"}, - {file = "pydantic-1.10.13-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a1f9f747851338933942db7af7b6ee8268568ef2ed86c4185c6ef4402e80ba8"}, - {file = "pydantic-1.10.13-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:97cce3ae7341f7620a0ba5ef6cf043975cd9d2b81f3aa5f4ea37928269bc1b87"}, - {file = "pydantic-1.10.13-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854223752ba81e3abf663d685f105c64150873cc6f5d0c01d3e3220bcff7d36f"}, - {file = "pydantic-1.10.13-cp37-cp37m-win_amd64.whl", hash = "sha256:b97c1fac8c49be29486df85968682b0afa77e1b809aff74b83081cc115e52f33"}, - {file = "pydantic-1.10.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c958d053453a1c4b1c2062b05cd42d9d5c8eb67537b8d5a7e3c3032943ecd261"}, - {file = "pydantic-1.10.13-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4c5370a7edaac06daee3af1c8b1192e305bc102abcbf2a92374b5bc793818599"}, - {file = "pydantic-1.10.13-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d6f6e7305244bddb4414ba7094ce910560c907bdfa3501e9db1a7fd7eaea127"}, - {file = "pydantic-1.10.13-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3a3c792a58e1622667a2837512099eac62490cdfd63bd407993aaf200a4cf1f"}, - {file = "pydantic-1.10.13-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c636925f38b8db208e09d344c7aa4f29a86bb9947495dd6b6d376ad10334fb78"}, - {file = "pydantic-1.10.13-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:678bcf5591b63cc917100dc50ab6caebe597ac67e8c9ccb75e698f66038ea953"}, - {file = "pydantic-1.10.13-cp38-cp38-win_amd64.whl", hash = "sha256:6cf25c1a65c27923a17b3da28a0bdb99f62ee04230c931d83e888012851f4e7f"}, - {file = "pydantic-1.10.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8ef467901d7a41fa0ca6db9ae3ec0021e3f657ce2c208e98cd511f3161c762c6"}, - {file = "pydantic-1.10.13-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:968ac42970f57b8344ee08837b62f6ee6f53c33f603547a55571c954a4225691"}, - {file = "pydantic-1.10.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9849f031cf8a2f0a928fe885e5a04b08006d6d41876b8bbd2fc68a18f9f2e3fd"}, - {file = "pydantic-1.10.13-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56e3ff861c3b9c6857579de282ce8baabf443f42ffba355bf070770ed63e11e1"}, - {file = "pydantic-1.10.13-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f00790179497767aae6bcdc36355792c79e7bbb20b145ff449700eb076c5f96"}, - {file = "pydantic-1.10.13-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:75b297827b59bc229cac1a23a2f7a4ac0031068e5be0ce385be1462e7e17a35d"}, - {file = "pydantic-1.10.13-cp39-cp39-win_amd64.whl", hash = "sha256:e70ca129d2053fb8b728ee7d1af8e553a928d7e301a311094b8a0501adc8763d"}, - {file = "pydantic-1.10.13-py3-none-any.whl", hash = "sha256:b87326822e71bd5f313e7d3bfdc77ac3247035ac10b0c0618bd99dcf95b1e687"}, - {file = "pydantic-1.10.13.tar.gz", hash = "sha256:32c8b48dcd3b2ac4e78b0ba4af3a2c2eb6048cb75202f0ea7b34feb740efc340"}, + {file = "pydantic-1.10.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f4fcec873f90537c382840f330b90f4715eebc2bc9925f04cb92de593eae054"}, + {file = "pydantic-1.10.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e3a76f571970fcd3c43ad982daf936ae39b3e90b8a2e96c04113a369869dc87"}, + {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d886bd3c3fbeaa963692ef6b643159ccb4b4cefaf7ff1617720cbead04fd1d"}, + {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:798a3d05ee3b71967844a1164fd5bdb8c22c6d674f26274e78b9f29d81770c4e"}, + {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:23d47a4b57a38e8652bcab15a658fdb13c785b9ce217cc3a729504ab4e1d6bc9"}, + {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9f674b5c3bebc2eba401de64f29948ae1e646ba2735f884d1594c5f675d6f2a"}, + {file = "pydantic-1.10.14-cp310-cp310-win_amd64.whl", hash = "sha256:24a7679fab2e0eeedb5a8924fc4a694b3bcaac7d305aeeac72dd7d4e05ecbebf"}, + {file = "pydantic-1.10.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d578ac4bf7fdf10ce14caba6f734c178379bd35c486c6deb6f49006e1ba78a7"}, + {file = "pydantic-1.10.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa7790e94c60f809c95602a26d906eba01a0abee9cc24150e4ce2189352deb1b"}, + {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad4e10efa5474ed1a611b6d7f0d130f4aafadceb73c11d9e72823e8f508e663"}, + {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1245f4f61f467cb3dfeced2b119afef3db386aec3d24a22a1de08c65038b255f"}, + {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:21efacc678a11114c765eb52ec0db62edffa89e9a562a94cbf8fa10b5db5c046"}, + {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:412ab4a3f6dbd2bf18aefa9f79c7cca23744846b31f1d6555c2ee2b05a2e14ca"}, + {file = "pydantic-1.10.14-cp311-cp311-win_amd64.whl", hash = "sha256:e897c9f35281f7889873a3e6d6b69aa1447ceb024e8495a5f0d02ecd17742a7f"}, + {file = "pydantic-1.10.14-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d604be0f0b44d473e54fdcb12302495fe0467c56509a2f80483476f3ba92b33c"}, + {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42c7d17706911199798d4c464b352e640cab4351efe69c2267823d619a937e5"}, + {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:596f12a1085e38dbda5cbb874d0973303e34227b400b6414782bf205cc14940c"}, + {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bfb113860e9288d0886e3b9e49d9cf4a9d48b441f52ded7d96db7819028514cc"}, + {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bc3ed06ab13660b565eed80887fcfbc0070f0aa0691fbb351657041d3e874efe"}, + {file = "pydantic-1.10.14-cp37-cp37m-win_amd64.whl", hash = "sha256:ad8c2bc677ae5f6dbd3cf92f2c7dc613507eafe8f71719727cbc0a7dec9a8c01"}, + {file = "pydantic-1.10.14-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c37c28449752bb1f47975d22ef2882d70513c546f8f37201e0fec3a97b816eee"}, + {file = "pydantic-1.10.14-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49a46a0994dd551ec051986806122767cf144b9702e31d47f6d493c336462597"}, + {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53e3819bd20a42470d6dd0fe7fc1c121c92247bca104ce608e609b59bc7a77ee"}, + {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbb503bbbbab0c588ed3cd21975a1d0d4163b87e360fec17a792f7d8c4ff29f"}, + {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:336709883c15c050b9c55a63d6c7ff09be883dbc17805d2b063395dd9d9d0022"}, + {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4ae57b4d8e3312d486e2498d42aed3ece7b51848336964e43abbf9671584e67f"}, + {file = "pydantic-1.10.14-cp38-cp38-win_amd64.whl", hash = "sha256:dba49d52500c35cfec0b28aa8b3ea5c37c9df183ffc7210b10ff2a415c125c4a"}, + {file = "pydantic-1.10.14-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c66609e138c31cba607d8e2a7b6a5dc38979a06c900815495b2d90ce6ded35b4"}, + {file = "pydantic-1.10.14-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d986e115e0b39604b9eee3507987368ff8148222da213cd38c359f6f57b3b347"}, + {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:646b2b12df4295b4c3148850c85bff29ef6d0d9621a8d091e98094871a62e5c7"}, + {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282613a5969c47c83a8710cc8bfd1e70c9223feb76566f74683af889faadc0ea"}, + {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:466669501d08ad8eb3c4fecd991c5e793c4e0bbd62299d05111d4f827cded64f"}, + {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:13e86a19dca96373dcf3190fcb8797d40a6f12f154a244a8d1e8e03b8f280593"}, + {file = "pydantic-1.10.14-cp39-cp39-win_amd64.whl", hash = "sha256:08b6ec0917c30861e3fe71a93be1648a2aa4f62f866142ba21670b24444d7fd8"}, + {file = "pydantic-1.10.14-py3-none-any.whl", hash = "sha256:8ee853cd12ac2ddbf0ecbac1c289f95882b2d4482258048079d13be700aa114c"}, + {file = "pydantic-1.10.14.tar.gz", hash = "sha256:46f17b832fe27de7850896f3afee50ea682220dd218f7e9c88d436788419dca6"}, ] [package.dependencies] @@ -2438,7 +2409,7 @@ testutils = ["gitpython (>3)"] name = "pyparsing" version = "3.1.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" -optional = false +optional = true python-versions = ">=3.6.8" files = [ {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, @@ -2481,13 +2452,13 @@ files = [ [[package]] name = "pytest" -version = "7.4.3" +version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"}, - {file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"}, + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, ] [package.dependencies] @@ -2586,7 +2557,6 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -2623,34 +2593,32 @@ files = [ [[package]] name = "qibo" -version = "0.2.3" +version = "0.2.4" description = "A framework for quantum computing with hardware acceleration." optional = false python-versions = ">=3.9,<3.12" files = [ - {file = "qibo-0.2.3-py3-none-any.whl", hash = "sha256:53e649c57bf17c75ccafff804633d99aab595a4cbf42b3c42d625764c3dbb5b6"}, - {file = "qibo-0.2.3.tar.gz", hash = "sha256:ad375d47499781c9a0c942fcbd3747c84346e4c671e40fca34797929a2f509b3"}, + {file = "qibo-0.2.4-py3-none-any.whl", hash = "sha256:5aaf7693004d8106eff3cc614e20ff03e7016742ab129e7ece76c84b3deb7366"}, + {file = "qibo-0.2.4.tar.gz", hash = "sha256:8ab8519b107fdfa57a7aa19d9243403437ceb4a776454816ce3071a00bdc15ff"}, ] [package.dependencies] cma = ">=3.3.0,<4.0.0" hyperopt = ">=0.2.7,<0.3.0" joblib = ">=1.2.0,<2.0.0" -matplotlib = ">=3.7.0,<4.0.0" -psutil = ">=5.9.4,<6.0.0" scipy = ">=1.10.1,<2.0.0" sympy = ">=1.11.1,<2.0.0" tabulate = ">=0.9.0,<0.10.0" [[package]] name = "qibolab" -version = "0.1.4" +version = "0.1.5" description = "Quantum hardware module and drivers for Qibo" optional = false python-versions = ">=3.9,<3.12" files = [ - {file = "qibolab-0.1.4-py3-none-any.whl", hash = "sha256:cbab4d6737858a66e0c4de056c094aec87d8495e21f4c45474c0cd633b1945a3"}, - {file = "qibolab-0.1.4.tar.gz", hash = "sha256:af05dbcc6e7ce4240f00cd51331502fda81b23f6b4ace64aeb21782f4274df48"}, + {file = "qibolab-0.1.5-py3-none-any.whl", hash = "sha256:589f5c73ccb92b628a01cef0a02ae40ab42f27558cae6dd1b45b570a00005c33"}, + {file = "qibolab-0.1.5.tar.gz", hash = "sha256:2c8717a3e5d8a22106d05833116edf76fb09c0ba8da0ae48efb8666b5814d690"}, ] [package.dependencies] @@ -2666,7 +2634,7 @@ los = ["qcodes (>=0.37.0,<0.38.0)", "qcodes_contrib_drivers (==0.18.0)"] qblox = ["pyvisa-py (==0.5.3)", "qblox-instruments (==0.11.0)", "qcodes (>=0.37.0,<0.38.0)", "qcodes_contrib_drivers (==0.18.0)"] qm = ["qm-qua (==1.1.1)", "qualang-tools (==0.14.0)"] rfsoc = ["qibosoq (>=0.0.4,<0.2)"] -zh = ["laboneq (==2.20.1)"] +zh = ["laboneq (==2.21.0)"] [[package]] name = "recommonmark" @@ -2753,92 +2721,107 @@ pyasn1 = ">=0.1.3" [[package]] name = "scikit-learn" -version = "1.3.2" +version = "1.4.0" description = "A set of python modules for machine learning and data mining" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "scikit-learn-1.3.2.tar.gz", hash = "sha256:a2f54c76accc15a34bfb9066e6c7a56c1e7235dda5762b990792330b52ccfb05"}, - {file = "scikit_learn-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e326c0eb5cf4d6ba40f93776a20e9a7a69524c4db0757e7ce24ba222471ee8a1"}, - {file = "scikit_learn-1.3.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:535805c2a01ccb40ca4ab7d081d771aea67e535153e35a1fd99418fcedd1648a"}, - {file = "scikit_learn-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1215e5e58e9880b554b01187b8c9390bf4dc4692eedeaf542d3273f4785e342c"}, - {file = "scikit_learn-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ee107923a623b9f517754ea2f69ea3b62fc898a3641766cb7deb2f2ce450161"}, - {file = "scikit_learn-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:35a22e8015048c628ad099da9df5ab3004cdbf81edc75b396fd0cff8699ac58c"}, - {file = "scikit_learn-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6fb6bc98f234fda43163ddbe36df8bcde1d13ee176c6dc9b92bb7d3fc842eb66"}, - {file = "scikit_learn-1.3.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:18424efee518a1cde7b0b53a422cde2f6625197de6af36da0b57ec502f126157"}, - {file = "scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3271552a5eb16f208a6f7f617b8cc6d1f137b52c8a1ef8edf547db0259b2c9fb"}, - {file = "scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4144a5004a676d5022b798d9e573b05139e77f271253a4703eed295bde0433"}, - {file = "scikit_learn-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:67f37d708f042a9b8d59551cf94d30431e01374e00dc2645fa186059c6c5d78b"}, - {file = "scikit_learn-1.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8db94cd8a2e038b37a80a04df8783e09caac77cbe052146432e67800e430c028"}, - {file = "scikit_learn-1.3.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:61a6efd384258789aa89415a410dcdb39a50e19d3d8410bd29be365bcdd512d5"}, - {file = "scikit_learn-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb06f8dce3f5ddc5dee1715a9b9f19f20d295bed8e3cd4fa51e1d050347de525"}, - {file = "scikit_learn-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b2de18d86f630d68fe1f87af690d451388bb186480afc719e5f770590c2ef6c"}, - {file = "scikit_learn-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:0402638c9a7c219ee52c94cbebc8fcb5eb9fe9c773717965c1f4185588ad3107"}, - {file = "scikit_learn-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a19f90f95ba93c1a7f7924906d0576a84da7f3b2282ac3bfb7a08a32801add93"}, - {file = "scikit_learn-1.3.2-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:b8692e395a03a60cd927125eef3a8e3424d86dde9b2370d544f0ea35f78a8073"}, - {file = "scikit_learn-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15e1e94cc23d04d39da797ee34236ce2375ddea158b10bee3c343647d615581d"}, - {file = "scikit_learn-1.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:785a2213086b7b1abf037aeadbbd6d67159feb3e30263434139c98425e3dcfcf"}, - {file = "scikit_learn-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:64381066f8aa63c2710e6b56edc9f0894cc7bf59bd71b8ce5613a4559b6145e0"}, - {file = "scikit_learn-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6c43290337f7a4b969d207e620658372ba3c1ffb611f8bc2b6f031dc5c6d1d03"}, - {file = "scikit_learn-1.3.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:dc9002fc200bed597d5d34e90c752b74df516d592db162f756cc52836b38fe0e"}, - {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d08ada33e955c54355d909b9c06a4789a729977f165b8bae6f225ff0a60ec4a"}, - {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763f0ae4b79b0ff9cca0bf3716bcc9915bdacff3cebea15ec79652d1cc4fa5c9"}, - {file = "scikit_learn-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:ed932ea780517b00dae7431e031faae6b49b20eb6950918eb83bd043237950e0"}, -] - -[package.dependencies] -joblib = ">=1.1.1" -numpy = ">=1.17.3,<2.0" -scipy = ">=1.5.0" + {file = "scikit-learn-1.4.0.tar.gz", hash = "sha256:d4373c984eba20e393216edd51a3e3eede56cbe93d4247516d205643c3b93121"}, + {file = "scikit_learn-1.4.0-1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fce93a7473e2f4ee4cc280210968288d6a7d7ad8dc6fa7bb7892145e407085f9"}, + {file = "scikit_learn-1.4.0-1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d77df3d1e15fc37a9329999979fa7868ba8655dbab21fe97fc7ddabac9e08cc7"}, + {file = "scikit_learn-1.4.0-1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2404659fedec40eeafa310cd14d613e564d13dbf8f3c752d31c095195ec05de6"}, + {file = "scikit_learn-1.4.0-1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e98632da8f6410e6fb6bf66937712c949b4010600ccd3f22a5388a83e610cc3c"}, + {file = "scikit_learn-1.4.0-1-cp310-cp310-win_amd64.whl", hash = "sha256:11b3b140f70fbc9f6a08884631ae8dd60a4bb2d7d6d1de92738ea42b740d8992"}, + {file = "scikit_learn-1.4.0-1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8341eabdc754d5ab91641a7763243845e96b6d68e03e472531e88a4f1b09f21"}, + {file = "scikit_learn-1.4.0-1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d1f6bce875ac2bb6b52514f67c185c564ccd299a05b65b7bab091a4c13dde12d"}, + {file = "scikit_learn-1.4.0-1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c408b46b2fd61952d519ea1af2f8f0a7a703e1433923ab1704c4131520b2083b"}, + {file = "scikit_learn-1.4.0-1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b465dd1dcd237b7b1dcd1a9048ccbf70a98c659474324fa708464c3a2533fad"}, + {file = "scikit_learn-1.4.0-1-cp311-cp311-win_amd64.whl", hash = "sha256:0db8e22c42f7980fe5eb22069b1f84c48966f3e0d23a01afde5999e3987a2501"}, + {file = "scikit_learn-1.4.0-1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7eef6ea2ed289af40e88c0be9f7704ca8b5de18508a06897c3fe21e0905efdf"}, + {file = "scikit_learn-1.4.0-1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:349669b01435bc4dbf25c6410b0892073befdaec52637d1a1d1ff53865dc8db3"}, + {file = "scikit_learn-1.4.0-1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d439c584e58434d0350701bd33f6c10b309e851fccaf41c121aed55f6851d8cf"}, + {file = "scikit_learn-1.4.0-1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0e2427d9ef46477625ab9b55c1882844fe6fc500f418c3f8e650200182457bc"}, + {file = "scikit_learn-1.4.0-1-cp312-cp312-win_amd64.whl", hash = "sha256:d3d75343940e7bf9b85c830c93d34039fa015eeb341c5c0b4cd7a90dadfe00d4"}, + {file = "scikit_learn-1.4.0-1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:76986d22e884ab062b1beecdd92379656e9d3789ecc1f9870923c178de55f9fe"}, + {file = "scikit_learn-1.4.0-1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:e22446ad89f1cb7657f0d849dcdc345b48e2d10afa3daf2925fdb740f85b714c"}, + {file = "scikit_learn-1.4.0-1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74812c9eabb265be69d738a8ea8d4884917a59637fcbf88a5f0e9020498bc6b3"}, + {file = "scikit_learn-1.4.0-1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad2a63e0dd386b92da3270887a29b308af4d7c750d8c4995dfd9a4798691bcc"}, + {file = "scikit_learn-1.4.0-1-cp39-cp39-win_amd64.whl", hash = "sha256:53b9e29177897c37e2ff9d4ba6ca12fdb156e22523e463db05def303f5c72b5c"}, + {file = "scikit_learn-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cb8f044a8f5962613ce1feb4351d66f8d784bd072d36393582f351859b065f7d"}, + {file = "scikit_learn-1.4.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:a6372c90bbf302387792108379f1ec77719c1618d88496d0df30cb8e370b4661"}, + {file = "scikit_learn-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:785ce3c352bf697adfda357c3922c94517a9376002971bc5ea50896144bc8916"}, + {file = "scikit_learn-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0aba2a20d89936d6e72d95d05e3bf1db55bca5c5920926ad7b92c34f5e7d3bbe"}, + {file = "scikit_learn-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:2bac5d56b992f8f06816f2cd321eb86071c6f6d44bb4b1cb3d626525820d754b"}, + {file = "scikit_learn-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27ae4b0f1b2c77107c096a7e05b33458354107b47775428d1f11b23e30a73e8a"}, + {file = "scikit_learn-1.4.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5c5c62ffb52c3ffb755eb21fa74cc2cbf2c521bd53f5c04eaa10011dbecf5f80"}, + {file = "scikit_learn-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f0d2018ac6fa055dab65fe8a485967990d33c672d55bc254c56c35287b02fab"}, + {file = "scikit_learn-1.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91a8918c415c4b4bf1d60c38d32958849a9191c2428ab35d30b78354085c7c7a"}, + {file = "scikit_learn-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:80a21de63275f8bcd7877b3e781679d2ff1eddfed515a599f95b2502a3283d42"}, + {file = "scikit_learn-1.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0f33bbafb310c26b81c4d41ecaebdbc1f63498a3f13461d50ed9a2e8f24d28e4"}, + {file = "scikit_learn-1.4.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:8b6ac1442ec714b4911e5aef8afd82c691b5c88b525ea58299d455acc4e8dcec"}, + {file = "scikit_learn-1.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05fc5915b716c6cc60a438c250108e9a9445b522975ed37e416d5ea4f9a63381"}, + {file = "scikit_learn-1.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:842b7d6989f3c574685e18da6f91223eb32301d0f93903dd399894250835a6f7"}, + {file = "scikit_learn-1.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:88bcb586fdff865372df1bc6be88bb7e6f9e0aa080dab9f54f5cac7eca8e2b6b"}, + {file = "scikit_learn-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f77674647dd31f56cb12ed13ed25b6ed43a056fffef051715022d2ebffd7a7d1"}, + {file = "scikit_learn-1.4.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:833999872e2920ce00f3a50839946bdac7539454e200eb6db54898a41f4bfd43"}, + {file = "scikit_learn-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:970ec697accaef10fb4f51763f3a7b1250f9f0553cf05514d0e94905322a0172"}, + {file = "scikit_learn-1.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:923d778f378ebacca2c672ab1740e5a413e437fb45ab45ab02578f8b689e5d43"}, + {file = "scikit_learn-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:1d041bc95006b545b59e458399e3175ab11ca7a03dc9a74a573ac891f5df1489"}, +] + +[package.dependencies] +joblib = ">=1.2.0" +numpy = ">=1.19.5" +scipy = ">=1.6.0" threadpoolctl = ">=2.0.0" [package.extras] -benchmark = ["matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "pandas (>=1.0.5)"] -docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.10.1)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] -examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"] -tests = ["black (>=23.3.0)", "matplotlib (>=3.1.3)", "mypy (>=1.3)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.0.272)", "scikit-image (>=0.16.2)"] +benchmark = ["matplotlib (>=3.3.4)", "memory-profiler (>=0.57.0)", "pandas (>=1.1.5)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.15.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] +tests = ["black (>=23.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.3)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.19.12)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.0.272)", "scikit-image (>=0.17.2)"] [[package]] name = "scipy" -version = "1.11.4" +version = "1.12.0" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "scipy-1.11.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc9a714581f561af0848e6b69947fda0614915f072dfd14142ed1bfe1b806710"}, - {file = "scipy-1.11.4-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:cf00bd2b1b0211888d4dc75656c0412213a8b25e80d73898083f402b50f47e41"}, - {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9999c008ccf00e8fbcce1236f85ade5c569d13144f77a1946bef8863e8f6eb4"}, - {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:933baf588daa8dc9a92c20a0be32f56d43faf3d1a60ab11b3f08c356430f6e56"}, - {file = "scipy-1.11.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8fce70f39076a5aa62e92e69a7f62349f9574d8405c0a5de6ed3ef72de07f446"}, - {file = "scipy-1.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:6550466fbeec7453d7465e74d4f4b19f905642c89a7525571ee91dd7adabb5a3"}, - {file = "scipy-1.11.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f313b39a7e94f296025e3cffc2c567618174c0b1dde173960cf23808f9fae4be"}, - {file = "scipy-1.11.4-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1b7c3dca977f30a739e0409fb001056484661cb2541a01aba0bb0029f7b68db8"}, - {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00150c5eae7b610c32589dda259eacc7c4f1665aedf25d921907f4d08a951b1c"}, - {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530f9ad26440e85766509dbf78edcfe13ffd0ab7fec2560ee5c36ff74d6269ff"}, - {file = "scipy-1.11.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5e347b14fe01003d3b78e196e84bd3f48ffe4c8a7b8a1afbcb8f5505cb710993"}, - {file = "scipy-1.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:acf8ed278cc03f5aff035e69cb511741e0418681d25fbbb86ca65429c4f4d9cd"}, - {file = "scipy-1.11.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:028eccd22e654b3ea01ee63705681ee79933652b2d8f873e7949898dda6d11b6"}, - {file = "scipy-1.11.4-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c6ff6ef9cc27f9b3db93a6f8b38f97387e6e0591600369a297a50a8e96e835d"}, - {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b030c6674b9230d37c5c60ab456e2cf12f6784596d15ce8da9365e70896effc4"}, - {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad669df80528aeca5f557712102538f4f37e503f0c5b9541655016dd0932ca79"}, - {file = "scipy-1.11.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce7fff2e23ab2cc81ff452a9444c215c28e6305f396b2ba88343a567feec9660"}, - {file = "scipy-1.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:36750b7733d960d7994888f0d148d31ea3017ac15eef664194b4ef68d36a4a97"}, - {file = "scipy-1.11.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e619aba2df228a9b34718efb023966da781e89dd3d21637b27f2e54db0410d7"}, - {file = "scipy-1.11.4-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:f3cd9e7b3c2c1ec26364856f9fbe78695fe631150f94cd1c22228456404cf1ec"}, - {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d10e45a6c50211fe256da61a11c34927c68f277e03138777bdebedd933712fea"}, - {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91af76a68eeae0064887a48e25c4e616fa519fa0d38602eda7e0f97d65d57937"}, - {file = "scipy-1.11.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6df1468153a31cf55ed5ed39647279beb9cfb5d3f84369453b49e4b8502394fd"}, - {file = "scipy-1.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:ee410e6de8f88fd5cf6eadd73c135020bfbbbdfcd0f6162c36a7638a1ea8cc65"}, - {file = "scipy-1.11.4.tar.gz", hash = "sha256:90a2b78e7f5733b9de748f589f09225013685f9b218275257f8a8168ededaeaa"}, -] - -[package.dependencies] -numpy = ">=1.21.6,<1.28.0" + {file = "scipy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78e4402e140879387187f7f25d91cc592b3501a2e51dfb320f48dfb73565f10b"}, + {file = "scipy-1.12.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5f00ebaf8de24d14b8449981a2842d404152774c1a1d880c901bf454cb8e2a1"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e53958531a7c695ff66c2e7bb7b79560ffdc562e2051644c5576c39ff8efb563"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e32847e08da8d895ce09d108a494d9eb78974cf6de23063f93306a3e419960c"}, + {file = "scipy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c1020cad92772bf44b8e4cdabc1df5d87376cb219742549ef69fc9fd86282dd"}, + {file = "scipy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:75ea2a144096b5e39402e2ff53a36fecfd3b960d786b7efd3c180e29c39e53f2"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:408c68423f9de16cb9e602528be4ce0d6312b05001f3de61fe9ec8b1263cad08"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5adfad5dbf0163397beb4aca679187d24aec085343755fcdbdeb32b3679f254c"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3003652496f6e7c387b1cf63f4bb720951cfa18907e998ea551e6de51a04467"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b8066bce124ee5531d12a74b617d9ac0ea59245246410e19bca549656d9a40a"}, + {file = "scipy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8bee4993817e204d761dba10dbab0774ba5a8612e57e81319ea04d84945375ba"}, + {file = "scipy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a24024d45ce9a675c1fb8494e8e5244efea1c7a09c60beb1eeb80373d0fecc70"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7e76cc48638228212c747ada851ef355c2bb5e7f939e10952bc504c11f4e372"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f7ce148dffcd64ade37b2df9315541f9adad6efcaa86866ee7dd5db0c8f041c3"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c39f92041f490422924dfdb782527a4abddf4707616e07b021de33467f917bc"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ebda398f86e56178c2fa94cad15bf457a218a54a35c2a7b4490b9f9cb2676c"}, + {file = "scipy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:95e5c750d55cf518c398a8240571b0e0782c2d5a703250872f36eaf737751338"}, + {file = "scipy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e646d8571804a304e1da01040d21577685ce8e2db08ac58e543eaca063453e1c"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:913d6e7956c3a671de3b05ccb66b11bc293f56bfdef040583a7221d9e22a2e35"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba1b0c7256ad75401c73e4b3cf09d1f176e9bd4248f0d3112170fb2ec4db067"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:730badef9b827b368f351eacae2e82da414e13cf8bd5051b4bdfd720271a5371"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6546dc2c11a9df6926afcbdd8a3edec28566e4e785b915e849348c6dd9f3f490"}, + {file = "scipy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:196ebad3a4882081f62a5bf4aeb7326aa34b110e533aab23e4374fcccb0890dc"}, + {file = "scipy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:b360f1b6b2f742781299514e99ff560d1fe9bd1bff2712894b52abe528d1fd1e"}, + {file = "scipy-1.12.0.tar.gz", hash = "sha256:4bf5abab8a36d20193c698b0f1fc282c1d083c94723902c447e5d2f1780936a3"}, +] + +[package.dependencies] +numpy = ">=1.22.4,<1.29.0" [package.extras] dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "seaborn" @@ -2890,13 +2873,13 @@ files = [ [[package]] name = "skl2onnx" -version = "1.15.0" +version = "1.16.0" description = "Convert scikit-learn models to ONNX" optional = true python-versions = "*" files = [ - {file = "skl2onnx-1.15.0-py2.py3-none-any.whl", hash = "sha256:13a9ea5d50619ce42381c67001db8c87ce574a459a8f0738b45d2f4b93f465f6"}, - {file = "skl2onnx-1.15.0.tar.gz", hash = "sha256:05b2c2643ad0357ec1ea684d138438a2df657df828e57d07cb78c2e76be20e37"}, + {file = "skl2onnx-1.16.0-py2.py3-none-any.whl", hash = "sha256:7de548580c625bfa5893fe79c9dd3213c3720b12e1ff8e3fd28967da0698242d"}, + {file = "skl2onnx-1.16.0.tar.gz", hash = "sha256:3370b3d4065ce2dc5933878c3273f4aea41f945cc6514543b13ad2d57f369ce5"}, ] [package.dependencies] @@ -3034,20 +3017,18 @@ markdown = ">=3.4" [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.7" +version = "1.0.8" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_applehelp-1.0.7-py3-none-any.whl", hash = "sha256:094c4d56209d1734e7d252f6e0b3ccc090bd52ee56807a5d9315b19c122ab15d"}, - {file = "sphinxcontrib_applehelp-1.0.7.tar.gz", hash = "sha256:39fdc8d762d33b01a7d8f026a3b7d71563ea3b72787d5f00ad8465bd9d6dfbfa"}, + {file = "sphinxcontrib_applehelp-1.0.8-py3-none-any.whl", hash = "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4"}, + {file = "sphinxcontrib_applehelp-1.0.8.tar.gz", hash = "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] @@ -3070,38 +3051,34 @@ Sphinx = ">=2.1" [[package]] name = "sphinxcontrib-devhelp" -version = "1.0.5" +version = "1.0.6" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_devhelp-1.0.5-py3-none-any.whl", hash = "sha256:fe8009aed765188f08fcaadbb3ea0d90ce8ae2d76710b7e29ea7d047177dae2f"}, - {file = "sphinxcontrib_devhelp-1.0.5.tar.gz", hash = "sha256:63b41e0d38207ca40ebbeabcf4d8e51f76c03e78cd61abe118cf4435c73d4212"}, + {file = "sphinxcontrib_devhelp-1.0.6-py3-none-any.whl", hash = "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f"}, + {file = "sphinxcontrib_devhelp-1.0.6.tar.gz", hash = "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.4" +version = "2.0.5" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_htmlhelp-2.0.4-py3-none-any.whl", hash = "sha256:8001661c077a73c29beaf4a79968d0726103c5605e27db92b9ebed8bab1359e9"}, - {file = "sphinxcontrib_htmlhelp-2.0.4.tar.gz", hash = "sha256:6c26a118a05b76000738429b724a0568dbde5b72391a688577da08f11891092a"}, + {file = "sphinxcontrib_htmlhelp-2.0.5-py3-none-any.whl", hash = "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04"}, + {file = "sphinxcontrib_htmlhelp-2.0.5.tar.gz", hash = "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["html5lib", "pytest"] [[package]] @@ -3120,38 +3097,34 @@ test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" -version = "1.0.6" +version = "1.0.7" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_qthelp-1.0.6-py3-none-any.whl", hash = "sha256:bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4"}, - {file = "sphinxcontrib_qthelp-1.0.6.tar.gz", hash = "sha256:62b9d1a186ab7f5ee3356d906f648cacb7a6bdb94d201ee7adf26db55092982d"}, + {file = "sphinxcontrib_qthelp-1.0.7-py3-none-any.whl", hash = "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182"}, + {file = "sphinxcontrib_qthelp-1.0.7.tar.gz", hash = "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] name = "sphinxcontrib-serializinghtml" -version = "1.1.9" +version = "1.1.10" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl", hash = "sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1"}, - {file = "sphinxcontrib_serializinghtml-1.1.9.tar.gz", hash = "sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54"}, + {file = "sphinxcontrib_serializinghtml-1.1.10-py3-none-any.whl", hash = "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7"}, + {file = "sphinxcontrib_serializinghtml-1.1.10.tar.gz", hash = "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f"}, ] -[package.dependencies] -Sphinx = ">=5" - [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] test = ["pytest"] [[package]] @@ -3314,38 +3287,29 @@ files = [ [[package]] name = "tensorflow-io-gcs-filesystem" -version = "0.34.0" +version = "0.35.0" description = "TensorFlow IO" optional = true python-versions = ">=3.7, <3.12" files = [ - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:d831702fbb270996b27cda7fde06e0825b2ea81fd8dd3ead35242f4f8b3889b8"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:b9a93fcb01db269bc845a1ced431f3c61201755ce5f9ec4885760f30122276ef"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5813c336b4f7cb0a01ff4cc6cbd3edf11ef67305baf0e3cf634911b702f493f8"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b035f4c92639657b6d376929d550ac3dee9e6c0523eb434eefe0a27bae3d05b"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:a17a616d2c7fae83de4424404815843507d40d4eb0d507c636a5493a20c3d958"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:ec4604c99cbb5b708f4516dee27aa655abae222b876c98b740f4c2f89dd5c001"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp311-cp311-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cbe26c4a3332589c7b724f147df453b5c226993aa8d346a15536358d77b364c4"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e6353123a5b51397950138a118876af833a7db66b531123bb86f82e80ab0e72"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f211d2b3db8f9931765992b607b71cbfb98c8cd6169079d004a67a94ab10ecb4"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:d3feba2dd76f7c188137c34642d68d378f0eed81636cb95090ecb1496722707c"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:44ad387a812a78e7424bb8bee3820521ae1c044bddf72b1e163e8df95c124a74"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:7f60183473f0ca966451bb1d1bb5dc29b3cf9c74d1d0e7f2ed46760ed56bd4af"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:3f346b287ed2400e09b13cfd8524222fd70a66aadb9164c645286c2087007e9f"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:027a07553367187f918a99661f63ae0506b91b77a70bee9c7ccaf3920bf7cfe7"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d8664bddbe4e7b56ce94db8b93ea9077a158fb5e15364e11e29f93015ceea24"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:182b0fbde7e9a537fda0b354c28b0b6c035736728de8fe2db7ef49cf90352014"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:0dafed144673e1173528768fe208a7c5a6e8edae40208381cac420ee7c918ec9"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:396bfff61b49f80b86ddebe0c76ae0f2731689cee49ad7d782625180b50b13af"}, - {file = "tensorflow_io_gcs_filesystem-0.34.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b20622f8572fcb6c93e8f7d626327472f263e47ebd63d2153ef09162ef5ef7b5"}, -] - -[package.extras] -tensorflow = ["tensorflow (>=2.13.0,<2.14.0)"] -tensorflow-aarch64 = ["tensorflow-aarch64 (>=2.13.0,<2.14.0)"] -tensorflow-cpu = ["tensorflow-cpu (>=2.13.0,<2.14.0)"] -tensorflow-gpu = ["tensorflow-gpu (>=2.13.0,<2.14.0)"] -tensorflow-rocm = ["tensorflow-rocm (>=2.13.0,<2.14.0)"] + {file = "tensorflow_io_gcs_filesystem-0.35.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:5521721b38105496d4b43a4ffb0af5b04cc4873d464f26fbceddf8d63815ce98"}, + {file = "tensorflow_io_gcs_filesystem-0.35.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd8f30908bf8b7b2a017d6b145720d105aff7f998422671b71729708ec7b2fe4"}, + {file = "tensorflow_io_gcs_filesystem-0.35.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac8f1de60fdf9c734aea967b98555e366ac8743f77bca15c49eff023f587076b"}, + {file = "tensorflow_io_gcs_filesystem-0.35.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:35b6eca7225c815d962254327195f191d88c3c9c2278a5ab23e0ac834acbadbb"}, + {file = "tensorflow_io_gcs_filesystem-0.35.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e997389bfe008210cbd97c0c738d64282a2f03ad4d0536013bb0a9efde0c283"}, + {file = "tensorflow_io_gcs_filesystem-0.35.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8fb3402fb1457482c386ea19371bc76383412ae9ea4396edb1e8adb4ba76f21"}, + {file = "tensorflow_io_gcs_filesystem-0.35.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb6bf8f5b40207ecb17e7fdc3b4fc824a8361267c14e9528c1688e16de135cb7"}, + {file = "tensorflow_io_gcs_filesystem-0.35.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:c4f786eebd98d401565374722f2e67f3878675b0d87489cbaa13c70ee6ac370a"}, + {file = "tensorflow_io_gcs_filesystem-0.35.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fce1466bdb91096b6d22e7df17358ba228bcb92db5cff83f2f9f1c68eb26788"}, + {file = "tensorflow_io_gcs_filesystem-0.35.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1856fe321fdb75f3386d92109c60db6ef097f610b450f9cc69d76444fb9980d1"}, +] + +[package.extras] +tensorflow = ["tensorflow (>=2.14.0,<2.15.0)"] +tensorflow-aarch64 = ["tensorflow-aarch64 (>=2.14.0,<2.15.0)"] +tensorflow-cpu = ["tensorflow-cpu (>=2.14.0,<2.15.0)"] +tensorflow-gpu = ["tensorflow-gpu (>=2.14.0,<2.15.0)"] +tensorflow-rocm = ["tensorflow-rocm (>=2.14.0,<2.15.0)"] [[package]] name = "termcolor" @@ -3416,13 +3380,13 @@ telegram = ["requests"] [[package]] name = "traitlets" -version = "5.14.0" +version = "5.14.1" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" files = [ - {file = "traitlets-5.14.0-py3-none-any.whl", hash = "sha256:f14949d23829023013c47df20b4a76ccd1a85effb786dc060f34de7948361b33"}, - {file = "traitlets-5.14.0.tar.gz", hash = "sha256:fcdaa8ac49c04dfa0ed3ee3384ef6dfdb5d6f3741502be247279407679296772"}, + {file = "traitlets-5.14.1-py3-none-any.whl", hash = "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74"}, + {file = "traitlets-5.14.1.tar.gz", hash = "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e"}, ] [package.extras] @@ -3431,13 +3395,13 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "typing-extensions" -version = "4.8.0" +version = "4.9.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, - {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, + {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, + {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, ] [[package]] @@ -3458,13 +3422,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "wcwidth" -version = "0.2.12" +version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.12-py2.py3-none-any.whl", hash = "sha256:f26ec43d96c8cbfed76a5075dac87680124fa84e0855195a6184da9c187f133c"}, - {file = "wcwidth-0.2.12.tar.gz", hash = "sha256:f01c104efdf57971bcb756f054dd58ddec5204dd15fa31d6503ea57947d97c02"}, + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] [[package]] @@ -3541,16 +3505,6 @@ files = [ {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, - {file = "wrapt-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecee4132c6cd2ce5308e21672015ddfed1ff975ad0ac8d27168ea82e71413f55"}, - {file = "wrapt-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2020f391008ef874c6d9e208b24f28e31bcb85ccff4f335f15a3251d222b92d9"}, - {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2feecf86e1f7a86517cab34ae6c2f081fd2d0dac860cb0c0ded96d799d20b335"}, - {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:240b1686f38ae665d1b15475966fe0472f78e71b1b4903c143a842659c8e4cb9"}, - {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9008dad07d71f68487c91e96579c8567c98ca4c3881b9b113bc7b33e9fd78b8"}, - {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6447e9f3ba72f8e2b985a1da758767698efa72723d5b59accefd716e9e8272bf"}, - {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:acae32e13a4153809db37405f5eba5bac5fbe2e2ba61ab227926a22901051c0a"}, - {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49ef582b7a1152ae2766557f0550a9fcbf7bbd76f43fbdc94dd3bf07cc7168be"}, - {file = "wrapt-1.14.1-cp311-cp311-win32.whl", hash = "sha256:358fe87cc899c6bb0ddc185bf3dbfa4ba646f05b1b0b9b5a27c2cb92c2cea204"}, - {file = "wrapt-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:26046cd03936ae745a502abf44dac702a5e6880b2b01c29aea8ddf3353b68224"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, @@ -3620,4 +3574,4 @@ viz = ["pydot"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "970164c313a675cd694bd4be27a83a3d2791796d49314be6664fed11d9431850" +content-hash = "bca71883bd2bee475b4e84db4d4a2b7c98add77f4f583a32df7d63279e1071df" diff --git a/pyproject.toml b/pyproject.toml index eea147c6e..30b575b94 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,7 +17,7 @@ classifiers = [ [tool.poetry.dependencies] python = ">=3.9,<3.12" -qibolab = "^0.1.4" +qibolab = "^0.1.5" qibo = "^0.2.1" numpy = "^1.24.0" scipy = "^1.10.1" From 5667b36829e231ae44608ea59fdab8716a69dfd4 Mon Sep 17 00:00:00 2001 From: Andrea Date: Mon, 29 Jan 2024 11:19:29 +0400 Subject: [PATCH 51/52] fix: Fix dump in qq fit and add tests to cover it --- src/qibocal/cli/fit.py | 2 ++ tests/test_protocols.py | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/qibocal/cli/fit.py b/src/qibocal/cli/fit.py index 63813d9ba..df4891afe 100644 --- a/src/qibocal/cli/fit.py +++ b/src/qibocal/cli/fit.py @@ -47,7 +47,9 @@ def fit(path, update): # dump updated runcard if platform is not None and update: # pragma: no cover # cannot test update since dummy may produce wrong values and trigger errors + (path / UPDATED_PLATFORM).mkdir(parents=True, exist_ok=True) dump_runcard(platform, path / UPDATED_PLATFORM) # dump json + (path / META).write_text(json.dumps(meta, indent=4)) diff --git a/tests/test_protocols.py b/tests/test_protocols.py index d94fd7f3f..5e570f0b8 100644 --- a/tests/test_protocols.py +++ b/tests/test_protocols.py @@ -95,8 +95,9 @@ def test_acquire_command(runcard, backend, platform, tmp_path): assert results_report.exit_code == 0 +@pytest.mark.parametrize("update", ["--update", "--no-update"]) @pytest.mark.parametrize("runcard", generate_runcard_single_protocol(), ids=idfn) -def test_fit_command(runcard, tmp_path): +def test_fit_command(runcard, update, tmp_path): """Test fit builder and report generated.""" (tmp_path / SINGLE_ACTION_RUNCARD).write_text(yaml.safe_dump(runcard)) runner = CliRunner() @@ -116,7 +117,7 @@ def test_fit_command(runcard, tmp_path): assert results.exit_code == 0 # perform fit - results_fit = runner.invoke(command, ["fit", str(tmp_path), "--no-update"]) + results_fit = runner.invoke(command, ["fit", str(tmp_path), update]) assert not results_fit.exception assert results_fit.exit_code == 0 From 76397f1be86ae0009ea540ee4446648caeeddac8 Mon Sep 17 00:00:00 2001 From: Andrea Date: Mon, 29 Jan 2024 11:49:49 +0400 Subject: [PATCH 52/52] fix: Fix GHZ_TO_HZ conversion in resonator fit --- .../protocols/characterization/flux_dependence/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qibocal/protocols/characterization/flux_dependence/utils.py b/src/qibocal/protocols/characterization/flux_dependence/utils.py index a0e9489e5..785667549 100644 --- a/src/qibocal/protocols/characterization/flux_dependence/utils.py +++ b/src/qibocal/protocols/characterization/flux_dependence/utils.py @@ -262,6 +262,6 @@ def resonator_flux_dependence_fit_bounds( left_bound, right_bound = qubit_flux_dependence_fit_bounds( qubit_frequency=qubit_frequency, bias=bias ) - left_bound += [bare_resonator_frequency - 0.5, 0] - right_bound += [bare_resonator_frequency + 0.5, 1] + left_bound += [bare_resonator_frequency * HZ_TO_GHZ - 0.5, 0] + right_bound += [bare_resonator_frequency * HZ_TO_GHZ + 0.5, 1] return (left_bound, right_bound)